diff --git a/CMakeLists.txt b/CMakeLists.txt index fd27e901f3..03382ab787 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,34 +90,30 @@ function(configureBitpitTargetDependencies TARGET_NAME DEPENDENCIES_SCOPE) endif() if (BLAS_FOUND) - target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${BLAS_LIBRARIES}) - target_include_directories(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${BLAS_INCLUDE_DIRS}) + target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} BLAS::BLAS) endif() if (CBLAS_FOUND) - set(CBLAS_PRIVATE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/external/CBLAS/include") + target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} CBLAS::CBLAS) - target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${CBLAS_LIBRARIES}) + set(CBLAS_PRIVATE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/external/CBLAS/include") target_include_directories(${TARGET_NAME} PRIVATE ${CBLAS_PRIVATE_INCLUDE_DIR}) - target_include_directories(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${CBLAS_INCLUDE_DIRS}) endif() if (LAPACK_FOUND) - target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${LAPACK_LIBRARIES}) + target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} LAPACK::LAPACK) target_include_directories(${TARGET_NAME} ${DEPENDENCIES_SCOPE}${LAPACK_INCLUDE_DIRS}) endif() if (LAPACKE_FOUND) - set(LAPACKE_PRIVATE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/external/LAPACKE/include") + target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} LAPACKE::LAPACKE) - target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${LAPACKE_LIBRARIES}) + set(LAPACKE_PRIVATE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/external/LAPACKE/include") target_include_directories(${TARGET_NAME} PRIVATE ${LAPACKE_PRIVATE_INCLUDE_DIR}) - target_include_directories(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${LAPACKE_INCLUDE_DIRS}) endif() if (PETSC_FOUND) - target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${PETSC_LIBRARIES}) - target_include_directories(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${PETSC_INCLUDES}) + target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} PETSc::PETSc) endif() unset(_PETSc_index) @@ -127,8 +123,7 @@ function(configureBitpitTargetDependencies TARGET_NAME DEPENDENCIES_SCOPE) endif() if (METIS_FOUND) - target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${METIS_LIBRARIES}) - target_include_directories(${TARGET_NAME} ${DEPENDENCIES_SCOPE} ${METIS_INCLUDE_DIRS}) + target_link_libraries(${TARGET_NAME} ${DEPENDENCIES_SCOPE} METIS::METIS) target_compile_definitions(${BITPIT_LIBRARY} ${DEPENDENCIES_SCOPE} "BITPIT_ENABLE_METIS=1") else() @@ -500,7 +495,7 @@ set(OPERATORS_EXTERNAL_DEPS "") set(CONTAINERS_EXTERNAL_DEPS "") set(IO_EXTERNAL_DEPS "Boost") set(COMMUNICATIONS_EXTERNAL_DEPS "MPI") -set(LA_EXTERNAL_DEPS "PETSc") +set(LA_EXTERNAL_DEPS "PETSc;LAPACKE") set(SA_EXTERNAL_DEPS "") set(CG_EXTERNAL_DEPS "") set(PABLO_EXTERNAL_DEPS "") @@ -943,9 +938,11 @@ SET(CMAKE_CXX_FLAGS_GNUPROFILING "-pg" CACHE STRING "Flags used by the C++ compiler during GNU profiling builds." FORCE) MARK_AS_ADVANCED(CMAKE_CXX_FLAGS_GNUPROFILING) -SET(CMAKE_C_FLAGS_GNUPROFILING "-pg" CACHE STRING - "Flags used by the C compiler during GNU profiling builds." FORCE) -MARK_AS_ADVANCED(CMAKE_C_FLAGS_GNUPROFILING) +if ("C" IN_LIST BITPIT_LANGUAGES) + SET(CMAKE_C_FLAGS_GNUPROFILING "-pg" CACHE STRING + "Flags used by the C compiler during GNU profiling builds." FORCE) + MARK_AS_ADVANCED(CMAKE_C_FLAGS_GNUPROFILING) +endif() SET(CMAKE_EXE_LINKER_FLAGS_GNUPROFILING "-pg" CACHE STRING "Flags used for linking binaries during GNU profiling builds." FORCE) @@ -960,9 +957,11 @@ SET(CMAKE_CXX_FLAGS_SCALASCAPROFILING "-O2" CACHE STRING "Flags used by the C++ compiler during Scalasca profiling builds." FORCE) MARK_AS_ADVANCED(CMAKE_CXX_FLAGS_SCALASCAPROFILING) -SET(CMAKE_C_FLAGS_SCALASCAPROFILING "-O2" CACHE STRING - "Flags used by the C compiler during Scalasca builds." FORCE) -MARK_AS_ADVANCED(CMAKE_C_FLAGS_SCALASCAPROFILING) +if ("C" IN_LIST BITPIT_LANGUAGES) + SET(CMAKE_C_FLAGS_SCALASCAPROFILING "-O2" CACHE STRING + "Flags used by the C compiler during Scalasca builds." FORCE) + MARK_AS_ADVANCED(CMAKE_C_FLAGS_SCALASCAPROFILING) +endif() SET(CMAKE_EXE_LINKER_FLAGS_SCALASCAPROFILING "" CACHE STRING "Flags used for linking binaries during Scalasca builds." FORCE) @@ -1003,24 +1002,31 @@ endif() # Standard build types if (MSVC) - set(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Zi /Zo /Oy- /Ob0 /MDd") - set(CMAKE_C_FLAGS_DEBUG "/Od /Zi /Oy- /Ob0 /MDd") - set(CMAKE_C_FLAGS_RELEASE "/O2 /MD") - set(CMAKE_C_FLAGS_MINSIZEREL "/O1 /MD") + if ("C" IN_LIST BITPIT_LANGUAGES) + set(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Zi /Zo /Oy- /Ob0 /MDd") + set(CMAKE_C_FLAGS_DEBUG "/Od /Zi /Oy- /Ob0 /MDd") + set(CMAKE_C_FLAGS_RELEASE "/O2 /MD") + set(CMAKE_C_FLAGS_MINSIZEREL "/O1 /MD") + endif() set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /Zi /Zo /Oy- /Ob0 /MDd") set(CMAKE_CXX_FLAGS_DEBUG "/Od /Zi /Oy- /Ob0 /MDd") set(CMAKE_CXX_FLAGS_RELEASE "/O2 /MD") set(CMAKE_CXX_FLAGS_MINSIZEREL "/O1 /MD") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4267 /wd4250 /Zc:preprocessor") + if ("C" IN_LIST BITPIT_LANGUAGES) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4267 /wd4250 /Zc:preprocessor") + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /wd4267 /wd4250 /Zc:preprocessor") else() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") - set(CMAKE_C_FLAGS_RELWITHSANITIZE "-O2 -g -fno-omit-frame-pointer -fno-common ${C_SANITIZE_MODULE_FLAGS}") - set(CMAKE_C_FLAGS_DEBUG "-O0 -g") - set(CMAKE_C_FLAGS_RELEASE "-O2") + if ("C" IN_LIST BITPIT_LANGUAGES) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELWITHSANITIZE "-O2 -g -fno-omit-frame-pointer -fno-common ${C_SANITIZE_MODULE_FLAGS}") + set(CMAKE_C_FLAGS_DEBUG "-O0 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2") + endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") @@ -1029,42 +1035,41 @@ else() set(CMAKE_CXX_FLAGS_RELEASE "-O2") CHECK_CXX_COMPILER_FLAG("-Wall" CXX_SUPPORTS_WALL) - if(CXX_SUPPORTS_WALL) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif() CHECK_CXX_COMPILER_FLAG("-Wextra" CXX_SUPPORTS_WEXTRA) - if(CXX_SUPPORTS_WEXTRA) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra") endif() CHECK_CXX_COMPILER_FLAG("-Wsuggest-override" CXX_SUPPORTS_WSUGGEST_OVERRIDE) - if(CXX_SUPPORTS_WSUGGEST_OVERRIDE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override") endif() - CHECK_C_COMPILER_FLAG("-Wall" C_SUPPORTS_WALL) - - if(C_SUPPORTS_WALL) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") - endif() - - CHECK_C_COMPILER_FLAG("-Wextra" C_SUPPORTS_WEXTRA) + if ("C" IN_LIST BITPIT_LANGUAGES) + CHECK_C_COMPILER_FLAG("-Wall" C_SUPPORTS_WALL) + if(C_SUPPORTS_WALL) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + endif() - if(C_SUPPORTS_WEXTRA) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra") + CHECK_C_COMPILER_FLAG("-Wextra" C_SUPPORTS_WEXTRA) + if(C_SUPPORTS_WEXTRA) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra") + endif() endif() set(CMAKE_EXE_LINKER_FLAGS_RELWITHSANITIZE "-fno-omit-frame-pointer -fno-common ${CXX_SANITIZE_MODULE_FLAGS}") endif() # Coverage build type -SET(CMAKE_C_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING - "Flags used by the C compiler during coverage builds." FORCE) -MARK_AS_ADVANCED(CMAKE_C_FLAGS_COVERAGE) +if ("C" IN_LIST BITPIT_LANGUAGES) + SET(CMAKE_C_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING + "Flags used by the C compiler during coverage builds." FORCE) + MARK_AS_ADVANCED(CMAKE_C_FLAGS_COVERAGE) +endif() SET(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE) @@ -1142,7 +1147,9 @@ scalasca ${C_FLAGS_INSTRUMENT} \"$@\" file(REMOVE scalasca_c_compiler) set(CMAKE_CXX_COMPILER "${PROJECT_BINARY_DIR}/scalasca_cxx_compiler") - set(CMAKE_C_COMPILER "${PROJECT_BINARY_DIR}/scalasca_c_compiler") + if ("C" IN_LIST BITPIT_LANGUAGES) + set(CMAKE_C_COMPILER "${PROJECT_BINARY_DIR}/scalasca_c_compiler") + endif() endif () # Check the features supported by the compiler diff --git a/external/CBLAS/cmake/FindCBLAS.cmake b/external/CBLAS/cmake/FindCBLAS.cmake index eb3f47db00..82073a99bb 100644 --- a/external/CBLAS/cmake/FindCBLAS.cmake +++ b/external/CBLAS/cmake/FindCBLAS.cmake @@ -394,3 +394,76 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CBLAS DEFAULT_MSG CBLAS_LIBRARIES CBLAS_WORKS) + +#----------------------------------------------------------------------------- +# Create imported target +#----------------------------------------------------------------------------- +if (NOT TARGET CBLAS::CBLAS) + set(CBLAS_LIBRARY_TARGETS "") + foreach(LIBRARY_PATH ${CBLAS_LIBRARIES}) + get_filename_component(LIBRARY_FILENAME "${LIBRARY_PATH}" NAME) + get_filename_component(LIBRARY_EXTENSION "${LIBRARY_PATH}" LAST_EXT) + + string(REGEX REPLACE "\\.[^.]*$" "" LIBRARY_TARGET "${LIBRARY_FILENAME}") + string(REGEX REPLACE "^lib" "" LIBRARY_TARGET "${LIBRARY_TARGET}") + set(LIBRARY_TARGET "CBLAS::${LIBRARY_TARGET}_library") + + if (LIBRARY_EXTENSION STREQUAL ".a") + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".lib") + get_filename_component(LIBRARY_BASENAME "${LIBRARY_FILENAME}" NAME_WE) + get_filename_component(LIBRARY_DIRECTORY "${LIBRARY_PATH}" DIRECTORY) + set(LIBRARY_DLL_SEARCH_PATHS + "${LIBRARY_DIRECTORY}" + "${LIBRARY_DIRECTORY}/../bin" + "${LIBRARY_DIRECTORY}/../../redist/intel64" + "${LIBRARY_DIRECTORY}/../../../redist/intel64" + "${LIBRARY_DIRECTORY}/../../redist/intel64/compiler" + "${LIBRARY_DIRECTORY}/../../../redist/intel64/compiler" + "${LIBRARY_DIRECTORY}/../../redist/intel64_win/compiler" + "${LIBRARY_DIRECTORY}/../../../redist/intel64_win/compiler" + + ) + + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + foreach(LIBRARY_DLL_SEARCH_PATH IN LISTS LIBRARY_DLL_SEARCH_PATHS) + string(REGEX REPLACE "_dll$" "" CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_BASENAME}") + set(CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_DLL_SEARCH_PATH}/${CANDIDATE_LIBRARY_DLL_PATH}.dll") + if(EXISTS "${CANDIDATE_LIBRARY_DLL_PATH}") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${CANDIDATE_LIBRARY_DLL_PATH}") + break() + endif() + + string(REGEX REPLACE "_dll$" "" CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_BASENAME}") + set(CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_DLL_SEARCH_PATH}/${CANDIDATE_LIBRARY_DLL_PATH}.2.dll") + if(EXISTS "${CANDIDATE_LIBRARY_DLL_PATH}") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${CANDIDATE_LIBRARY_DLL_PATH}") + break() + endif() + endforeach() + elseif (LIBRARY_EXTENSION STREQUAL ".so") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".dll") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + endif() + + add_library(${LIBRARY_TARGET} ${TARGET_TYPE} IMPORTED) + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_LOCATION ${TARGET_IMPORTED_LOCATION}) + if (WIN32 AND TARGET_TYPE STREQUAL "SHARED") + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_IMPLIB "${LIBRARY_PATH}") + endif() + set_target_properties(${LIBRARY_TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CBLAS_INCLUDE_DIRS}") + set_target_properties(${LIBRARY_TARGET} PROPERTIES INTERFACE_LINK_OPTIONS "${CBLAS_LINKER_FLAGS}") + + list(APPEND CBLAS_LIBRARY_TARGETS ${LIBRARY_TARGET}) + endforeach() + + add_library(CBLAS::CBLAS INTERFACE IMPORTED) + set_target_properties(CBLAS::CBLAS PROPERTIES INTERFACE_LINK_LIBRARIES "${CBLAS_LIBRARY_TARGETS}") +endif() diff --git a/external/LAPACKE/cmake/FindLAPACKE.cmake b/external/LAPACKE/cmake/FindLAPACKE.cmake index c86470b3c6..8fe0afc149 100644 --- a/external/LAPACKE/cmake/FindLAPACKE.cmake +++ b/external/LAPACKE/cmake/FindLAPACKE.cmake @@ -424,3 +424,76 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(LAPACKE DEFAULT_MSG LAPACKE_LIBRARIES LAPACKE_WORKS) + +#----------------------------------------------------------------------------- +# Create imported target +#----------------------------------------------------------------------------- +if (NOT TARGET LAPACKE::LAPACKE) + set(LAPACKE_LIBRARY_TARGETS "") + foreach(LIBRARY_PATH ${LAPACKE_LIBRARIES}) + get_filename_component(LIBRARY_FILENAME "${LIBRARY_PATH}" NAME) + get_filename_component(LIBRARY_EXTENSION "${LIBRARY_PATH}" LAST_EXT) + + string(REGEX REPLACE "\\.[^.]*$" "" LIBRARY_TARGET "${LIBRARY_FILENAME}") + string(REGEX REPLACE "^lib" "" LIBRARY_TARGET "${LIBRARY_TARGET}") + set(LIBRARY_TARGET "LAPACKE::${LIBRARY_TARGET}_library") + + if (LIBRARY_EXTENSION STREQUAL ".a") + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".lib") + get_filename_component(LIBRARY_BASENAME "${LIBRARY_FILENAME}" NAME_WE) + get_filename_component(LIBRARY_DIRECTORY "${LIBRARY_PATH}" DIRECTORY) + set(LIBRARY_DLL_SEARCH_PATHS + "${LIBRARY_DIRECTORY}" + "${LIBRARY_DIRECTORY}/../bin" + "${LIBRARY_DIRECTORY}/../../bin" + "${LIBRARY_DIRECTORY}/../../redist/intel64" + "${LIBRARY_DIRECTORY}/../../../redist/intel64" + "${LIBRARY_DIRECTORY}/../../redist/intel64/compiler" + "${LIBRARY_DIRECTORY}/../../../redist/intel64/compiler" + "${LIBRARY_DIRECTORY}/../../redist/intel64_win/compiler" + "${LIBRARY_DIRECTORY}/../../../redist/intel64_win/compiler" + ) + + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + foreach(LIBRARY_DLL_SEARCH_PATH IN LISTS LIBRARY_DLL_SEARCH_PATHS) + string(REGEX REPLACE "_dll$" "" CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_BASENAME}") + set(CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_DLL_SEARCH_PATH}/${CANDIDATE_LIBRARY_DLL_PATH}.dll") + if(EXISTS "${CANDIDATE_LIBRARY_DLL_PATH}") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${CANDIDATE_LIBRARY_DLL_PATH}") + break() + endif() + + string(REGEX REPLACE "_dll$" "" CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_BASENAME}") + set(CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_DLL_SEARCH_PATH}/${CANDIDATE_LIBRARY_DLL_PATH}.2.dll") + if(EXISTS "${CANDIDATE_LIBRARY_DLL_PATH}") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${CANDIDATE_LIBRARY_DLL_PATH}") + break() + endif() + endforeach() + elseif (LIBRARY_EXTENSION STREQUAL ".so") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".dll") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + endif() + + add_library(${LIBRARY_TARGET} ${TARGET_TYPE} IMPORTED) + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_LOCATION ${TARGET_IMPORTED_LOCATION}) + if (WIN32 AND TARGET_TYPE STREQUAL "SHARED") + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_IMPLIB "${LIBRARY_PATH}") + endif() + set_target_properties(${LIBRARY_TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LAPACKE_INCLUDE_DIRS}") + set_target_properties(${LIBRARY_TARGET} PROPERTIES INTERFACE_LINK_OPTIONS "${LAPACKE_LINKER_FLAGS}") + + list(APPEND LAPACKE_LIBRARY_TARGETS ${LIBRARY_TARGET}) + endforeach() + + add_library(LAPACKE::LAPACKE INTERFACE IMPORTED) + set_target_properties(LAPACKE::LAPACKE PROPERTIES INTERFACE_LINK_LIBRARIES "${LAPACKE_LIBRARY_TARGETS}") +endif() diff --git a/external/METIS/cmake/FindMETIS.cmake b/external/METIS/cmake/FindMETIS.cmake index dfed58b08e..372590a9bb 100644 --- a/external/METIS/cmake/FindMETIS.cmake +++ b/external/METIS/cmake/FindMETIS.cmake @@ -332,3 +332,59 @@ find_package_handle_standard_args(METIS DEFAULT_MSG # # TODO: Add possibility to check for specific functions in the library # + +#----------------------------------------------------------------------------- +# Create imported target +#----------------------------------------------------------------------------- +if (NOT TARGET METIS::METIS) + set(METIS_LIBRARY_TARGETS "") + foreach(LIBRARY_PATH ${METIS_LIBRARIES}) + get_filename_component(LIBRARY_FILENAME "${LIBRARY_PATH}" NAME) + get_filename_component(LIBRARY_EXTENSION "${LIBRARY_PATH}" LAST_EXT) + + string(REGEX REPLACE "\\.[^.]*$" "" LIBRARY_TARGET "${LIBRARY_FILENAME}") + string(REGEX REPLACE "^lib" "" LIBRARY_TARGET "${LIBRARY_TARGET}") + set(LIBRARY_TARGET "METIS::${LIBRARY_TARGET}_library") + + if (LIBRARY_EXTENSION STREQUAL ".a") + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".lib") + get_filename_component(LIBRARY_BASENAME "${LIBRARY_FILENAME}" NAME_WE) + get_filename_component(LIBRARY_DIRECTORY "${LIBRARY_PATH}" DIRECTORY) + set(LIBRARY_DLL_SEARCH_PATHS + "${LIBRARY_DIRECTORY}" + "${LIBRARY_DIRECTORY}/../bin" + "${LIBRARY_DIRECTORY}/../../bin" + ) + + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + foreach(LIBRARY_DLL_SEARCH_PATH IN LISTS LIBRARY_DLL_SEARCH_PATHS) + set(CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_DLL_SEARCH_PATH}/${LIBRARY_BASENAME}.dll") + if(EXISTS "${CANDIDATE_LIBRARY_DLL_PATH}") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${CANDIDATE_LIBRARY_DLL_PATH}") + break() + endif() + endforeach() + elseif (LIBRARY_EXTENSION STREQUAL ".so") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".dll") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + endif() + + add_library(${LIBRARY_TARGET} ${TARGET_TYPE} IMPORTED) + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_LOCATION ${TARGET_IMPORTED_LOCATION}) + if (WIN32 AND TARGET_TYPE STREQUAL "SHARED") + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_IMPLIB "${LIBRARY_PATH}") + endif() + set_target_properties(${LIBRARY_TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${METIS_INCLUDE_DIRS}") + list(APPEND METIS_LIBRARY_TARGETS ${LIBRARY_TARGET}) + endforeach() + + add_library(METIS::METIS INTERFACE IMPORTED) + set_target_properties(METIS::METIS PROPERTIES INTERFACE_LINK_LIBRARIES "${METIS_LIBRARY_TARGETS}") +endif() diff --git a/external/PETSc/cmake/FindPETSc.cmake b/external/PETSc/cmake/FindPETSc.cmake index 5b56b4b62a..3472317b6e 100644 --- a/external/PETSc/cmake/FindPETSc.cmake +++ b/external/PETSc/cmake/FindPETSc.cmake @@ -444,3 +444,59 @@ find_package_handle_standard_args (PETSc REQUIRED_VARS PETSC_INCLUDES PETSC_LIBRARIES PETSC_EXECUTABLE_RUNS VERSION_VAR PETSC_VERSION FAIL_MESSAGE "PETSc could not be found. Be sure to set PETSC_DIR and PETSC_ARCH.") + +#----------------------------------------------------------------------------- +# Create imported target +#----------------------------------------------------------------------------- +if (NOT TARGET PETSc::PETSc) + set(PETSC_LIBRARY_TARGETS "") + foreach(LIBRARY_PATH ${PETSC_LIBRARIES}) + get_filename_component(LIBRARY_FILENAME "${LIBRARY_PATH}" NAME) + get_filename_component(LIBRARY_EXTENSION "${LIBRARY_PATH}" LAST_EXT) + + string(REGEX REPLACE "\\.[^.]*$" "" LIBRARY_TARGET "${LIBRARY_FILENAME}") + string(REGEX REPLACE "^lib" "" LIBRARY_TARGET "${LIBRARY_TARGET}") + set(LIBRARY_TARGET "PETSc::${LIBRARY_TARGET}_library") + + if (LIBRARY_EXTENSION STREQUAL ".a") + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".lib") + get_filename_component(LIBRARY_BASENAME "${LIBRARY_FILENAME}" NAME_WE) + get_filename_component(LIBRARY_DIRECTORY "${LIBRARY_PATH}" DIRECTORY) + set(LIBRARY_DLL_SEARCH_PATHS + "${LIBRARY_DIRECTORY}" + "${LIBRARY_DIRECTORY}/../bin" + ) + + set(TARGET_TYPE "STATIC") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + foreach(LIBRARY_DLL_SEARCH_PATH IN LISTS LIBRARY_DLL_SEARCH_PATHS) + set(CANDIDATE_LIBRARY_DLL_PATH "${LIBRARY_DLL_SEARCH_PATH}/${LIBRARY_BASENAME}.dll") + if(EXISTS "${CANDIDATE_LIBRARY_DLL_PATH}") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${CANDIDATE_LIBRARY_DLL_PATH}") + break() + endif() + endforeach() + elseif (LIBRARY_EXTENSION STREQUAL ".so") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + elseif (LIBRARY_EXTENSION STREQUAL ".dll") + set(TARGET_TYPE "SHARED") + set(TARGET_IMPORTED_LOCATION "${LIBRARY_PATH}") + endif() + + add_library(${LIBRARY_TARGET} ${TARGET_TYPE} IMPORTED) + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_LOCATION ${TARGET_IMPORTED_LOCATION}) + if (WIN32 AND TARGET_TYPE STREQUAL "SHARED") + set_target_properties(${LIBRARY_TARGET} PROPERTIES IMPORTED_IMPLIB "${LIBRARY_PATH}") + endif() + set_target_properties(${LIBRARY_TARGET} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${PETSC_INCLUDES}") + target_compile_definitions(${LIBRARY_TARGET} INTERFACE ${PETSC_DEFINITIONS}) + list(APPEND PETSC_LIBRARY_TARGETS ${LIBRARY_TARGET}) + endforeach() + + add_library(PETSc::PETSc INTERFACE IMPORTED) + set_target_properties(PETSc::PETSc PROPERTIES INTERFACE_LINK_LIBRARIES "${PETSC_LIBRARY_TARGETS}") +endif()