diff --git a/CMakeLists.txt b/CMakeLists.txt index bc8cdbd8..85f375ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,6 +273,7 @@ if (DYAD_ENABLE_MARGO_DTL) find_package(json-c CONFIG) pkg_check_modules (MARGO REQUIRED IMPORTED_TARGET margo) endif() +set(DYAD_PKG_CONFIG_PATH "$ENV{PKG_CONFIG_PATH}") function(dyad_install_headers public_headers current_dir) message("-- [${PROJECT_NAME}] " "installing headers ${public_headers}") @@ -310,18 +311,18 @@ set(DYAD_INSTALL_TMP_CMAKE_DIR "${CMAKE_BINARY_DIR}/install_cmake_scripts") # Write the version file. This is independent of build/install tree. write_basic_package_version_file( - ${DYAD_BUILD_CMAKE_DIR}/DYADConfigVersion.cmake + ${DYAD_BUILD_CMAKE_DIR}/dyad-config-version.cmake VERSION "${DYAD_PACKAGE_VERSION}" COMPATIBILITY SameMajorVersion) -file(COPY ${DYAD_BUILD_CMAKE_DIR}/DYADConfigVersion.cmake +file(COPY ${DYAD_BUILD_CMAKE_DIR}/dyad-config-version.cmake DESTINATION ${DYAD_INSTALL_TMP_CMAKE_DIR}) # This is for the build tree set(EXTRA_CMAKE_MODULE_DIR "${CMAKE_SOURCE_DIR}/cmake/modules") set(INCLUDE_INSTALL_DIRS ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) set(LIB_INSTALL_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) -configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/configure_files/DYADConfig.cmake.in - "${DYAD_BUILD_CMAKE_DIR}/DYADConfig.cmake" +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/configure_files/dyad-config.cmake.in + "${DYAD_BUILD_CMAKE_DIR}/dyad-config.cmake" INSTALL_DESTINATION "${DYAD_BUILD_CMAKE_DIR}" PATH_VARS INCLUDE_INSTALL_DIRS LIB_INSTALL_DIR) @@ -329,15 +330,15 @@ configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/configure_files/ set(EXTRA_CMAKE_MODULE_DIR "") set(INCLUDE_INSTALL_DIRS "${DYAD_INSTALL_INCLUDEDIR}") set(LIB_INSTALL_DIR "${DYAD_INSTALL_LIBDIR}") -configure_package_config_file(cmake/configure_files/DYADConfig.cmake.in - "${DYAD_INSTALL_TMP_CMAKE_DIR}/DYADConfig.cmake" +configure_package_config_file(cmake/configure_files/dyad-config.cmake.in + "${DYAD_INSTALL_TMP_CMAKE_DIR}/dyad-config.cmake" INSTALL_DESTINATION "${DYAD_INSTALL_CMAKE_DIR}" PATH_VARS INCLUDE_INSTALL_DIRS LIB_INSTALL_DIR) # Install export -install(EXPORT ${DYAD_EXPORTED_TARGETS} # DYADTargets - NAMESPACE DYAD:: - FILE DYADTargets.cmake +install(EXPORT ${DYAD_EXPORTED_TARGETS} # dyad-targets + NAMESPACE dyad:: + FILE dyad-targets.cmake DESTINATION "${DYAD_INSTALL_CMAKE_DIR}") # Install the cmake stuff diff --git a/cmake/configure_files/DYADConfig.cmake.in b/cmake/configure_files/DYADConfig.cmake.in deleted file mode 100644 index f9b3c1b1..00000000 --- a/cmake/configure_files/DYADConfig.cmake.in +++ /dev/null @@ -1,64 +0,0 @@ -# This will create IMPORTED targets for DYAD. The executables will be -# DYAD::-bin (e.g., DYAD::dyad-bin) and the library will -# be DYAD::dyad. - -include("${CMAKE_CURRENT_LIST_DIR}/DYADConfigVersion.cmake") - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules") -list(APPEND CMAKE_MODULE_PATH "@EXTRA_CMAKE_MODULE_DIR@") - -# None of these are currently needed -# include(GNUInstallDirs) -# include(ExternalProject) -# include(DYADCMakeUtilities) -# include(CMakePackageConfigHelpers) - - -set(DYAD_VERSION ${PACKAGE_VERSION}) - -# Record compiler information -set(DYAD_C_COMPILER "@CMAKE_C_COMPILER@") -set(DYAD_CXX_COMPILER "@CMAKE_CXX_COMPILER@") - -set(DYAD_C_FLAGS "@CMAKE_C_FLAGS@") -set(DYAD_CXX_FLAGS "@CMAKE_CXX_FLAGS@") - -set(DYAD_C_STANDARD "@CMAKE_C_STANDARD@") -set(DYAD_CXX_STANDARD "@CMAKE_CXX_STANDARD@") - -# Using DYAD-specific versions of these variables so that we don't risk -# polluting user CMake scripts -set(DYAD_C_STANDARD_REQUIRED TRUE) -set(DYAD_CXX_STANDARD_REQUIRED TRUE) - -# Record the various flags and switches accumlated in DYAD -set(DYAD_GNU_LINUX @DYAD_GNU_LINUX@) -set(DYAD_HAS_STD_FILESYSTEM @DYAD_HAS_STD_FILESYSTEM@) -set(DYAD_HAS_STD_FSTREAM_FD @DYAD_HAS_STD_FSTREAM_FD@) - -# Setup dependencies - - -@PACKAGE_INIT@ - -# Now actually import the DYAD target -set(_TMP_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIRS@") -foreach (_DIR ${_TMP_INCLUDE_DIRS}) - set_and_check(_INCLUDE_DIR "${_DIR}") - list(APPEND DYAD_INCLUDE_DIRS "${_INCLUDE_DIR}") -endforeach (_DIR "${_TMP_INCLUDE_DIRS}") - -set(_TMP_LIBRARY_DIRS "@PACKAGE_LIB_INSTALL_DIR@") -foreach (_DIR ${_TMP_LIBRARY_DIRS}) - set_and_check(_LIBRARY_DIR "${_DIR}") - list(APPEND DYAD_LIBRARY_DIRS "${_LIBRARY_DIR}") -endforeach (_DIR ${_TMP_LIBRARY_DIRS}) - -if (NOT TARGET DYAD::dyad) - include(${CMAKE_CURRENT_LIST_DIR}/DYADTargets.cmake) -endif (NOT TARGET DYAD::dyad) - -check_required_components(DYAD) - -set(DYAD_LIBRARIES DYAD::dyad) diff --git a/cmake/configure_files/dyad-config.cmake.in b/cmake/configure_files/dyad-config.cmake.in new file mode 100644 index 00000000..c15ba10a --- /dev/null +++ b/cmake/configure_files/dyad-config.cmake.in @@ -0,0 +1,195 @@ +# This will create IMPORTED targets for DYAD. The executables will be +# dyad::-bin (e.g., dyad::dyad-bin) and the library will +# be dyad::dyad. + +include("${CMAKE_CURRENT_LIST_DIR}/dyad-config-version.cmake") + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules") +list(APPEND CMAKE_MODULE_PATH "@EXTRA_CMAKE_MODULE_DIR@") + + +set(DYAD_VERSION ${PACKAGE_VERSION}) + +# Record compiler information +set(DYAD_C_COMPILER "@CMAKE_C_COMPILER@") +set(DYAD_CXX_COMPILER "@CMAKE_CXX_COMPILER@") + +set(DYAD_C_FLAGS "@CMAKE_C_FLAGS@") +set(DYAD_CXX_FLAGS "@CMAKE_CXX_FLAGS@") + +set(DYAD_C_STANDARD "@CMAKE_C_STANDARD@") +set(DYAD_CXX_STANDARD "@CMAKE_CXX_STANDARD@") + +# Using DYAD-specific versions of these variables so that we don't risk +# polluting user CMake scripts +set(DYAD_C_STANDARD_REQUIRED TRUE) +set(DYAD_CXX_STANDARD_REQUIRED TRUE) + +# Record the various flags and switches accumlated in DYAD +set(DYAD_GNU_LINUX @DYAD_GNU_LINUX@) +set(DYAD_HAS_STD_FILESYSTEM @DYAD_HAS_STD_FILESYSTEM@) +set(DYAD_HAS_STD_FSTREAM_FD @DYAD_HAS_STD_FSTREAM_FD@) + +# Setup dependencies + + +@PACKAGE_INIT@ + +# Now actually import the DYAD target +set(_TMP_INCLUDE_DIRS "@DYAD_INSTALL_INCLUDEDIR@") +foreach (_DIR ${_TMP_INCLUDE_DIRS}) + if (EXISTS "${_DIR}") + set_and_check(_INCLUDE_DIR "${_DIR}") + list(APPEND DYAD_INCLUDE_DIRS "${_INCLUDE_DIR}") + endif () +endforeach () +if (DYAD_INCLUDE_DIRS) + list(REMOVE_DUPLICATES DYAD_INCLUDE_DIRS) +endif () + +set(_TMP_LIBRARY_DIRS "@DYAD_LIBDIR@") +foreach (_DIR ${_TMP_LIBRARY_DIRS}) + if (EXISTS "${_DIR}") + set_and_check(_LIBRARY_DIR "${_DIR}") + list(APPEND DYAD_LIBRARY_DIRS "${_LIBRARY_DIR}") + endif () +endforeach () +if (DYAD_LIBRARY_DIRS) + list(REMOVE_DUPLICATES DYAD_LIBRARY_DIRS) +endif () + +set(_dyad_target "") +if (TARGET dyad::dyad) + set(_dyad_target "dyad::dyad") +elseif (TARGET dyad) + set(_dyad_target "dyad") +else () + include(${CMAKE_CURRENT_LIST_DIR}/dyad-targets.cmake) + if (TARGET dyad::dyad) + set(_dyad_target "dyad::dyad") + elseif (TARGET dyad) + set(_dyad_target "dyad") + endif () +endif () + +if (NOT _dyad_target STREQUAL "") + if (DYAD_INCLUDE_DIRS) + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${DYAD_INCLUDE_DIRS}" + ) + endif () + if (DYAD_LIBRARY_DIRS) + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${DYAD_LIBRARY_DIRS}" + ) + endif () +endif () + +set(DYAD_LIBRARIES ${_dyad_target}) + + +# Restore build-time PKG_CONFIG_PATH as hint, but allow consumer to override +set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:@DYAD_PKG_CONFIG_PATH@") +find_package(PkgConfig REQUIRED) + +set(FluxCore_INCLUDE_DIRS "@FluxCore_INCLUDE_DIRS@") +set(FluxCore_LIBRARY_PATH "@FluxCore_LIBRARY_PATH@") + +pkg_check_modules(FLUX_CORE REQUIRED IMPORTED_TARGET flux-core) + +# Use build-time paths as fallback if pkg_check_modules didn't populate them +if (NOT FLUX_CORE_INCLUDE_DIRS STREQUAL "" AND NOT FLUX_CORE_INCLUDE_DIRS MATCHES "NOTFOUND") + set(FluxCore_INCLUDE_DIRS ${FLUX_CORE_INCLUDE_DIRS}) +endif () +if (NOT FLUX_CORE_LIBRARY_DIRS STREQUAL "" AND NOT FLUX_CORE_LIBRARY_DIRS MATCHES "NOTFOUND") + set(FluxCore_LIBRARY_PATH ${FLUX_CORE_LIBRARY_DIRS}) +endif () + +if (NOT _dyad_target STREQUAL "") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${FluxCore_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${FluxCore_LIBRARY_PATH}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "flux-core") +endif () + +pkg_check_modules(JANSSON REQUIRED IMPORTED_TARGET jansson) +if (NOT _dyad_target STREQUAL "") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${JANSSON_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${JANSSON_LIBRARY_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "jansson") +endif () + +find_package(gotcha 2.4.2 REQUIRED) +if (gotcha_FOUND) + message(STATUS "[Dyad] found gotcha at ${gotcha_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${gotcha_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "${gotcha_LIBRARIES}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${gotcha_LIBRARY_PATH}") +else () + message(FATAL_ERROR "-- [Dyad] gotcha is needed for dyad build") +endif () + +if (@DYAD_ENABLE_MARGO_DATA@) + pkg_check_modules(MARGO REQUIRED IMPORTED_TARGET margo) + + if (NOT _dyad_target STREQUAL "") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${MARGO_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${MARGO_LIBRARY_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "margo") + endif () +endif () + +if (@DYAD_ENABLE_UCX_DATA@) + find_package(ucx 1.6 REQUIRED) + + if (NOT _dyad_target STREQUAL "") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES "${ucx_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${ucx_LIBRARY_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "${ucx_LIBRARIES}") + endif () +endif () + +if (@DYAD_LOGGER_CPP_LOGGER@) + find_package(CppLogger 1.1.1 REQUIRED NAMES cpp-logger cpp_logger CPP_LOGGER Cpp_logger) + if (cpp-logger_FOUND) + message(STATUS "[Dyad] found cpp-logger at ${CPP_LOGGER_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${CPP_LOGGER_INCLUDE_DIRS}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "${CPP_LOGGER_LIBRARIES}") + set_property(TARGET ${_dyad_target} APPEND PROPERTY + INTERFACE_LINK_DIRECTORIES "${CPP_LOGGER_LIBRARY_DIRS}") + else () + message(FATAL_ERROR "-- [Dyad] cpp-logger is not found but selected in cmake options for Dyad build") + endif () +endif() + +check_required_components(dyad) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(dyad + REQUIRED_VARS DYAD_LIBRARIES DYAD_INCLUDE_DIRS +) +set(DYAD_FOUND ${dyad_FOUND}) + +list(GET DYAD_INCLUDE_DIRS 0 _first_include) +get_filename_component(DYAD_DIR ${_first_include}/.. ABSOLUTE) +unset(_first_include) +set(DYAD_ROOT_DIR "${DYAD_DIR}") + +unset(_dyad_target) diff --git a/cmake/configure_files/dyad_module.lua.in b/cmake/configure_files/dyad_module.lua.in index 9081056d..e7216138 100644 --- a/cmake/configure_files/dyad_module.lua.in +++ b/cmake/configure_files/dyad_module.lua.in @@ -43,8 +43,8 @@ whatis("DYAD_HAS_DOXYGEN: @DYAD_HAS_DOXYGEN@") whatis("DYAD_HAS_STD_FILESYSTEM: @DYAD_HAS_STD_FILESYSTEM@") whatis("DYAD_HAS_STD_FSTREAM_FD: @DYAD_HAS_STD_FSTREAM_FD@") -prepend_path("PATH","@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@") -prepend_path("LD_LIBRARY_PATH","@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@") +prepend_path("PATH","@DYAD_INSTALL_BINDIR@") +prepend_path("LD_LIBRARY_PATH","@DYAD_INSTALL_LIBDIR@") -pushenv("DYAD_DIR","@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DIR@") +pushenv("DYAD_DIR","@DYAD_INSTALL_LIBDIR@/cmake/dyad") diff --git a/cmake/modules/FindCatch2.cmake b/cmake/modules/FindCatch2.cmake new file mode 100644 index 00000000..189167f8 --- /dev/null +++ b/cmake/modules/FindCatch2.cmake @@ -0,0 +1,10 @@ +include(fetch_package) + +fetch_package(NAME Catch2 catch2 + VERSION 3.15.0 + GIT https://github.com/catchorg/Catch2.git + TAG v3.15.0 + REQUIRED + DIAG + VARS "BUILD_TESTING OFF BOOL" + "CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} PATH") diff --git a/cmake/modules/FindCppLogger.cmake b/cmake/modules/FindCppLogger.cmake index 58cb72d5..80c85eb9 100644 --- a/cmake/modules/FindCppLogger.cmake +++ b/cmake/modules/FindCppLogger.cmake @@ -1,83 +1,12 @@ -#.rst: -# FindCppLogger -# ----------- -# -# Find cpp-logger headers and libraries. -# -# :: -# -# cpp-logger_FOUND - True if cpp-logger found. -# cpp-logger_INCLUDE_DIRS - Where to find cpp-logger.h. -# cpp-logger_LIBRARIES - List of libraries when using cpp-logger. - -#cmake_minimum_required(VERSION 3.10.2) # based on the requirement of cpp-logger - -foreach (_cpp-logger_hint "$ENV{cpp_logger_DIR}" "$ENV{CPP_LOGGER_DIR}" "$ENV{Cpp_logger}" - "$ENV{cpp_logger_PATH}" "$ENV{CPP_LOGGER_PATH}") - if (_cpp-logger_hint) - foreach (_suffix - "lib/cmake/cpp-logger" "lib/cmake/CPP-LOGGER" "lib/cmake/Cpp_logger" - "lib64/cmake/cpp-logger" "lib64/cmake/CPP-LOGGER" "lib64/cmake/Cpp_logger" - "lib" "lib64" - ) - list(APPEND CMAKE_PREFIX_PATH "${_cpp-logger_hint}/${_suffix}") - endforeach () - # Also add the hint root itself - list(APPEND CMAKE_PREFIX_PATH "${_cpp-logger_hint}") - endif () -endforeach () - - -find_package(cpp-logger - NAMES cpp-logger CPP-LOGGER Cpp_logger - QUIET -) - -if (NOT cpp-logger_FOUND AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.14") - message(STATUS "cpp-logger not found, fetching ...") - include(FetchContent) - FetchContent_Declare( - cpp-logger - GIT_REPOSITORY https://github.com/hariharan-devarajan/cpp-logger.git - GIT_TAG v0.0.7 - ) - - set(CPP_LOGGER_ENABLE_TESTING OFF CACHE BOOL "" FORCE) - set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(cpp-logger) - set(CMAKE_WARN_DEPRECATED ON CACHE BOOL "" FORCE) - - target_compile_options(cpp-logger PRIVATE -std=gnu11 -w) -endif () - -if (TARGET cpp-logger::cpp-logger) - get_target_property(cpp-logger_INCLUDE_DIRS cpp-logger::cpp-logger INTERFACE_INCLUDE_DIRECTORIES) - if (NOT cpp-logger_INCLUDE_DIRS) - set(cpp-logger_INCLUDE_DIRS ${CPP_LOGGER_INCLUDE_DIRS}) - endif () - set(cpp-logger_LIBRARIES cpp-logger::cpp-logger) - set(cpp-logger_FOUND TRUE) -elseif (TARGET cpp-logger) - get_target_property(cpp-logger_INCLUDE_DIRS cpp-logger INTERFACE_INCLUDE_DIRECTORIES) - if (NOT cpp-logger_INCLUDE_DIRS) - set(cpp-logger_INCLUDE_DIRS ${CPP_LOGGER_INCLUDE_DIRS}) - endif () - set(cpp-logger_LIBRARIES cpp-logger) - set(cpp-logger_FOUND TRUE) -elseif (cpp-logger_LIBRARIES) - add_library(cpp-logger::cpp-logger UNKNOWN IMPORTED) - set_target_properties(cpp-logger::cpp-logger PROPERTIES - IMPORTED_LOCATION "${cpp-logger_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${cpp-logger_INCLUDE_DIRS}" - ) - set(cpp-logger_LIBRARIES cpp-logger::cpp-logger) - set(cpp-logger_FOUND TRUE) -else () - message(FATAL_ERROR "cpp-logger: could not find or create target cpp-logger::cpp-logger") -endif () - -message(STATUS "cpp-logger_LIBRARIES: ${cpp-logger_LIBRARIES}") -message(STATUS "cpp-logger_INCLUDE_DIRS: ${cpp-logger_INCLUDE_DIRS}") -set(CPP_LOGGER_INCLUDE_DIRS ${cpp-logger_INCLUDE_DIRS}) -set(CPP_LOGGER_LIBRARIES ${cpp-logger_LIBRARIES}) -mark_as_advanced(cpp-logger_INCLUDE_DIRS CPP_LOGGER_INCLUDE_DIR cpp-logger_LIBRARIES CPP_LOGGER_LIBRARIES) +include(fetch_package) + +fetch_package(NAME cpp-logger cpp_logger CPP_LOGGER Cpp_logger + VERSION 1.1.1 + GIT https://github.com/JaeseungYeom/cpp-logger.git + TAG cmake_fix + #GIT https://github.com/hariharan-devarajan/cpp-logger.git + #TAG b18d21b1ce67da49196a195d0cb496bd083cca38 + #SHALLOW + DIAG + VARS "CPP_LOGGER_ENABLE_TESTING OFF BOOL" + "CPP_LOGGER_LIBDIR_AS_LIB ${DYAD_LIBDIR_AS_LIB} BOOL") diff --git a/cmake/modules/FindFluxCore.cmake b/cmake/modules/FindFluxCore.cmake index d2ce39ed..fad6b215 100644 --- a/cmake/modules/FindFluxCore.cmake +++ b/cmake/modules/FindFluxCore.cmake @@ -11,7 +11,7 @@ else() if(FLUX) get_filename_component(EXTRA_FLUX_CORE_PREFIX_BIN ${FLUX} DIRECTORY) get_filename_component(EXTRA_FLUX_CORE_PREFIX ${EXTRA_FLUX_CORE_PREFIX_BIN} DIRECTORY) - set(ENV{PKG_CONFIG_PATH} "${EXTRA_FLUX_CORE_PREFIX}/lib/pkgconfig:${EXTRA_FLUX_CORE_PREFIX}/lib64/pkgconfig:$ENV{PKG_CONFIG_PATH}") + set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${EXTRA_FLUX_CORE_PREFIX}/lib/pkgconfig:${EXTRA_FLUX_CORE_PREFIX}/lib64/pkgconfig") message(STATUS "found ${FLUX} in PATH with prefix=${EXTRA_FLUX_CORE_PREFIX}") endif() endif() @@ -48,7 +48,7 @@ else() message("-- FluxCore_INCLUDE_DIRS: " ${FluxCore_INCLUDE_DIRS}) get_filename_component(FluxCore_ROOT_DIR ${FluxCore_INCLUDE_DIRS}/.. ABSOLUTE) message("-- FluxCore_ROOT_DIR: " ${FluxCore_ROOT_DIR}) - find_path(FluxCore_LIBRARY_PATH libflux-core.so PATH_SUFFIXES lib/) + find_path(FluxCore_LIBRARY_PATH libflux-core.so PATH_SUFFIXES lib/ lib64/) message("-- FluxCore_LIBRARY_PATH: " ${FluxCore_LIBRARY_PATH}) set(FluxCore_LIBRARIES -L${FluxCore_LIBRARY_PATH} -lflux-core) set(FluxCore_FOUND True) diff --git a/cmake/modules/FindGotcha.cmake b/cmake/modules/FindGotcha.cmake index 37c932a1..8da1f8b7 100644 --- a/cmake/modules/FindGotcha.cmake +++ b/cmake/modules/FindGotcha.cmake @@ -1,98 +1,24 @@ -#.rst: -# FindGotcha -# ----------- -# -# Find gotcha headers and libraries. -# -# :: -# -# gotcha_FOUND - True if gotcha found. -# gotcha_INCLUDE_DIRS - Where to find gotcha.h. -# gotcha_LIBRARIES - List of libraries when using gotcha. +include(fetch_package) -#cmake_minimum_required(VERSION 3.0) +fetch_package(NAME gotcha GOTCHA Gotcha + VERSION 2.4.2 + GIT https://github.com/JaeseungYeom/GOTCHA.git + TAG rm_empty_dir + #GIT https://github.com/LLNL/GOTCHA.git + #TAG 56def6fd26e436f01fb7831f784d0f9b1347904b + REQUIRED + DIAG + VARS "GOTCHA_ENABLE_TESTING OFF BOOL" + "CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} PATH") -foreach (_gotcha_hint "$ENV{gotcha_DIR}" "$ENV{GOTCHA_DIR}" - "$ENV{gotcha_PATH}" "$ENV{GOTCHA_PATH}") - if (_gotcha_hint) - foreach (_suffix - "lib/cmake/gotcha" "lib/cmake/GOTCHA" - "lib64/cmake/gotcha" "lib64/cmake/GOTCHA" - "lib" "lib64" - ) - list(APPEND CMAKE_PREFIX_PATH "${_gotcha_hint}/${_suffix}") - endforeach () - # Also add the hint root itself - list(APPEND CMAKE_PREFIX_PATH "${_gotcha_hint}") - endif () -endforeach () - -set(gotcha_FOUND FALSE) - -if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.14") - message(STATUS "Gotcha: fetching if not found") - include(FetchContent) - FetchContent_Declare( - gotcha - GIT_REPOSITORY https://github.com/llnl/GOTCHA.git - GIT_TAG 1.0.8 - PATCH_COMMAND sed -i "s/CMAKE_SOURCE_DIR/CMAKE_CURRENT_SOURCE_DIR/g" CMakeLists.txt && - sed -i "s|PATH_VARS gotcha_INSTALL_INCLUDE_DIR PATH_VARS gotcha_INSTALL_LIBRARY_DIR|PATH_VARS gotcha_INSTALL_INCLUDE_DIR gotcha_INSTALL_LIBRARY_DIR|g" CMakeLists.txt && - sed -i "s|add_subdirectory(example)||g" src/CMakeLists.txt - FIND_PACKAGE_ARGS NAMES gotcha GOTCHA - ) - set(GOTCHA_ENABLE_TESTS OFF CACHE BOOL "" FORCE) - set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(gotcha) - set(CMAKE_WARN_DEPRECATED ON CACHE BOOL "" FORCE) - - # Add the generated include directory so gotcha_config.h can be found - if (TARGET gotcha) - get_target_property(_gotcha_imported gotcha IMPORTED) - if (NOT _gotcha_imported) - set_target_properties(gotcha PROPERTIES C_EXTENSIONS ON) - target_compile_options(gotcha PRIVATE -std=gnu11 -w) - target_include_directories(gotcha PUBLIC +get_target_property(_gotcha_imported gotcha IMPORTED) +if (NOT _gotcha_imported OR _gotcha_imported MATCHES "NOTFOUND") + # GOTCHA uses GNU-specific extensions. So it needs to be + # compiled with -std=gnu11 instead of -std=c11. + set_target_properties(gotcha PROPERTIES C_EXTENSIONS ON) + # Setting gotcha include dirs + target_include_directories(gotcha PUBLIC $ - ) - else () - message(STATUS "Gotcha imported") - endif () - endif () -else () - message(STATUS "Gotcha: finding only (CMake < 3.14)") - find_package(gotcha - NAMES gotcha GOTCHA - REQUIRED - ) -endif () - -if (TARGET gotcha::gotcha) - get_target_property(gotcha_INCLUDE_DIRS gotcha::gotcha INTERFACE_INCLUDE_DIRECTORIES) - if (NOT gotcha_INCLUDE_DIRS) - set(gotcha_INCLUDE_DIRS "") - endif () - set(gotcha_LIBRARIES gotcha::gotcha) - set(gotcha_FOUND TRUE) -elseif (TARGET gotcha) - get_target_property(gotcha_INCLUDE_DIRS gotcha INTERFACE_INCLUDE_DIRECTORIES) - if (NOT gotcha_INCLUDE_DIRS) - set(gotcha_INCLUDE_DIRS "") - endif () - set(gotcha_LIBRARIES gotcha) - set(gotcha_FOUND TRUE) -elseif (gotcha_LIBRARIES) - add_library(gotcha::gotcha UNKNOWN IMPORTED) - set_target_properties(gotcha::gotcha PROPERTIES - IMPORTED_LOCATION "${gotcha_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${gotcha_INCLUDE_DIRS}" - ) - set(gotcha_LIBRARIES gotcha::gotcha) - set(gotcha_FOUND TRUE) -else () - message(FATAL_ERROR "Gotcha: could not find or create target gotcha::gotcha") + $ + ) endif () - -message(STATUS "gotcha_INCLUDE_DIRS: ${gotcha_INCLUDE_DIRS}") -message(STATUS "gotcha_LIBRARIES: ${gotcha_LIBRARIES}") -mark_as_advanced(gotcha_INCLUDE_DIRS gotcha_INCLUDE_DIR gotcha_LIBRARIES) diff --git a/cmake/modules/fetch_package.cmake b/cmake/modules/fetch_package.cmake new file mode 100644 index 00000000..b31c675c --- /dev/null +++ b/cmake/modules/fetch_package.cmake @@ -0,0 +1,433 @@ +# fetch_package.cmake +# +# A CMake helper function to find or fetch an external package. +# +# Usage: +# fetch_package( +# NAME [name2 ...] # required: candidate package names (first is primary) +# # multiple names handle different casing conventions +# # e.g. NAME gotcha GOTCHA Gotcha +# GIT # required (mutually exclusive with URL): +# # git repository URL +# or +# URL # required (mutually exclusive with GIT): +# # archive download URL +# [TAG ] # recommended with GIT: tag, branch, or commit hash +# [URL_HASH ] # recommended with URL: integrity hash e.g. SHA256=abc... +# [VERSION ] # optional: CMake package version for find_package +# # must match installed package's reported version +# # e.g. VERSION 2.4.2 (not the git tag) +# [SUBMODULES [path2 ...]] # optional, GIT only: git submodules to initialize +# # omitted -> disable all submodules (default) +# # "" -> explicitly disable all submodules +# # path ... -> initialize only listed submodules +# # with GIT_SUBMODULES_RECURSE ON +# [PATCH_COMMAND [args ...]] # optional: command to patch source after clone +# [VARS ...] # optional: set cache variables before FetchContent +# # only applied when fetching, not when importing +# # type required: BOOL STRING PATH FILEPATH INTERNAL +# # e.g. "CPP_LOGGER_LIBDIR_AS_LIB ON BOOL" +# # "CMAKE_INSTALL_LIBDIR lib PATH" +# [REQUIRED] # optional flag: fatal error if not found or fetched +# [QUIET] # optional flag: suppress status and warning messages +# # cmake configuration continues on failure regardless +# [EXACT] # optional flag: require exact version match +# [SHALLOW] # optional flag: perform a shallow git clone +# [DIAG] # optional flag: enable diagnostic messages +# ) +# +# Output variables (in caller scope): +# _FOUND +# _LIBRARIES +# _INCLUDE_DIRS +# _POPULATED +# +# Requires CMake >= 3.14 for FetchContent fallback. + +include_guard(GLOBAL) + +#cmake_minimum_required(VERSION 3.14) + +macro(_fetch_package_debug_vars dbg_target_name dbg_libs dbg_includes) + if (NOT ARG_QUIET AND ARG_DIAG AND ARG_DIAG) + message(STATUS "[fetch_package] target : '${dbg_target_name}'") + message(STATUS "[fetch_package] ${pkg_LIBS_var} : '${dbg_libs}'") + message(STATUS "[fetch_package] ${pkg_INCLUDES_var} : '${dbg_includes}'") + endif () +endmacro() + +# ------------------------------------------------------------------------------ +# Internal helper macro: find include directories for a target when +# INTERFACE_INCLUDE_DIRECTORIES is not set by the package's cmake config. +# +# Some packages set old-style _INCLUDE_DIRS variables via find_package +# but do not propagate them to INTERFACE_INCLUDE_DIRECTORIES on the target. +# Additionally, the variable name may not match the primary target name — +# e.g. find_package may set CPP_LOGGER_INCLUDE_DIRS instead of +# cpp-logger_INCLUDE_DIRS. This macro iterates over all candidate package +# name variants (from ARG_NAME) to find whichever _INCLUDE_DIRS variable +# was actually set, then applies it to the target's INTERFACE_INCLUDE_DIRECTORIES +# so consumers can use target_link_libraries() without manually setting includes. +# +# Arguments: +# _fp_target — the target to set INTERFACE_INCLUDE_DIRECTORIES on +# _fp_arg_name — the name of the list variable containing candidate +# package names (pass as string, e.g. ARG_NAME not ${ARG_NAME}) +# +# Accesses from caller scope (macro): +# pkg_INCLUDES_var — the output variable name for include dirs +# +# Sets in caller scope: +# _includes — the found include dirs (empty if not found) +# ${pkg_INCLUDES_var} — propagated to PARENT_SCOPE if found +# ------------------------------------------------------------------------------ +macro(_fetch_package_find_includes _fp_target _fp_arg_name) + set(_includes "") + foreach(_fp_name IN LISTS ${_fp_arg_name}) + set(_fp_alt_var "${_fp_name}_INCLUDE_DIRS") + if (NOT "${${_fp_alt_var}}" STREQUAL "" AND + NOT "${${_fp_alt_var}}" MATCHES "NOTFOUND") + set(_includes "${${_fp_alt_var}}") + break() + endif () + endforeach () + unset(_fp_alt_var) + unset(_fp_name) + + if (NOT _includes STREQUAL "") + set_target_properties(${_fp_target} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_includes}" + ) + set(${pkg_INCLUDES_var} "${_includes}" PARENT_SCOPE) + endif () +endmacro() + +function(fetch_package) + + # -------------------------------------------------------------------------- + # Parse arguments + # -------------------------------------------------------------------------- + cmake_parse_arguments(ARG + "REQUIRED;QUIET;EXACT;SHALLOW;DIAG" # boolean flags + "VERSION;GIT;TAG;URL;URL_HASH" # single-value keywords + "NAME;SUBMODULES;PATCH_COMMAND;VARS" # multi-value keywords + ${ARGN} + ) + + if (NOT ARG_NAME) + message(FATAL_ERROR "[fetch_package] NAME is required") + endif () + + if (NOT ARG_GIT AND NOT ARG_URL) + message(FATAL_ERROR "[fetch_package] either GIT or URL must be specified") + endif () + + if (ARG_GIT AND ARG_URL) + message(FATAL_ERROR "[fetch_package] GIT and URL are mutually exclusive") + endif () + + # -------------------------------------------------------------------------- + # Build find_package argument list + # -------------------------------------------------------------------------- + set(find_args "") + set(locail_find_args "") + if (ARG_VERSION) + list(APPEND find_args ${ARG_VERSION}) + if (ARG_EXACT) + list(APPEND find_args EXACT) + endif () + set(local_find_args ${find_args}) + endif () + if (ARG_REQUIRED) + list(APPEND find_args REQUIRED) + endif () + if (ARG_QUIET) + list(APPEND find_args QUIET) + endif () + + # -------------------------------------------------------------------------- + # Build FetchContent argument list + # -------------------------------------------------------------------------- + set(fetch_args "") + if (ARG_GIT) + list(APPEND fetch_args GIT_REPOSITORY ${ARG_GIT}) + if (ARG_TAG) + list(APPEND fetch_args GIT_TAG ${ARG_TAG}) + endif () + if (ARG_SHALLOW) + list(APPEND fetch_args GIT_SHALLOW TRUE) + else () + list(APPEND fetch_args GIT_SHALLOW FALSE) + endif () + if (DEFINED ARG_SUBMODULES) + list(APPEND fetch_args GIT_SUBMODULES ${ARG_SUBMODULES}) + if (ARG_SUBMODULES) + list(APPEND fetch_args GIT_SUBMODULES_RECURSE ON) + else () + list(APPEND fetch_args GIT_SUBMODULES_RECURSE OFF) + endif () + else () + list(APPEND fetch_args GIT_SUBMODULES "") + list(APPEND fetch_args GIT_SUBMODULES_RECURSE OFF) + endif () + elseif (ARG_URL) + list(APPEND fetch_args URL ${ARG_URL}) + if (ARG_URL_HASH) + list(APPEND fetch_args URL_HASH ${ARG_URL_HASH}) + endif () + endif () + + if (ARG_PATCH_COMMAND) + list(APPEND fetch_args PATCH_COMMAND ${ARG_PATCH_COMMAND}) + endif () + + # Enable correct behavior for GIT_SUBMODULES "" + if (POLICY CMP0097) + cmake_policy(SET CMP0097 NEW) + endif () + + # -------------------------------------------------------------------------- + # Collect environment hints and populate CMAKE_PREFIX_PATH + # -------------------------------------------------------------------------- + foreach (pkg_name IN LISTS ARG_NAME) + set(pkg_dir_hints "") + foreach (env_var "${pkg_name}_DIR" "${pkg_name}_PATH" "${pkg_name}_ROOT") + set(_env_val "$ENV{${env_var}}") + if (NOT _env_val STREQUAL "") + list(APPEND pkg_dir_hints "${_env_val}") + if (NOT ARG_QUIET AND ARG_DIAG) + message(STATUS "[fetch_package] adding env ${env_var}='${_env_val}'") + endif () + endif () + endforeach () + + foreach (pkg_dir IN LISTS pkg_dir_hints) + list(APPEND CMAKE_PREFIX_PATH "${pkg_dir}") + list(APPEND CMAKE_PREFIX_PATH "${pkg_dir}/lib") + list(APPEND CMAKE_PREFIX_PATH "${pkg_dir}/lib64") + list(APPEND CMAKE_PREFIX_PATH "${pkg_dir}/lib/cmake/${pkg_name}") + list(APPEND CMAKE_PREFIX_PATH "${pkg_dir}/lib64/cmake/${pkg_name}") + endforeach () + endforeach () + # Propagate hints to caller so subsequent find_package calls also benefit + #set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" PARENT_SCOPE) + + # -------------------------------------------------------------------------- + # Attempt find_package first + # -------------------------------------------------------------------------- + list(GET ARG_NAME 0 primary_name) + + # Derive output variable names + set(pkg_FOUND_var "${primary_name}_FOUND") + set(pkg_LIBS_var "${primary_name}_LIBRARIES") + set(pkg_INCLUDES_var "${primary_name}_INCLUDE_DIRS") + + if (NOT ARG_QUIET AND ARG_DIAG) + message(STATUS "[fetch_package] attempt find_package(${primary_name}; ${find_args} NAMES ${ARG_NAME}; QUIET)") + endif () + + find_package(${primary_name} ${local_find_args} NAMES ${ARG_NAME} QUIET) + + if (${pkg_FOUND_var}) + if (NOT ARG_QUIET AND ARG_DIAG) + message(STATUS "[fetch_package] find_package found ${primary_name}") + endif () + + set(_lib_dir "") + foreach(_target ${scoped_target} ${primary_name}) + if (TARGET ${_target} AND _lib_dir STREQUAL "") + set(_loc "") + + # Promote target to global visibility so parent scopes can use it + set_target_properties(${_target} PROPERTIES IMPORTED_GLOBAL TRUE) + + # Try consumer's build type first + if (CMAKE_BUILD_TYPE) + string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type_upper) + get_target_property(_loc ${_target} IMPORTED_LOCATION_${_build_type_upper}) + if (_loc STREQUAL "" OR _loc MATCHES "NOTFOUND") + set(_loc "") + endif () + endif () + + # Fallback to generic IMPORTED_LOCATION + if (_loc STREQUAL "") + get_target_property(_loc ${_target} IMPORTED_LOCATION) + if (_loc STREQUAL "" OR _loc MATCHES "NOTFOUND") + set(_loc "") + endif () + endif () + + # Fall back to other configs + if (_loc STREQUAL "") + foreach(_config RELEASE DEBUG RELWITHDEBINFO MINSIZEREL NOCONFIG) + if (NOT _config STREQUAL "${_build_type_upper}") + get_target_property(_loc_cfg ${_target} IMPORTED_LOCATION_${_config}) + if (NOT _loc_cfg STREQUAL "" AND NOT _loc_cfg MATCHES "NOTFOUND") + set(_loc "${_loc_cfg}") + break() + endif () + endif () + endforeach () + endif () + + if (NOT _loc STREQUAL "") + get_filename_component(_lib_dir "${_loc}" DIRECTORY) + #message(STATUS "[fetch_package] setting INTERFACE_LINK_DIRECTORIES: '${_lib_dir}' on '${_target}'") + set_target_properties(${_target} PROPERTIES + INTERFACE_LINK_DIRECTORIES "${_lib_dir}" + ) + #get_target_property(_check ${_target} INTERFACE_LINK_DIRECTORIES) + #message(STATUS "[fetch_package] ${_target} INTERFACE_LINK_DIRECTORIES: '${_check}'") + endif () + endif () + endforeach () + else () + # ---------------------------------------------------------------------- + # Fall back to FetchContent if not found locally + # ---------------------------------------------------------------------- + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.14") + if (NOT ARG_QUIET AND ARG_DIAG) + message(STATUS "[fetch_package] ${primary_name} not found locally, fetching...") + endif () + + include(FetchContent) + FetchContent_Declare(${primary_name} ${fetch_args}) + + # Force set cmake variable caches + if (ARG_VARS) + foreach(_opt IN LISTS ARG_VARS) + unset(CMAKE_MATCH_1) + unset(CMAKE_MATCH_2) + unset(CMAKE_MATCH_3) + + string(REGEX MATCH "^([^ ]+) (.+) (BOOL|STRING|PATH|FILEPATH|INTERNAL)$" + _match "${_opt}") + if (CMAKE_MATCH_1 AND CMAKE_MATCH_2 AND CMAKE_MATCH_3) + set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE ${CMAKE_MATCH_3} "" FORCE) + else () + unset(CMAKE_MATCH_1) + unset(CMAKE_MATCH_2) + string(REGEX MATCH "^([^ ]+) (.+)$" _match "${_opt}") + if (CMAKE_MATCH_1 AND CMAKE_MATCH_2) + set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE STRING "" FORCE) + else () + if (NOT ARG_QUIET AND ARG_DIAG) + message(WARNING "[fetch_package] invalid VARS entry: '${_opt}'") + endif () + endif () + endif () + endforeach () + endif () + + # Suppress deprecation warnings from the fetched project's older CMake policies + set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(${primary_name}) + set(CMAKE_WARN_DEPRECATED ON CACHE BOOL "" FORCE) + + # Suppress warnings from fetched project's sources + if (TARGET ${primary_name}) + target_compile_options(${primary_name} PRIVATE -w) + endif () + + # Propagate FetchContent population status to caller scope + FetchContent_GetProperties(${primary_name}) + set(${primary_name}_POPULATED "${${primary_name}_POPULATED}" PARENT_SCOPE) + else () + # CMake too old for FetchContent + if (ARG_REQUIRED) + message(FATAL_ERROR + "[fetch_package] ${primary_name} not found and FetchContent " + "requires CMake >= 3.14 (current: ${CMAKE_VERSION})" + ) + elseif (NOT ARG_QUIET AND ARG_DIAG) + message(WARNING + "[fetch_package] ${primary_name} not found and FetchContent " + "requires CMake >= 3.14 (current: ${CMAKE_VERSION})" + ) + endif () + return() + endif () + endif () + + # -------------------------------------------------------------------------- + # Resolve target and populate output variables + # -------------------------------------------------------------------------- + set(scoped_target "${primary_name}::${primary_name}") + + if (TARGET ${scoped_target}) + # Modern imported target with scoped name (preferred) + get_target_property(_includes ${scoped_target} INTERFACE_INCLUDE_DIRECTORIES) + _fetch_package_debug_vars(${scoped_target} ${scoped_target} "${_includes}") + + if (NOT _includes STREQUAL "" AND NOT _includes MATCHES "NOTFOUND") + if ("${${pkg_INCLUDES_var}}" STREQUAL "" OR + "${${pkg_INCLUDES_var}}" MATCHES "NOTFOUND") + set(${pkg_INCLUDES_var} "${_includes}" PARENT_SCOPE) + else () + # Preserve the value already set by find_package + set(${pkg_INCLUDES_var} "${${pkg_INCLUDES_var}}" PARENT_SCOPE) + endif () + else () + _fetch_package_find_includes(${scoped_target} ARG_NAME) + endif () + set(${pkg_LIBS_var} "${scoped_target}" PARENT_SCOPE) + set(${pkg_FOUND_var} TRUE PARENT_SCOPE) + + elseif (TARGET ${primary_name}) + # Unscoped imported target + get_target_property(_includes ${primary_name} INTERFACE_INCLUDE_DIRECTORIES) + _fetch_package_debug_vars(${primary_name} ${primary_name} "${_includes}") + + if (NOT _includes STREQUAL "" AND NOT _includes MATCHES "NOTFOUND") + if ("${${pkg_INCLUDES_var}}" STREQUAL "" OR + "${${pkg_INCLUDES_var}}" MATCHES "NOTFOUND") + set(${pkg_INCLUDES_var} "${_includes}" PARENT_SCOPE) + else () + set(${pkg_INCLUDES_var} "${${pkg_INCLUDES_var}}" PARENT_SCOPE) + endif () + else () + _fetch_package_find_includes(${primary_name} ARG_NAME) + endif () + set(${pkg_LIBS_var} "${primary_name}" PARENT_SCOPE) + set(${pkg_FOUND_var} TRUE PARENT_SCOPE) + + elseif (NOT "${${pkg_LIBS_var}}" STREQUAL "" AND + NOT "${${pkg_LIBS_var}}" MATCHES "NOTFOUND") + # Old-style variables set by find_package — wrap in an imported target + set(_orig_libs "${${pkg_LIBS_var}}") + set(_orig_includes "${${pkg_INCLUDES_var}}") + + add_library(${scoped_target} UNKNOWN IMPORTED) + + if (NOT _orig_includes STREQUAL "" AND NOT _orig_includes MATCHES "NOTFOUND") + set_target_properties(${scoped_target} PROPERTIES + IMPORTED_LOCATION "${_orig_libs}" + INTERFACE_INCLUDE_DIRECTORIES "${_orig_includes}" + ) + set(${pkg_INCLUDES_var} "${_orig_includes}" PARENT_SCOPE) + else () + set_target_properties(${scoped_target} PROPERTIES + IMPORTED_LOCATION "${_orig_libs}" + ) + endif () + + _fetch_package_debug_vars("${scoped_target}" "${_orig_libs}" "${_orig_includes}") + set(${pkg_LIBS_var} "${scoped_target}" PARENT_SCOPE) + set(${pkg_FOUND_var} TRUE PARENT_SCOPE) + + else () + # Could not find or create any target + set(${pkg_FOUND_var} FALSE PARENT_SCOPE) + if (ARG_REQUIRED) + message(FATAL_ERROR + "[fetch_package] could not find or create a target for ${primary_name}" + ) + elseif (NOT ARG_QUIET) + message(WARNING + "[fetch_package] could not find or create a target for ${primary_name}" + ) + endif () + return() + endif () +endfunction() diff --git a/src/dyad/client/CMakeLists.txt b/src/dyad/client/CMakeLists.txt index 87dc2ed8..470f1c10 100644 --- a/src/dyad/client/CMakeLists.txt +++ b/src/dyad/client/CMakeLists.txt @@ -21,7 +21,7 @@ target_link_libraries(${PROJECT_NAME}_client PRIVATE ${PROJECT_NAME}_utils ${PROJECT_NAME}_murmur3 ${PROJECT_NAME}_dtl) target_link_libraries(${PROJECT_NAME}_client PUBLIC ${PROJECT_NAME}_ctx) -target_compile_definitions(${PROJECT_NAME}_client PUBLIC BUILDING_DYAD=1) +target_compile_definitions(${PROJECT_NAME}_client PRIVATE BUILDING_DYAD=1) target_compile_definitions(${PROJECT_NAME}_client PUBLIC DYAD_HAS_CONFIG) target_include_directories(${PROJECT_NAME}_client PUBLIC $ # will be used for generated code @@ -51,4 +51,4 @@ install( ) if(NOT "${DYAD_CLIENT_PUBLIC_HEADERS}" STREQUAL "") dyad_install_headers("${DYAD_CLIENT_PUBLIC_HEADERS}" ${CMAKE_CURRENT_SOURCE_DIR}) -endif() \ No newline at end of file +endif() diff --git a/src/dyad/client/dyad_client_int.h b/src/dyad/client/dyad_client_int.h index 9e73b02b..48952f27 100644 --- a/src/dyad/client/dyad_client_int.h +++ b/src/dyad/client/dyad_client_int.h @@ -6,6 +6,10 @@ #include // clang-format on +#ifdef __cplusplus +extern "C" { +#endif + // Debug message #ifndef DPRINTF #if VA_OPT_SUPPORTED @@ -60,4 +64,8 @@ DYAD_DLL_EXPORTED dyad_rc_t dyad_kvs_read (const dyad_ctx_t *ctx, DYAD_PFA_ANNOTATE DYAD_DLL_EXPORTED int dyad_sync_directory (dyad_ctx_t *ctx, const char *path); #endif +#ifdef __cplusplus +} +#endif + #endif /* DYAD_CORE_DYAD_CORE_INT_H */ diff --git a/src/dyad/core/CMakeLists.txt b/src/dyad/core/CMakeLists.txt index 36d7c4fd..27571506 100644 --- a/src/dyad/core/CMakeLists.txt +++ b/src/dyad/core/CMakeLists.txt @@ -8,7 +8,7 @@ set(DYAD_CTX_PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../../../include/dyad/co add_library(${PROJECT_NAME}_ctx SHARED ${DYAD_CTX_SRC} ${DYAD_CTX_PUBLIC_HEADERS} ${DYAD_CTX_PRIVATE_HEADERS}) -target_compile_definitions(${PROJECT_NAME}_ctx PUBLIC BUILDING_DYAD=1) +target_compile_definitions(${PROJECT_NAME}_ctx PRIVATE BUILDING_DYAD=1) target_compile_definitions(${PROJECT_NAME}_ctx PUBLIC DYAD_HAS_CONFIG) target_include_directories(${PROJECT_NAME}_ctx PUBLIC $ @@ -30,4 +30,4 @@ install( if(NOT "${DYAD_CTX_PUBLIC_HEADERS}" STREQUAL "") dyad_install_headers("${DYAD_CTX_PUBLIC_HEADERS}" ${CMAKE_CURRENT_SOURCE_DIR}) -endif() \ No newline at end of file +endif() diff --git a/src/dyad/service/flux_module/CMakeLists.txt b/src/dyad/service/flux_module/CMakeLists.txt index 032fef39..8feae6b6 100644 --- a/src/dyad/service/flux_module/CMakeLists.txt +++ b/src/dyad/service/flux_module/CMakeLists.txt @@ -22,7 +22,7 @@ target_link_libraries(${DYAD_FLUX_MODULE} PRIVATE Jansson::Jansson) target_link_libraries(${DYAD_FLUX_MODULE} PRIVATE ${PROJECT_NAME}_dtl) target_link_libraries(${DYAD_FLUX_MODULE} PRIVATE ${PROJECT_NAME}_ctx) target_link_libraries(${DYAD_FLUX_MODULE} PRIVATE ${PROJECT_NAME}_utils) -target_compile_definitions(${DYAD_FLUX_MODULE} PUBLIC BUILDING_DYAD=1) +target_compile_definitions(${DYAD_FLUX_MODULE} PRIVATE BUILDING_DYAD=1) target_compile_definitions(${DYAD_FLUX_MODULE} PUBLIC DYAD_HAS_CONFIG) target_include_directories(${DYAD_FLUX_MODULE} PUBLIC $ diff --git a/src/dyad/wrapper/CMakeLists.txt b/src/dyad/wrapper/CMakeLists.txt index c5cc4696..751e3d68 100644 --- a/src/dyad/wrapper/CMakeLists.txt +++ b/src/dyad/wrapper/CMakeLists.txt @@ -12,7 +12,7 @@ add_library(${PROJECT_NAME}_wrapper SHARED ${DYAD_WRAPPER_SRC} target_link_libraries(${PROJECT_NAME}_wrapper PRIVATE ${PROJECT_NAME}_ctx ${PROJECT_NAME}_client) target_link_libraries(${PROJECT_NAME}_wrapper PRIVATE ${PROJECT_NAME}_utils flux::core) target_link_libraries(${PROJECT_NAME}_wrapper PRIVATE ${gotcha_LIBRARIES}) -target_compile_definitions(${PROJECT_NAME}_wrapper PUBLIC BUILDING_DYAD=1) +target_compile_definitions(${PROJECT_NAME}_wrapper PRIVATE BUILDING_DYAD=1) target_compile_definitions(${PROJECT_NAME}_wrapper PUBLIC DYAD_HAS_CONFIG) target_include_directories(${PROJECT_NAME}_wrapper PUBLIC $ diff --git a/tests/dspaces_perf/CMakeLists.txt b/tests/dspaces_perf/CMakeLists.txt index 75d37d7c..97fd1897 100644 --- a/tests/dspaces_perf/CMakeLists.txt +++ b/tests/dspaces_perf/CMakeLists.txt @@ -14,14 +14,13 @@ find_package(Catch2 REQUIRED) find_package(MPI REQUIRED COMPONENTS CXX) find_package(dspaces REQUIRED CONFIG) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(Catch2::Catch2) include_directories(${MPI_CXX_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories(${CMAKE_BINARY_DIR}/include) set(TEST_LIBS Catch2::Catch2 ${MPI_CXX_LIBRARIES} -rdynamic dspaces::dspaces) set(TEST_SRC ${CMAKE_CURRENT_SOURCE_DIR}/catch_config.h ${CMAKE_CURRENT_SOURCE_DIR}/test_utils.h) add_executable(unit_test unit_test.cpp ${TEST_SRC} ) -target_link_libraries(unit_test ${TEST_LIBS}) +target_link_libraries(unit_test PRIVATE ${TEST_LIBS}) # TODO add the "add_test" directives by going into the subdirectories # add_subdirectory(script) diff --git a/tests/dspaces_perf/catch_config.h b/tests/dspaces_perf/catch_config.h index 9eb9ac24..abb9e267 100644 --- a/tests/dspaces_perf/catch_config.h +++ b/tests/dspaces_perf/catch_config.h @@ -19,6 +19,6 @@ int main(int argc, char* argv[]) { int test_return_code = session.run(); returnCode = finalize(); if (returnCode != 0) return returnCode; - exit(test_return_code); + return test_return_code; } #endif // DYAD_CATCH_CONFIG_H diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index fc2654e1..6122eb5a 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -1,8 +1,8 @@ -if(NOT DEFINED ENV{DYAD_TEST_MACHINE}) - message(FATAL_ERROR "-- [dyad] DYAD_TEST_MACHINE in env should be set for ${PROJECT_NAME} test build") -else() - message(STATUS "[dyad] found setting machine to $ENV{DYAD_TEST_MACHINE}") -endif() +#if(NOT DEFINED ENV{DYAD_TEST_MACHINE}) +# message(FATAL_ERROR "-- [dyad] DYAD_TEST_MACHINE in env should be set for ${PROJECT_NAME} test build") +#else() +# message(STATUS "[dyad] found setting machine to $ENV{DYAD_TEST_MACHINE}") +#endif() if(NOT DEFINED ENV{DYAD_PFS_DIR}) message(FATAL_ERROR "-- [dyad] DYAD_PFS_DIR in env should be set for ${PROJECT_NAME} paper test build") else() @@ -19,18 +19,22 @@ file(MAKE_DIRECTORY ${DYAD_LOG_DIR}) find_package(Catch2 REQUIRED) find_package(MPI REQUIRED COMPONENTS CXX) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(Catch2::Catch2) include_directories(${MPI_CXX_INCLUDE_DIRS}) include_directories(${DYAD_PROJECT_DIR}/src) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories(${CMAKE_BINARY_DIR}/include) -set(TEST_LIBS Catch2::Catch2 -lstdc++fs ${MPI_CXX_LIBRARIES} -rdynamic dyad_core dyad_ctx dyad_utils flux-core ${CPP_LOGGER_LIBRARIES}) +set(TEST_LIBS Catch2::Catch2 -lstdc++fs ${MPI_CXX_LIBRARIES} -rdynamic dyad_client dyad_ctx dyad_utils flux-core ${CPP_LOGGER_LIBRARIES}) set(TEST_SRC ${CMAKE_CURRENT_SOURCE_DIR}/catch_config.h ${CMAKE_CURRENT_SOURCE_DIR}/mpi_console_reporter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mpi_console_reporter.hpp ${CMAKE_CURRENT_SOURCE_DIR}/test_utils.h) -add_executable(unit_test unit_test.cpp ${TEST_SRC} ) -target_link_libraries(unit_test ${TEST_LIBS}) +add_executable(unit_test unit_test.cpp ${TEST_SRC}) +target_link_libraries(unit_test PRIVATE ${TEST_LIBS}) +target_compile_definitions(${PROJECT_NAME}_client PRIVATE BUILDING_DYAD=1) +target_compile_definitions(unit_test PUBLIC DYAD_HAS_CONFIG) +target_include_directories(unit_test PUBLIC + $ + $) add_dependencies(unit_test dyad) add_subdirectory(script) add_subdirectory(data_plane) add_subdirectory(mdm) -add_subdirectory(dyad_core) \ No newline at end of file +add_subdirectory(dyad_core) diff --git a/tests/unit/catch_config.h b/tests/unit/catch_config.h index 987b6d28..4ef25914 100644 --- a/tests/unit/catch_config.h +++ b/tests/unit/catch_config.h @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) { int test_return_code = session.run(); returnCode = finalize(); if (returnCode != 0) return returnCode; - exit(test_return_code); + return test_return_code; } #include diff --git a/tests/unit/data_plane/data_plane.cpp b/tests/unit/data_plane/data_plane.cpp index 49bdab81..5dc383ed 100644 --- a/tests/unit/data_plane/data_plane.cpp +++ b/tests/unit/data_plane/data_plane.cpp @@ -1,6 +1,7 @@ #include -#include #include +#include +#include #include #include @@ -214,4 +215,4 @@ TEST_CASE("LocalNodeDataBandwidth", "[files= " + std::to_string(args.number_of_f REQUIRE(rc >= 0); REQUIRE(clean_directories() == 0); REQUIRE(posttest() == 0); -} \ No newline at end of file +} diff --git a/tests/unit/dyad_core/core_functions.cpp b/tests/unit/dyad_core/core_functions.cpp index 0915737b..3c84eaf1 100644 --- a/tests/unit/dyad_core/core_functions.cpp +++ b/tests/unit/dyad_core/core_functions.cpp @@ -1,5 +1,5 @@ +#include -#include /** * Test cases */ @@ -67,4 +67,4 @@ TEST_CASE("gen_path_key", "[module=dyad_core]" int result = gen_path_key(str, path_key, sizeof(path_key), 3, 5); REQUIRE(result == -1); } -} \ No newline at end of file +} diff --git a/tests/unit/mpi_console_reporter.cpp b/tests/unit/mpi_console_reporter.cpp index 1cbbd186..cb8565a6 100644 --- a/tests/unit/mpi_console_reporter.cpp +++ b/tests/unit/mpi_console_reporter.cpp @@ -109,6 +109,7 @@ class ConsoleAssertionPrinter { messageLabel = "explicitly with messages"; break; // These cases are here to prevent compiler warnings + case ResultWas::ExplicitSkip: case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: @@ -717,4 +718,4 @@ void ConsoleMPIReporter::printSummaryDivider() { #if defined(__clang__) # pragma clang diagnostic pop -#endif \ No newline at end of file +#endif