aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake')
-rw-r--r--cmake/ComputeCppCompilerChecks.cmake50
-rw-r--r--cmake/ComputeCppIRMap.cmake18
-rw-r--r--cmake/Eigen3Config.cmake.in4
-rw-r--r--cmake/EigenConfigureTesting.cmake21
-rw-r--r--cmake/EigenSmokeTestList.cmake131
-rw-r--r--cmake/EigenTesting.cmake453
-rw-r--r--cmake/EigenUninstall.cmake2
-rw-r--r--cmake/FindAdolc.cmake16
-rw-r--r--cmake/FindBLAS.cmake77
-rw-r--r--cmake/FindBLASEXT.cmake28
-rw-r--r--cmake/FindCHOLMOD.cmake (renamed from cmake/FindCholmod.cmake)18
-rw-r--r--cmake/FindComputeCpp.cmake550
-rw-r--r--cmake/FindEigen2.cmake18
-rw-r--r--cmake/FindEigen3.cmake36
-rw-r--r--cmake/FindFFTW.cmake5
-rw-r--r--cmake/FindGLEW.cmake80
-rw-r--r--cmake/FindGMP.cmake2
-rw-r--r--cmake/FindGSL.cmake100
-rw-r--r--cmake/FindGoogleHash.cmake6
-rw-r--r--cmake/FindHWLOC.cmake11
-rw-r--r--cmake/FindKLU.cmake48
-rw-r--r--cmake/FindLAPACK.cmake27
-rw-r--r--cmake/FindMPFR.cmake14
-rw-r--r--cmake/FindMPREAL.cmake103
-rw-r--r--cmake/FindMetis.cmake5
-rw-r--r--cmake/FindPASTIX.cmake (renamed from cmake/FindPastix.cmake)44
-rw-r--r--cmake/FindPTSCOTCH.cmake35
-rw-r--r--cmake/FindSCOTCH.cmake (renamed from cmake/FindScotch.cmake)7
-rw-r--r--cmake/FindSPQR.cmake4
-rw-r--r--cmake/FindStandardMathLibrary.cmake10
-rw-r--r--cmake/FindSuperLU.cmake4
-rw-r--r--cmake/FindTriSYCL.cmake173
-rw-r--r--cmake/FindUMFPACK.cmake (renamed from cmake/FindUmfpack.cmake)6
-rw-r--r--cmake/RegexUtils.cmake22
-rw-r--r--cmake/language_support.cmake67
35 files changed, 1472 insertions, 723 deletions
diff --git a/cmake/ComputeCppCompilerChecks.cmake b/cmake/ComputeCppCompilerChecks.cmake
new file mode 100644
index 000000000..1807485e4
--- /dev/null
+++ b/cmake/ComputeCppCompilerChecks.cmake
@@ -0,0 +1,50 @@
+cmake_minimum_required(VERSION 3.4.3)
+
+if(CMAKE_COMPILER_IS_GNUCXX)
+ if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
+ message(FATAL_ERROR "host compiler - gcc version must be > 4.8")
+ endif()
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.6)
+ message(FATAL_ERROR "host compiler - clang version must be > 3.6")
+ endif()
+endif()
+
+if(MSVC)
+ set(ComputeCpp_STL_CHECK_SRC __STL_check)
+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${ComputeCpp_STL_CHECK_SRC}.cpp
+ "#include <ios>\n"
+ "int main() { return 0; }\n")
+ execute_process(
+ COMMAND ${ComputeCpp_DEVICE_COMPILER_EXECUTABLE}
+ ${COMPUTECPP_DEVICE_COMPILER_FLAGS}
+ -isystem ${ComputeCpp_INCLUDE_DIRS}
+ -o ${ComputeCpp_STL_CHECK_SRC}.sycl
+ -c ${ComputeCpp_STL_CHECK_SRC}.cpp
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ RESULT_VARIABLE ComputeCpp_STL_CHECK_RESULT
+ ERROR_QUIET
+ OUTPUT_QUIET)
+ if(NOT ${ComputeCpp_STL_CHECK_RESULT} EQUAL 0)
+ # Try disabling compiler version checks
+ execute_process(
+ COMMAND ${ComputeCpp_DEVICE_COMPILER_EXECUTABLE}
+ ${COMPUTECPP_DEVICE_COMPILER_FLAGS}
+ -D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH
+ -isystem ${ComputeCpp_INCLUDE_DIRS}
+ -o ${ComputeCpp_STL_CHECK_SRC}.cpp.sycl
+ -c ${ComputeCpp_STL_CHECK_SRC}.cpp
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ RESULT_VARIABLE ComputeCpp_STL_CHECK_RESULT
+ ERROR_QUIET
+ OUTPUT_QUIET)
+ if(NOT ${ComputeCpp_STL_CHECK_RESULT} EQUAL 0)
+ message(STATUS "Device compiler cannot consume hosted STL headers. Using any parts of the STL will likely result in device compiler errors.")
+ else()
+ message(STATUS "Device compiler does not meet certain STL version requirements. Disabling version checks and hoping for the best.")
+ list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH)
+ endif()
+ endif()
+ file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${ComputeCpp_STL_CHECK_SRC}.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/${ComputeCpp_STL_CHECK_SRC}.cpp.sycl)
+endif(MSVC)
diff --git a/cmake/ComputeCppIRMap.cmake b/cmake/ComputeCppIRMap.cmake
new file mode 100644
index 000000000..942d91d64
--- /dev/null
+++ b/cmake/ComputeCppIRMap.cmake
@@ -0,0 +1,18 @@
+cmake_minimum_required(VERSION 3.4.3)
+
+# These should match the types of IR output by compute++
+set(IR_MAP_spir bc)
+set(IR_MAP_spir64 bc)
+set(IR_MAP_spir32 bc)
+set(IR_MAP_spirv spv)
+set(IR_MAP_spirv64 spv)
+set(IR_MAP_spirv32 spv)
+set(IR_MAP_aorta-x86_64 o)
+set(IR_MAP_aorta-aarch64 o)
+set(IR_MAP_aorta-rcar-cve o)
+set(IR_MAP_custom-spir64 bc)
+set(IR_MAP_custom-spir32 bc)
+set(IR_MAP_custom-spirv64 spv)
+set(IR_MAP_custom-spirv32 spv)
+set(IR_MAP_ptx64 s)
+set(IR_MAP_amdgcn s)
diff --git a/cmake/Eigen3Config.cmake.in b/cmake/Eigen3Config.cmake.in
index c5c546887..0a1ac61c9 100644
--- a/cmake/Eigen3Config.cmake.in
+++ b/cmake/Eigen3Config.cmake.in
@@ -3,7 +3,9 @@
@PACKAGE_INIT@
-include ("${CMAKE_CURRENT_LIST_DIR}/Eigen3Targets.cmake")
+if (NOT TARGET eigen)
+ include ("${CMAKE_CURRENT_LIST_DIR}/Eigen3Targets.cmake")
+endif ()
# Legacy variables, do *not* use. May be removed in the future.
diff --git a/cmake/EigenConfigureTesting.cmake b/cmake/EigenConfigureTesting.cmake
index afc24b5e9..9cb3bb20b 100644
--- a/cmake/EigenConfigureTesting.cmake
+++ b/cmake/EigenConfigureTesting.cmake
@@ -11,16 +11,18 @@ add_custom_target(buildtests)
add_custom_target(check COMMAND "ctest")
add_dependencies(check buildtests)
-# check whether /bin/bash exists
-find_file(EIGEN_BIN_BASH_EXISTS "/bin/bash" PATHS "/" NO_DEFAULT_PATH)
+# check whether /bin/bash exists (disabled as not used anymore)
+# find_file(EIGEN_BIN_BASH_EXISTS "/bin/bash" PATHS "/" NO_DEFAULT_PATH)
# This call activates testing and generates the DartConfiguration.tcl
include(CTest)
set(EIGEN_TEST_BUILD_FLAGS "" CACHE STRING "Options passed to the build command of unit tests")
+set(EIGEN_DASHBOARD_BUILD_TARGET "buildtests" CACHE STRING "Target to be built in dashboard mode, default is buildtests")
+set(EIGEN_CTEST_ERROR_EXCEPTION "" CACHE STRING "Regular expression for build error messages to be filtered out")
# Overwrite default DartConfiguration.tcl such that ctest can build our unit tests.
-# Recall that our unit tests are not in the "all" target, so we have to explicitely ask ctest to build our custom 'buildtests' target.
+# Recall that our unit tests are not in the "all" target, so we have to explicitly ask ctest to build our custom 'buildtests' target.
# At this stage, we can also add custom flags to the build tool through the user defined EIGEN_TEST_BUILD_FLAGS variable.
file(READ "${CMAKE_CURRENT_BINARY_DIR}/DartConfiguration.tcl" EIGEN_DART_CONFIG_FILE)
# try to grab the default flags
@@ -28,7 +30,7 @@ string(REGEX MATCH "MakeCommand:.*-- (.*)\nDefaultCTestConfigurationType" EIGEN_
if(NOT CMAKE_MATCH_1)
string(REGEX MATCH "MakeCommand:.*[^c]make (.*)\nDefaultCTestConfigurationType" EIGEN_DUMMY ${EIGEN_DART_CONFIG_FILE})
endif()
-string(REGEX REPLACE "MakeCommand:.*DefaultCTestConfigurationType" "MakeCommand: ${CMAKE_COMMAND} --build . --target buildtests --config \"\${CTEST_CONFIGURATION_TYPE}\" -- ${CMAKE_MATCH_1} ${EIGEN_TEST_BUILD_FLAGS}\nDefaultCTestConfigurationType"
+string(REGEX REPLACE "MakeCommand:.*DefaultCTestConfigurationType" "MakeCommand: ${CMAKE_COMMAND} --build . --target ${EIGEN_DASHBOARD_BUILD_TARGET} --config \"\${CTEST_CONFIGURATION_TYPE}\" -- ${CMAKE_MATCH_1} ${EIGEN_TEST_BUILD_FLAGS}\nDefaultCTestConfigurationType"
EIGEN_DART_CONFIG_FILE2 ${EIGEN_DART_CONFIG_FILE})
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/DartConfiguration.tcl" ${EIGEN_DART_CONFIG_FILE2})
@@ -39,7 +41,7 @@ ei_init_testing()
# configure Eigen related testing options
option(EIGEN_NO_ASSERTION_CHECKING "Disable checking of assertions using exceptions" OFF)
-option(EIGEN_DEBUG_ASSERTS "Enable advanced debuging of assertions" OFF)
+option(EIGEN_DEBUG_ASSERTS "Enable advanced debugging of assertions" OFF)
if(CMAKE_COMPILER_IS_GNUCXX)
option(EIGEN_COVERAGE_TESTING "Enable/disable gcov" OFF)
@@ -47,15 +49,10 @@ if(CMAKE_COMPILER_IS_GNUCXX)
set(COVERAGE_FLAGS "-fprofile-arcs -ftest-coverage")
set(CTEST_CUSTOM_COVERAGE_EXCLUDE "/test/")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS}")
- endif(EIGEN_COVERAGE_TESTING)
+ endif()
elseif(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS")
-endif(CMAKE_COMPILER_IS_GNUCXX)
-
+endif()
-check_cxx_compiler_flag("-std=c++11" EIGEN_COMPILER_SUPPORT_CXX11)
-if(EIGEN_TEST_CXX11 AND EIGEN_COMPILER_SUPPORT_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-endif()
diff --git a/cmake/EigenSmokeTestList.cmake b/cmake/EigenSmokeTestList.cmake
new file mode 100644
index 000000000..6f0f72418
--- /dev/null
+++ b/cmake/EigenSmokeTestList.cmake
@@ -0,0 +1,131 @@
+# List of tests that will be build and run during Eigen's smoke testing. If one
+# of these tests doesn't exists or cannot be build with the current configuration
+# it will just be skipped.
+set(ei_smoke_test_list
+ adjoint_1
+ alignedvector3
+ array_cwise_7
+ array_cwise_8
+ array_for_matrix_1
+ array_of_string
+ array_replicate_1
+ array_reverse_1
+ autodiff_1
+ autodiff_scalar_1
+ bandmatrix
+ bdcsvd_9
+ bessel_functions_1
+ bfloat16_float
+ blasutil_1
+ block_5
+ BVH
+ cholesky_1
+ cholmod_support_23
+ cholmod_support_24
+ conservative_resize_1
+ constructor_1
+ corners_1
+ ctorleakmiscmatrices_4
+ dense_storage
+ determinant_1
+ diagonal_1
+ diagonal_2
+ diagonalmatrices_1
+ dynalloc
+ eigensolver_complex_1
+ eigensolver_selfadjoint_8
+ EulerAngles_1
+ exceptions
+ fastmath
+ first_aligned
+ geo_alignedbox_2
+ geo_eulerangles_1
+ geo_homogeneous_1
+ geo_hyperplane_1
+ geo_orthomethods_1
+ geo_parametrizedline_1
+ geo_transformations_7
+ half_float
+ hessenberg_1
+ hessenberg_6qr_10
+ householder_8
+ indexed_view_1
+ inplace_decomposition_1
+ integer_types_1
+ inverse_1
+ is_same_dense
+ jacobi_1
+ jacobisvd_1
+ kronecker_product
+ linearstructure_1
+ mapped_matrix_1
+ mapstaticmethods_1
+ mapstride_1
+ matrix_square_root_1
+ meta
+ minres_2
+ miscmatrices_1
+ mixingtypes_7
+ nestbyvalue
+ nesting_ops_1
+ nomalloc_1
+ nullary_1
+ num_dimensions
+ NumericalDiff
+ numext
+ packetmath
+ permutationmatrices_1
+ polynomialsolver_1
+ prec_inverse_4x4_1
+ product_extra_5
+ product_selfadjoint_1
+ product_small_7
+ product_symm_1
+ product_syrk_1
+ product_trmm_1
+ product_trmv_1
+ product_trsolve_5
+ qr_1
+ qr_colpivoting_7
+ qr_fullpivoting_4
+ rand
+ real_qz_1
+ redux_1
+ ref_1
+ resize
+ rvalue_types_1
+ schur_complex_1
+ schur_real_1
+ selfadjoint_1
+ sizeof
+ sizeoverflow
+ smallvectors
+ sparse_basic_3
+ sparse_block_1
+ sparse_extra_4
+ sparse_permutations_2
+ sparse_product_4
+ sparse_ref_1
+ sparse_solvers_1
+ sparse_vector_1
+ special_functions_1
+ special_numbers_1
+ special_packetmath_1
+ spqr_support_2
+ stable_norm_1
+ stddeque_1
+ stddeque_overload_1
+ stdlist_1
+ stdlist_overload_1
+ stdvector_1
+ stdvector_overload_1
+ stl_iterators_1
+ swap_1
+ symbolic_index_1
+ triangular_1
+ type_aliaslu_9
+ umeyama_3
+ unalignedassert
+ unalignedcount
+ vectorwiseop_1
+ visitor_1) \ No newline at end of file
diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake
index a92a2978b..eb8457db6 100644
--- a/cmake/EigenTesting.cmake
+++ b/cmake/EigenTesting.cmake
@@ -6,7 +6,7 @@ macro(ei_add_property prop value)
else()
set_property(GLOBAL PROPERTY ${prop} "${previous} ${value}")
endif()
-endmacro(ei_add_property)
+endmacro()
#internal. See documentation of ei_add_test for details.
macro(ei_add_test_internal testname testname_with_suffix)
@@ -18,20 +18,34 @@ macro(ei_add_test_internal testname testname_with_suffix)
set(filename ${testname}.cpp)
endif()
+ # Add the current target to the list of subtest targets
+ get_property(EIGEN_SUBTESTS_LIST GLOBAL PROPERTY EIGEN_SUBTESTS_LIST)
+ set(EIGEN_SUBTESTS_LIST "${EIGEN_SUBTESTS_LIST}${targetname}\n")
+ set_property(GLOBAL PROPERTY EIGEN_SUBTESTS_LIST "${EIGEN_SUBTESTS_LIST}")
+
if(EIGEN_ADD_TEST_FILENAME_EXTENSION STREQUAL cu)
- if(EIGEN_TEST_CUDA_CLANG)
+ if(EIGEN_TEST_HIP)
+ hip_reset_flags()
+ hip_add_executable(${targetname} ${filename} HIPCC_OPTIONS "-DEIGEN_USE_HIP ${ARGV2}")
+ elseif(EIGEN_TEST_CUDA_CLANG)
set_source_files_properties(${filename} PROPERTIES LANGUAGE CXX)
- if(CUDA_64_BIT_DEVICE_CODE)
+
+ if(CUDA_64_BIT_DEVICE_CODE AND (EXISTS "${CUDA_TOOLKIT_ROOT_DIR}/lib64"))
link_directories("${CUDA_TOOLKIT_ROOT_DIR}/lib64")
else()
link_directories("${CUDA_TOOLKIT_ROOT_DIR}/lib")
endif()
+
if (${ARGC} GREATER 2)
add_executable(${targetname} ${filename})
else()
add_executable(${targetname} ${filename} OPTIONS ${ARGV2})
endif()
- target_link_libraries(${targetname} "cudart_static" "cuda" "dl" "rt" "pthread")
+ set(CUDA_CLANG_LINK_LIBRARIES "cudart_static" "cuda" "dl" "pthread")
+ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(CUDA_CLANG_LINK_LIBRARIES ${CUDA_CLANG_LINK_LIBRARIES} "rt")
+ endif()
+ target_link_libraries(${targetname} ${CUDA_CLANG_LINK_LIBRARIES})
else()
if (${ARGC} GREATER 2)
cuda_add_executable(${targetname} ${filename} OPTIONS ${ARGV2})
@@ -51,119 +65,22 @@ macro(ei_add_test_internal testname testname_with_suffix)
if(EIGEN_NO_ASSERTION_CHECKING)
ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_NO_ASSERTION_CHECKING=1")
- else(EIGEN_NO_ASSERTION_CHECKING)
+ else()
if(EIGEN_DEBUG_ASSERTS)
ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_DEBUG_ASSERTS=1")
- endif(EIGEN_DEBUG_ASSERTS)
- endif(EIGEN_NO_ASSERTION_CHECKING)
-
- ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_MAX_SIZE=${EIGEN_TEST_MAX_SIZE}")
-
- ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}")
-
- if(MSVC)
- ei_add_target_property(${targetname} COMPILE_FLAGS "/bigobj")
- endif()
-
- # let the user pass flags.
- if(${ARGC} GREATER 2)
- ei_add_target_property(${targetname} COMPILE_FLAGS "${ARGV2}")
- endif(${ARGC} GREATER 2)
-
- if(EIGEN_TEST_CUSTOM_CXX_FLAGS)
- ei_add_target_property(${targetname} COMPILE_FLAGS "${EIGEN_TEST_CUSTOM_CXX_FLAGS}")
- endif()
-
- if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)
- target_link_libraries(${targetname} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})
- endif()
- if(EXTERNAL_LIBS)
- target_link_libraries(${targetname} ${EXTERNAL_LIBS})
- endif()
- if(EIGEN_TEST_CUSTOM_LINKER_FLAGS)
- target_link_libraries(${targetname} ${EIGEN_TEST_CUSTOM_LINKER_FLAGS})
- endif()
-
- if(${ARGC} GREATER 3)
- set(libs_to_link ${ARGV3})
- # it could be that some cmake module provides a bad library string " " (just spaces),
- # and that severely breaks target_link_libraries ("can't link to -l-lstdc++" errors).
- # so we check for strings containing only spaces.
- string(STRIP "${libs_to_link}" libs_to_link_stripped)
- string(LENGTH "${libs_to_link_stripped}" libs_to_link_stripped_length)
- if(${libs_to_link_stripped_length} GREATER 0)
- # notice: no double quotes around ${libs_to_link} here. It may be a list.
- target_link_libraries(${targetname} ${libs_to_link})
endif()
endif()
- add_test(${testname_with_suffix} "${targetname}")
-
- # Specify target and test labels accoirding to EIGEN_CURRENT_SUBPROJECT
- get_property(current_subproject GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT)
- if ((current_subproject) AND (NOT (current_subproject STREQUAL "")))
- set_property(TARGET ${targetname} PROPERTY LABELS "Build${current_subproject}")
- add_dependencies("Build${current_subproject}" ${targetname})
- set_property(TEST ${testname_with_suffix} PROPERTY LABELS "${current_subproject}")
- endif()
-
-endmacro(ei_add_test_internal)
-
-# SYCL
-macro(ei_add_test_internal_sycl testname testname_with_suffix)
- include_directories( SYSTEM ${COMPUTECPP_PACKAGE_ROOT_DIR}/include)
- set(targetname ${testname_with_suffix})
-
- if(EIGEN_ADD_TEST_FILENAME_EXTENSION)
- set(filename ${testname}.${EIGEN_ADD_TEST_FILENAME_EXTENSION})
- else()
- set(filename ${testname}.cpp)
- endif()
-
- set( include_file ${CMAKE_CURRENT_BINARY_DIR}/inc_${filename})
- set( bc_file ${CMAKE_CURRENT_BINARY_DIR}/${filename})
- set( host_file ${CMAKE_CURRENT_SOURCE_DIR}/${filename})
-
- ADD_CUSTOM_COMMAND(
- OUTPUT ${include_file}
- COMMAND ${CMAKE_COMMAND} -E echo "\\#include \\\"${host_file}\\\"" > ${include_file}
- COMMAND ${CMAKE_COMMAND} -E echo "\\#include \\\"${bc_file}.sycl\\\"" >> ${include_file}
- DEPENDS ${filename} ${bc_file}.sycl
- COMMENT "Building ComputeCpp integration header file ${include_file}"
- )
- # Add a custom target for the generated integration header
- add_custom_target(${testname}_integration_header_sycl DEPENDS ${include_file})
-
- add_executable(${targetname} ${include_file})
- add_dependencies(${targetname} ${testname}_integration_header_sycl)
- add_sycl_to_target(${targetname} ${filename} ${CMAKE_CURRENT_BINARY_DIR})
-
- if (targetname MATCHES "^eigen2_")
- add_dependencies(eigen2_buildtests ${targetname})
- else()
- add_dependencies(buildtests ${targetname})
- endif()
-
- if(EIGEN_NO_ASSERTION_CHECKING)
- ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_NO_ASSERTION_CHECKING=1")
- else(EIGEN_NO_ASSERTION_CHECKING)
- if(EIGEN_DEBUG_ASSERTS)
- ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_DEBUG_ASSERTS=1")
- endif(EIGEN_DEBUG_ASSERTS)
- endif(EIGEN_NO_ASSERTION_CHECKING)
-
ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_MAX_SIZE=${EIGEN_TEST_MAX_SIZE}")
- ei_add_target_property(${targetname} COMPILE_FLAGS "-DEIGEN_TEST_FUNC=${testname}")
-
- if(MSVC AND NOT EIGEN_SPLIT_LARGE_TESTS)
+ if(MSVC)
ei_add_target_property(${targetname} COMPILE_FLAGS "/bigobj")
endif()
# let the user pass flags.
if(${ARGC} GREATER 2)
ei_add_target_property(${targetname} COMPILE_FLAGS "${ARGV2}")
- endif(${ARGC} GREATER 2)
+ endif()
if(EIGEN_TEST_CUSTOM_CXX_FLAGS)
ei_add_target_property(${targetname} COMPILE_FLAGS "${EIGEN_TEST_CUSTOM_CXX_FLAGS}")
@@ -201,11 +118,28 @@ macro(ei_add_test_internal_sycl testname testname_with_suffix)
add_dependencies("Build${current_subproject}" ${targetname})
set_property(TEST ${testname_with_suffix} PROPERTY LABELS "${current_subproject}")
endif()
-
-
-endmacro(ei_add_test_internal_sycl)
-
-
+ if(EIGEN_SYCL)
+ # Force include of the SYCL file at the end to avoid errors.
+ set_property(TARGET ${targetname} PROPERTY COMPUTECPP_INCLUDE_AFTER 1)
+ # Set COMPILE_FLAGS to COMPILE_DEFINITIONS instead to avoid having to duplicate the flags
+ # to the device compiler.
+ get_target_property(target_compile_flags ${targetname} COMPILE_FLAGS)
+ separate_arguments(target_compile_flags)
+ foreach(flag ${target_compile_flags})
+ if(${flag} MATCHES "^-D.*")
+ string(REPLACE "-D" "" definition_flag ${flag})
+ set_property(TARGET ${targetname} APPEND PROPERTY COMPILE_DEFINITIONS ${definition_flag})
+ list(REMOVE_ITEM target_compile_flags ${flag})
+ endif()
+ endforeach()
+ set_property(TARGET ${targetname} PROPERTY COMPILE_FLAGS ${target_compile_flags})
+ # Link against pthread and add sycl to target
+ set(THREADS_PREFER_PTHREAD_FLAG ON)
+ find_package(Threads REQUIRED)
+ target_link_libraries(${targetname} Threads::Threads)
+ add_sycl_to_target(TARGET ${targetname} SOURCES ${filename})
+ endif(EIGEN_SYCL)
+endmacro(ei_add_test_internal)
# Macro to add a test
#
# the unique mandatory parameter testname must correspond to a file
@@ -240,7 +174,7 @@ endmacro(ei_add_test_internal_sycl)
#
# If EIGEN_SPLIT_LARGE_TESTS is ON, the test is split into multiple executables
# test_<testname>_<N>
-# where N runs from 1 to the greatest occurence found in the source file. Each of these
+# where N runs from 1 to the greatest occurrence found in the source file. Each of these
# executables is built passing -DEIGEN_TEST_PART_N. This allows to split large tests
# into smaller executables.
#
@@ -260,98 +194,61 @@ macro(ei_add_test testname)
endif()
file(READ "${filename}" test_source)
- set(parts 0)
string(REGEX MATCHALL "CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+|EIGEN_SUFFIXES(;[0-9]+)+"
- occurences "${test_source}")
- string(REGEX REPLACE "CALL_SUBTEST_|EIGEN_TEST_PART_|EIGEN_SUFFIXES" "" suffixes "${occurences}")
+ occurrences "${test_source}")
+ string(REGEX REPLACE "CALL_SUBTEST_|EIGEN_TEST_PART_|EIGEN_SUFFIXES" "" suffixes "${occurrences}")
list(REMOVE_DUPLICATES suffixes)
- if(EIGEN_SPLIT_LARGE_TESTS AND suffixes)
+ set(explicit_suffixes "")
+ if( (NOT EIGEN_SPLIT_LARGE_TESTS) AND suffixes)
+ # Check whether we have EIGEN_TEST_PART_* statements, in which case we likely must enforce splitting.
+ # For instance, indexed_view activate a different c++ version for each part.
+ string(REGEX MATCHALL "EIGEN_TEST_PART_[0-9]+" occurrences "${test_source}")
+ string(REGEX REPLACE "EIGEN_TEST_PART_" "" explicit_suffixes "${occurrences}")
+ list(REMOVE_DUPLICATES explicit_suffixes)
+ endif()
+ if( (EIGEN_SPLIT_LARGE_TESTS AND suffixes) OR explicit_suffixes)
add_custom_target(${testname})
foreach(suffix ${suffixes})
ei_add_test_internal(${testname} ${testname}_${suffix}
"${ARGV1} -DEIGEN_TEST_PART_${suffix}=1" "${ARGV2}")
add_dependencies(${testname} ${testname}_${suffix})
- endforeach(suffix)
- else(EIGEN_SPLIT_LARGE_TESTS AND suffixes)
- set(symbols_to_enable_all_parts "")
- foreach(suffix ${suffixes})
- set(symbols_to_enable_all_parts
- "${symbols_to_enable_all_parts} -DEIGEN_TEST_PART_${suffix}=1")
- endforeach(suffix)
- ei_add_test_internal(${testname} ${testname} "${ARGV1} ${symbols_to_enable_all_parts}" "${ARGV2}")
- endif(EIGEN_SPLIT_LARGE_TESTS AND suffixes)
-endmacro(ei_add_test)
-
-macro(ei_add_test_sycl testname)
- get_property(EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST)
- set(EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}${testname}\n")
- set_property(GLOBAL PROPERTY EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}")
-
- if(EIGEN_ADD_TEST_FILENAME_EXTENSION)
- set(filename ${testname}.${EIGEN_ADD_TEST_FILENAME_EXTENSION})
+ endforeach()
else()
- set(filename ${testname}.cpp)
+ ei_add_test_internal(${testname} ${testname} "${ARGV1} -DEIGEN_TEST_PART_ALL=1" "${ARGV2}")
endif()
-
- file(READ "${filename}" test_source)
- set(parts 0)
- string(REGEX MATCHALL "CALL_SUBTEST_[0-9]+|EIGEN_TEST_PART_[0-9]+|EIGEN_SUFFIXES(;[0-9]+)+"
- occurences "${test_source}")
- string(REGEX REPLACE "CALL_SUBTEST_|EIGEN_TEST_PART_|EIGEN_SUFFIXES" "" suffixes "${occurences}")
- list(REMOVE_DUPLICATES suffixes)
- if(EIGEN_SPLIT_LARGE_TESTS AND suffixes)
- add_custom_target(${testname})
- foreach(suffix ${suffixes})
- ei_add_test_internal_sycl(${testname} ${testname}_${suffix}
- "${ARGV1} -DEIGEN_TEST_PART_${suffix}=1" "${ARGV2}")
- add_dependencies(${testname} ${testname}_${suffix})
- endforeach(suffix)
- else(EIGEN_SPLIT_LARGE_TESTS AND suffixes)
- set(symbols_to_enable_all_parts "")
- foreach(suffix ${suffixes})
- set(symbols_to_enable_all_parts
- "${symbols_to_enable_all_parts} -DEIGEN_TEST_PART_${suffix}=1")
- endforeach(suffix)
- ei_add_test_internal_sycl(${testname} ${testname} "${ARGV1} ${symbols_to_enable_all_parts}" "${ARGV2}")
- endif(EIGEN_SPLIT_LARGE_TESTS AND suffixes)
-endmacro(ei_add_test_sycl)
+endmacro()
# adds a failtest, i.e. a test that succeed if the program fails to compile
# note that the test runner for these is CMake itself, when passed -DEIGEN_FAILTEST=ON
# so here we're just running CMake commands immediately, we're not adding any targets.
macro(ei_add_failtest testname)
- get_property(EIGEN_FAILTEST_FAILURE_COUNT GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT)
- get_property(EIGEN_FAILTEST_COUNT GLOBAL PROPERTY EIGEN_FAILTEST_COUNT)
- message(STATUS "Checking failtest: ${testname}")
- set(filename "${testname}.cpp")
- file(READ "${filename}" test_source)
+ set(test_target_ok ${testname}_ok)
+ set(test_target_ko ${testname}_ko)
- try_compile(succeeds_when_it_should_fail
- "${CMAKE_CURRENT_BINARY_DIR}"
- "${CMAKE_CURRENT_SOURCE_DIR}/${filename}"
- COMPILE_DEFINITIONS "-DEIGEN_SHOULD_FAIL_TO_BUILD")
- if (succeeds_when_it_should_fail)
- message(STATUS "FAILED: ${testname} build succeeded when it should have failed")
- endif()
+ # Add executables
+ add_executable(${test_target_ok} ${testname}.cpp)
+ add_executable(${test_target_ko} ${testname}.cpp)
- try_compile(succeeds_when_it_should_succeed
- "${CMAKE_CURRENT_BINARY_DIR}"
- "${CMAKE_CURRENT_SOURCE_DIR}/${filename}"
- COMPILE_DEFINITIONS)
- if (NOT succeeds_when_it_should_succeed)
- message(STATUS "FAILED: ${testname} build failed when it should have succeeded")
- endif()
+ # Remove them from the normal build process
+ set_target_properties(${test_target_ok} ${test_target_ko} PROPERTIES
+ EXCLUDE_FROM_ALL TRUE
+ EXCLUDE_FROM_DEFAULT_BUILD TRUE)
- if (succeeds_when_it_should_fail OR NOT succeeds_when_it_should_succeed)
- math(EXPR EIGEN_FAILTEST_FAILURE_COUNT ${EIGEN_FAILTEST_FAILURE_COUNT}+1)
- endif()
+ # Configure the failing test
+ target_compile_definitions(${test_target_ko} PRIVATE EIGEN_SHOULD_FAIL_TO_BUILD)
- math(EXPR EIGEN_FAILTEST_COUNT ${EIGEN_FAILTEST_COUNT}+1)
+ # Add the tests to ctest.
+ add_test(NAME ${test_target_ok}
+ COMMAND ${CMAKE_COMMAND} --build . --target ${test_target_ok} --config $<CONFIGURATION>
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+ add_test(NAME ${test_target_ko}
+ COMMAND ${CMAKE_COMMAND} --build . --target ${test_target_ko} --config $<CONFIGURATION>
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
- set_property(GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT ${EIGEN_FAILTEST_FAILURE_COUNT})
- set_property(GLOBAL PROPERTY EIGEN_FAILTEST_COUNT ${EIGEN_FAILTEST_COUNT})
-endmacro(ei_add_failtest)
+ # Expect the second test to fail
+ set_tests_properties(${test_target_ko} PROPERTIES WILL_FAIL TRUE)
+endmacro()
# print a summary of the different options
macro(ei_testing_print_summary)
@@ -418,6 +315,12 @@ macro(ei_testing_print_summary)
message(STATUS "AVX: Using architecture defaults")
endif()
+ if(EIGEN_TEST_AVX2)
+ message(STATUS "AVX2: ON")
+ else()
+ message(STATUS "AVX2: Using architecture defaults")
+ endif()
+
if(EIGEN_TEST_FMA)
message(STATUS "FMA: ON")
else()
@@ -430,6 +333,12 @@ macro(ei_testing_print_summary)
message(STATUS "AVX512: Using architecture defaults")
endif()
+ if(EIGEN_TEST_AVX512DQ)
+ message(STATUS "AVX512DQ: ON")
+ else()
+ message(STATUS "AVX512DQ: Using architecture defaults")
+ endif()
+
if(EIGEN_TEST_ALTIVEC)
message(STATUS "Altivec: ON")
else()
@@ -442,6 +351,12 @@ macro(ei_testing_print_summary)
message(STATUS "VSX: Using architecture defaults")
endif()
+ if(EIGEN_TEST_MSA)
+ message(STATUS "MIPS MSA: ON")
+ else()
+ message(STATUS "MIPS MSA: Using architecture defaults")
+ endif()
+
if(EIGEN_TEST_NEON)
message(STATUS "ARM NEON: ON")
else()
@@ -467,7 +382,11 @@ macro(ei_testing_print_summary)
endif()
if(EIGEN_TEST_SYCL)
- message(STATUS "SYCL: ON")
+ if(EIGEN_SYCL_TRISYCL)
+ message(STATUS "SYCL: ON (using triSYCL)")
+ else()
+ message(STATUS "SYCL: ON (using computeCPP)")
+ endif()
else()
message(STATUS "SYCL: OFF")
endif()
@@ -480,13 +399,18 @@ macro(ei_testing_print_summary)
else()
message(STATUS "CUDA: OFF")
endif()
+ if(EIGEN_TEST_HIP)
+ message(STATUS "HIP: ON (using hipcc)")
+ else()
+ message(STATUS "HIP: OFF")
+ endif()
endif() # vectorization / alignment options
message(STATUS "\n${EIGEN_TESTING_SUMMARY}")
message(STATUS "************************************************************")
-endmacro(ei_testing_print_summary)
+endmacro()
macro(ei_init_testing)
define_property(GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT BRIEF_DOCS " " FULL_DOCS " ")
@@ -494,11 +418,13 @@ macro(ei_init_testing)
define_property(GLOBAL PROPERTY EIGEN_MISSING_BACKENDS BRIEF_DOCS " " FULL_DOCS " ")
define_property(GLOBAL PROPERTY EIGEN_TESTING_SUMMARY BRIEF_DOCS " " FULL_DOCS " ")
define_property(GLOBAL PROPERTY EIGEN_TESTS_LIST BRIEF_DOCS " " FULL_DOCS " ")
+ define_property(GLOBAL PROPERTY EIGEN_SUBTESTS_LIST BRIEF_DOCS " " FULL_DOCS " ")
set_property(GLOBAL PROPERTY EIGEN_TESTED_BACKENDS "")
set_property(GLOBAL PROPERTY EIGEN_MISSING_BACKENDS "")
set_property(GLOBAL PROPERTY EIGEN_TESTING_SUMMARY "")
set_property(GLOBAL PROPERTY EIGEN_TESTS_LIST "")
+ set_property(GLOBAL PROPERTY EIGEN_SUBTESTS_LIST "")
define_property(GLOBAL PROPERTY EIGEN_FAILTEST_FAILURE_COUNT BRIEF_DOCS " " FULL_DOCS " ")
define_property(GLOBAL PROPERTY EIGEN_FAILTEST_COUNT BRIEF_DOCS " " FULL_DOCS " ")
@@ -508,7 +434,7 @@ macro(ei_init_testing)
# uncomment anytime you change the ei_get_compilerver_from_cxx_version_string macro
# ei_test_get_compilerver_from_cxx_version_string()
-endmacro(ei_init_testing)
+endmacro()
macro(ei_set_sitename)
# if the sitename is not yet set, try to set it
@@ -525,7 +451,7 @@ macro(ei_set_sitename)
if(SITE)
string(TOLOWER ${SITE} SITE)
endif()
-endmacro(ei_set_sitename)
+endmacro()
macro(ei_get_compilerver VAR)
if(MSVC)
@@ -538,6 +464,8 @@ macro(ei_get_compilerver VAR)
else()
set(${VAR} "na")
endif()
+ elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "PGI")
+ set(${VAR} "${CMAKE_CXX_COMPILER_ID}-${CMAKE_CXX_COMPILER_VERSION}")
else()
# on all other system we rely on ${CMAKE_CXX_COMPILER}
# supporting a "--version" or "/version" flag
@@ -550,18 +478,20 @@ macro(ei_get_compilerver VAR)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${EIGEN_CXX_FLAG_VERSION}
OUTPUT_VARIABLE eigen_cxx_compiler_version_string OUTPUT_STRIP_TRAILING_WHITESPACE)
+ string(REGEX REPLACE "^[ \n\r]+" "" eigen_cxx_compiler_version_string ${eigen_cxx_compiler_version_string})
string(REGEX REPLACE "[\n\r].*" "" eigen_cxx_compiler_version_string ${eigen_cxx_compiler_version_string})
ei_get_compilerver_from_cxx_version_string("${eigen_cxx_compiler_version_string}" CNAME CVER)
set(${VAR} "${CNAME}-${CVER}")
endif()
-endmacro(ei_get_compilerver)
+endmacro()
# Extract compiler name and version from a raw version string
-# WARNING: if you edit thid macro, then please test it by uncommenting
+# WARNING: if you edit this macro, then please test it by uncommenting
# the testing macro call in ei_init_testing() of the EigenTesting.cmake file.
-# See also the ei_test_get_compilerver_from_cxx_version_string macro at the end of the file
+# See also the ei_test_get_compilerver_from_cxx_version_string macro at the end
+# of the file
macro(ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER)
# extract possible compiler names
string(REGEX MATCH "g\\+\\+" ei_has_gpp ${VERSTRING})
@@ -569,6 +499,7 @@ macro(ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER)
string(REGEX MATCH "gcc|GCC" ei_has_gcc ${VERSTRING})
string(REGEX MATCH "icpc|ICC" ei_has_icpc ${VERSTRING})
string(REGEX MATCH "clang|CLANG" ei_has_clang ${VERSTRING})
+ string(REGEX MATCH "mingw32" ei_has_mingw ${VERSTRING})
# combine them
if((ei_has_llvm) AND (ei_has_gpp OR ei_has_gcc))
@@ -577,6 +508,8 @@ macro(ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER)
set(${CNAME} "llvm-clang++")
elseif(ei_has_clang)
set(${CNAME} "clang++")
+ elseif ((ei_has_mingw) AND (ei_has_gpp OR ei_has_gcc))
+ set(${CNAME} "mingw32-g++")
elseif(ei_has_icpc)
set(${CNAME} "icpc")
elseif(ei_has_gpp OR ei_has_gcc)
@@ -597,15 +530,21 @@ macro(ei_get_compilerver_from_cxx_version_string VERSTRING CNAME CVER)
if(NOT eicver)
# try to extract 2:
string(REGEX MATCH "[^0-9][0-9]+\\.[0-9]+" eicver ${VERSTRING})
- else()
- set(eicver " _")
+ if (NOT eicver AND ei_has_mingw)
+ # try to extract 1 number plus suffix:
+ string(REGEX MATCH "[^0-9][0-9]+-win32" eicver ${VERSTRING})
+ endif()
endif()
endif()
endif()
+
+ if (NOT eicver)
+ set(eicver " _")
+ endif()
string(REGEX REPLACE ".(.*)" "\\1" ${CVER} ${eicver})
-endmacro(ei_get_compilerver_from_cxx_version_string)
+endmacro()
macro(ei_get_cxxflags VAR)
set(${VAR} "")
@@ -634,6 +573,8 @@ macro(ei_get_cxxflags VAR)
set(${VAR} SSE3)
elseif(EIGEN_TEST_SSE2 OR IS_64BIT_ENV)
set(${VAR} SSE2)
+ elseif(EIGEN_TEST_MSA)
+ set(${VAR} MSA)
endif()
if(EIGEN_TEST_OPENMP)
@@ -651,7 +592,7 @@ macro(ei_get_cxxflags VAR)
set(${VAR} ${${VAR}}-ROWMAJ)
endif()
endif()
-endmacro(ei_get_cxxflags)
+endmacro()
macro(ei_set_build_string)
ei_get_compilerver(LOCAL_COMPILER_VERSION)
@@ -666,6 +607,10 @@ macro(ei_set_build_string)
set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-${LOCAL_COMPILER_FLAGS})
endif()
+ if(EIGEN_TEST_EXTERNAL_BLAS)
+ set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-external_blas)
+ endif()
+
ei_is_64bit_env(IS_64BIT_ENV)
if(NOT IS_64BIT_ENV)
set(TMP_BUILD_STRING ${TMP_BUILD_STRING}-32bit)
@@ -682,7 +627,7 @@ macro(ei_set_build_string)
endif()
string(TOLOWER ${TMP_BUILD_STRING} BUILDNAME)
-endmacro(ei_set_build_string)
+endmacro()
macro(ei_is_64bit_env VAR)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@@ -692,7 +637,7 @@ macro(ei_is_64bit_env VAR)
else()
message(WARNING "Unsupported pointer size. Please contact the authors.")
endif()
-endmacro(ei_is_64bit_env)
+endmacro()
# helper macro for testing ei_get_compilerver_from_cxx_version_string
@@ -705,7 +650,7 @@ macro(ei_test1_get_compilerver_from_cxx_version_string STR REFNAME REFVER)
message("STATUS ei_get_compilerver_from_cxx_version_string error:")
message("Expected \"${REFNAME}-${REFVER}\", got \"${CNAME}-${CVER}\"")
endif()
-endmacro(ei_test1_get_compilerver_from_cxx_version_string)
+endmacro()
# macro for testing ei_get_compilerver_from_cxx_version_string
# feel free to add more version strings
@@ -720,4 +665,118 @@ macro(ei_test_get_compilerver_from_cxx_version_string)
ei_test1_get_compilerver_from_cxx_version_string("i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)" "llvm-g++" "4.2.1")
ei_test1_get_compilerver_from_cxx_version_string("g++-mp-4.4 (GCC) 4.4.6" "g++" "4.4.6")
ei_test1_get_compilerver_from_cxx_version_string("g++-mp-4.4 (GCC) 2011" "g++" "4.4")
-endmacro(ei_test_get_compilerver_from_cxx_version_string)
+ ei_test1_get_compilerver_from_cxx_version_string("x86_64-w64-mingw32-g++ (GCC) 10-win32 20210110" "mingw32-g++" "10-win32")
+endmacro()
+
+# Split all tests listed in EIGEN_TESTS_LIST into num_splits many targets
+# named buildtestspartN with N = { 0, ..., num_splits-1}.
+#
+# The intention behind the existance of this macro is the size of Eigen's
+# testsuite. Together with the relativly big compile-times building all tests
+# can take a substantial amount of time depending on the available hardware.
+#
+# The last buildtestspartN target will build possible remaining tests.
+#
+# An example:
+#
+# EIGEN_TESTS_LIST= [ test1, test2, test3, test4, test5, test6, test7 ]
+#
+# A call to ei_split_testsuite(3) creates the following targets with dependencies
+#
+# Target Dependencies
+# ------ ------------
+# buildtestspart0 test1, test2
+# buildtestspart1 test3, test4
+# buildtestspart2 test5, test6, test7
+#
+macro(ei_split_testsuite num_splits)
+ get_property(EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST)
+
+ # Translate EIGEN_TESTS_LIST into a CMake list
+ string(REGEX REPLACE "\n" " " EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}")
+ set(EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}")
+ separate_arguments(EIGEN_TESTS_LIST)
+
+ set(eigen_test_count "0")
+ foreach(t IN ITEMS ${EIGEN_TESTS_LIST})
+ math(EXPR eigen_test_count "${eigen_test_count}+1")
+ endforeach()
+
+ # Get number of tests per target
+ math(EXPR num_tests_per_target "${eigen_test_count}/${num_splits} - ${eigen_test_count}/${num_splits} % 1")
+
+ set(test_idx "0")
+ math(EXPR target_bound "${num_splits}-1")
+ foreach(part RANGE "0" "${target_bound}")
+ # Create target
+ set(current_target "buildtestspart${part}")
+ add_custom_target("${current_target}")
+ math(EXPR upper_bound "${test_idx} + ${num_tests_per_target} - 1")
+ foreach(test_idx RANGE "${test_idx}" "${upper_bound}")
+ list(GET EIGEN_TESTS_LIST "${test_idx}" curr_test)
+ add_dependencies("${current_target}" "${curr_test}")
+ endforeach()
+ math(EXPR test_idx "${test_idx} + ${num_tests_per_target}")
+ endforeach()
+
+ # Handle the possibly remaining tests
+ math(EXPR test_idx "${num_splits} * ${num_tests_per_target}")
+ math(EXPR target_bound "${eigen_test_count} - 1")
+ foreach(test_idx RANGE "${test_idx}" "${target_bound}")
+ list(GET EIGEN_TESTS_LIST "${test_idx}" curr_test)
+ add_dependencies("${current_target}" "${curr_test}")
+ endforeach()
+endmacro(ei_split_testsuite num_splits)
+
+# Defines the custom command buildsmoketests to build a number of tests
+# specified in smoke_test_list.
+#
+# Test in smoke_test_list can be either test targets (e.g. packetmath) or
+# subtests targets (e.g. packetmath_2). If any of the test are not available
+# in the current configuration they are just skipped.
+#
+# All tests added via this macro are labeled with the smoketest label. This
+# allows running smoketests only using ctest.
+#
+# Smoke tests are intended to be run before the whole test suite is invoked,
+# e.g., to smoke test patches.
+macro(ei_add_smoke_tests smoke_test_list)
+ # Set the build target to build smoketests
+ set(buildtarget "buildsmoketests")
+ add_custom_target("${buildtarget}")
+
+ # Get list of all tests and translate it into a CMake list
+ get_property(EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST)
+ string(REGEX REPLACE "\n" " " EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}")
+ set(EIGEN_TESTS_LIST "${EIGEN_TESTS_LIST}")
+ separate_arguments(EIGEN_TESTS_LIST)
+
+ # Check if the test in smoke_test_list is a currently valid test target
+ foreach(test IN ITEMS ${smoke_test_list})
+ # Add tests in smoke_test_list to our smoke test target but only if the test
+ # is currently available, i.e., is in EIGEN_SUBTESTS_LIST
+ if ("${test}" IN_LIST EIGEN_TESTS_LIST)
+ add_dependencies("${buildtarget}" "${test}")
+ # In the case of a test we match all subtests
+ set(ctest_regex "${ctest_regex}^${test}_[0-9]+$$|")
+ endif()
+ endforeach()
+
+ # Get list of all subtests and translate it into a CMake list
+ get_property(EIGEN_SUBTESTS_LIST GLOBAL PROPERTY EIGEN_SUBTESTS_LIST)
+ string(REGEX REPLACE "\n" " " EIGEN_SUBTESTS_LIST "${EIGEN_SUBTESTS_LIST}")
+ set(EIGEN_SUBTESTS_LIST "${EIGEN_SUBTESTS_LIST}")
+ separate_arguments(EIGEN_SUBTESTS_LIST)
+
+ # Check if the test in smoke_test_list is a currently valid subtest target
+ foreach(test IN ITEMS ${smoke_test_list})
+ # Add tests in smoke_test_list to our smoke test target but only if the test
+ # is currently available, i.e., is in EIGEN_SUBTESTS_LIST
+ if ("${test}" IN_LIST EIGEN_SUBTESTS_LIST)
+ add_dependencies("${buildtarget}" "${test}")
+ # Add label smoketest to be able to run smoketests using ctest
+ get_property(test_labels TEST ${test} PROPERTY LABELS)
+ set_property(TEST ${test} PROPERTY LABELS "${test_labels};smoketest")
+ endif()
+ endforeach()
+endmacro(ei_add_smoke_tests)
diff --git a/cmake/EigenUninstall.cmake b/cmake/EigenUninstall.cmake
index 4dae8c85c..5e63c98d9 100644
--- a/cmake/EigenUninstall.cmake
+++ b/cmake/EigenUninstall.cmake
@@ -27,7 +27,7 @@ if(EXISTS ${MANIFEST})
else()
message(STATUS "File '${file}' does not exist.")
endif()
- endforeach(file)
+ endforeach()
message(STATUS "========== Finished Uninstalling Eigen ==============")
else()
diff --git a/cmake/FindAdolc.cmake b/cmake/FindAdolc.cmake
index 937e54990..13c59fcf7 100644
--- a/cmake/FindAdolc.cmake
+++ b/cmake/FindAdolc.cmake
@@ -1,20 +1,20 @@
if (ADOLC_INCLUDES AND ADOLC_LIBRARIES)
set(ADOLC_FIND_QUIETLY TRUE)
-endif (ADOLC_INCLUDES AND ADOLC_LIBRARIES)
+endif ()
find_path(ADOLC_INCLUDES
- NAMES
- adolc/adtl.h
- PATHS
- $ENV{ADOLCDIR}
- ${INCLUDE_INSTALL_DIR}
+ NAMES adolc/adtl.h
+ PATHS $ENV{ADOLCDIR} $ENV{ADOLCDIR}/include ${INCLUDE_INSTALL_DIR}
)
-find_library(ADOLC_LIBRARIES adolc PATHS $ENV{ADOLCDIR} ${LIB_INSTALL_DIR})
+find_library(ADOLC_LIBRARIES
+ adolc
+ PATHS $ENV{ADOLCDIR} ${LIB_INSTALL_DIR}
+ PATH_SUFFIXES lib lib64)
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(ADOLC DEFAULT_MSG
+find_package_handle_standard_args(Adolc DEFAULT_MSG
ADOLC_INCLUDES ADOLC_LIBRARIES)
mark_as_advanced(ADOLC_INCLUDES ADOLC_LIBRARIES)
diff --git a/cmake/FindBLAS.cmake b/cmake/FindBLAS.cmake
index 9f74b07fe..1bb8f1965 100644
--- a/cmake/FindBLAS.cmake
+++ b/cmake/FindBLAS.cmake
@@ -147,12 +147,13 @@ mark_as_advanced(BLAS_VERBOSE)
include(CheckFunctionExists)
include(CheckFortranFunctionExists)
+include(CMakeFindDependencyMacro)
set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
# Check the language being used
get_property( _LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES )
-if( _LANGUAGES_ MATCHES Fortran )
+if( _LANGUAGES_ MATCHES Fortran AND CMAKE_Fortran_COMPILER)
set( _CHECK_FORTRAN TRUE )
elseif( (_LANGUAGES_ MATCHES C) OR (_LANGUAGES_ MATCHES CXX) )
set( _CHECK_FORTRAN FALSE )
@@ -270,8 +271,8 @@ macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread)
endif ()
set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
- endif(_libraries_work)
- endforeach(_library ${_list})
+ endif()
+ endforeach()
if(_libraries_work)
# Test this combination of libraries.
@@ -310,11 +311,11 @@ macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread)
if(_libraries_work)
set(${LIBRARIES} ${${LIBRARIES}} ${_thread})
- else(_libraries_work)
+ else()
set(${LIBRARIES} FALSE)
- endif(_libraries_work)
+ endif()
-endmacro(Check_Fortran_Libraries)
+endmacro()
set(BLAS_LINKER_FLAGS)
@@ -438,7 +439,7 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
if (OMP_gomp_LIBRARY)
set(OMP_LIB "${OMP_gomp_LIBRARY}")
endif()
- else(CMAKE_C_COMPILER_ID STREQUAL "Intel")
+ else()
if (OMP_iomp5_LIBRARY)
set(OMP_LIB "${OMP_iomp5_LIBRARY}")
endif()
@@ -509,9 +510,9 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
- find_package(Threads)
+ find_dependency(Threads)
else()
- find_package(Threads REQUIRED)
+ find_dependency(Threads REQUIRED)
endif()
set(BLAS_SEARCH_LIBS "")
@@ -560,7 +561,7 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
"${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
endforeach()
endforeach()
- else (WIN32)
+ else ()
if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
list(APPEND BLAS_SEARCH_LIBS
"mkl_blas95 mkl_intel mkl_intel_thread mkl_core guide")
@@ -586,9 +587,9 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
set(OMP_LIB "")
endif()
endif ()
- endif (WIN32)
+ endif ()
- else (BLA_F95)
+ else ()
set(BLAS_mkl_SEARCH_SYMBOL sgemm)
set(_LIBRARIES BLAS_LIBRARIES)
@@ -632,7 +633,7 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
"${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
endforeach()
endforeach()
- else (WIN32)
+ else ()
if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
list(APPEND BLAS_SEARCH_LIBS
"mkl_intel mkl_intel_thread mkl_core guide")
@@ -667,9 +668,9 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
list(APPEND BLAS_SEARCH_LIBS
"mkl_em64t")
endif ()
- endif (WIN32)
+ endif ()
- endif (BLA_F95)
+ endif ()
foreach (IT ${BLAS_SEARCH_LIBS})
string(REPLACE " " ";" SEARCH_LIBS ${IT})
@@ -698,9 +699,9 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
if (${_LIBRARIES} AND NOT BLAS_VENDOR_FOUND)
set (BLAS_VENDOR_FOUND "Intel MKL")
endif()
- endif (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
- endif(NOT BLAS_LIBRARIES OR BLA_VENDOR MATCHES "Intel*")
-endif (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
+ endif ()
+ endif()
+endif ()
if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
@@ -727,7 +728,7 @@ if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "Goto")
endif()
-endif (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
+endif ()
# OpenBlas
@@ -755,7 +756,7 @@ if (BLA_VENDOR STREQUAL "Open" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "Openblas")
endif()
-endif (BLA_VENDOR STREQUAL "Open" OR BLA_VENDOR STREQUAL "All")
+endif ()
# EigenBlas
@@ -802,7 +803,7 @@ if (BLA_VENDOR STREQUAL "Eigen" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "Eigen")
endif()
-endif (BLA_VENDOR STREQUAL "Eigen" OR BLA_VENDOR STREQUAL "All")
+endif ()
if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
@@ -830,7 +831,7 @@ if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "Atlas")
endif()
-endif (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
+endif ()
# BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
@@ -858,7 +859,7 @@ if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "PhiPACK")
endif()
-endif (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
+endif ()
# BLAS in Alpha CXML library?
@@ -886,7 +887,7 @@ if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "CXML")
endif()
-endif (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
+endif ()
# BLAS in Alpha DXML library? (now called CXML, see above)
@@ -914,7 +915,7 @@ if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "DXML")
endif()
-endif (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
+endif ()
# BLAS in Sun Performance library?
@@ -1124,7 +1125,7 @@ if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All")
"${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" )
endif()
- endif(_ACML_ROOT)
+ endif()
elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
@@ -1229,7 +1230,7 @@ if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "ACML")
endif()
-endif (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") # ACML
+endif () # ACML
# Apple BLAS library?
@@ -1257,7 +1258,7 @@ if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "Apple Accelerate")
endif()
-endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
+endif ()
if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
@@ -1284,7 +1285,7 @@ if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "NAS")
endif()
-endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
+endif ()
# Generic BLAS library?
@@ -1316,7 +1317,7 @@ if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
set (BLAS_VENDOR_FOUND "Netlib or other Generic libblas")
endif()
-endif (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
+endif ()
if(BLA_F95)
@@ -1331,7 +1332,7 @@ if(BLA_F95)
if(BLAS95_FOUND)
message(STATUS "A library with BLAS95 API found.")
message(STATUS "BLAS_LIBRARIES ${BLAS_LIBRARIES}")
- else(BLAS95_FOUND)
+ else()
message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but blas 95 libraries could not be found or check of symbols failed."
"\nPlease indicate where to find blas libraries. You have three options:\n"
"- Option 1: Provide the installation directory of BLAS library with cmake option: -DBLAS_DIR=your/path/to/blas\n"
@@ -1349,13 +1350,13 @@ if(BLA_F95)
message(STATUS
"A library with BLAS95 API not found. Please specify library location.")
endif()
- endif(BLAS95_FOUND)
- endif(NOT BLAS_FIND_QUIETLY)
+ endif()
+ endif()
set(BLAS_FOUND TRUE)
set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
-else(BLA_F95)
+else()
if(BLAS_LIBRARIES)
set(BLAS_FOUND TRUE)
@@ -1367,7 +1368,7 @@ else(BLA_F95)
if(BLAS_FOUND)
message(STATUS "A library with BLAS API found.")
message(STATUS "BLAS_LIBRARIES ${BLAS_LIBRARIES}")
- else(BLAS_FOUND)
+ else()
message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but blas libraries could not be found or check of symbols failed."
"\nPlease indicate where to find blas libraries. You have three options:\n"
"- Option 1: Provide the installation directory of BLAS library with cmake option: -DBLAS_DIR=your/path/to/blas\n"
@@ -1385,10 +1386,10 @@ else(BLA_F95)
message(STATUS
"A library with BLAS API not found. Please specify library location.")
endif()
- endif(BLAS_FOUND)
- endif(NOT BLAS_FIND_QUIETLY)
+ endif()
+ endif()
-endif(BLA_F95)
+endif()
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
diff --git a/cmake/FindBLASEXT.cmake b/cmake/FindBLASEXT.cmake
index 0fe7fb849..69a941897 100644
--- a/cmake/FindBLASEXT.cmake
+++ b/cmake/FindBLASEXT.cmake
@@ -41,18 +41,19 @@
# License text for the above reference.)
# macro to factorize this call
+include(CMakeFindDependencyMacro)
macro(find_package_blas)
if(BLASEXT_FIND_REQUIRED)
if(BLASEXT_FIND_QUIETLY)
- find_package(BLAS REQUIRED QUIET)
+ find_dependency(BLAS REQUIRED QUIET)
else()
- find_package(BLAS REQUIRED)
+ find_dependency(BLAS REQUIRED)
endif()
else()
if(BLASEXT_FIND_QUIETLY)
- find_package(BLAS QUIET)
+ find_dependency(BLAS QUIET)
else()
- find_package(BLAS)
+ find_dependency(BLAS)
endif()
endif()
endmacro()
@@ -316,7 +317,7 @@ if(BLA_VENDOR MATCHES "Intel*")
"\n (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_SEQ_LIBRARIES
BLAS_LIBRARY_DIRS
BLAS_INCLUDE_DIRS)
@@ -324,14 +325,14 @@ if(BLA_VENDOR MATCHES "Intel*")
if(NOT BLASEXT_FIND_QUIETLY)
message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_PAR_LIBRARIES)
endif()
else()
if(NOT BLASEXT_FIND_QUIETLY)
message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_SEQ_LIBRARIES
BLAS_LIBRARY_DIRS
BLAS_INCLUDE_DIRS)
@@ -343,14 +344,14 @@ elseif(BLA_VENDOR MATCHES "ACML*")
"\n (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_SEQ_LIBRARIES
BLAS_LIBRARY_DIRS)
if(BLAS_PAR_LIBRARIES)
if(NOT BLASEXT_FIND_QUIETLY)
message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_PAR_LIBRARIES)
endif()
elseif(BLA_VENDOR MATCHES "IBMESSL*")
@@ -360,21 +361,24 @@ elseif(BLA_VENDOR MATCHES "IBMESSL*")
"\n (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_SEQ_LIBRARIES
BLAS_LIBRARY_DIRS)
if(BLAS_PAR_LIBRARIES)
if(NOT BLASEXT_FIND_QUIETLY)
message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_PAR_LIBRARIES)
endif()
else()
if(NOT BLASEXT_FIND_QUIETLY)
message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
endif()
- find_package_handle_standard_args(BLAS DEFAULT_MSG
+ find_package_handle_standard_args(BLASEXT DEFAULT_MSG
BLAS_SEQ_LIBRARIES
BLAS_LIBRARY_DIRS)
endif()
+
+# Callers expect BLAS_FOUND to be set as well.
+set(BLAS_FOUND BLASEXT_FOUND)
diff --git a/cmake/FindCholmod.cmake b/cmake/FindCHOLMOD.cmake
index 23239c300..e470cb2e0 100644
--- a/cmake/FindCholmod.cmake
+++ b/cmake/FindCHOLMOD.cmake
@@ -1,9 +1,9 @@
-# Cholmod lib usually requires linking to a blas and lapack library.
+# CHOLMOD lib usually requires linking to a blas and lapack library.
# It is up to the user of this module to find a BLAS and link to it.
if (CHOLMOD_INCLUDES AND CHOLMOD_LIBRARIES)
set(CHOLMOD_FIND_QUIETLY TRUE)
-endif (CHOLMOD_INCLUDES AND CHOLMOD_LIBRARIES)
+endif ()
find_path(CHOLMOD_INCLUDES
NAMES
@@ -29,7 +29,7 @@ if(CHOLMOD_LIBRARIES)
set(CHOLMOD_LIBRARIES FALSE)
endif ()
-endif(CHOLMOD_LIBRARIES)
+endif()
if(CHOLMOD_LIBRARIES)
@@ -40,7 +40,7 @@ if(CHOLMOD_LIBRARIES)
set(CHOLMOD_LIBRARIES FALSE)
endif ()
-endif(CHOLMOD_LIBRARIES)
+endif()
if(CHOLMOD_LIBRARIES)
@@ -51,7 +51,7 @@ if(CHOLMOD_LIBRARIES)
set(CHOLMOD_LIBRARIES FALSE)
endif ()
-endif(CHOLMOD_LIBRARIES)
+endif()
if(CHOLMOD_LIBRARIES)
@@ -62,7 +62,7 @@ if(CHOLMOD_LIBRARIES)
set(CHOLMOD_LIBRARIES FALSE)
endif ()
-endif(CHOLMOD_LIBRARIES)
+endif()
if(CHOLMOD_LIBRARIES)
@@ -71,16 +71,16 @@ if(CHOLMOD_LIBRARIES)
set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${CHOLMOD_METIS_LIBRARY})
endif ()
-endif(CHOLMOD_LIBRARIES)
+endif()
if(CHOLMOD_LIBRARIES)
find_library(SUITESPARSE_LIBRARY SuiteSparse PATHS ${CHOLMOD_LIBDIR} $ENV{CHOLMODDIR} ${LIB_INSTALL_DIR})
if (SUITESPARSE_LIBRARY)
set(CHOLMOD_LIBRARIES ${CHOLMOD_LIBRARIES} ${SUITESPARSE_LIBRARY})
- endif (SUITESPARSE_LIBRARY)
+ endif ()
-endif(CHOLMOD_LIBRARIES)
+endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CHOLMOD DEFAULT_MSG
diff --git a/cmake/FindComputeCpp.cmake b/cmake/FindComputeCpp.cmake
index 07ebed61b..1c271f0fe 100644
--- a/cmake/FindComputeCpp.cmake
+++ b/cmake/FindComputeCpp.cmake
@@ -2,7 +2,7 @@
# FindComputeCpp
#---------------
#
-# Copyright 2016 Codeplay Software Ltd.
+# Copyright 2016-2018 Codeplay Software Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use these files except in compliance with the License.
@@ -23,204 +23,359 @@
#
# Tools for finding and building with ComputeCpp.
#
-# User must define COMPUTECPP_PACKAGE_ROOT_DIR pointing to the ComputeCpp
-# installation.
+# User must define ComputeCpp_DIR pointing to the ComputeCpp
+# installation.
#
# Latest version of this file can be found at:
# https://github.com/codeplaysoftware/computecpp-sdk
-# Require CMake version 3.2.2 or higher
-cmake_minimum_required(VERSION 3.2.2)
-
-# Check that a supported host compiler can be found
-if(CMAKE_COMPILER_IS_GNUCXX)
- # Require at least gcc 4.8
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
- message(FATAL_ERROR
- "host compiler - Not found! (gcc version must be at least 4.8)")
- # Require the GCC dual ABI to be disabled for 5.1 or higher
- elseif (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.1)
- set(COMPUTECPP_DISABLE_GCC_DUAL_ABI "True")
- message(STATUS
- "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION} (note pre 5.1 gcc ABI enabled)")
- else()
- message(STATUS "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION}")
- endif()
-elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- # Require at least clang 3.6
- if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.6)
- message(FATAL_ERROR
- "host compiler - Not found! (clang version must be at least 3.6)")
- else()
- message(STATUS "host compiler - clang ${CMAKE_CXX_COMPILER_VERSION}")
- endif()
-else()
- message(WARNING
- "host compiler - Not found! (ComputeCpp supports GCC and Clang, see readme)")
-endif()
+cmake_minimum_required(VERSION 3.4.3)
+include(FindPackageHandleStandardArgs)
+include(ComputeCppIRMap)
-set(COMPUTECPP_64_BIT_DEFAULT ON)
-option(COMPUTECPP_64_BIT_CODE "Compile device code in 64 bit mode"
- ${COMPUTECPP_64_BIT_DEFAULT})
-mark_as_advanced(COMPUTECPP_64_BIT_CODE)
+set(COMPUTECPP_USER_FLAGS "" CACHE STRING "User flags for compute++")
+separate_arguments(COMPUTECPP_USER_FLAGS)
+mark_as_advanced(COMPUTECPP_USER_FLAGS)
-# Find OpenCL package
-find_package(OpenCL REQUIRED)
+set(COMPUTECPP_BITCODE "spir64" CACHE STRING
+ "Bitcode type to use as SYCL target in compute++")
+mark_as_advanced(COMPUTECPP_BITCODE)
-# Find ComputeCpp packagee
-if(NOT COMPUTECPP_PACKAGE_ROOT_DIR)
- message(FATAL_ERROR
- "ComputeCpp package - Not found! (please set COMPUTECPP_PACKAGE_ROOT_DIR")
-else()
- message(STATUS "ComputeCpp package - Found")
-endif()
-option(COMPUTECPP_PACKAGE_ROOT_DIR "Path to the ComputeCpp Package")
-
-# Obtain the path to compute++
-find_program(COMPUTECPP_DEVICE_COMPILER compute++ PATHS
- ${COMPUTECPP_PACKAGE_ROOT_DIR} PATH_SUFFIXES bin)
-if (EXISTS ${COMPUTECPP_DEVICE_COMPILER})
- mark_as_advanced(COMPUTECPP_DEVICE_COMPILER)
- message(STATUS "compute++ - Found")
-else()
- message(FATAL_ERROR "compute++ - Not found! (${COMPUTECPP_DEVICE_COMPILER})")
-endif()
+include(CMakeFindDependencyMacro)
+find_dependency(OpenCL REQUIRED)
-# Obtain the path to computecpp_info
-find_program(COMPUTECPP_INFO_TOOL computecpp_info PATHS
- ${COMPUTECPP_PACKAGE_ROOT_DIR} PATH_SUFFIXES bin)
-if (EXISTS ${COMPUTECPP_INFO_TOOL})
- mark_as_advanced(${COMPUTECPP_INFO_TOOL})
- message(STATUS "computecpp_info - Found")
-else()
- message(FATAL_ERROR "computecpp_info - Not found! (${COMPUTECPP_INFO_TOOL})")
+# Find ComputeCpp package
+
+if(DEFINED ComputeCpp_DIR)
+ set(computecpp_find_hint ${ComputeCpp_DIR})
+elseif(DEFINED ENV{COMPUTECPP_DIR})
+ set(computecpp_find_hint $ENV{COMPUTECPP_DIR})
endif()
-# Obtain the path to the ComputeCpp runtime library
-find_library(COMPUTECPP_RUNTIME_LIBRARY ComputeCpp PATHS ${COMPUTECPP_PACKAGE_ROOT_DIR}
- HINTS ${COMPUTECPP_PACKAGE_ROOT_DIR}/lib PATH_SUFFIXES lib
- DOC "ComputeCpp Runtime Library" NO_DEFAULT_PATH)
+# Used for running executables on the host
+set(computecpp_host_find_hint ${computecpp_find_hint})
-if (EXISTS ${COMPUTECPP_RUNTIME_LIBRARY})
- mark_as_advanced(COMPUTECPP_RUNTIME_LIBRARY)
- message(STATUS "libComputeCpp.so - Found")
-else()
- message(FATAL_ERROR "libComputeCpp.so - Not found!")
+if(CMAKE_CROSSCOMPILING)
+ # ComputeCpp_HOST_DIR is used to find executables that are run on the host
+ if(DEFINED ComputeCpp_HOST_DIR)
+ set(computecpp_host_find_hint ${ComputeCpp_HOST_DIR})
+ elseif(DEFINED ENV{COMPUTECPP_HOST_DIR})
+ set(computecpp_host_find_hint $ENV{COMPUTECPP_HOST_DIR})
+ endif()
endif()
-# Obtain the ComputeCpp include directory
-set(COMPUTECPP_INCLUDE_DIRECTORY ${COMPUTECPP_PACKAGE_ROOT_DIR}/include/)
-if (NOT EXISTS ${COMPUTECPP_INCLUDE_DIRECTORY})
- message(FATAL_ERROR "ComputeCpp includes - Not found!")
-else()
- message(STATUS "ComputeCpp includes - Found")
-endif()
+find_program(ComputeCpp_DEVICE_COMPILER_EXECUTABLE compute++
+ HINTS ${computecpp_host_find_hint}
+ PATH_SUFFIXES bin
+ NO_SYSTEM_ENVIRONMENT_PATH)
+
+find_program(ComputeCpp_INFO_EXECUTABLE computecpp_info
+ HINTS ${computecpp_host_find_hint}
+ PATH_SUFFIXES bin
+ NO_SYSTEM_ENVIRONMENT_PATH)
-# Obtain the package version
-execute_process(COMMAND ${COMPUTECPP_INFO_TOOL} "--dump-version"
- OUTPUT_VARIABLE COMPUTECPP_PACKAGE_VERSION
- RESULT_VARIABLE COMPUTECPP_INFO_TOOL_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
-if(NOT COMPUTECPP_INFO_TOOL_RESULT EQUAL "0")
- message(FATAL_ERROR "Package version - Error obtaining version!")
+find_library(COMPUTECPP_RUNTIME_LIBRARY
+ NAMES ComputeCpp ComputeCpp_vs2015
+ HINTS ${computecpp_find_hint}
+ PATH_SUFFIXES lib
+ DOC "ComputeCpp Runtime Library")
+
+find_library(COMPUTECPP_RUNTIME_LIBRARY_DEBUG
+ NAMES ComputeCpp_d ComputeCpp ComputeCpp_vs2015_d
+ HINTS ${computecpp_find_hint}
+ PATH_SUFFIXES lib
+ DOC "ComputeCpp Debug Runtime Library")
+
+find_path(ComputeCpp_INCLUDE_DIRS
+ NAMES "CL/sycl.hpp"
+ HINTS ${computecpp_find_hint}/include
+ DOC "The ComputeCpp include directory")
+get_filename_component(ComputeCpp_INCLUDE_DIRS ${ComputeCpp_INCLUDE_DIRS} ABSOLUTE)
+
+get_filename_component(computecpp_canonical_root_dir "${ComputeCpp_INCLUDE_DIRS}/.." ABSOLUTE)
+set(ComputeCpp_ROOT_DIR "${computecpp_canonical_root_dir}" CACHE PATH
+ "The root of the ComputeCpp install")
+
+if(NOT ComputeCpp_INFO_EXECUTABLE)
+ message(WARNING "Can't find computecpp_info - check ComputeCpp_DIR")
else()
- mark_as_advanced(COMPUTECPP_PACKAGE_VERSION)
- message(STATUS "Package version - ${COMPUTECPP_PACKAGE_VERSION}")
+ execute_process(COMMAND ${ComputeCpp_INFO_EXECUTABLE} "--dump-version"
+ OUTPUT_VARIABLE ComputeCpp_VERSION
+ RESULT_VARIABLE ComputeCpp_INFO_EXECUTABLE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(NOT ComputeCpp_INFO_EXECUTABLE_RESULT EQUAL "0")
+ message(WARNING "Package version - Error obtaining version!")
+ endif()
+
+ execute_process(COMMAND ${ComputeCpp_INFO_EXECUTABLE} "--dump-is-supported"
+ OUTPUT_VARIABLE COMPUTECPP_PLATFORM_IS_SUPPORTED
+ RESULT_VARIABLE ComputeCpp_INFO_EXECUTABLE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(NOT ComputeCpp_INFO_EXECUTABLE_RESULT EQUAL "0")
+ message(WARNING "platform - Error checking platform support!")
+ else()
+ mark_as_advanced(COMPUTECPP_PLATFORM_IS_SUPPORTED)
+ if (COMPUTECPP_PLATFORM_IS_SUPPORTED)
+ message(STATUS "platform - your system can support ComputeCpp")
+ else()
+ message(STATUS "platform - your system is not officially supported")
+ endif()
+ endif()
endif()
-# Obtain the device compiler flags
-execute_process(COMMAND ${COMPUTECPP_INFO_TOOL} "--dump-device-compiler-flags"
- OUTPUT_VARIABLE COMPUTECPP_DEVICE_COMPILER_FLAGS
- RESULT_VARIABLE COMPUTECPP_INFO_TOOL_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
-if(NOT COMPUTECPP_INFO_TOOL_RESULT EQUAL "0")
- message(FATAL_ERROR "compute++ flags - Error obtaining compute++ flags!")
-else()
- mark_as_advanced(COMPUTECPP_COMPILER_FLAGS)
- message(STATUS "compute++ flags - ${COMPUTECPP_DEVICE_COMPILER_FLAGS}")
+find_package_handle_standard_args(ComputeCpp
+ REQUIRED_VARS ComputeCpp_ROOT_DIR
+ ComputeCpp_DEVICE_COMPILER_EXECUTABLE
+ ComputeCpp_INFO_EXECUTABLE
+ COMPUTECPP_RUNTIME_LIBRARY
+ COMPUTECPP_RUNTIME_LIBRARY_DEBUG
+ ComputeCpp_INCLUDE_DIRS
+ VERSION_VAR ComputeCpp_VERSION)
+mark_as_advanced(ComputeCpp_ROOT_DIR
+ ComputeCpp_DEVICE_COMPILER_EXECUTABLE
+ ComputeCpp_INFO_EXECUTABLE
+ COMPUTECPP_RUNTIME_LIBRARY
+ COMPUTECPP_RUNTIME_LIBRARY_DEBUG
+ ComputeCpp_INCLUDE_DIRS
+ ComputeCpp_VERSION)
+
+if(NOT ComputeCpp_FOUND)
+ return()
endif()
-set(COMPUTECPP_DEVICE_COMPILER_FLAGS ${COMPUTECPP_DEVICE_COMPILER_FLAGS} -sycl-compress-name -no-serial-memop -DEIGEN_NO_ASSERTION_CHECKING=1)
+list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -O2 -mllvm -inline-threshold=1000 -intelspirmetadata)
+mark_as_advanced(COMPUTECPP_DEVICE_COMPILER_FLAGS)
-# Check if the platform is supported
-execute_process(COMMAND ${COMPUTECPP_INFO_TOOL} "--dump-is-supported"
- OUTPUT_VARIABLE COMPUTECPP_PLATFORM_IS_SUPPORTED
- RESULT_VARIABLE COMPUTECPP_INFO_TOOL_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
-if(NOT COMPUTECPP_INFO_TOOL_RESULT EQUAL "0")
- message(FATAL_ERROR "platform - Error checking platform support!")
-else()
- mark_as_advanced(COMPUTECPP_PLATFORM_IS_SUPPORTED)
- if (COMPUTECPP_PLATFORM_IS_SUPPORTED)
- message(STATUS "platform - your system can support ComputeCpp")
- else()
- message(STATUS "platform - your system CANNOT support ComputeCpp")
+if(CMAKE_CROSSCOMPILING)
+ if(NOT COMPUTECPP_DONT_USE_TOOLCHAIN)
+ list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS --gcc-toolchain=${COMPUTECPP_TOOLCHAIN_DIR})
endif()
+ list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS --sysroot=${COMPUTECPP_SYSROOT_DIR})
+ list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -target ${COMPUTECPP_TARGET_TRIPLE})
+endif()
+
+list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -sycl-target ${COMPUTECPP_BITCODE})
+message(STATUS "compute++ flags - ${COMPUTECPP_DEVICE_COMPILER_FLAGS}")
+
+include(ComputeCppCompilerChecks)
+
+if(NOT TARGET OpenCL::OpenCL)
+ add_library(OpenCL::OpenCL UNKNOWN IMPORTED)
+ set_target_properties(OpenCL::OpenCL PROPERTIES
+ IMPORTED_LOCATION "${OpenCL_LIBRARIES}"
+ INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIRS}"
+ )
+endif()
+
+if(NOT TARGET ComputeCpp::ComputeCpp)
+ add_library(ComputeCpp::ComputeCpp UNKNOWN IMPORTED)
+ set_target_properties(ComputeCpp::ComputeCpp PROPERTIES
+ IMPORTED_LOCATION_DEBUG "${COMPUTECPP_RUNTIME_LIBRARY_DEBUG}"
+ IMPORTED_LOCATION_RELWITHDEBINFO "${COMPUTECPP_RUNTIME_LIBRARY}"
+ IMPORTED_LOCATION "${COMPUTECPP_RUNTIME_LIBRARY}"
+ INTERFACE_INCLUDE_DIRECTORIES "${ComputeCpp_INCLUDE_DIRS}"
+ INTERFACE_LINK_LIBRARIES "OpenCL::OpenCL"
+ )
endif()
+# This property allows targets to specify that their sources should be
+# compiled with the integration header included after the user's
+# sources, not before (e.g. when an enum is used in a kernel name, this
+# is not technically valid SYCL code but can work with ComputeCpp)
+define_property(
+ TARGET PROPERTY COMPUTECPP_INCLUDE_AFTER
+ BRIEF_DOCS "Include integration header after user source"
+ FULL_DOCS "Changes compiler arguments such that the source file is
+ actually the integration header, and the .cpp file is included on
+ the command line so that it is seen by the compiler first. Enables
+ non-standards-conformant SYCL code to compile with ComputeCpp."
+)
+define_property(
+ TARGET PROPERTY INTERFACE_COMPUTECPP_FLAGS
+ BRIEF_DOCS "Interface compile flags to provide compute++"
+ FULL_DOCS "Set additional compile flags to pass to compute++ when compiling
+ any target which links to this one."
+)
+define_property(
+ SOURCE PROPERTY COMPUTECPP_SOURCE_FLAGS
+ BRIEF_DOCS "Source file compile flags for compute++"
+ FULL_DOCS "Set additional compile flags for compiling the SYCL integration
+ header for the given source file."
+)
+
####################
-# __build_sycl
+# __build_ir
####################
#
# Adds a custom target for running compute++ and adding a dependency for the
-# resulting integration header.
+# resulting integration header and kernel binary.
#
-# targetName : Name of the target.
-# sourceFile : Source file to be compiled.
-# binaryDir : Intermediate directory to output the integration header.
+# TARGET : Name of the target.
+# SOURCE : Source file to be compiled.
+# COUNTER : Counter included in name of custom target. Different counter
+# values prevent duplicated names of custom target when source files with
+# the same name, but located in different directories, are used for the
+# same target.
#
-function(__build_spir targetName sourceFile binaryDir)
-
- # Retrieve source file name.
- get_filename_component(sourceFileName ${sourceFile} NAME)
-
- # Set the path to the Sycl file.
- set(outputSyclFile ${binaryDir}/${sourceFileName}.sycl)
-
- # Add any user-defined include to the device compiler
- get_property(includeDirectories DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY
- INCLUDE_DIRECTORIES)
- set(device_compiler_includes "")
- foreach(directory ${includeDirectories})
- set(device_compiler_includes "-I${directory}" ${device_compiler_includes})
- endforeach()
- if (CMAKE_INCLUDE_PATH)
- foreach(directory ${CMAKE_INCLUDE_PATH})
- set(device_compiler_includes "-I${directory}"
- ${device_compiler_includes})
+function(__build_ir)
+ set(options)
+ set(one_value_args
+ TARGET
+ SOURCE
+ COUNTER
+ )
+ set(multi_value_args)
+ cmake_parse_arguments(SDK_BUILD_IR
+ "${options}"
+ "${one_value_args}"
+ "${multi_value_args}"
+ ${ARGN}
+ )
+ get_filename_component(sourceFileName ${SDK_BUILD_IR_SOURCE} NAME)
+
+ # Set the path to the integration header.
+ # The .sycl filename must depend on the target so that different targets
+ # using the same source file will be generated with a different rule.
+ set(baseSyclName ${CMAKE_CURRENT_BINARY_DIR}/${SDK_BUILD_IR_TARGET}_${sourceFileName})
+ set(outputSyclFile ${baseSyclName}.sycl)
+ set(outputDeviceFile ${baseSyclName}.${IR_MAP_${COMPUTECPP_BITCODE}})
+ set(depFileName ${baseSyclName}.sycl.d)
+
+ set(include_directories "$<TARGET_PROPERTY:${SDK_BUILD_IR_TARGET},INCLUDE_DIRECTORIES>")
+ set(compile_definitions "$<TARGET_PROPERTY:${SDK_BUILD_IR_TARGET},COMPILE_DEFINITIONS>")
+ set(generated_include_directories
+ $<$<BOOL:${include_directories}>:-I\"$<JOIN:${include_directories},\"\t-I\">\">)
+ set(generated_compile_definitions
+ $<$<BOOL:${compile_definitions}>:-D$<JOIN:${compile_definitions},\t-D>>)
+
+ # Obtain language standard of the file
+ set(device_compiler_cxx_standard)
+ get_target_property(targetCxxStandard ${SDK_BUILD_IR_TARGET} CXX_STANDARD)
+ if (targetCxxStandard MATCHES 17)
+ set(device_compiler_cxx_standard "-std=c++1z")
+ elseif (targetCxxStandard MATCHES 14)
+ set(device_compiler_cxx_standard "-std=c++14")
+ elseif (targetCxxStandard MATCHES 11)
+ set(device_compiler_cxx_standard "-std=c++11")
+ elseif (targetCxxStandard MATCHES 98)
+ message(FATAL_ERROR "SYCL applications cannot be compiled using C++98")
+ else ()
+ set(device_compiler_cxx_standard "")
+ endif()
+
+ get_property(source_compile_flags
+ SOURCE ${SDK_BUILD_IR_SOURCE}
+ PROPERTY COMPUTECPP_SOURCE_FLAGS
+ )
+ separate_arguments(source_compile_flags)
+ if(source_compile_flags)
+ list(APPEND computecpp_source_flags ${source_compile_flags})
+ endif()
+
+ list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS
+ ${device_compiler_cxx_standard}
+ ${COMPUTECPP_USER_FLAGS}
+ ${computecpp_source_flags}
+ )
+
+ set(ir_dependencies ${SDK_BUILD_IR_SOURCE})
+ get_target_property(target_libraries ${SDK_BUILD_IR_TARGET} LINK_LIBRARIES)
+ if(target_libraries)
+ foreach(library ${target_libraries})
+ if(TARGET ${library})
+ list(APPEND ir_dependencies ${library})
+ endif()
endforeach()
endif()
- # Convert argument list format
- separate_arguments(COMPUTECPP_DEVICE_COMPILER_FLAGS)
+ # Depfile support was only added in CMake 3.7
+ # CMake throws an error if it is unsupported by the generator (i. e. not ninja)
+ if((NOT CMAKE_VERSION VERSION_LESS 3.7.0) AND
+ CMAKE_GENERATOR MATCHES "Ninja")
+ file(RELATIVE_PATH relOutputFile ${CMAKE_BINARY_DIR} ${outputDeviceFile})
+ set(generate_depfile -MMD -MF ${depFileName} -MT ${relOutputFile})
+ set(enable_depfile DEPFILE ${depFileName})
+ endif()
# Add custom command for running compute++
add_custom_command(
- OUTPUT ${outputSyclFile}
- COMMAND ${COMPUTECPP_DEVICE_COMPILER}
+ OUTPUT ${outputDeviceFile} ${outputSyclFile}
+ COMMAND ${ComputeCpp_DEVICE_COMPILER_EXECUTABLE}
${COMPUTECPP_DEVICE_COMPILER_FLAGS}
- -isystem ${COMPUTECPP_INCLUDE_DIRECTORY}
- ${COMPUTECPP_PLATFORM_SPECIFIC_ARGS}
- ${device_compiler_includes}
- -o ${outputSyclFile}
- -c ${CMAKE_CURRENT_SOURCE_DIR}/${sourceFile}
- DEPENDS ${sourceFile}
- WORKING_DIRECTORY ${binaryDir}
- COMMENT "Building ComputeCpp integration header file ${outputSyclFile}")
-
- # Add a custom target for the generated integration header
- add_custom_target(${targetName}_integration_header DEPENDS ${outputSyclFile})
-
- # Add a dependency on the integration header
- add_dependencies(${targetName} ${targetName}_integration_header)
-
- # Set the host compiler C++ standard to C++11
- set_property(TARGET ${targetName} PROPERTY CXX_STANDARD 11)
-
- # Disable GCC dual ABI on GCC 5.1 and higher
- if(COMPUTECPP_DISABLE_GCC_DUAL_ABI)
- set_property(TARGET ${targetName} APPEND PROPERTY COMPILE_DEFINITIONS
- "_GLIBCXX_USE_CXX11_ABI=0")
+ ${generated_include_directories}
+ ${generated_compile_definitions}
+ -sycl-ih ${outputSyclFile}
+ -o ${outputDeviceFile}
+ -c ${SDK_BUILD_IR_SOURCE}
+ ${generate_depfile}
+ DEPENDS ${ir_dependencies}
+ IMPLICIT_DEPENDS CXX ${SDK_BUILD_IR_SOURCE}
+ ${enable_depfile}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Building ComputeCpp integration header file ${outputSyclFile}")
+
+ # Name: (user-defined name)_(source file)_(counter)_ih
+ set(headerTargetName
+ ${SDK_BUILD_IR_TARGET}_${sourceFileName}_${SDK_BUILD_IR_COUNTER}_ih)
+
+ if(NOT MSVC)
+ # Add a custom target for the generated integration header
+ add_custom_target(${headerTargetName} DEPENDS ${outputDeviceFile} ${outputSyclFile})
+ add_dependencies(${SDK_BUILD_IR_TARGET} ${headerTargetName})
+ endif()
+
+ # This property can be set on a per-target basis to indicate that the
+ # integration header should appear after the main source listing
+ get_target_property(includeAfter ${SDK_ADD_SYCL_TARGET} COMPUTECPP_INCLUDE_AFTER)
+
+ if(includeAfter)
+ # Change the source file to the integration header - e.g.
+ # g++ -c source_file_name.cpp.sycl
+ get_target_property(current_sources ${SDK_BUILD_IR_TARGET} SOURCES)
+ # Remove absolute path to source file
+ list(REMOVE_ITEM current_sources ${SDK_BUILD_IR_SOURCE})
+ # Remove relative path to source file
+ string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" ""
+ rel_source_file ${SDK_BUILD_IR_SOURCE}
+ )
+ list(REMOVE_ITEM current_sources ${rel_source_file})
+ # Add SYCL header to source list
+ list(APPEND current_sources ${outputSyclFile})
+ set_property(TARGET ${SDK_BUILD_IR_TARGET}
+ PROPERTY SOURCES ${current_sources})
+ # CMake/gcc don't know what language a .sycl file is, so tell them
+ set_property(SOURCE ${outputSyclFile} PROPERTY LANGUAGE CXX)
+ set(includedFile ${SDK_BUILD_IR_SOURCE})
+ set(cppFile ${outputSyclFile})
+ else()
+ set_property(SOURCE ${outputSyclFile} PROPERTY HEADER_FILE_ONLY ON)
+ set(includedFile ${outputSyclFile})
+ set(cppFile ${SDK_BUILD_IR_SOURCE})
+ endif()
+
+ # Force inclusion of the integration header for the host compiler
+ if(MSVC)
+ # Group SYCL files inside Visual Studio
+ source_group("SYCL" FILES ${outputSyclFile})
+
+ if(includeAfter)
+ # Allow the source file to be edited using Visual Studio.
+ # It will be added as a header file so it won't be compiled.
+ set_property(SOURCE ${SDK_BUILD_IR_SOURCE} PROPERTY HEADER_FILE_ONLY true)
+ endif()
+
+ # Add both source and the sycl files to the VS solution.
+ target_sources(${SDK_BUILD_IR_TARGET} PUBLIC ${SDK_BUILD_IR_SOURCE} ${outputSyclFile})
+
+ set(forceIncludeFlags "/FI${includedFile} /TP")
+ else()
+ set(forceIncludeFlags "-include ${includedFile} -x c++")
endif()
-endfunction()
+ set_property(
+ SOURCE ${cppFile}
+ APPEND_STRING PROPERTY COMPILE_FLAGS "${forceIncludeFlags}"
+ )
+
+endfunction(__build_ir)
#######################
# add_sycl_to_target
@@ -229,17 +384,72 @@ endfunction()
# Adds a SYCL compilation custom command associated with an existing
# target and sets a dependancy on that new command.
#
-# targetName : Name of the target to add a SYCL to.
-# sourceFile : Source file to be compiled for SYCL.
-# binaryDir : Intermediate directory to output the integration header.
+# TARGET : Name of the target to add SYCL to.
+# SOURCES : Source files to be compiled for SYCL.
#
-function(add_sycl_to_target targetName sourceFile binaryDir)
+function(add_sycl_to_target)
+ set(options)
+ set(one_value_args
+ TARGET
+ )
+ set(multi_value_args
+ SOURCES
+ )
+ cmake_parse_arguments(SDK_ADD_SYCL
+ "${options}"
+ "${one_value_args}"
+ "${multi_value_args}"
+ ${ARGN}
+ )
+
+ set_target_properties(${SDK_ADD_SYCL_TARGET} PROPERTIES LINKER_LANGUAGE CXX)
- # Add custom target to run compute++ and generate the integration header
- __build_spir(${targetName} ${sourceFile} ${binaryDir})
+ # If the CXX compiler is set to compute++ enable the driver.
+ get_filename_component(cmakeCxxCompilerFileName "${CMAKE_CXX_COMPILER}" NAME)
+ if("${cmakeCxxCompilerFileName}" STREQUAL "compute++")
+ if(MSVC)
+ message(FATAL_ERROR "The compiler driver is not supported by this system,
+ revert the CXX compiler to your default host compiler.")
+ endif()
- # Link with the ComputeCpp runtime library
- target_link_libraries(${targetName} PUBLIC ${COMPUTECPP_RUNTIME_LIBRARY}
- PUBLIC ${OpenCL_LIBRARIES})
+ get_target_property(includeAfter ${SDK_ADD_SYCL_TARGET} COMPUTECPP_INCLUDE_AFTER)
+ if(includeAfter)
+ list(APPEND COMPUTECPP_USER_FLAGS -fsycl-ih-last)
+ endif()
+ list(INSERT COMPUTECPP_DEVICE_COMPILER_FLAGS 0 -sycl-driver)
+ # Prepend COMPUTECPP_DEVICE_COMPILER_FLAGS and append COMPUTECPP_USER_FLAGS
+ foreach(prop COMPILE_OPTIONS INTERFACE_COMPILE_OPTIONS)
+ get_target_property(target_compile_options ${SDK_ADD_SYCL_TARGET} ${prop})
+ if(NOT target_compile_options)
+ set(target_compile_options "")
+ endif()
+ set_property(
+ TARGET ${SDK_ADD_SYCL_TARGET}
+ PROPERTY ${prop}
+ ${COMPUTECPP_DEVICE_COMPILER_FLAGS}
+ ${target_compile_options}
+ ${COMPUTECPP_USER_FLAGS}
+ )
+ endforeach()
+ else()
+ set(fileCounter 0)
+ list(INSERT COMPUTECPP_DEVICE_COMPILER_FLAGS 0 -sycl)
+ # Add custom target to run compute++ and generate the integration header
+ foreach(sourceFile ${SDK_ADD_SYCL_SOURCES})
+ if(NOT IS_ABSOLUTE ${sourceFile})
+ set(sourceFile "${CMAKE_CURRENT_SOURCE_DIR}/${sourceFile}")
+ endif()
+ __build_ir(
+ TARGET ${SDK_ADD_SYCL_TARGET}
+ SOURCE ${sourceFile}
+ COUNTER ${fileCounter}
+ )
+ MATH(EXPR fileCounter "${fileCounter} + 1")
+ endforeach()
+ endif()
+ set_property(TARGET ${SDK_ADD_SYCL_TARGET}
+ APPEND PROPERTY LINK_LIBRARIES ComputeCpp::ComputeCpp)
+ set_property(TARGET ${SDK_ADD_SYCL_TARGET}
+ APPEND PROPERTY INTERFACE_LINK_LIBRARIES ComputeCpp::ComputeCpp)
endfunction(add_sycl_to_target)
diff --git a/cmake/FindEigen2.cmake b/cmake/FindEigen2.cmake
index a834b8872..eb2709dc0 100644
--- a/cmake/FindEigen2.cmake
+++ b/cmake/FindEigen2.cmake
@@ -17,16 +17,16 @@
if(NOT Eigen2_FIND_VERSION)
if(NOT Eigen2_FIND_VERSION_MAJOR)
set(Eigen2_FIND_VERSION_MAJOR 2)
- endif(NOT Eigen2_FIND_VERSION_MAJOR)
+ endif()
if(NOT Eigen2_FIND_VERSION_MINOR)
set(Eigen2_FIND_VERSION_MINOR 0)
- endif(NOT Eigen2_FIND_VERSION_MINOR)
+ endif()
if(NOT Eigen2_FIND_VERSION_PATCH)
set(Eigen2_FIND_VERSION_PATCH 0)
- endif(NOT Eigen2_FIND_VERSION_PATCH)
+ endif()
set(Eigen2_FIND_VERSION "${Eigen2_FIND_VERSION_MAJOR}.${Eigen2_FIND_VERSION_MINOR}.${Eigen2_FIND_VERSION_PATCH}")
-endif(NOT Eigen2_FIND_VERSION)
+endif()
macro(_eigen2_check_version)
file(READ "${EIGEN2_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen2_version_header)
@@ -49,8 +49,8 @@ macro(_eigen2_check_version)
message(STATUS "Eigen2 version ${EIGEN2_VERSION} found in ${EIGEN2_INCLUDE_DIR}, "
"but at least version ${Eigen2_FIND_VERSION} is required")
- endif(NOT EIGEN2_VERSION_OK)
-endmacro(_eigen2_check_version)
+ endif()
+endmacro()
if (EIGEN2_INCLUDE_DIR)
@@ -58,7 +58,7 @@ if (EIGEN2_INCLUDE_DIR)
_eigen2_check_version()
set(EIGEN2_FOUND ${EIGEN2_VERSION_OK})
-else (EIGEN2_INCLUDE_DIR)
+else ()
find_path(EIGEN2_INCLUDE_DIR NAMES Eigen/Core
PATHS
@@ -69,12 +69,12 @@ find_path(EIGEN2_INCLUDE_DIR NAMES Eigen/Core
if(EIGEN2_INCLUDE_DIR)
_eigen2_check_version()
-endif(EIGEN2_INCLUDE_DIR)
+endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Eigen2 DEFAULT_MSG EIGEN2_INCLUDE_DIR EIGEN2_VERSION_OK)
mark_as_advanced(EIGEN2_INCLUDE_DIR)
-endif(EIGEN2_INCLUDE_DIR)
+endif()
diff --git a/cmake/FindEigen3.cmake b/cmake/FindEigen3.cmake
index 9e9697860..0b36805e7 100644
--- a/cmake/FindEigen3.cmake
+++ b/cmake/FindEigen3.cmake
@@ -10,8 +10,12 @@
# EIGEN3_INCLUDE_DIR - the eigen include directory
# EIGEN3_VERSION - eigen version
#
+# and the following imported target:
+#
+# Eigen3::Eigen - The header-only Eigen library
+#
# This module reads hints about search locations from
-# the following enviroment variables:
+# the following environment variables:
#
# EIGEN3_ROOT
# EIGEN3_ROOT_DIR
@@ -24,16 +28,16 @@
if(NOT Eigen3_FIND_VERSION)
if(NOT Eigen3_FIND_VERSION_MAJOR)
set(Eigen3_FIND_VERSION_MAJOR 2)
- endif(NOT Eigen3_FIND_VERSION_MAJOR)
+ endif()
if(NOT Eigen3_FIND_VERSION_MINOR)
set(Eigen3_FIND_VERSION_MINOR 91)
- endif(NOT Eigen3_FIND_VERSION_MINOR)
+ endif()
if(NOT Eigen3_FIND_VERSION_PATCH)
set(Eigen3_FIND_VERSION_PATCH 0)
- endif(NOT Eigen3_FIND_VERSION_PATCH)
+ endif()
set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
-endif(NOT Eigen3_FIND_VERSION)
+endif()
macro(_eigen3_check_version)
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
@@ -48,24 +52,25 @@ macro(_eigen3_check_version)
set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
set(EIGEN3_VERSION_OK FALSE)
- else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+ else()
set(EIGEN3_VERSION_OK TRUE)
- endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+ endif()
if(NOT EIGEN3_VERSION_OK)
message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
"but at least version ${Eigen3_FIND_VERSION} is required")
- endif(NOT EIGEN3_VERSION_OK)
-endmacro(_eigen3_check_version)
+ endif()
+endmacro()
if (EIGEN3_INCLUDE_DIR)
# in cache already
_eigen3_check_version()
set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
+ set(Eigen3_FOUND ${EIGEN3_VERSION_OK})
-else (EIGEN3_INCLUDE_DIR)
+else ()
# search first if an Eigen3Config.cmake is available in the system,
# if successful this would set EIGEN3_INCLUDE_DIR and the rest of
@@ -82,16 +87,21 @@ else (EIGEN3_INCLUDE_DIR)
${KDE4_INCLUDE_DIR}
PATH_SUFFIXES eigen3 eigen
)
- endif(NOT EIGEN3_INCLUDE_DIR)
+ endif()
if(EIGEN3_INCLUDE_DIR)
_eigen3_check_version()
- endif(EIGEN3_INCLUDE_DIR)
+ endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
mark_as_advanced(EIGEN3_INCLUDE_DIR)
-endif(EIGEN3_INCLUDE_DIR)
+endif()
+if(EIGEN3_FOUND AND NOT TARGET Eigen3::Eigen)
+ add_library(Eigen3::Eigen INTERFACE IMPORTED)
+ set_target_properties(Eigen3::Eigen PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${EIGEN3_INCLUDE_DIR}")
+endif()
diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake
index 6c4dc9ab4..ed55c5fad 100644
--- a/cmake/FindFFTW.cmake
+++ b/cmake/FindFFTW.cmake
@@ -22,7 +22,8 @@ if( NOT FFTW_ROOT AND ENV{FFTWDIR} )
endif()
# Check if we can use PkgConfig
-find_package(PkgConfig)
+include(CMakeFindDependencyMacro)
+find_dependency(PkgConfig)
#Determine from PKG
if( PKG_CONFIG_FOUND AND NOT FFTW_ROOT )
@@ -101,7 +102,7 @@ else()
PATHS ${PKG_FFTW_INCLUDE_DIRS} ${INCLUDE_INSTALL_DIR}
)
-endif( FFTW_ROOT )
+endif()
set(FFTW_LIBRARIES ${FFTW_LIB} ${FFTWF_LIB})
diff --git a/cmake/FindGLEW.cmake b/cmake/FindGLEW.cmake
index 54da20f12..9d486d5ba 100644
--- a/cmake/FindGLEW.cmake
+++ b/cmake/FindGLEW.cmake
@@ -10,47 +10,47 @@
# Also defined, but not for general use are:
# GLEW_GLEW_LIBRARY = the full path to the glew library.
-IF (WIN32)
+if (WIN32)
- IF(CYGWIN)
+ if(CYGWIN)
- FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h)
+ find_path( GLEW_INCLUDE_DIR GL/glew.h)
- FIND_LIBRARY( GLEW_GLEW_LIBRARY glew32
+ find_library( GLEW_GLEW_LIBRARY glew32
${OPENGL_LIBRARY_DIR}
/usr/lib/w32api
/usr/X11R6/lib
)
- ELSE(CYGWIN)
+ else(CYGWIN)
- FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h
+ find_path( GLEW_INCLUDE_DIR GL/glew.h
$ENV{GLEW_ROOT_PATH}/include
)
- FIND_LIBRARY( GLEW_GLEW_LIBRARY
+ find_library( GLEW_GLEW_LIBRARY
NAMES glew glew32
PATHS
$ENV{GLEW_ROOT_PATH}/lib
${OPENGL_LIBRARY_DIR}
)
- ENDIF(CYGWIN)
+ endif(CYGWIN)
-ELSE (WIN32)
+else (WIN32)
- IF (APPLE)
+ if (APPLE)
# These values for Apple could probably do with improvement.
- FIND_PATH( GLEW_INCLUDE_DIR glew.h
+ find_path( GLEW_INCLUDE_DIR glew.h
/System/Library/Frameworks/GLEW.framework/Versions/A/Headers
${OPENGL_LIBRARY_DIR}
)
- SET(GLEW_GLEW_LIBRARY "-framework GLEW" CACHE STRING "GLEW library for OSX")
- SET(GLEW_cocoa_LIBRARY "-framework Cocoa" CACHE STRING "Cocoa framework for OSX")
- ELSE (APPLE)
+ set(GLEW_GLEW_LIBRARY "-framework GLEW" CACHE STRING "GLEW library for OSX")
+ set(GLEW_cocoa_LIBRARY "-framework Cocoa" CACHE STRING "Cocoa framework for OSX")
+ else (APPLE)
- FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h
+ find_path( GLEW_INCLUDE_DIR GL/glew.h
/usr/include/GL
/usr/openwin/share/include
/usr/openwin/include
@@ -60,44 +60,44 @@ ELSE (WIN32)
/opt/graphics/OpenGL/contrib/libglew
)
- FIND_LIBRARY( GLEW_GLEW_LIBRARY GLEW
+ find_library( GLEW_GLEW_LIBRARY GLEW
/usr/openwin/lib
/usr/X11R6/lib
)
- ENDIF (APPLE)
+ endif (APPLE)
-ENDIF (WIN32)
+endif (WIN32)
-SET( GLEW_FOUND "NO" )
-IF(GLEW_INCLUDE_DIR)
- IF(GLEW_GLEW_LIBRARY)
+set( GLEW_FOUND "NO" )
+if(GLEW_INCLUDE_DIR)
+ if(GLEW_GLEW_LIBRARY)
# Is -lXi and -lXmu required on all platforms that have it?
# If not, we need some way to figure out what platform we are on.
- SET( GLEW_LIBRARIES
+ set( GLEW_LIBRARIES
${GLEW_GLEW_LIBRARY}
${GLEW_cocoa_LIBRARY}
)
- SET( GLEW_FOUND "YES" )
+ set( GLEW_FOUND "YES" )
#The following deprecated settings are for backwards compatibility with CMake1.4
- SET (GLEW_LIBRARY ${GLEW_LIBRARIES})
- SET (GLEW_INCLUDE_PATH ${GLEW_INCLUDE_DIR})
-
- ENDIF(GLEW_GLEW_LIBRARY)
-ENDIF(GLEW_INCLUDE_DIR)
-
-IF(GLEW_FOUND)
- IF(NOT GLEW_FIND_QUIETLY)
- MESSAGE(STATUS "Found Glew: ${GLEW_LIBRARIES}")
- ENDIF(NOT GLEW_FIND_QUIETLY)
-ELSE(GLEW_FOUND)
- IF(GLEW_FIND_REQUIRED)
- MESSAGE(FATAL_ERROR "Could not find Glew")
- ENDIF(GLEW_FIND_REQUIRED)
-ENDIF(GLEW_FOUND)
-
-MARK_AS_ADVANCED(
+ set (GLEW_LIBRARY ${GLEW_LIBRARIES})
+ set (GLEW_INCLUDE_PATH ${GLEW_INCLUDE_DIR})
+
+ endif(GLEW_GLEW_LIBRARY)
+endif(GLEW_INCLUDE_DIR)
+
+if(GLEW_FOUND)
+ if(NOT GLEW_FIND_QUIETLY)
+ message(STATUS "Found Glew: ${GLEW_LIBRARIES}")
+ endif(NOT GLEW_FIND_QUIETLY)
+else(GLEW_FOUND)
+ if(GLEW_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find Glew")
+ endif(GLEW_FIND_REQUIRED)
+endif(GLEW_FOUND)
+
+mark_as_advanced(
GLEW_INCLUDE_DIR
GLEW_GLEW_LIBRARY
GLEW_Xmu_LIBRARY
diff --git a/cmake/FindGMP.cmake b/cmake/FindGMP.cmake
index 1f0273960..c41eedcf0 100644
--- a/cmake/FindGMP.cmake
+++ b/cmake/FindGMP.cmake
@@ -3,7 +3,7 @@
if (GMP_INCLUDES AND GMP_LIBRARIES)
set(GMP_FIND_QUIETLY TRUE)
-endif (GMP_INCLUDES AND GMP_LIBRARIES)
+endif ()
find_path(GMP_INCLUDES
NAMES
diff --git a/cmake/FindGSL.cmake b/cmake/FindGSL.cmake
index bf411a7f9..8632232f9 100644
--- a/cmake/FindGSL.cmake
+++ b/cmake/FindGSL.cmake
@@ -23,9 +23,9 @@
# www.mip.informatik.uni-kiel.de
# --------------------------------
-IF(WIN32)
+if(WIN32)
# JW tested with gsl-1.8, Windows XP, MSVS 7.1
- SET(GSL_POSSIBLE_ROOT_DIRS
+ set(GSL_POSSIBLE_ROOT_DIRS
${GSL_ROOT_DIR}
$ENV{GSL_ROOT_DIR}
${GSL_DIR}
@@ -35,136 +35,136 @@ IF(WIN32)
$ENV{EXTRA}
"C:/Program Files/GnuWin32"
)
- FIND_PATH(GSL_INCLUDE_DIR
+ find_path(GSL_INCLUDE_DIR
NAMES gsl/gsl_cdf.h gsl/gsl_randist.h
PATHS ${GSL_POSSIBLE_ROOT_DIRS}
PATH_SUFFIXES include
DOC "GSL header include dir"
)
- FIND_LIBRARY(GSL_GSL_LIBRARY
+ find_library(GSL_GSL_LIBRARY
NAMES libgsl.dll.a gsl libgsl
PATHS ${GSL_POSSIBLE_ROOT_DIRS}
PATH_SUFFIXES lib
DOC "GSL library" )
if(NOT GSL_GSL_LIBRARY)
- FIND_FILE(GSL_GSL_LIBRARY
+ find_file(GSL_GSL_LIBRARY
NAMES libgsl.dll.a
PATHS ${GSL_POSSIBLE_ROOT_DIRS}
PATH_SUFFIXES lib
DOC "GSL library")
- endif(NOT GSL_GSL_LIBRARY)
+ endif()
- FIND_LIBRARY(GSL_GSLCBLAS_LIBRARY
+ find_library(GSL_GSLCBLAS_LIBRARY
NAMES libgslcblas.dll.a gslcblas libgslcblas
PATHS ${GSL_POSSIBLE_ROOT_DIRS}
PATH_SUFFIXES lib
DOC "GSL cblas library dir" )
if(NOT GSL_GSLCBLAS_LIBRARY)
- FIND_FILE(GSL_GSLCBLAS_LIBRARY
+ find_file(GSL_GSLCBLAS_LIBRARY
NAMES libgslcblas.dll.a
PATHS ${GSL_POSSIBLE_ROOT_DIRS}
PATH_SUFFIXES lib
DOC "GSL library")
- endif(NOT GSL_GSLCBLAS_LIBRARY)
+ endif()
- SET(GSL_LIBRARIES ${GSL_GSL_LIBRARY})
+ set(GSL_LIBRARIES ${GSL_GSL_LIBRARY})
- #MESSAGE("DBG\n"
+ #message("DBG\n"
# "GSL_GSL_LIBRARY=${GSL_GSL_LIBRARY}\n"
# "GSL_GSLCBLAS_LIBRARY=${GSL_GSLCBLAS_LIBRARY}\n"
# "GSL_LIBRARIES=${GSL_LIBRARIES}")
-ELSE(WIN32)
+else(WIN32)
- IF(UNIX)
- SET(GSL_CONFIG_PREFER_PATH
+ if(UNIX)
+ set(GSL_CONFIG_PREFER_PATH
"$ENV{GSL_DIR}/bin"
"$ENV{GSL_DIR}"
"$ENV{GSL_HOME}/bin"
"$ENV{GSL_HOME}"
CACHE STRING "preferred path to GSL (gsl-config)")
- FIND_PROGRAM(GSL_CONFIG gsl-config
+ find_program(GSL_CONFIG gsl-config
${GSL_CONFIG_PREFER_PATH}
/usr/bin/
)
- # MESSAGE("DBG GSL_CONFIG ${GSL_CONFIG}")
+ # message("DBG GSL_CONFIG ${GSL_CONFIG}")
- IF (GSL_CONFIG)
+ if (GSL_CONFIG)
# set CXXFLAGS to be fed into CXX_FLAGS by the user:
- SET(GSL_CXX_FLAGS "`${GSL_CONFIG} --cflags`")
+ set(GSL_CXX_FLAGS "`${GSL_CONFIG} --cflags`")
# set INCLUDE_DIRS to prefix+include
- EXEC_PROGRAM(${GSL_CONFIG}
+ exec_program(${GSL_CONFIG}
ARGS --prefix
OUTPUT_VARIABLE GSL_PREFIX)
- SET(GSL_INCLUDE_DIR ${GSL_PREFIX}/include CACHE STRING INTERNAL)
+ set(GSL_INCLUDE_DIR ${GSL_PREFIX}/include CACHE STRING INTERNAL)
# set link libraries and link flags
- #SET(GSL_LIBRARIES "`${GSL_CONFIG} --libs`")
- EXEC_PROGRAM(${GSL_CONFIG}
+ #set(GSL_LIBRARIES "`${GSL_CONFIG} --libs`")
+ exec_program(${GSL_CONFIG}
ARGS --libs
OUTPUT_VARIABLE GSL_LIBRARIES )
# extract link dirs for rpath
- EXEC_PROGRAM(${GSL_CONFIG}
+ exec_program(${GSL_CONFIG}
ARGS --libs
OUTPUT_VARIABLE GSL_CONFIG_LIBS )
# extract version
- EXEC_PROGRAM(${GSL_CONFIG}
+ exec_program(${GSL_CONFIG}
ARGS --version
OUTPUT_VARIABLE GSL_FULL_VERSION )
# split version as major/minor
- STRING(REGEX MATCH "(.)\\..*" GSL_VERSION_MAJOR_ "${GSL_FULL_VERSION}")
- SET(GSL_VERSION_MAJOR ${CMAKE_MATCH_1})
- STRING(REGEX MATCH ".\\.(.*)" GSL_VERSION_MINOR_ "${GSL_FULL_VERSION}")
- SET(GSL_VERSION_MINOR ${CMAKE_MATCH_1})
+ string(REGEX MATCH "(.)\\..*" GSL_VERSION_MAJOR_ "${GSL_FULL_VERSION}")
+ set(GSL_VERSION_MAJOR ${CMAKE_MATCH_1})
+ string(REGEX MATCH ".\\.(.*)" GSL_VERSION_MINOR_ "${GSL_FULL_VERSION}")
+ set(GSL_VERSION_MINOR ${CMAKE_MATCH_1})
# split off the link dirs (for rpath)
# use regular expression to match wildcard equivalent "-L*<endchar>"
# with <endchar> is a space or a semicolon
- STRING(REGEX MATCHALL "[-][L]([^ ;])+"
+ string(REGEX MATCHALL "[-][L]([^ ;])+"
GSL_LINK_DIRECTORIES_WITH_PREFIX
"${GSL_CONFIG_LIBS}" )
- # MESSAGE("DBG GSL_LINK_DIRECTORIES_WITH_PREFIX=${GSL_LINK_DIRECTORIES_WITH_PREFIX}")
+ # message("DBG GSL_LINK_DIRECTORIES_WITH_PREFIX=${GSL_LINK_DIRECTORIES_WITH_PREFIX}")
# remove prefix -L because we need the pure directory for LINK_DIRECTORIES
- IF (GSL_LINK_DIRECTORIES_WITH_PREFIX)
- STRING(REGEX REPLACE "[-][L]" "" GSL_LINK_DIRECTORIES ${GSL_LINK_DIRECTORIES_WITH_PREFIX} )
- ENDIF (GSL_LINK_DIRECTORIES_WITH_PREFIX)
- SET(GSL_EXE_LINKER_FLAGS "-Wl,-rpath,${GSL_LINK_DIRECTORIES}" CACHE STRING INTERNAL)
- # MESSAGE("DBG GSL_LINK_DIRECTORIES=${GSL_LINK_DIRECTORIES}")
- # MESSAGE("DBG GSL_EXE_LINKER_FLAGS=${GSL_EXE_LINKER_FLAGS}")
+ if (GSL_LINK_DIRECTORIES_WITH_PREFIX)
+ string(REGEX REPLACE "[-][L]" "" GSL_LINK_DIRECTORIES ${GSL_LINK_DIRECTORIES_WITH_PREFIX} )
+ endif (GSL_LINK_DIRECTORIES_WITH_PREFIX)
+ set(GSL_EXE_LINKER_FLAGS "-Wl,-rpath,${GSL_LINK_DIRECTORIES}" CACHE STRING INTERNAL)
+ # message("DBG GSL_LINK_DIRECTORIES=${GSL_LINK_DIRECTORIES}")
+ # message("DBG GSL_EXE_LINKER_FLAGS=${GSL_EXE_LINKER_FLAGS}")
- # ADD_DEFINITIONS("-DHAVE_GSL")
- # SET(GSL_DEFINITIONS "-DHAVE_GSL")
- MARK_AS_ADVANCED(
+ # add_definitions("-DHAVE_GSL")
+ # set(GSL_DEFINITIONS "-DHAVE_GSL")
+ mark_as_advanced(
GSL_CXX_FLAGS
GSL_INCLUDE_DIR
GSL_LIBRARIES
GSL_LINK_DIRECTORIES
GSL_DEFINITIONS
)
- MESSAGE(STATUS "Using GSL from ${GSL_PREFIX}")
+ message(STATUS "Using GSL from ${GSL_PREFIX}")
- ELSE(GSL_CONFIG)
- MESSAGE("FindGSL.cmake: gsl-config not found. Please set it manually. GSL_CONFIG=${GSL_CONFIG}")
- ENDIF(GSL_CONFIG)
+ else(GSL_CONFIG)
+ message("FindGSL.cmake: gsl-config not found. Please set it manually. GSL_CONFIG=${GSL_CONFIG}")
+ endif(GSL_CONFIG)
- ENDIF(UNIX)
-ENDIF(WIN32)
+ endif(UNIX)
+endif(WIN32)
-IF(GSL_LIBRARIES)
- IF(GSL_INCLUDE_DIR OR GSL_CXX_FLAGS)
+if(GSL_LIBRARIES)
+ if(GSL_INCLUDE_DIR OR GSL_CXX_FLAGS)
- SET(GSL_FOUND 1)
+ set(GSL_FOUND 1)
- ENDIF(GSL_INCLUDE_DIR OR GSL_CXX_FLAGS)
-ENDIF(GSL_LIBRARIES)
+ endif(GSL_INCLUDE_DIR OR GSL_CXX_FLAGS)
+endif(GSL_LIBRARIES)
diff --git a/cmake/FindGoogleHash.cmake b/cmake/FindGoogleHash.cmake
index f6a81a02c..481eb4dad 100644
--- a/cmake/FindGoogleHash.cmake
+++ b/cmake/FindGoogleHash.cmake
@@ -1,7 +1,7 @@
if (GOOGLEHASH_INCLUDES AND GOOGLEHASH_LIBRARIES)
set(GOOGLEHASH_FIND_QUIETLY TRUE)
-endif (GOOGLEHASH_INCLUDES AND GOOGLEHASH_LIBRARIES)
+endif ()
find_path(GOOGLEHASH_INCLUDES
NAMES
@@ -15,9 +15,9 @@ if(GOOGLEHASH_INCLUDES)
file(WRITE ${CMAKE_BINARY_DIR}/googlehash_test.cpp
"#include <google/sparse_hash_map>\n#include <google/dense_hash_map>\nint main(int argc, char** argv) { google::dense_hash_map<int,float> a; google::sparse_hash_map<int,float> b; return 0;}\n")
try_compile(GOOGLEHASH_COMPILE ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}/googlehash_test.cpp OUTPUT_VARIABLE GOOGLEHASH_COMPILE_RESULT)
-endif(GOOGLEHASH_INCLUDES)
+endif()
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(GOOGLEHASH DEFAULT_MSG GOOGLEHASH_INCLUDES GOOGLEHASH_COMPILE)
+find_package_handle_standard_args(GoogleHash DEFAULT_MSG GOOGLEHASH_INCLUDES GOOGLEHASH_COMPILE)
mark_as_advanced(GOOGLEHASH_INCLUDES)
diff --git a/cmake/FindHWLOC.cmake b/cmake/FindHWLOC.cmake
index a831b5c72..522f52157 100644
--- a/cmake/FindHWLOC.cmake
+++ b/cmake/FindHWLOC.cmake
@@ -65,8 +65,9 @@ endif()
# Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
# -------------------------------------------------------------------------------------
-include(FindPkgConfig)
-find_package(PkgConfig QUIET)
+include(CMakeFindDependencyMacro)
+# include(FindPkgConfig)
+find_dependency(PkgConfig QUIET)
if( PKG_CONFIG_EXECUTABLE AND NOT HWLOC_GIVEN_BY_USER )
pkg_search_module(HWLOC hwloc)
@@ -85,7 +86,7 @@ if( PKG_CONFIG_EXECUTABLE AND NOT HWLOC_GIVEN_BY_USER )
endif()
endif()
-endif( PKG_CONFIG_EXECUTABLE AND NOT HWLOC_GIVEN_BY_USER )
+endif()
if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR (HWLOC_GIVEN_BY_USER) )
@@ -282,9 +283,9 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) O
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_LIBRARIES)
- endif(HWLOC_LIBRARIES)
+ endif()
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR (HWLOC_GIVEN_BY_USER) )
+endif()
if (HWLOC_LIBRARIES)
if (HWLOC_LIBRARY_DIRS)
diff --git a/cmake/FindKLU.cmake b/cmake/FindKLU.cmake
new file mode 100644
index 000000000..6217d1490
--- /dev/null
+++ b/cmake/FindKLU.cmake
@@ -0,0 +1,48 @@
+# KLU lib usually requires linking to a blas library.
+# It is up to the user of this module to find a BLAS and link to it.
+
+if (KLU_INCLUDES AND KLU_LIBRARIES)
+ set(KLU_FIND_QUIETLY TRUE)
+endif ()
+
+find_path(KLU_INCLUDES
+ NAMES
+ klu.h
+ PATHS
+ $ENV{KLUDIR}
+ ${INCLUDE_INSTALL_DIR}
+ PATH_SUFFIXES
+ suitesparse
+ ufsparse
+)
+
+find_library(KLU_LIBRARIES klu PATHS $ENV{KLUDIR} ${LIB_INSTALL_DIR})
+
+if(KLU_LIBRARIES)
+
+ if(NOT KLU_LIBDIR)
+ get_filename_component(KLU_LIBDIR ${KLU_LIBRARIES} PATH)
+ endif()
+
+ find_library(COLAMD_LIBRARY colamd PATHS ${KLU_LIBDIR} $ENV{KLUDIR} ${LIB_INSTALL_DIR})
+ if(COLAMD_LIBRARY)
+ set(KLU_LIBRARIES ${KLU_LIBRARIES} ${COLAMD_LIBRARY})
+ endif ()
+
+ find_library(AMD_LIBRARY amd PATHS ${KLU_LIBDIR} $ENV{KLUDIR} ${LIB_INSTALL_DIR})
+ if(AMD_LIBRARY)
+ set(KLU_LIBRARIES ${KLU_LIBRARIES} ${AMD_LIBRARY})
+ endif ()
+
+ find_library(BTF_LIBRARY btf PATHS $ENV{KLU_LIBDIR} $ENV{KLUDIR} ${LIB_INSTALL_DIR})
+ if(BTF_LIBRARY)
+ set(KLU_LIBRARIES ${KLU_LIBRARIES} ${BTF_LIBRARY})
+ endif()
+
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(KLU DEFAULT_MSG
+ KLU_INCLUDES KLU_LIBRARIES)
+
+mark_as_advanced(KLU_INCLUDES KLU_LIBRARIES AMD_LIBRARY COLAMD_LIBRARY BTF_LIBRARY)
diff --git a/cmake/FindLAPACK.cmake b/cmake/FindLAPACK.cmake
index 2fcae2199..3fd738807 100644
--- a/cmake/FindLAPACK.cmake
+++ b/cmake/FindLAPACK.cmake
@@ -26,6 +26,7 @@
include(CheckFunctionExists)
+include(CMakeFindDependencyMacro)
# This macro checks for the existence of the combination of fortran libraries
# given by _list. If the combination is found, this macro checks (using the
@@ -75,8 +76,8 @@ macro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _b
mark_as_advanced(${_prefix}_${_library}_LIBRARY)
set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
set(_libraries_found ${${_prefix}_${_library}_LIBRARY})
- endif(_libraries_found)
- endforeach(_library ${_list})
+ endif()
+ endforeach()
if(_libraries_found)
set(_libraries_found ${${LIBRARIES}})
endif()
@@ -88,7 +89,7 @@ macro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _b
set(${LIBRARIES} ${_libraries_found})
# Some C++ linkers require the f2c library to link with Fortran libraries.
# I do not know which ones, thus I just add the f2c library if it is available.
- find_package( F2C QUIET )
+ find_dependency( F2C QUIET )
if ( F2C_FOUND )
set(${DEFINITIONS} ${${DEFINITIONS}} ${F2C_DEFINITIONS})
set(${LIBRARIES} ${${LIBRARIES}} ${F2C_LIBRARIES})
@@ -103,7 +104,7 @@ macro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _b
set(CMAKE_REQUIRED_LIBRARIES "")
mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)
set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})
- endif(_libraries_found AND NOT _libraries_work)
+ endif()
# If not found, test this combination of libraries with a C interface.
# A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.
@@ -117,7 +118,7 @@ macro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _b
set(CMAKE_REQUIRED_LIBRARIES "")
mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)
set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})
- endif(_libraries_found AND NOT _libraries_work)
+ endif()
# on failure
if(NOT _libraries_work)
@@ -126,7 +127,7 @@ macro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _b
endif()
#message("DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}")
#message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
-endmacro(check_lapack_libraries)
+endmacro()
#
@@ -135,9 +136,9 @@ endmacro(check_lapack_libraries)
# LAPACK requires BLAS
if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
- find_package(BLAS)
+ find_dependency(BLAS)
else()
- find_package(BLAS REQUIRED)
+ find_dependency(BLAS REQUIRED)
endif()
if (NOT BLAS_FOUND)
@@ -216,7 +217,7 @@ else()
"${BLAS_LIBRARIES}"
"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR"
)
- endif ( NOT LAPACK_LIBRARIES )
+ endif ()
# Generic LAPACK library?
# This configuration *must* be the last try as this library is notably slow.
@@ -242,14 +243,14 @@ else()
if(NOT LAPACK_FIND_QUIETLY)
if(LAPACK_FOUND)
message(STATUS "A library with LAPACK API found.")
- else(LAPACK_FOUND)
+ else()
if(LAPACK_FIND_REQUIRED)
message(FATAL_ERROR "A required library with LAPACK API not found. Please specify library location.")
else()
message(STATUS "A library with LAPACK API not found. Please specify library location.")
endif()
- endif(LAPACK_FOUND)
- endif(NOT LAPACK_FIND_QUIETLY)
+ endif()
+ endif()
# Add variables to cache
set( LAPACK_INCLUDE_DIR "${LAPACK_INCLUDE_DIR}"
@@ -270,4 +271,4 @@ else()
#message("DEBUG: LAPACK_LIBRARIES_DIR = ${LAPACK_LIBRARIES_DIR}")
#message("DEBUG: LAPACK_FOUND = ${LAPACK_FOUND}")
-endif(NOT BLAS_FOUND)
+endif()
diff --git a/cmake/FindMPFR.cmake b/cmake/FindMPFR.cmake
index aa4c2cd7d..d8da9d6ff 100644
--- a/cmake/FindMPFR.cmake
+++ b/cmake/FindMPFR.cmake
@@ -32,16 +32,16 @@ find_path(MPFR_INCLUDES
if(NOT MPFR_FIND_VERSION)
if(NOT MPFR_FIND_VERSION_MAJOR)
set(MPFR_FIND_VERSION_MAJOR 1)
- endif(NOT MPFR_FIND_VERSION_MAJOR)
+ endif()
if(NOT MPFR_FIND_VERSION_MINOR)
set(MPFR_FIND_VERSION_MINOR 0)
- endif(NOT MPFR_FIND_VERSION_MINOR)
+ endif()
if(NOT MPFR_FIND_VERSION_PATCH)
set(MPFR_FIND_VERSION_PATCH 0)
- endif(NOT MPFR_FIND_VERSION_PATCH)
+ endif()
set(MPFR_FIND_VERSION "${MPFR_FIND_VERSION_MAJOR}.${MPFR_FIND_VERSION_MINOR}.${MPFR_FIND_VERSION_PATCH}")
-endif(NOT MPFR_FIND_VERSION)
+endif()
if(MPFR_INCLUDES)
@@ -65,11 +65,11 @@ if(MPFR_INCLUDES)
set(MPFR_VERSION_OK FALSE)
message(STATUS "MPFR version ${MPFR_VERSION} found in ${MPFR_INCLUDES}, "
"but at least version ${MPFR_FIND_VERSION} is required")
- else(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION})
+ else()
set(MPFR_VERSION_OK TRUE)
- endif(${MPFR_VERSION} VERSION_LESS ${MPFR_FIND_VERSION})
+ endif()
-endif(MPFR_INCLUDES)
+endif()
# Set MPFR_LIBRARIES
diff --git a/cmake/FindMPREAL.cmake b/cmake/FindMPREAL.cmake
new file mode 100644
index 000000000..947a1ce88
--- /dev/null
+++ b/cmake/FindMPREAL.cmake
@@ -0,0 +1,103 @@
+# Try to find the MPFR C++ (MPREAL) library
+# See http://www.holoborodko.com/pavel/mpreal/
+#
+# This module supports requiring a minimum version, e.g. you can do
+# find_package(MPREAL 1.8.6)
+# to require version 1.8.6 or newer of MPREAL C++.
+#
+# Once done this will define
+#
+# MPREAL_FOUND - system has MPREAL lib with correct version
+# MPREAL_INCLUDES - MPREAL required include directories
+# MPREAL_LIBRARIES - MPREAL required libraries
+# MPREAL_VERSION - MPREAL version
+
+# Copyright (c) 2020 The Eigen Authors.
+# Redistribution and use is allowed according to the terms of the BSD license.
+
+include(CMakeFindDependencyMacro)
+find_dependency(MPFR)
+find_dependency(GMP)
+
+# Set MPREAL_INCLUDES
+find_path(MPREAL_INCLUDES
+ NAMES
+ mpreal.h
+ PATHS
+ $ENV{GMPDIR}
+ ${INCLUDE_INSTALL_DIR}
+)
+
+# Set MPREAL_FIND_VERSION to 1.0.0 if no minimum version is specified
+
+if(NOT MPREAL_FIND_VERSION)
+ if(NOT MPREAL_FIND_VERSION_MAJOR)
+ set(MPREAL_FIND_VERSION_MAJOR 1)
+ endif()
+ if(NOT MPREAL_FIND_VERSION_MINOR)
+ set(MPREAL_FIND_VERSION_MINOR 0)
+ endif()
+ if(NOT MPREAL_FIND_VERSION_PATCH)
+ set(MPREAL_FIND_VERSION_PATCH 0)
+ endif()
+
+ set(MPREAL_FIND_VERSION "${MPREAL_FIND_VERSION_MAJOR}.${MPREAL_FIND_VERSION_MINOR}.${MPREAL_FIND_VERSION_PATCH}")
+endif()
+
+# Check bugs
+# - https://github.com/advanpix/mpreal/issues/7
+# - https://github.com/advanpix/mpreal/issues/9
+set(MPREAL_TEST_PROGRAM "
+#include <mpreal.h>
+#include <algorithm>
+int main(int argc, char** argv) {
+ const mpfr::mpreal one = 1.0;
+ const mpfr::mpreal zero = 0.0;
+ using namespace std;
+ const mpfr::mpreal smaller = min(one, zero);
+ return 0;
+}")
+
+if(MPREAL_INCLUDES)
+
+ # Set MPREAL_VERSION
+
+ file(READ "${MPREAL_INCLUDES}/mpreal.h" _mpreal_version_header)
+
+ string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MAJOR[ \t]+([0-9]+)" _mpreal_major_version_match "${_mpreal_version_header}")
+ set(MPREAL_MAJOR_VERSION "${CMAKE_MATCH_1}")
+ string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MINOR[ \t]+([0-9]+)" _mpreal_minor_version_match "${_mpreal_version_header}")
+ set(MPREAL_MINOR_VERSION "${CMAKE_MATCH_1}")
+ string(REGEX MATCH "define[ \t]+MPREAL_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpreal_patchlevel_version_match "${_mpreal_version_header}")
+ set(MPREAL_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}")
+
+ set(MPREAL_VERSION ${MPREAL_MAJOR_VERSION}.${MPREAL_MINOR_VERSION}.${MPREAL_PATCHLEVEL_VERSION})
+
+ # Check whether found version exceeds minimum version
+
+ if(${MPREAL_VERSION} VERSION_LESS ${MPREAL_FIND_VERSION})
+ set(MPREAL_VERSION_OK FALSE)
+ message(STATUS "MPREAL version ${MPREAL_VERSION} found in ${MPREAL_INCLUDES}, "
+ "but at least version ${MPREAL_FIND_VERSION} is required")
+ else()
+ set(MPREAL_VERSION_OK TRUE)
+
+ list(APPEND MPREAL_INCLUDES "${MPFR_INCLUDES}" "${GMP_INCLUDES}")
+ list(REMOVE_DUPLICATES MPREAL_INCLUDES)
+
+ list(APPEND MPREAL_LIBRARIES "${MPFR_LIBRARIES}" "${GMP_LIBRARIES}")
+ list(REMOVE_DUPLICATES MPREAL_LIBRARIES)
+
+ # Make sure it compiles with the current compiler.
+ unset(MPREAL_WORKS CACHE)
+ include(CheckCXXSourceCompiles)
+ set(CMAKE_REQUIRED_INCLUDES "${MPREAL_INCLUDES}")
+ set(CMAKE_REQUIRED_LIBRARIES "${MPREAL_LIBRARIES}")
+ check_cxx_source_compiles("${MPREAL_TEST_PROGRAM}" MPREAL_WORKS)
+ endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(MPREAL DEFAULT_MSG
+ MPREAL_INCLUDES MPREAL_VERSION_OK MPREAL_WORKS)
+mark_as_advanced(MPREAL_INCLUDES)
diff --git a/cmake/FindMetis.cmake b/cmake/FindMetis.cmake
index da2f1f1d7..747f88273 100644
--- a/cmake/FindMetis.cmake
+++ b/cmake/FindMetis.cmake
@@ -238,7 +238,7 @@ if(METIS_LIBRARIES)
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_LIBRARIES)
-endif(METIS_LIBRARIES)
+endif()
if (METIS_LIBRARIES)
list(GET METIS_LIBRARIES 0 first_lib)
@@ -258,7 +258,8 @@ mark_as_advanced(METIS_DIR_FOUND)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(METIS DEFAULT_MSG
METIS_LIBRARIES
- METIS_WORKS)
+ METIS_WORKS
+ METIS_INCLUDE_DIRS)
#
# TODO: Add possibility to check for specific functions in the library
#
diff --git a/cmake/FindPastix.cmake b/cmake/FindPASTIX.cmake
index 470477fdc..db1427b0a 100644
--- a/cmake/FindPastix.cmake
+++ b/cmake/FindPASTIX.cmake
@@ -118,7 +118,7 @@ if( PASTIX_FIND_COMPONENTS )
if (${component} STREQUAL "SCOTCH")
set(PASTIX_LOOK_FOR_SCOTCH ON)
endif()
- if (${component} STREQUAL "SCOTCH")
+ if (${component} STREQUAL "PTSCOTCH")
set(PASTIX_LOOK_FOR_PTSCOTCH ON)
endif()
if (${component} STREQUAL "METIS")
@@ -133,14 +133,14 @@ endif()
# Required dependencies
# ---------------------
-
+include(CMakeFindDependencyMacro)
if (NOT PASTIX_FIND_QUIETLY)
message(STATUS "Looking for PASTIX - Try to detect pthread")
endif()
if (PASTIX_FIND_REQUIRED)
- find_package(Threads REQUIRED QUIET)
+ find_dependency(Threads REQUIRED QUIET)
else()
- find_package(Threads QUIET)
+ find_dependency(Threads QUIET)
endif()
set(PASTIX_EXTRA_LIBRARIES "")
if( THREADS_FOUND )
@@ -198,9 +198,9 @@ if (NOT PASTIX_FIND_QUIETLY)
message(STATUS "Looking for PASTIX - Try to detect HWLOC")
endif()
if (PASTIX_FIND_REQUIRED)
- find_package(HWLOC REQUIRED QUIET)
+ find_dependency(HWLOC REQUIRED QUIET)
else()
- find_package(HWLOC QUIET)
+ find_dependency(HWLOC QUIET)
endif()
# PASTIX depends on BLAS
@@ -209,9 +209,9 @@ if (NOT PASTIX_FIND_QUIETLY)
message(STATUS "Looking for PASTIX - Try to detect BLAS")
endif()
if (PASTIX_FIND_REQUIRED)
- find_package(BLASEXT REQUIRED QUIET)
+ find_dependency(BLASEXT REQUIRED QUIET)
else()
- find_package(BLASEXT QUIET)
+ find_dependency(BLASEXT QUIET)
endif()
# Optional dependencies
@@ -230,15 +230,15 @@ if (NOT MPI_FOUND AND PASTIX_LOOK_FOR_MPI)
set(MPI_C_COMPILER mpicc)
endif()
if (PASTIX_FIND_REQUIRED AND PASTIX_FIND_REQUIRED_MPI)
- find_package(MPI REQUIRED QUIET)
+ find_dependency(MPI REQUIRED QUIET)
else()
- find_package(MPI QUIET)
+ find_dependency(MPI QUIET)
endif()
if (MPI_FOUND)
mark_as_advanced(MPI_LIBRARY)
mark_as_advanced(MPI_EXTRA_LIBRARY)
endif()
-endif (NOT MPI_FOUND AND PASTIX_LOOK_FOR_MPI)
+endif ()
# PASTIX may depend on STARPU
#----------------------------
@@ -272,14 +272,14 @@ if( NOT STARPU_FOUND AND PASTIX_LOOK_FOR_STARPU)
endif()
# set the list of optional dependencies we may discover
if (PASTIX_FIND_REQUIRED AND PASTIX_FIND_REQUIRED_STARPU)
- find_package(STARPU ${PASTIX_STARPU_VERSION} REQUIRED
+ find_dependency(STARPU ${PASTIX_STARPU_VERSION} REQUIRED
COMPONENTS ${STARPU_COMPONENT_LIST})
else()
- find_package(STARPU ${PASTIX_STARPU_VERSION}
+ find_dependency(STARPU ${PASTIX_STARPU_VERSION}
COMPONENTS ${STARPU_COMPONENT_LIST})
endif()
-endif( NOT STARPU_FOUND AND PASTIX_LOOK_FOR_STARPU)
+endif()
# PASTIX may depends on SCOTCH
#-----------------------------
@@ -288,9 +288,9 @@ if (NOT SCOTCH_FOUND AND PASTIX_LOOK_FOR_SCOTCH)
message(STATUS "Looking for PASTIX - Try to detect SCOTCH")
endif()
if (PASTIX_FIND_REQUIRED AND PASTIX_FIND_REQUIRED_SCOTCH)
- find_package(SCOTCH REQUIRED QUIET)
+ find_dependency(SCOTCH REQUIRED QUIET)
else()
- find_package(SCOTCH QUIET)
+ find_dependency(SCOTCH QUIET)
endif()
endif()
@@ -301,9 +301,9 @@ if (NOT PTSCOTCH_FOUND AND PASTIX_LOOK_FOR_PTSCOTCH)
message(STATUS "Looking for PASTIX - Try to detect PTSCOTCH")
endif()
if (PASTIX_FIND_REQUIRED AND PASTIX_FIND_REQUIRED_PTSCOTCH)
- find_package(PTSCOTCH REQUIRED QUIET)
+ find_dependency(PTSCOTCH REQUIRED QUIET)
else()
- find_package(PTSCOTCH QUIET)
+ find_dependency(PTSCOTCH QUIET)
endif()
endif()
@@ -314,9 +314,9 @@ if (NOT METIS_FOUND AND PASTIX_LOOK_FOR_METIS)
message(STATUS "Looking for PASTIX - Try to detect METIS")
endif()
if (PASTIX_FIND_REQUIRED AND PASTIX_FIND_REQUIRED_METIS)
- find_package(METIS REQUIRED QUIET)
+ find_dependency(METIS REQUIRED QUIET)
else()
- find_package(METIS QUIET)
+ find_dependency(METIS QUIET)
endif()
endif()
@@ -478,7 +478,7 @@ foreach(pastix_lib ${PASTIX_libs_to_find})
endif()
mark_as_advanced(PASTIX_${pastix_lib}_LIBRARY)
-endforeach(pastix_lib ${PASTIX_libs_to_find})
+endforeach()
# check a function to validate the find
if(PASTIX_LIBRARIES)
@@ -681,7 +681,7 @@ if(PASTIX_LIBRARIES)
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_LIBRARIES)
-endif(PASTIX_LIBRARIES)
+endif()
if (PASTIX_LIBRARIES)
list(GET PASTIX_LIBRARIES 0 first_lib)
diff --git a/cmake/FindPTSCOTCH.cmake b/cmake/FindPTSCOTCH.cmake
index 1396d0582..6ccc743e6 100644
--- a/cmake/FindPTSCOTCH.cmake
+++ b/cmake/FindPTSCOTCH.cmake
@@ -79,20 +79,21 @@ if( PTSCOTCH_FIND_COMPONENTS )
endif()
# PTSCOTCH depends on Threads, try to find it
+include(CMakeFindDependencyMacro)
if (NOT THREADS_FOUND)
if (PTSCOTCH_FIND_REQUIRED)
- find_package(Threads REQUIRED)
+ find_dependency(Threads REQUIRED)
else()
- find_package(Threads)
+ find_dependency(Threads)
endif()
endif()
# PTSCOTCH depends on MPI, try to find it
if (NOT MPI_FOUND)
if (PTSCOTCH_FIND_REQUIRED)
- find_package(MPI REQUIRED)
+ find_dependency(MPI REQUIRED)
else()
- find_package(MPI)
+ find_dependency(MPI)
endif()
endif()
@@ -148,18 +149,18 @@ else()
foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND")
find_path(PTSCOTCH_${ptscotch_hdr}_DIRS
- NAMES ${ptscotch_hdr}
- HINTS ${PTSCOTCH_DIR}
- PATH_SUFFIXES "include" "include/scotch")
+ NAMES ${ptscotch_hdr}
+ HINTS ${PTSCOTCH_DIR}
+ PATH_SUFFIXES "include" "include/scotch")
mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS)
endforeach()
else()
foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND")
find_path(PTSCOTCH_${ptscotch_hdr}_DIRS
- NAMES ${ptscotch_hdr}
- HINTS ${_inc_env}
- PATH_SUFFIXES "scotch")
+ NAMES ${ptscotch_hdr}
+ HINTS ${_inc_env}
+ PATH_SUFFIXES "scotch")
mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS)
endforeach()
endif()
@@ -171,7 +172,6 @@ foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find})
if (PTSCOTCH_${ptscotch_hdr}_DIRS)
list(APPEND PTSCOTCH_INCLUDE_DIRS "${PTSCOTCH_${ptscotch_hdr}_DIRS}")
else ()
- set(PTSCOTCH_INCLUDE_DIRS "PTSCOTCH_INCLUDE_DIRS-NOTFOUND")
if (NOT PTSCOTCH_FIND_QUIETLY)
message(STATUS "Looking for ptscotch -- ${ptscotch_hdr} not found")
endif()
@@ -229,16 +229,16 @@ else()
foreach(ptscotch_lib ${PTSCOTCH_libs_to_find})
set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND")
find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY
- NAMES ${ptscotch_lib}
- HINTS ${PTSCOTCH_DIR}
- PATH_SUFFIXES lib lib32 lib64)
+ NAMES ${ptscotch_lib}
+ HINTS ${PTSCOTCH_DIR}
+ PATH_SUFFIXES lib lib32 lib64)
endforeach()
else()
foreach(ptscotch_lib ${PTSCOTCH_libs_to_find})
set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND")
find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY
- NAMES ${ptscotch_lib}
- HINTS ${_lib_env})
+ NAMES ${ptscotch_lib}
+ HINTS ${_lib_env})
endforeach()
endif()
endif()
@@ -255,7 +255,6 @@ foreach(ptscotch_lib ${PTSCOTCH_libs_to_find})
list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}")
list(APPEND PTSCOTCH_LIBRARY_DIRS "${${ptscotch_lib}_lib_path}")
else ()
- list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}")
if (NOT PTSCOTCH_FIND_QUIETLY)
message(STATUS "Looking for ptscotch -- lib ${ptscotch_lib} not found")
endif()
@@ -355,7 +354,7 @@ if(PTSCOTCH_LIBRARIES)
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_LIBRARIES)
-endif(PTSCOTCH_LIBRARIES)
+endif()
if (PTSCOTCH_LIBRARIES)
list(GET PTSCOTCH_LIBRARIES 0 first_lib)
diff --git a/cmake/FindScotch.cmake b/cmake/FindSCOTCH.cmake
index 89d295ac2..11b971a92 100644
--- a/cmake/FindScotch.cmake
+++ b/cmake/FindSCOTCH.cmake
@@ -71,11 +71,12 @@ if( SCOTCH_FIND_COMPONENTS )
endif()
# SCOTCH may depend on Threads, try to find it
+include(CMakeFindDependencyMacro)
if (NOT THREADS_FOUND)
if (SCOTCH_FIND_REQUIRED)
- find_package(Threads REQUIRED)
+ find_dependency(Threads REQUIRED)
else()
- find_package(Threads)
+ find_dependency(Threads)
endif()
endif()
@@ -301,7 +302,7 @@ if(SCOTCH_LIBRARIES)
set(CMAKE_REQUIRED_INCLUDES)
set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_LIBRARIES)
-endif(SCOTCH_LIBRARIES)
+endif()
if (SCOTCH_LIBRARIES)
list(GET SCOTCH_LIBRARIES 0 first_lib)
diff --git a/cmake/FindSPQR.cmake b/cmake/FindSPQR.cmake
index 1e958c3c1..d6fb2e13d 100644
--- a/cmake/FindSPQR.cmake
+++ b/cmake/FindSPQR.cmake
@@ -6,7 +6,7 @@
if (SPQR_INCLUDES AND SPQR_LIBRARIES)
set(SPQR_FIND_QUIETLY TRUE)
-endif (SPQR_INCLUDES AND SPQR_LIBRARIES)
+endif ()
find_path(SPQR_INCLUDES
NAMES
@@ -33,7 +33,7 @@ if(SPQR_LIBRARIES)
set(SPQR_LIBRARIES ${SPQR_LIBRARIES} ${CHOLMOD_LIBRARY})
endif()
-endif(SPQR_LIBRARIES)
+endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SPQR DEFAULT_MSG SPQR_INCLUDES SPQR_LIBRARIES)
diff --git a/cmake/FindStandardMathLibrary.cmake b/cmake/FindStandardMathLibrary.cmake
index 711b0e4b4..1d1e5b3a9 100644
--- a/cmake/FindStandardMathLibrary.cmake
+++ b/cmake/FindStandardMathLibrary.cmake
@@ -10,6 +10,7 @@
# pass the "-lm" linker flag.
#
# Copyright (c) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>
+# 2020 Susi Lehtola <susi.lehtola@gmail.com>
# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
@@ -17,10 +18,15 @@ include(CheckCXXSourceCompiles)
# a little test program for c++ math functions.
# notice the std:: is required on some platforms such as QNX
+# notice the (void) is required if -Wall (-Wunused-value) is added to CMAKE_CXX_FLAG
+# We read in the arguments from standard input to avoid the compiler optimizing away the calls
set(find_standard_math_library_test_program
-"#include<cmath>
-int main() { std::sin(0.0); std::log(0.0f); }")
+"
+#include<cmath>
+int main(int argc, char **){
+ return int(std::sin(double(argc)) + std::log(double(argc)));
+}")
# first try compiling/linking the test program without any linker flags
diff --git a/cmake/FindSuperLU.cmake b/cmake/FindSuperLU.cmake
index f38146e06..4b779f516 100644
--- a/cmake/FindSuperLU.cmake
+++ b/cmake/FindSuperLU.cmake
@@ -4,7 +4,7 @@
if (SUPERLU_INCLUDES AND SUPERLU_LIBRARIES)
set(SUPERLU_FIND_QUIETLY TRUE)
-endif (SUPERLU_INCLUDES AND SUPERLU_LIBRARIES)
+endif ()
find_path(SUPERLU_INCLUDES
NAMES
@@ -90,7 +90,7 @@ endif()
endif()
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(SUPERLU
+find_package_handle_standard_args(SuperLU
REQUIRED_VARS SUPERLU_INCLUDES SUPERLU_LIBRARIES SUPERLU_VERSION_OK
VERSION_VAR SUPERLU_VERSION_VAR)
diff --git a/cmake/FindTriSYCL.cmake b/cmake/FindTriSYCL.cmake
new file mode 100644
index 000000000..810423907
--- /dev/null
+++ b/cmake/FindTriSYCL.cmake
@@ -0,0 +1,173 @@
+#.rst:
+# FindTriSYCL
+#---------------
+#
+# TODO : insert Copyright and licence
+
+#########################
+# FindTriSYCL.cmake
+#########################
+#
+# Tools for finding and building with TriSYCL.
+#
+# User must define TRISYCL_INCLUDE_DIR pointing to the triSYCL
+# include directory.
+#
+# Latest version of this file can be found at:
+# https://github.com/triSYCL/triSYCL
+
+# Requite CMake version 3.5 or higher
+cmake_minimum_required (VERSION 3.5)
+
+# Check that a supported host compiler can be found
+if(CMAKE_COMPILER_IS_GNUCXX)
+ # Require at least gcc 5.4
+ if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4)
+ message(FATAL_ERROR
+ "host compiler - Not found! (gcc version must be at least 5.4)")
+ else()
+ message(STATUS "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION}")
+ endif()
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ # Require at least clang 3.9
+ if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9)
+ message(FATAL_ERROR
+ "host compiler - Not found! (clang version must be at least 3.9)")
+ else()
+ message(STATUS "host compiler - clang ${CMAKE_CXX_COMPILER_VERSION}")
+ endif()
+else()
+ message(WARNING
+ "host compiler - Not found! (triSYCL supports GCC and Clang)")
+endif()
+
+#triSYCL options
+option(TRISYCL_OPENMP "triSYCL multi-threading with OpenMP" ON)
+option(TRISYCL_OPENCL "triSYCL OpenCL interoperability mode" OFF)
+option(TRISYCL_NO_ASYNC "triSYCL use synchronous kernel execution" OFF)
+option(TRISYCL_DEBUG "triSCYL use debug mode" OFF)
+option(TRISYCL_DEBUG_STRUCTORS "triSYCL trace of object lifetimes" OFF)
+option(TRISYCL_TRACE_KERNEL "triSYCL trace of kernel execution" OFF)
+
+mark_as_advanced(TRISYCL_OPENMP)
+mark_as_advanced(TRISYCL_OPENCL)
+mark_as_advanced(TRISYCL_NO_ASYNC)
+mark_as_advanced(TRISYCL_DEBUG)
+mark_as_advanced(TRISYCL_DEBUG_STRUCTORS)
+mark_as_advanced(TRISYCL_TRACE_KERNEL)
+
+#triSYCL definitions
+set(CL_SYCL_LANGUAGE_VERSION 220 CACHE STRING
+ "Host language version to be used by trisYCL (default is: 220)")
+set(TRISYCL_CL_LANGUAGE_VERSION 220 CACHE STRING
+ "Device language version to be used by trisYCL (default is: 220)")
+# triSYCL now requires c++17
+set(CMAKE_CXX_STANDARD 17)
+set(CXX_STANDARD_REQUIRED ON)
+
+
+# Find OpenCL package
+include(CMakeFindDependencyMacro)
+if(TRISYCL_OPENCL)
+ find_dependency(OpenCL REQUIRED)
+ if(UNIX)
+ set(BOOST_COMPUTE_INCPATH /usr/include/compute CACHE PATH
+ "Path to Boost.Compute headers (default is: /usr/include/compute)")
+ endif()
+endif()
+
+# Find OpenMP package
+if(TRISYCL_OPENMP)
+ find_dependency(OpenMP REQUIRED)
+endif()
+
+# Find Boost
+find_dependency(Boost 1.58 REQUIRED COMPONENTS chrono log)
+
+# If debug or trace we need boost log
+if(TRISYCL_DEBUG OR TRISYCL_DEBUG_STRUCTORS OR TRISYCL_TRACE_KERNEL)
+ set(LOG_NEEDED ON)
+else()
+ set(LOG_NEEDED OFF)
+endif()
+
+find_dependency(Threads REQUIRED)
+
+# Find triSYCL directory
+if (TRISYCL_INCLUDES AND TRISYCL_LIBRARIES)
+ set(TRISYCL_FIND_QUIETLY TRUE)
+endif ()
+
+find_path(TRISYCL_INCLUDE_DIR
+ NAMES sycl.hpp
+ PATHS $ENV{TRISYCLDIR} $ENV{TRISYCLDIR}/include ${INCLUDE_INSTALL_DIR}
+ PATH_SUFFIXES triSYCL
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(TriSYCL DEFAULT_MSG
+ TRISYCL_INCLUDE_DIR)
+
+if(NOT TRISYCL_INCLUDE_DIR)
+ message(FATAL_ERROR
+ "triSYCL include directory - Not found! (please set TRISYCL_INCLUDE_DIR")
+else()
+ message(STATUS "triSYCL include directory - Found ${TRISYCL_INCLUDE_DIR}")
+endif()
+
+include(CMakeParseArguments)
+#######################
+# add_sycl_to_target
+#######################
+function(add_sycl_to_target)
+ set(options)
+ set(one_value_args
+ TARGET
+ )
+ set(multi_value_args
+ SOURCES
+ )
+ cmake_parse_arguments(ADD_SYCL_ARGS
+ "${options}"
+ "${one_value_args}"
+ "${multi_value_args}"
+ ${ARGN}
+ )
+
+ # Add include directories to the "#include <>" paths
+ target_include_directories (${ADD_SYCL_ARGS_TARGET} PUBLIC
+ ${TRISYCL_INCLUDE_DIR}
+ ${Boost_INCLUDE_DIRS}
+ $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_INCLUDE_DIRS}>
+ $<$<BOOL:${TRISYCL_OPENCL}>:${BOOST_COMPUTE_INCPATH}>)
+
+ # Link dependencies
+ target_link_libraries(${ADD_SYCL_ARGS_TARGET}
+ $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_LIBRARIES}>
+ Threads::Threads
+ $<$<BOOL:${LOG_NEEDED}>:Boost::log>
+ Boost::chrono)
+
+ # Compile definitions
+ target_compile_definitions(${ADD_SYCL_ARGS_TARGET} PUBLIC
+ EIGEN_SYCL_TRISYCL
+ $<$<BOOL:${TRISYCL_NO_ASYNC}>:TRISYCL_NO_ASYNC>
+ $<$<BOOL:${TRISYCL_OPENCL}>:TRISYCL_OPENCL>
+ $<$<BOOL:${TRISYCL_DEBUG}>:TRISYCL_DEBUG>
+ $<$<BOOL:${TRISYCL_DEBUG_STRUCTORS}>:TRISYCL_DEBUG_STRUCTORS>
+ $<$<BOOL:${TRISYCL_TRACE_KERNEL}>:TRISYCL_TRACE_KERNEL>
+ $<$<BOOL:${LOG_NEEDED}>:BOOST_LOG_DYN_LINK>)
+
+ # C++ and OpenMP requirements
+ target_compile_options(${ADD_SYCL_ARGS_TARGET} PUBLIC
+ ${TRISYCL_COMPILE_OPTIONS}
+ $<$<BOOL:${TRISYCL_OPENMP}>:${OpenMP_CXX_FLAGS}>)
+
+ if(${TRISYCL_OPENMP} AND (NOT WIN32))
+ # Does not support generator expressions
+ set_target_properties(${ADD_SYCL_ARGS_TARGET}
+ PROPERTIES
+ LINK_FLAGS ${OpenMP_CXX_FLAGS})
+ endif()
+
+endfunction()
diff --git a/cmake/FindUmfpack.cmake b/cmake/FindUMFPACK.cmake
index 53cf0b49b..91cf6372f 100644
--- a/cmake/FindUmfpack.cmake
+++ b/cmake/FindUMFPACK.cmake
@@ -3,7 +3,7 @@
if (UMFPACK_INCLUDES AND UMFPACK_LIBRARIES)
set(UMFPACK_FIND_QUIETLY TRUE)
-endif (UMFPACK_INCLUDES AND UMFPACK_LIBRARIES)
+endif ()
find_path(UMFPACK_INCLUDES
NAMES
@@ -22,7 +22,7 @@ if(UMFPACK_LIBRARIES)
if(NOT UMFPACK_LIBDIR)
get_filename_component(UMFPACK_LIBDIR ${UMFPACK_LIBRARIES} PATH)
- endif(NOT UMFPACK_LIBDIR)
+ endif()
find_library(COLAMD_LIBRARY colamd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})
if(COLAMD_LIBRARY)
@@ -44,7 +44,7 @@ if(UMFPACK_LIBRARIES)
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CHOLMOD_LIBRARY})
endif()
-endif(UMFPACK_LIBRARIES)
+endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(UMFPACK DEFAULT_MSG
diff --git a/cmake/RegexUtils.cmake b/cmake/RegexUtils.cmake
index b59dfc340..f0a15248b 100644
--- a/cmake/RegexUtils.cmake
+++ b/cmake/RegexUtils.cmake
@@ -1,19 +1,19 @@
function(escape_string_as_regex _str_out _str_in)
- STRING(REGEX REPLACE "\\\\" "\\\\\\\\" FILETEST2 "${_str_in}")
- STRING(REGEX REPLACE "([.$+*?|-])" "\\\\\\1" FILETEST2 "${FILETEST2}")
- STRING(REGEX REPLACE "\\^" "\\\\^" FILETEST2 "${FILETEST2}")
- STRING(REGEX REPLACE "\\(" "\\\\(" FILETEST2 "${FILETEST2}")
- STRING(REGEX REPLACE "\\)" "\\\\)" FILETEST2 "${FILETEST2}")
- STRING(REGEX REPLACE "\\[" "\\\\[" FILETEST2 "${FILETEST2}")
- STRING(REGEX REPLACE "\\]" "\\\\]" FILETEST2 "${FILETEST2}")
- SET(${_str_out} "${FILETEST2}" PARENT_SCOPE)
+ string(REGEX REPLACE "\\\\" "\\\\\\\\" FILETEST2 "${_str_in}")
+ string(REGEX REPLACE "([.$+*?|-])" "\\\\\\1" FILETEST2 "${FILETEST2}")
+ string(REGEX REPLACE "\\^" "\\\\^" FILETEST2 "${FILETEST2}")
+ string(REGEX REPLACE "\\(" "\\\\(" FILETEST2 "${FILETEST2}")
+ string(REGEX REPLACE "\\)" "\\\\)" FILETEST2 "${FILETEST2}")
+ string(REGEX REPLACE "\\[" "\\\\[" FILETEST2 "${FILETEST2}")
+ string(REGEX REPLACE "\\]" "\\\\]" FILETEST2 "${FILETEST2}")
+ set(${_str_out} "${FILETEST2}" PARENT_SCOPE)
endfunction()
function(test_escape_string_as_regex)
- SET(test1 "\\.^$-+*()[]?|")
+ set(test1 "\\.^$-+*()[]?|")
escape_string_as_regex(test2 "${test1}")
- SET(testRef "\\\\\\.\\^\\$\\-\\+\\*\\(\\)\\[\\]\\?\\|")
+ set(testRef "\\\\\\.\\^\\$\\-\\+\\*\\(\\)\\[\\]\\?\\|")
if(NOT test2 STREQUAL testRef)
message("Error in the escape_string_for_regex function : \n ${test1} was escaped as ${test2}, should be ${testRef}")
- endif(NOT test2 STREQUAL testRef)
+ endif()
endfunction() \ No newline at end of file
diff --git a/cmake/language_support.cmake b/cmake/language_support.cmake
deleted file mode 100644
index 2f14f30b8..000000000
--- a/cmake/language_support.cmake
+++ /dev/null
@@ -1,67 +0,0 @@
-# cmake/modules/language_support.cmake
-#
-# Temporary additional general language support is contained within this
-# file.
-
-# This additional function definition is needed to provide a workaround for
-# CMake bug 9220.
-
-# On debian testing (cmake 2.6.2), I get return code zero when calling
-# cmake the first time, but cmake crashes when running a second time
-# as follows:
-#
-# -- The Fortran compiler identification is unknown
-# CMake Error at /usr/share/cmake-2.6/Modules/CMakeFortranInformation.cmake:7 (GET_FILENAME_COMPONENT):
-# get_filename_component called with incorrect number of arguments
-# Call Stack (most recent call first):
-# CMakeLists.txt:3 (enable_language)
-#
-# My workaround is to invoke cmake twice. If both return codes are zero,
-# it is safe to invoke ENABLE_LANGUAGE(Fortran OPTIONAL)
-
-function(workaround_9220 language language_works)
- #message("DEBUG: language = ${language}")
- set(text
- "project(test NONE)
- cmake_minimum_required(VERSION 2.8.0)
- set (CMAKE_Fortran_FLAGS \"${CMAKE_Fortran_FLAGS}\")
- set (CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS}\")
- enable_language(${language} OPTIONAL)
- ")
- file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/language_tests/${language})
- file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language})
- file(WRITE ${CMAKE_BINARY_DIR}/language_tests/${language}/CMakeLists.txt
- ${text})
- execute_process(
- COMMAND ${CMAKE_COMMAND} . -G "${CMAKE_GENERATOR}"
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}
- RESULT_VARIABLE return_code
- OUTPUT_QUIET
- ERROR_QUIET
- )
-
- if(return_code EQUAL 0)
- # Second run
- execute_process (
- COMMAND ${CMAKE_COMMAND} . -G "${CMAKE_GENERATOR}"
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/language_tests/${language}
- RESULT_VARIABLE return_code
- OUTPUT_QUIET
- ERROR_QUIET
- )
- if(return_code EQUAL 0)
- set(${language_works} ON PARENT_SCOPE)
- else(return_code EQUAL 0)
- set(${language_works} OFF PARENT_SCOPE)
- endif(return_code EQUAL 0)
- else(return_code EQUAL 0)
- set(${language_works} OFF PARENT_SCOPE)
- endif(return_code EQUAL 0)
-endfunction(workaround_9220)
-
-# Temporary tests of the above function.
-#workaround_9220(CXX CXX_language_works)
-#message("CXX_language_works = ${CXX_language_works}")
-#workaround_9220(CXXp CXXp_language_works)
-#message("CXXp_language_works = ${CXXp_language_works}")
-