From 418fa49d2fb29ceb4d8e40c3fd44f86e877d24f6 Mon Sep 17 00:00:00 2001 From: Terry Cojean Date: Thu, 11 Nov 2021 20:10:20 +0100 Subject: [PATCH 1/5] Make ginkgo.pc libraries be found recursively --- cmake/information_helpers.cmake | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/cmake/information_helpers.cmake b/cmake/information_helpers.cmake index e4f9033be50..bdc22bf59dc 100644 --- a/cmake/information_helpers.cmake +++ b/cmake/information_helpers.cmake @@ -1,11 +1,34 @@ +macro(ginkgo_interface_libraries_recursively INTERFACE_LIBS) + foreach(_libs ${INTERFACE_LIBS}) + if (TARGET ${_libs}) + if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND "${_libs}" MATCHES "ginkgo*") + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-l${_libs}${CMAKE_DEBUG_POSTFIX}") + else() + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-l${_libs}") + endif() + get_target_property(GINKGO_LIBS_INTERFACE_LIBS "${_libs}" INTERFACE_LINK_LIBRARIES) + ginkgo_interface_libraries_recursively("${GINKGO_LIBS_INTERFACE_LIBS}") + endif() + endforeach() +endmacro() + macro(ginkgo_interface_information) get_target_property(GINKGO_INTERFACE_LINK_LIBRARIES ginkgo INTERFACE_LINK_LIBRARIES) - set(GINKGO_INTERFACE_LINK_FLAGS "-L${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_LIBRARY_DIR} -lginkgo") + set(GINKGO_INTERFACE_LINK_FLAGS "-L${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_LIBRARY_DIR}") set(GINKGO_INTERFACE_CXX_FLAGS "-I${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_INCLUDE_DIR}") - foreach(_libs IN LISTS GINKGO_INTERFACE_LINK_LIBRARIES) - set(GINKGO_INTERFACE_LINK_FLAGS "${GINKGO_INTERFACE_LINK_FLAGS} -l${_libs}") - endforeach() + unset(GINKGO_INTERFACE_LIBS_FOUND) + string(TOUPPER "${CMAKE_BUILD_TYPE}" upper_CMAKE_BUILD_TYPE) + if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG") + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-lginkgo${CMAKE_DEBUG_POSTFIX}") + else() + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-lginkgo") + endif() + ginkgo_interface_libraries_recursively("${GINKGO_INTERFACE_LINK_LIBRARIES}") + list(REMOVE_DUPLICATES GINKGO_INTERFACE_LIBS_FOUND) + string(REPLACE ";" " " GINKGO_FORMATTED_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIBS_FOUND}") + set(GINKGO_INTERFACE_LINK_FLAGS "${GINKGO_INTERFACE_LINK_FLAGS} ${GINKGO_FORMATTED_INTERFACE_LIBS_FOUND}") + unset(GINKGO_INTERFACE_LIBS_FOUND) endmacro(ginkgo_interface_information) macro(ginkgo_git_information) From fcb4058b55f699b28b5530a3eedf74170fec96c8 Mon Sep 17 00:00:00 2001 From: Terry Cojean Date: Wed, 22 Dec 2021 11:35:13 +0100 Subject: [PATCH 2/5] Deal with more complex settings. --- CMakeLists.txt | 2 + cmake/information_helpers.cmake | 84 +++++++++++++++++++++++++++++---- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 761f10f420d..9312c3f948f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -334,6 +334,8 @@ endif() configure_file(${Ginkgo_SOURCE_DIR}/cmake/ginkgo.pc.in ${Ginkgo_BINARY_DIR}/ginkgo.pc @ONLY) +file(GENERATE OUTPUT ${Ginkgo_BINARY_DIR}/ginkgo.pc + INPUT ${Ginkgo_BINARY_DIR}/ginkgo.pc) # WINDOWS NVCC has " inside the string, add escape character # to avoid config problem. diff --git a/cmake/information_helpers.cmake b/cmake/information_helpers.cmake index bdc22bf59dc..80898e71209 100644 --- a/cmake/information_helpers.cmake +++ b/cmake/information_helpers.cmake @@ -1,34 +1,98 @@ +function(filter_generator_expressions INPUT OUTPUT) + string(REGEX REPLACE ".+LINK:.+:(.+)>" "\\1" + TMP "${INPUT}") + string(REGEX REPLACE ".+\\$:.+>(.+)" "\\1" + TMP "${TMP}") + string(REGEX REPLACE ".+INTERFACE:.+>" "" TMP "${TMP}") + set(${OUTPUT} "${TMP}" PARENT_SCOPE) +endfunction() + macro(ginkgo_interface_libraries_recursively INTERFACE_LIBS) foreach(_libs ${INTERFACE_LIBS}) if (TARGET ${_libs}) - if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND "${_libs}" MATCHES "ginkgo*") - list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-l${_libs}${CMAKE_DEBUG_POSTFIX}") - else() - list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-l${_libs}") + if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND "${_libs}" MATCHES "ginkgo.*") + set(GINKGO_INTERFACE_LIB_NAME "-l${_libs}${CMAKE_DEBUG_POSTFIX}") + elseif("${_libs}" MATCHES "ginkgo.*") # Ginkgo libs are appended in the form -l + set(GINKGO_INTERFACE_LIB_NAME "-l${_libs}") + endif() + + # Get the link flags and treat them + get_target_property(GINKGO_INTERFACE_LIBS_LINK_FLAGS "${_libs}" + INTERFACE_LINK_OPTIONS) + if (GINKGO_INTERFACE_LIBS_LINK_FLAGS) + filter_generator_expressions("${GINKGO_INTERFACE_LIBS_LINK_FLAGS}" + GINKGO_INTERFACE_LIB_NAME) + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") + elseif (NOT "${GINKGO_INTERFACE_LIB_NAME}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND) + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") + endif() + + # Populate the include directories + get_target_property(GINKGO_LIBS_INTERFACE_INCS "${_libs}" + INTERFACE_INCLUDE_DIRECTORIES) + foreach(_incs ${GINKGO_LIBS_INTERFACE_INCS}) + filter_generator_expressions("${_incs}" GINKGO_INTERFACE_INC_FILTERED) + if (GINKGO_INTERFACE_INC_FILTERED AND NOT + "-I${GINKGO_INTERFACE_INC_FILTERED}" IN_LIST GINKGO_INTERFACE_CFLAGS_FOUND) + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "-I${GINKGO_INTERFACE_INC_FILTERED}") + endif() + endforeach() + + # Populate the compiler options and definitions if needed + get_target_property(GINKGO_LIBS_INTERFACE_DEFS "${_libs}" + INTERFACE_COMPILE_DEFINITIONS) + if (GINKGO_LIBS_INTERFACE_DEFS) + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "${GINKGO_LIBS_INTERFACE_DEFS}") + endif() + get_target_property(GINKGO_LIBS_INTERFACE_OPTS "${_libs}" + INTERFACE_COMPILE_OPTIONS) + filter_generator_expressions("${GINKGO_LIBS_INTERFACE_OPTS}" GINKGO_LIBS_INTERFACE_OPTS_FILTERED) + if (GINKGO_LIBS_INTERFACE_OPTS) + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "${GINKGO_LIBS_INTERFACE_OPTS_FILTERED}") endif() - get_target_property(GINKGO_LIBS_INTERFACE_LIBS "${_libs}" INTERFACE_LINK_LIBRARIES) + + # Keep recursing through the libraries + get_target_property(GINKGO_LIBS_INTERFACE_LIBS "${_libs}" + INTERFACE_LINK_LIBRARIES) ginkgo_interface_libraries_recursively("${GINKGO_LIBS_INTERFACE_LIBS}") + elseif(EXISTS "${_libs}") + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${_libs}") endif() endforeach() endmacro() macro(ginkgo_interface_information) - get_target_property(GINKGO_INTERFACE_LINK_LIBRARIES ginkgo INTERFACE_LINK_LIBRARIES) set(GINKGO_INTERFACE_LINK_FLAGS "-L${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_LIBRARY_DIR}") - set(GINKGO_INTERFACE_CXX_FLAGS "-I${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_INCLUDE_DIR}") - unset(GINKGO_INTERFACE_LIBS_FOUND) + unset(GINKGO_INTERFACE_CFLAGS_FOUND) + # Prepare recursively populated library list string(TOUPPER "${CMAKE_BUILD_TYPE}" upper_CMAKE_BUILD_TYPE) if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG") list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-lginkgo${CMAKE_DEBUG_POSTFIX}") else() list(APPEND GINKGO_INTERFACE_LIBS_FOUND "-lginkgo") endif() + # Prepare recursively populated include directory list + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND + "-I${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_INCLUDE_DIR}") + + # Call the recursive interface libraries macro + get_target_property(GINKGO_INTERFACE_LINK_LIBRARIES ginkgo INTERFACE_LINK_LIBRARIES) ginkgo_interface_libraries_recursively("${GINKGO_INTERFACE_LINK_LIBRARIES}") + + # Format and store the interface libraries found list(REMOVE_DUPLICATES GINKGO_INTERFACE_LIBS_FOUND) - string(REPLACE ";" " " GINKGO_FORMATTED_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIBS_FOUND}") - set(GINKGO_INTERFACE_LINK_FLAGS "${GINKGO_INTERFACE_LINK_FLAGS} ${GINKGO_FORMATTED_INTERFACE_LIBS_FOUND}") + string(REPLACE ";" " " + GINKGO_FORMATTED_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIBS_FOUND}") + set(GINKGO_INTERFACE_LINK_FLAGS + "${GINKGO_INTERFACE_LINK_FLAGS} ${GINKGO_FORMATTED_INTERFACE_LIBS_FOUND}") unset(GINKGO_INTERFACE_LIBS_FOUND) + # Format and store the interface cflags found + list(REMOVE_DUPLICATES GINKGO_INTERFACE_CFLAGS_FOUND) + string(REPLACE ";" " " + GINKGO_FORMATTED_INTERFACE_CFLAGS_FOUND "${GINKGO_INTERFACE_CFLAGS_FOUND}") + set(GINKGO_INTERFACE_CXX_FLAGS "${GINKGO_FORMATTED_INTERFACE_CFLAGS_FOUND}") + unset(GINKGO_INTERFACE_CFLAGS_FOUND) endmacro(ginkgo_interface_information) macro(ginkgo_git_information) From 6c2b2967513d901b52a8dc50d5e8bf193edf2041 Mon Sep 17 00:00:00 2001 From: Terry Cojean Date: Tue, 1 Feb 2022 10:44:01 +0100 Subject: [PATCH 3/5] Review updates. + Add support for multiple build types + Remove more generator expressions --- CMakeLists.txt | 6 +++--- cmake/ginkgo.pc.in | 4 ++-- cmake/information_helpers.cmake | 14 ++++++++++---- cmake/install_helpers.cmake | 3 ++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9312c3f948f..ac02b8ade62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -333,9 +333,9 @@ if(GINKGO_BUILD_DOC) endif() configure_file(${Ginkgo_SOURCE_DIR}/cmake/ginkgo.pc.in - ${Ginkgo_BINARY_DIR}/ginkgo.pc @ONLY) -file(GENERATE OUTPUT ${Ginkgo_BINARY_DIR}/ginkgo.pc - INPUT ${Ginkgo_BINARY_DIR}/ginkgo.pc) + ${Ginkgo_BINARY_DIR}/ginkgo.pc.in @ONLY) +file(GENERATE OUTPUT ${Ginkgo_BINARY_DIR}/ginkgo_$.pc + INPUT ${Ginkgo_BINARY_DIR}/ginkgo.pc.in) # WINDOWS NVCC has " inside the string, add escape character # to avoid config problem. diff --git a/cmake/ginkgo.pc.in b/cmake/ginkgo.pc.in index 4eeb1766f3d..a60ddf419e8 100644 --- a/cmake/ginkgo.pc.in +++ b/cmake/ginkgo.pc.in @@ -2,11 +2,11 @@ prefix=@CMAKE_INSTALL_PREFIX@ libdir=${prefix}/@GINKGO_INSTALL_LIBRARY_DIR@ includedir=${prefix}/@GINKGO_INSTALL_INCLUDE_DIR@ -Name: @Ginkgo_NAME@ +Name: @CMAKE_PROJECT_NAME@ Description: @Ginkgo_DESCRIPTION@ Version: @Ginkgo_VERSION@ URL: https://ginkgo-project.github.io/ Requires: Libs: @GINKGO_INTERFACE_LINK_FLAGS@ -Cflags: @GINKGO_INTERFACE_CXX_FLAGS@ \ No newline at end of file +Cflags: @GINKGO_INTERFACE_CXX_FLAGS@ diff --git a/cmake/information_helpers.cmake b/cmake/information_helpers.cmake index 80898e71209..569c46e04c2 100644 --- a/cmake/information_helpers.cmake +++ b/cmake/information_helpers.cmake @@ -1,9 +1,15 @@ function(filter_generator_expressions INPUT OUTPUT) - string(REGEX REPLACE ".+LINK:.+:(.+)>" "\\1" - TMP "${INPUT}") - string(REGEX REPLACE ".+\\$:.+>(.+)" "\\1" - TMP "${TMP}") + # See https://gitlab.kitware.com/cmake/cmake/-/blob/v3.22.2/Modules/FindMPI.cmake#L1218 + # and other versions of this file for what we are removing here. + string(REGEX REPLACE "[$<]+COMPILE.*>:.+[>]+(.+)" "\\1" TMP "${INPUT}") + # There can be at least two type of SHELL, one with generator $<> form, one + # without (v3.16.x). Sometimes, it also has extra arguments. We need to do + # at least a greedy regex also consuming the final `>` if present before + # doing a non greedy one for the leftovers. + string(REGEX REPLACE "[$]+" "\\1" TMP "${TMP}") + string(REGEX REPLACE "[$]*" "\\1" TMP "${TMP}") string(REGEX REPLACE ".+INTERFACE:.+>" "" TMP "${TMP}") + string(REGEX REPLACE "\$" "," TMP "${TMP}") set(${OUTPUT} "${TMP}" PARENT_SCOPE) endfunction() diff --git a/cmake/install_helpers.cmake b/cmake/install_helpers.cmake index af5bf5b18b8..c2b8622e859 100644 --- a/cmake/install_helpers.cmake +++ b/cmake/install_helpers.cmake @@ -71,7 +71,8 @@ endfunction() function(ginkgo_install) # pkg-config file - install(FILES "${Ginkgo_BINARY_DIR}/ginkgo.pc" DESTINATION "${GINKGO_INSTALL_PKGCONFIG_DIR}") + install(FILES ${Ginkgo_BINARY_DIR}/ginkgo_$.pc + DESTINATION "${GINKGO_INSTALL_PKGCONFIG_DIR}") # install the public header files install(DIRECTORY "${Ginkgo_SOURCE_DIR}/include/" From fee3be7d706e211069ef44aeb9e7120959563957 Mon Sep 17 00:00:00 2001 From: Terry Cojean Date: Wed, 30 Mar 2022 18:56:07 +0200 Subject: [PATCH 4/5] Take care of hwloc corner cases --- cmake/information_helpers.cmake | 95 +++++++++++++++++--------------- cmake/install_helpers.cmake | 3 +- third_party/hwloc/CMakeLists.txt | 4 +- 3 files changed, 57 insertions(+), 45 deletions(-) diff --git a/cmake/information_helpers.cmake b/cmake/information_helpers.cmake index 569c46e04c2..adfa760bda4 100644 --- a/cmake/information_helpers.cmake +++ b/cmake/information_helpers.cmake @@ -10,59 +10,68 @@ function(filter_generator_expressions INPUT OUTPUT) string(REGEX REPLACE "[$]*" "\\1" TMP "${TMP}") string(REGEX REPLACE ".+INTERFACE:.+>" "" TMP "${TMP}") string(REGEX REPLACE "\$" "," TMP "${TMP}") + # Ignore hwloc include if it is the internal one + string(REGEX REPLACE "${PROJECT_BINARY_DIR}.*hwloc/src/include.*" "" TMP "${TMP}") set(${OUTPUT} "${TMP}" PARENT_SCOPE) endfunction() macro(ginkgo_interface_libraries_recursively INTERFACE_LIBS) foreach(_libs ${INTERFACE_LIBS}) - if (TARGET ${_libs}) - if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND "${_libs}" MATCHES "ginkgo.*") - set(GINKGO_INTERFACE_LIB_NAME "-l${_libs}${CMAKE_DEBUG_POSTFIX}") - elseif("${_libs}" MATCHES "ginkgo.*") # Ginkgo libs are appended in the form -l - set(GINKGO_INTERFACE_LIB_NAME "-l${_libs}") - endif() + if (NOT "${_libs}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND + AND NOT "-l${_libs}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND) + if (TARGET ${_libs}) + if (upper_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND "${_libs}" MATCHES "ginkgo.*") + set(GINKGO_INTERFACE_LIB_NAME "-l${_libs}${CMAKE_DEBUG_POSTFIX}") + elseif("${_libs}" MATCHES "ginkgo.*") # Ginkgo libs are appended in the form -l + set(GINKGO_INTERFACE_LIB_NAME "-l${_libs}") + endif() - # Get the link flags and treat them - get_target_property(GINKGO_INTERFACE_LIBS_LINK_FLAGS "${_libs}" - INTERFACE_LINK_OPTIONS) - if (GINKGO_INTERFACE_LIBS_LINK_FLAGS) - filter_generator_expressions("${GINKGO_INTERFACE_LIBS_LINK_FLAGS}" - GINKGO_INTERFACE_LIB_NAME) - list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") - elseif (NOT "${GINKGO_INTERFACE_LIB_NAME}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND) - list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") - endif() + # Get the link flags and treat them + get_target_property(GINKGO_INTERFACE_LIBS_LINK_FLAGS "${_libs}" + INTERFACE_LINK_OPTIONS) + if (GINKGO_INTERFACE_LIBS_LINK_FLAGS) + filter_generator_expressions("${GINKGO_INTERFACE_LIBS_LINK_FLAGS}" + GINKGO_INTERFACE_LIB_NAME) + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") + elseif (NOT "${GINKGO_INTERFACE_LIB_NAME}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND) + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") + endif() + + # Populate the include directories + get_target_property(GINKGO_LIBS_INTERFACE_INCS "${_libs}" + INTERFACE_INCLUDE_DIRECTORIES) + foreach(_incs ${GINKGO_LIBS_INTERFACE_INCS}) + filter_generator_expressions("${_incs}" GINKGO_INTERFACE_INC_FILTERED) + if (GINKGO_INTERFACE_INC_FILTERED AND NOT + "-I${GINKGO_INTERFACE_INC_FILTERED}" IN_LIST GINKGO_INTERFACE_CFLAGS_FOUND) + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "-I${GINKGO_INTERFACE_INC_FILTERED}") + endif() + endforeach() - # Populate the include directories - get_target_property(GINKGO_LIBS_INTERFACE_INCS "${_libs}" - INTERFACE_INCLUDE_DIRECTORIES) - foreach(_incs ${GINKGO_LIBS_INTERFACE_INCS}) - filter_generator_expressions("${_incs}" GINKGO_INTERFACE_INC_FILTERED) - if (GINKGO_INTERFACE_INC_FILTERED AND NOT - "-I${GINKGO_INTERFACE_INC_FILTERED}" IN_LIST GINKGO_INTERFACE_CFLAGS_FOUND) - list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "-I${GINKGO_INTERFACE_INC_FILTERED}") + # Populate the compiler options and definitions if needed + get_target_property(GINKGO_LIBS_INTERFACE_DEFS "${_libs}" + INTERFACE_COMPILE_DEFINITIONS) + if (GINKGO_LIBS_INTERFACE_DEFS) + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "${GINKGO_LIBS_INTERFACE_DEFS}") + endif() + get_target_property(GINKGO_LIBS_INTERFACE_OPTS "${_libs}" + INTERFACE_COMPILE_OPTIONS) + filter_generator_expressions("${GINKGO_LIBS_INTERFACE_OPTS}" GINKGO_LIBS_INTERFACE_OPTS_FILTERED) + if (GINKGO_LIBS_INTERFACE_OPTS) + list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "${GINKGO_LIBS_INTERFACE_OPTS_FILTERED}") endif() - endforeach() - # Populate the compiler options and definitions if needed - get_target_property(GINKGO_LIBS_INTERFACE_DEFS "${_libs}" - INTERFACE_COMPILE_DEFINITIONS) - if (GINKGO_LIBS_INTERFACE_DEFS) - list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "${GINKGO_LIBS_INTERFACE_DEFS}") - endif() - get_target_property(GINKGO_LIBS_INTERFACE_OPTS "${_libs}" - INTERFACE_COMPILE_OPTIONS) - filter_generator_expressions("${GINKGO_LIBS_INTERFACE_OPTS}" GINKGO_LIBS_INTERFACE_OPTS_FILTERED) - if (GINKGO_LIBS_INTERFACE_OPTS) - list(APPEND GINKGO_INTERFACE_CFLAGS_FOUND "${GINKGO_LIBS_INTERFACE_OPTS_FILTERED}") + # Keep recursing through the libraries + get_target_property(GINKGO_LIBS_INTERFACE_LIBS "${_libs}" + INTERFACE_LINK_LIBRARIES) + ginkgo_interface_libraries_recursively("${GINKGO_LIBS_INTERFACE_LIBS}") + elseif(EXISTS "${_libs}") + if ("${_libs}" MATCHES "${PROJECT_BINARY_DIR}.*hwloc.so") + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${CMAKE_INSTALL_PREFIX}/${GINKGO_INSTALL_LIBRARY_DIR}/libhwloc.so") + else() + list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${_libs}") + endif() endif() - - # Keep recursing through the libraries - get_target_property(GINKGO_LIBS_INTERFACE_LIBS "${_libs}" - INTERFACE_LINK_LIBRARIES) - ginkgo_interface_libraries_recursively("${GINKGO_LIBS_INTERFACE_LIBS}") - elseif(EXISTS "${_libs}") - list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${_libs}") endif() endforeach() endmacro() diff --git a/cmake/install_helpers.cmake b/cmake/install_helpers.cmake index c2b8622e859..2d9e8081ebe 100644 --- a/cmake/install_helpers.cmake +++ b/cmake/install_helpers.cmake @@ -72,7 +72,8 @@ endfunction() function(ginkgo_install) # pkg-config file install(FILES ${Ginkgo_BINARY_DIR}/ginkgo_$.pc - DESTINATION "${GINKGO_INSTALL_PKGCONFIG_DIR}") + DESTINATION "${GINKGO_INSTALL_PKGCONFIG_DIR}" + RENAME ginkgo.pc) # install the public header files install(DIRECTORY "${Ginkgo_SOURCE_DIR}/include/" diff --git a/third_party/hwloc/CMakeLists.txt b/third_party/hwloc/CMakeLists.txt index a47e9a84877..9cbbb46482e 100644 --- a/third_party/hwloc/CMakeLists.txt +++ b/third_party/hwloc/CMakeLists.txt @@ -6,7 +6,7 @@ ginkgo_load_and_configure_package(hwloc_external "https://download.open-mpi.org/ ) add_library(hwloc SHARED IMPORTED GLOBAL) -add_dependencies(hwloc hwloc_external ) +add_dependencies(hwloc hwloc_external) file(MAKE_DIRECTORY ${TPL_HWLOC_PATH}/lib/) file(GLOB HWLOC_LIBS "${TPL_HWLOC_PATH}/build/hwloc/.libs/libhwloc.so*") configure_file("${TPL_HWLOC_PATH}/build/include/hwloc/autogen/config.h" "${TPL_HWLOC_PATH}/src/include/hwloc/autogen/config.h" COPYONLY) @@ -14,6 +14,8 @@ foreach(lib ${HWLOC_LIBS}) get_filename_component(lib_name ${lib} NAME) configure_file("${lib}" "${TPL_HWLOC_PATH}/lib/${lib_name}" COPYONLY) endforeach() +# NOTE: if changing this (e.g. to `.a`), please update the special case in +# `cmake/information_helpers.cmake` set(HWLOC_LIBRARIES "${TPL_HWLOC_PATH}/lib/libhwloc.so" CACHE FILEPATH "The path to HWLOC library libhwloc.so" FORCE) set(HWLOC_INCLUDE_DIRS "${TPL_HWLOC_PATH}/src/include" CACHE PATH "The directory containing the hwloc header, hwloc.h" FORCE) set_target_properties(hwloc PROPERTIES IMPORTED_LOCATION ${HWLOC_LIBRARIES}) From cbd70da2026a0b5460a1a9c47b51f4edbd9b910d Mon Sep 17 00:00:00 2001 From: Terry Cojean Date: Wed, 13 Apr 2022 12:14:06 +0200 Subject: [PATCH 5/5] Do not add duplicates to the list. --- cmake/ginkgo.pc.in | 2 +- cmake/information_helpers.cmake | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cmake/ginkgo.pc.in b/cmake/ginkgo.pc.in index a60ddf419e8..9d5aeb65808 100644 --- a/cmake/ginkgo.pc.in +++ b/cmake/ginkgo.pc.in @@ -8,5 +8,5 @@ Version: @Ginkgo_VERSION@ URL: https://ginkgo-project.github.io/ Requires: -Libs: @GINKGO_INTERFACE_LINK_FLAGS@ +Libs: @GINKGO_INTERFACE_LINK_FLAGS@ Cflags: @GINKGO_INTERFACE_CXX_FLAGS@ diff --git a/cmake/information_helpers.cmake b/cmake/information_helpers.cmake index adfa760bda4..5cf80368c8a 100644 --- a/cmake/information_helpers.cmake +++ b/cmake/information_helpers.cmake @@ -6,8 +6,8 @@ function(filter_generator_expressions INPUT OUTPUT) # without (v3.16.x). Sometimes, it also has extra arguments. We need to do # at least a greedy regex also consuming the final `>` if present before # doing a non greedy one for the leftovers. - string(REGEX REPLACE "[$]+" "\\1" TMP "${TMP}") - string(REGEX REPLACE "[$]*" "\\1" TMP "${TMP}") + string(REGEX REPLACE "[$+" "\\1" TMP "${TMP}") + string(REGEX REPLACE "[$*" "\\1" TMP "${TMP}") string(REGEX REPLACE ".+INTERFACE:.+>" "" TMP "${TMP}") string(REGEX REPLACE "\$" "," TMP "${TMP}") # Ignore hwloc include if it is the internal one @@ -32,8 +32,8 @@ macro(ginkgo_interface_libraries_recursively INTERFACE_LIBS) if (GINKGO_INTERFACE_LIBS_LINK_FLAGS) filter_generator_expressions("${GINKGO_INTERFACE_LIBS_LINK_FLAGS}" GINKGO_INTERFACE_LIB_NAME) - list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") - elseif (NOT "${GINKGO_INTERFACE_LIB_NAME}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND) + endif() + if (NOT "${GINKGO_INTERFACE_LIB_NAME}" IN_LIST GINKGO_INTERFACE_LIBS_FOUND) list(APPEND GINKGO_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIB_NAME}") endif() @@ -97,6 +97,7 @@ macro(ginkgo_interface_information) # Format and store the interface libraries found list(REMOVE_DUPLICATES GINKGO_INTERFACE_LIBS_FOUND) + list(REMOVE_ITEM GINKGO_INTERFACE_LIBS_FOUND "") string(REPLACE ";" " " GINKGO_FORMATTED_INTERFACE_LIBS_FOUND "${GINKGO_INTERFACE_LIBS_FOUND}") set(GINKGO_INTERFACE_LINK_FLAGS @@ -104,6 +105,7 @@ macro(ginkgo_interface_information) unset(GINKGO_INTERFACE_LIBS_FOUND) # Format and store the interface cflags found list(REMOVE_DUPLICATES GINKGO_INTERFACE_CFLAGS_FOUND) + list(REMOVE_ITEM GINKGO_INTERFACE_CFLAGS_FOUND "") string(REPLACE ";" " " GINKGO_FORMATTED_INTERFACE_CFLAGS_FOUND "${GINKGO_INTERFACE_CFLAGS_FOUND}") set(GINKGO_INTERFACE_CXX_FLAGS "${GINKGO_FORMATTED_INTERFACE_CFLAGS_FOUND}")