diff options
Diffstat (limited to 'cmake')
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}") - |