diff --git a/CMakeLists.txt b/CMakeLists.txt index a04fd71d..54d12faf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,15 +5,21 @@ cmake_minimum_required(VERSION 3.18) +if(POLICY CMP0074) + cmake_policy(SET CMP0074 NEW) +endif() if(POLICY CMP0135) cmake_policy(SET CMP0135 NEW) endif() -cmake_policy(SET CMP0074 NEW) - project(AMS VERSION 0.1.1 LANGUAGES CXX C) +get_filename_component(AMS_CXX_COMPILER_NAME "${CMAKE_CXX_COMPILER}" NAME) +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND AMS_CXX_COMPILER_NAME STREQUAL "gcc") + message(WARNING "CMAKE_CXX_COMPILER points to gcc; forcing libstdc++ on C++ link lines") + link_libraries("$<$:stdc++>") +endif() # NOTE: This may break some of our integrations with the applications. But flux requires > C++20, RMQ requires C++17 and although AMS does not have # any restrictions on the CXX standard the application may impose those. The solution would be to compile RMQ with an older GCC version (8) and @@ -23,13 +29,51 @@ set(CMAKE_CXX_STANDARD 17) # Enable this to get compile_commands.json set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -if (NOT EXISTS ${CMAKE_BINARY_DIR}/CMakeCache.txt) +if (NOT EXISTS "${CMAKE_BINARY_DIR}/CMakeCache.txt") if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE) endif() endif() -set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH};") +option(ENABLE_MPI "Enable MPI support" OFF) +option(ENABLE_CUDA "Enable CUDA support" OFF) +option(ENABLE_HIP "Enable HIP support" OFF) +option(ENABLE_CALIPER "Use Caliper for profiling" OFF) +option(ENABLE_TESTS "Build AMS tests" OFF) +option(ENABLE_WORKFLOW "Install python drivers used by the outer workflow" OFF) +option(ENABLE_RMQ "Use RabbitMQ as a database back end" OFF) +option(ENABLE_PERFFLOWASPECT "Use PerfFlowAspect for profiling" OFF) +option(AMS_ENABLE_DEBUG "Enable verbose AMS messages" OFF) +option(AMS_DEFER_STATIC_TPL_RESOLUTION + "Defer selected static TPL resolution to downstream final links when building shared AMS" + OFF) + +set(AMS_THIRDPARTY_DIR "${PROJECT_SOURCE_DIR}/thirdparty" CACHE PATH + "Path to AMS-local third-party dependencies") +set(AMS_FMT_DIR "" CACHE PATH + "Path to a directory containing fmt-config.cmake or fmtConfig.cmake") +set(HDF5_WITH_INTEL_RUNTIME "" CACHE FILEPATH + "Optional Intel runtime library to link when using static HDF5") + +if (ENABLE_CUDA AND ENABLE_HIP) + message(FATAL_ERROR "AMS does not support compilation with both CUDA and HIP enabled.") +endif() + +if (NOT BLT_SOURCE_DIR) + set(BLT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/blt" CACHE PATH "Path to a BLT checkout") +endif() + +if (NOT EXISTS "${BLT_SOURCE_DIR}/SetupBLT.cmake") + message(FATAL_ERROR + "BLT was not found. Set BLT_SOURCE_DIR to a BLT checkout or provide a local " + "'${PROJECT_SOURCE_DIR}/blt' checkout for standalone builds.") +endif() + +list(PREPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" "${BLT_SOURCE_DIR}/cmake") +include("${BLT_SOURCE_DIR}/SetupBLT.cmake") + +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) set(AMS_APP_LIBRARIES "") set(AMS_APP_DEFINES "") @@ -39,96 +83,230 @@ set(AMS_EXAMPLE_LIBRARIES "") set(AMS_EXAMPLE_DEFINES "") set(AMS_EXAMPLE_INCLUDES "") -# ------------------------------------------------------------------------------ -option(WITH_CUDA "Option to enable CUDA" OFF) -option(WITH_HIP "Option to enable HIP" OFF) -option(WITH_MPI "Option to enable MPI" OFF) -option(WITH_CALIPER "Use Caliper for Profiling" OFF) -option(WITH_TESTS "Compile tests" OFF) -option(WITH_RMQ "Use RabbitMQ as a database back end (require a reachable and running RabbitMQ server service)" OFF) -option(WITH_AMS_DEBUG "Enable verbose messages" OFF) -option(WITH_PERFFLOWASPECT "Use PerfFlowAspect for Profiling" OFF) -option(WITH_WORKFLOW "Install python drivers used by the outer workflow" OFF) -option(WITH_AMS_LIB "Install C++ library to support scientific applications" ON) - -# ------------------------------------------------------------------------------ -find_package(nlohmann_json REQUIRED) -list(APPEND AMS_APP_LIBRARIES nlohmann_json::nlohmann_json) - -# ------------------------------------------------------------------------------ -find_package(Threads REQUIRED) -# ------------------------------------------------------------------------------ - -#------------------------------------------------------------------------------- +set(AMS_PACKAGE_DEPENDENCY_BLOCK "") + +function(ams_append_package_dependency line) + set(AMS_PACKAGE_DEPENDENCY_BLOCK + "${AMS_PACKAGE_DEPENDENCY_BLOCK}${line}\n" + PARENT_SCOPE) +endfunction() + +function(inherit_target_nostatic) + set(options) + set(singleValueArgs TO FROM OBJECT) + set(multiValueArgs) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT DEFINED arg_TO) + message(FATAL_ERROR "Must provide a TO argument to inherit_target_nostatic") + endif() + + if (NOT DEFINED arg_FROM) + message(FATAL_ERROR "Must provide a FROM argument to inherit_target_nostatic") + endif() + + set(_scope INTERFACE) + + get_target_property(_interface_system_includes ${arg_FROM} INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) + if (_interface_system_includes) + target_include_directories(${arg_TO} SYSTEM ${_scope} ${_interface_system_includes}) + endif() + + get_target_property(_interface_includes ${arg_FROM} INTERFACE_INCLUDE_DIRECTORIES) + if (_interface_includes) + target_include_directories(${arg_TO} ${_scope} ${_interface_includes}) + endif() + + get_target_property(_interface_defines ${arg_FROM} INTERFACE_COMPILE_DEFINITIONS) + if (_interface_defines) + target_compile_definitions(${arg_TO} ${_scope} ${_interface_defines}) + endif() + + if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") + get_target_property(_interface_link_options ${arg_FROM} INTERFACE_LINK_OPTIONS) + if (_interface_link_options) + target_link_options(${arg_TO} ${_scope} ${_interface_link_options}) + endif() + endif() + + get_target_property(_interface_compile_options ${arg_FROM} INTERFACE_COMPILE_OPTIONS) + if (_interface_compile_options) + target_compile_options(${arg_TO} ${_scope} ${_interface_compile_options}) + endif() +endfunction() + +function(remove_static_from_libs) + set(options) + set(singleValueArgs TO) + set(multiValueArgs FROM) + cmake_parse_arguments(arg "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT DEFINED arg_TO) + message(FATAL_ERROR "Must provide a TO argument to remove_static_from_libs") + endif() + + if (NOT DEFINED arg_FROM) + message(FATAL_ERROR "Must provide a FROM argument to remove_static_from_libs") + endif() + + if (BUILD_SHARED_LIBS AND AMS_DEFER_STATIC_TPL_RESOLUTION) + set(retval) + foreach(THIS_LIB ${arg_FROM}) + if (TARGET ${THIS_LIB}) + get_target_property(target_type ${THIS_LIB} TYPE) + if (target_type STREQUAL STATIC_LIBRARY) + add_library("${THIS_LIB}::nostatic" INTERFACE IMPORTED) + inherit_target_nostatic(TO "${THIS_LIB}::nostatic" FROM ${THIS_LIB}) + list(APPEND retval "${THIS_LIB}::nostatic") + else() + list(APPEND retval ${THIS_LIB}) + endif() + else() + get_filename_component(THIS_EXT ${THIS_LIB} EXT) + if (NOT ".a" STREQUAL "${THIS_EXT}") + list(APPEND retval ${THIS_LIB}) + endif() + endif() + endforeach() + else() + set(retval ${arg_FROM}) + endif() + + set(${arg_TO} ${retval} PARENT_SCOPE) +endfunction() + +if (AMS_DEFER_STATIC_TPL_RESOLUTION AND NOT BUILD_SHARED_LIBS) + message(STATUS + "AMS_DEFER_STATIC_TPL_RESOLUTION is ignored when BUILD_SHARED_LIBS=OFF.") +endif() + +if (ENABLE_RMQ) + find_package(Threads REQUIRED) +endif() + include(cmake/FetchAndAddFmt.cmake) -FetchAndAddFmt("On") -#------------------------------------------------------------------------------- +set(_ams_fmt_args) +if (AMS_FMT_DIR) + list(APPEND _ams_fmt_args PATHS "${AMS_FMT_DIR}" NO_DEFAULT_PATH) +endif() +find_package(fmt CONFIG QUIET ${_ams_fmt_args}) +if (NOT TARGET fmt::fmt) + message(STATUS "fmt not found via CMake package discovery; falling back to FetchContent") + FetchAndAddFmt(ON) +endif() -#------------------------------------------------------------------------------- -include(cmake/FetchAndAddTlExpected.cmake) -FetchAndAddTlExpected("On") -#------------------------------------------------------------------------------- +find_package(nlohmann_json CONFIG REQUIRED) +include(cmake/FetchAndAddTlExpected.cmake) +find_package(tl-expected QUIET) +if (NOT TARGET tl::expected) + message(STATUS "tl::expected not found via CMake package discovery; falling back to FetchContent") + FetchAndAddTlExpected(ON) +endif() +if (NOT TARGET tl::expected) + message(FATAL_ERROR + "Unable to find tl::expected. Provide a tl-expected package or allow " + "FetchContent to populate it.") +endif() set(MPI_DIRECTORIES "") -if (WITH_MPI) - find_package(MPI REQUIRED) +if (ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS C CXX) message(STATUS "MPICC: ${MPI_C_COMPILER}") message(STATUS "MPICXX: ${MPI_CXX_COMPILER}") - message(STATUS "MPI Library used: " MPI::MPI_CXX) + message(STATUS "MPI Library used: MPI::MPI_CXX") foreach(LIBRARY ${MPI_C_LIBRARIES}) get_filename_component(LIB_DIR ${LIBRARY} DIRECTORY) list(APPEND MPI_DIRECTORIES ${LIB_DIR}) endforeach() list(REMOVE_DUPLICATES MPI_DIRECTORIES) - message(STATUS "MPI Liraries: ${MPI_DIRECTORIES}") + message(STATUS "MPI Libraries: ${MPI_DIRECTORIES}") list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_MPI__") endif() -if(WITH_CUDA AND WITH_HIP) - message(FATAL "AMS Does not support compilation with both CUDA and HIP enabled.") -elseif (WITH_CUDA) - find_package(CUDAToolkit) +if (ENABLE_CUDA) + find_package(CUDAToolkit REQUIRED) list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_CUDA__") -elseif (WITH_HIP) +elseif (ENABLE_HIP) find_package(HIP REQUIRED) list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_HIP__") - list(APPEND CMAKE_CXX_FLAGS "-I${ROCM_PATH}/include/") + if (DEFINED ROCM_PATH) + list(APPEND CMAKE_CXX_FLAGS "-I${ROCM_PATH}/include/") + endif() endif() -# ------------------------------------------------------------------------------ -if (WITH_CALIPER) +if (ENABLE_CALIPER) find_package(caliper REQUIRED) - message(STATUS "Caliper Directory is ${caliper_DIR}") + message(STATUS "Caliper directory is ${caliper_DIR}") list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_CALIPER__") endif() -if (WITH_AMS_DEBUG) - list(APPEND AMS_APP_DEFINES "LIBAMS_VERBOSE") - list(APPEND AMS_APP_DEFINES "__AMS_DEBUG__") +if (AMS_ENABLE_DEBUG) + list(APPEND AMS_APP_DEFINES "LIBAMS_VERBOSE" "__AMS_DEBUG__") endif() -if (AMS_HDF5_DIR) - if (HDF5_USE_STATIC_LIBRARIES) - find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - set(AMS_HDF5_TARGET hdf5-static) - set(AMS_HDF5_LIB_TYPE "static") - else() - find_package(HDF5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - set(AMS_HDF5_LIB_TYPE "shared") - set(AMS_HDF5_TARGET hdf5-shared) - endif() -else() - find_package(HDF5 REQUIRED COMPONENTS C CXX) - set(AMS_HDF5_TARGET HDF5::HDF5) +set(AMS_HDF5_MODE "") +set(AMS_HDF5_LINK_TARGETS "") + +if (DEFINED HDF5_DIR AND NOT "${HDF5_DIR}" STREQUAL "") + # Try old packaging system. + if (HDF5_USE_STATIC_LIBRARIES) + set(_mode static) + else() + set(_mode shared) + endif() + find_package(hdf5 CONFIG QUIET + COMPONENTS C ${_mode} + NO_DEFAULT_PATH + HINTS ${HDF5_DIR}/lib/cmake/hdf5 + ${HDF5_DIR}/lib64/cmake/hdf5 + ${HDF5_DIR}/share/cmake + ${HDF5_DIR}) + if (TARGET "hdf5-${_mode}") + set(AMS_HDF5_LINK_TARGETS "hdf5-${_mode}") + if (HDF5_USE_STATIC_LIBRARIES) + find_package(ZLIB REQUIRED) + list(APPEND AMS_HDF5_LINK_TARGETS ZLIB::ZLIB) + if (HDF5_WITH_INTEL_RUNTIME) + list(APPEND AMS_HDF5_LINK_TARGETS "${HDF5_WITH_INTEL_RUNTIME}") + endif() + set(AMS_HDF5_MODE "HDF5_STATIC_TARGET") + else() + set(AMS_HDF5_MODE "HDF5_SHARED_TARGET") + endif() + endif() +endif() + +if (NOT AMS_HDF5_MODE) + # Try new packaing system. + find_package(HDF5 CONFIG QUIET COMPONENTS C) + if (NOT HDF5_FOUND) + find_package(HDF5 REQUIRED COMPONENTS C) + endif() + + if (TARGET HDF5::HDF5) + set(AMS_HDF5_LINK_TARGETS HDF5::HDF5) + elseif (TARGET hdf5::hdf5) + set(AMS_HDF5_LINK_TARGETS hdf5::hdf5) + elseif (TARGET HDF5::C) + set(AMS_HDF5_LINK_TARGETS HDF5::C) + else() + message(FATAL_ERROR + "Unable to determine imported HDF5 targets for AMS. Provide either " + "an HDF5 package with hdf5-static or hdf5-shared, or a modern HDF5 package with imported targets.") + endif() + + set(AMS_HDF5_MODE "HDF5_STANDARD_TARGET") endif() -message(STATUS "HDF5 Dir is ${HDF5_FOUND}") + +message(STATUS "AMS HDF5 mode is ${AMS_HDF5_MODE}") list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_HDF5__") -if (WITH_RMQ) - if (WITH_CUDA) +if (ENABLE_RMQ) + if (ENABLE_CUDA) add_compile_definitions(THRUST_IGNORE_CUB_VERSION_CHECK) endif() + list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_RMQ__") find_package(amqpcpp REQUIRED) @@ -139,49 +317,67 @@ if (WITH_RMQ) set(AMS_OPENSSL_FOUND_ROOT "") if (OPENSSL_FOUND) message(STATUS "OpenSSL libraries found: ${OPENSSL_LIBRARIES}") - message(STATUS "OpenSSL includes found: " ${OPENSSL_INCLUDE_DIR}) + message(STATUS "OpenSSL includes found: ${OPENSSL_INCLUDE_DIR}") get_filename_component(AMS_OPENSSL_FOUND_ROOT "${OPENSSL_SSL_LIBRARY}" DIRECTORY) get_filename_component(AMS_OPENSSL_FOUND_ROOT "${AMS_OPENSSL_FOUND_ROOT}" DIRECTORY) - message(STATUS "OPENSSL Root dir is ${AMS_OPENSSL_FOUND_ROOT}") + message(STATUS "OpenSSL root dir is ${AMS_OPENSSL_FOUND_ROOT}") else() - message(STATUS "OpenSSL Not Found") + message(STATUS "OpenSSL not found") endif() + set(AMS_LIBEVENT_HINTS ${MPI_DIRECTORIES}) - - find_package(libevent REQUIRED) # event loop library -endif() # WITH_RMQ + find_package(libevent REQUIRED) +endif() -# ------------------------------------------------------------------------------ find_package(Torch REQUIRED) # This is annoying, torch populates all my cuda flags # and resets them set(CMAKE_CUDA_FLAGS "") set(CMAKE_CUDA_ARCHITECTURES ON) - -# ------------------------------------------------------------------------------ -if (WITH_RZ) - find_package(MPI REQUIRED) - add_subdirectory(rz) - list(APPEND AMS_APP_INCLUDES "${RZ_AMS_INCLUDES}" "${MPI_INCLUDE_PATH}") - list(APPEND AMS_APP_LIB_DIRS "${RZ_AMS_LIBDIRS}") - list(APPEND AMS_APP_LIBRARIES "${RZ_AMS_LIBRARIES}" "${MPI_C_LIBRARIES}") - list(APPEND AMS_APP_DEFINES "${RZ_AMS_DEFINES}") -endif() - -if (WITH_PERFFLOWASPECT) +if (ENABLE_PERFFLOWASPECT) find_package(perfflowaspect CONFIG REQUIRED) - list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_PERFFLOWASPECT__") list(APPEND AMS_APP_LIB_DIRS "${PERFFLOWASPECT_LIB_DIR}") - list(APPEND AMS_APP_LIBRARIES "perfflow_runtime") endif() +if (NOT BUILD_SHARED_LIBS) + ams_append_package_dependency("find_dependency(fmt CONFIG REQUIRED)") + ams_append_package_dependency("find_dependency(Torch REQUIRED)") + if (ENABLE_MPI) + ams_append_package_dependency("find_dependency(MPI REQUIRED COMPONENTS C CXX)") + endif() + if (ENABLE_CUDA) + ams_append_package_dependency("find_dependency(CUDAToolkit REQUIRED)") + endif() + if (ENABLE_HIP) + ams_append_package_dependency("find_dependency(HIP REQUIRED)") + endif() + if (ENABLE_CALIPER) + ams_append_package_dependency("find_dependency(caliper REQUIRED)") + endif() + if (AMS_HDF5_MODE STREQUAL "HDF5_STATIC_TARGET") + ams_append_package_dependency("find_dependency(hdf5 CONFIG REQUIRED COMPONENTS C static)") + ams_append_package_dependency("find_dependency(ZLIB REQUIRED)") + elseif (AMS_HDF5_MODE STREQUAL "HDF5_SHARED_TARGET") + ams_append_package_dependency("find_dependency(hdf5 CONFIG REQUIRED COMPONENTS C shared)") + else() + ams_append_package_dependency("find_dependency(HDF5 REQUIRED COMPONENTS C)") + endif() + if (ENABLE_RMQ) + ams_append_package_dependency("find_dependency(Threads REQUIRED)") + ams_append_package_dependency("find_dependency(amqpcpp REQUIRED)") + ams_append_package_dependency("find_dependency(OpenSSL REQUIRED)") + endif() + if (ENABLE_PERFFLOWASPECT) + ams_append_package_dependency("find_dependency(perfflowaspect CONFIG REQUIRED)") + endif() +endif() add_subdirectory(src) -if (WITH_TESTS) +if (ENABLE_TESTS) include(CTest) add_subdirectory(tests) endif() diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index cc3f1ca3..3c709d83 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -1,78 +1,19 @@ @PACKAGE_INIT@ -# Expose configuration options with AMS_ prefix -set(AMS_WITH_MPI @WITH_MPI@) -set(AMS_WITH_CUDA @WITH_CUDA@) -set(AMS_WITH_CALIPER @WITH_CALIPER@) -set(AMS_WITH_HDF5 @WITH_HDF5@) -set(AMS_WITH_RMQ @WITH_RMQ@) include(CMakeFindDependencyMacro) -find_dependency(fmt) -find_dependency(tl-expected) - -if (NOT TARGET Torch) - set(AMS_TORCH_DIR @Torch_DIR@) - if (NOT Torch_DIR) - set(Torch_DIR ${AMS_TORCH_DIR}) - endif() - find_dependency(Torch REQUIRED HINTS ${Torch_DIR}) -endif() - -#Add usage hints for downstream projects -if(AMS_WITH_MPI) - if (NOT TARGET MPI) - find_dependency(MPI REQUIRED) - endif() -endif() - -if(AMS_WITH_CUDA) - if (NOT TARGET CUDA::cudart) - find_dependency(CUDAToolkit REQUIRED) - endif() -endif() - -set(AMS_HDF5_DIR @AMS_HDF5_DIR@) -set(AMS_HDF5_LIB_TYPE @AMS_HDF5_LIB_TYPE@) -if (NOT TARGET hdf5-shared OR NOT TARGET hdf5-static) - if (NOT HDF5_DIR) - set(HDF5_DIR ${AMS_HDF5_DIR}) - endif() - - if (${AMS_HDF5_LIB_TYPE} STREQUAL "static") - find_dependency(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) - else() - find_dependency(HDF5 COMPONENTS C shared HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) - endif() -endif() - -if (AMS_WITH_CALIPER) - if (NOT TARGET caliper) - set(CALIPER_AMS_DIR @caliper_DIR@) - # check if we specify another caliper directory - if (NOT caliper_DIR) - set(caliper_DIR ${CALIPER_AMS_DIR}) - endif() - find_dependency(caliper HINTS ${caliper_DIR}) - endif() -endif() - -if (AMS_WITH_RMQ) - set(AMS_RMQ_DIR @amqpcpp_DIR@) - if (NOT amqpcpp_DIR) - set(amqpcpp_DIR ${AMS_RMQ_DIR}) - endif() - set(AMS_OPENSSL_FOUND_ROOT @AMS_OPENSSL_FOUND_ROOT@) - if (NOT OPENSSL_ROOT_DIR) - set(OPENSSL_ROOT_DIR ${AMS_OPENSSL_FOUND_ROOT}) - endif() - find_dependency(amqpcpp REQUIRED HINTS ${amqpcpp_DIR}) - # find dependency does not correctly discover OpenSSL, not sure why. - find_dependency(OpenSSL) - if (NOT OPENSSL_FOUND) - find_dependency(OpenSSL HINTS ${AMS_OPENSSL_FOUND_ROOT}) - endif() -endif() +set(AMS_ENABLE_MPI @ENABLE_MPI@) +set(AMS_ENABLE_CUDA @ENABLE_CUDA@) +set(AMS_ENABLE_HIP @ENABLE_HIP@) +set(AMS_ENABLE_CALIPER @ENABLE_CALIPER@) +set(AMS_ENABLE_WORKFLOW @ENABLE_WORKFLOW@) +set(AMS_ENABLE_RMQ @ENABLE_RMQ@) +set(AMS_ENABLE_PERFFLOWASPECT @ENABLE_PERFFLOWASPECT@) +set(AMS_BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@) +set(AMS_DEFER_STATIC_TPL_RESOLUTION @AMS_DEFER_STATIC_TPL_RESOLUTION@) +set(AMS_HDF5_MODE "@AMS_HDF5_MODE@") + +@AMS_PACKAGE_DEPENDENCY_BLOCK@ include("${CMAKE_CURRENT_LIST_DIR}/AMSTargets.cmake") check_required_components("@PROJECT_NAME@") diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 8683e6f4..bb025727 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -8,13 +8,12 @@ set(AMS_LIB_SRC wf/debug.cpp wf/logger.cpp wf/utils.cpp wf/SmallVector.cpp ml/su list(APPEND AMS_LIB_SRC wf/hdf5db.cpp) -if (WITH_RMQ) +if (ENABLE_RMQ) list(APPEND AMS_LIB_SRC wf/rmqdb.cpp) endif() -add_library(AMS ${AMS_LIB_SRC}) - -get_target_property(AMS_TYPE AMS TYPE) +blt_add_library(NAME AMS SOURCES ${AMS_LIB_SRC}) +add_library(AMS::AMS ALIAS AMS) # ------------------------------------------------------------------------------ # setup the lib first @@ -28,34 +27,35 @@ target_include_directories(AMS PUBLIC $ ) -target_link_libraries(AMS PUBLIC fmt::fmt tl::expected) +target_link_libraries(AMS PRIVATE fmt::fmt nlohmann_json::nlohmann_json ${AMS_APP_LIBRARIES} + $) + +if (BUILD_SHARED_LIBS AND AMS_DEFER_STATIC_TPL_RESOLUTION AND UNIX AND NOT APPLE) + target_link_options(AMS PRIVATE "-Wl,--unresolved-symbols=ignore-all") +endif() -if (WITH_CUDA) +if (ENABLE_CUDA) target_link_libraries(AMS PRIVATE CUDA::cudart) -elseif (WITH_HIP) +elseif (ENABLE_HIP) target_link_libraries(AMS PRIVATE hip::host) endif() -target_link_libraries(AMS PUBLIC $ PRIVATE $) +remove_static_from_libs(TO LINK_AMS_HDF5_TARGETS FROM ${AMS_HDF5_LINK_TARGETS}) +target_link_libraries(AMS PRIVATE ${LINK_AMS_HDF5_TARGETS}) -if (WITH_CALIPER) - target_link_libraries(AMS PUBLIC $ PRIVATE $) +if (ENABLE_CALIPER) + target_link_libraries(AMS PRIVATE caliper) endif() -if (WITH_MPI) - target_link_libraries(AMS PUBLIC $ PRIVATE $) +if (ENABLE_MPI) + target_link_libraries(AMS PRIVATE MPI::MPI_CXX) endif() -if (WITH_RMQ) - target_link_libraries(AMS PUBLIC $ PRIVATE $) +if (ENABLE_RMQ) + target_link_libraries(AMS PRIVATE amqpcpp) if (OPENSSL_FOUND) - target_link_libraries(AMS PUBLIC - $ - $ - PRIVATE - $ - $) + target_link_libraries(AMS PRIVATE OpenSSL::SSL OpenSSL::Crypto) endif() # NOTE: We set here the event/event pthreads as public. As there is no easy way # to do a find package(libevent) and RMQ is not exposing that properly. @@ -64,9 +64,10 @@ if (WITH_RMQ) target_link_libraries(AMS PUBLIC ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() -target_link_libraries(AMS PUBLIC - $ PRIVATE - $) +target_link_libraries(AMS PRIVATE stdc++fs torch) +if (ENABLE_RMQ) + target_link_libraries(AMS PRIVATE Threads::Threads) +endif() configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS-config.h.in" "${PROJECT_BINARY_DIR}/include/AMS-config.h") @@ -94,6 +95,11 @@ install(TARGETS AMS ) # Export the AMS targets for use by external projects +export(EXPORT AMSTargets + NAMESPACE AMS:: + FILE "${CMAKE_CURRENT_BINARY_DIR}/AMSTargets.cmake" +) + install(EXPORT AMSTargets NAMESPACE AMS:: # Prefix target names with AMS:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" # Install location for CMake config @@ -106,7 +112,7 @@ install(FILES ${PROJECT_BINARY_DIR}/include/AMSTypes.hpp ${PROJECT_BINARY_DIR}/include/ArrayRef.hpp ${PROJECT_BINARY_DIR}/include/SmallVector.hpp - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/" # Headers installed into AMS subdir + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/" ) @@ -130,4 +136,3 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/AMSConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" ) - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 103bac3e..264b3294 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,10 +3,8 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -if (WITH_AMS_LIB) - add_subdirectory(AMSlib) -endif() +add_subdirectory(AMSlib) -if (WITH_WORKFLOW) +if (ENABLE_WORKFLOW) add_subdirectory(AMSWorkflow) endif() diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 18ed1981..5ad5a13f 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -23,5 +23,6 @@ add_subdirectory(torch) add_subdirectory(db) add_subdirectory(wf) add_subdirectory(ams_interface) +add_subdirectory(downstream) #add_subdirectory(perf_regression) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 2fb519e3..6b4efd84 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -5,11 +5,11 @@ endfunction() function(BUILD_UNIT_TEST exe source) - add_executable(${exe} ${source}) + blt_add_executable(NAME ${exe} SOURCES ${source}) target_compile_features(${exe} PRIVATE cxx_std_17) - if (WITH_CUDA) + if (ENABLE_CUDA) target_link_libraries(${exe} PRIVATE CUDA::cudart) - elseif(WITH_HIP) + elseif (ENABLE_HIP) target_link_libraries(${exe} PRIVATE hip::host) endif() @@ -17,7 +17,7 @@ function(BUILD_UNIT_TEST exe source) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) target_include_directories(${exe} PRIVATE ${AMS_TEST_ROOT}) target_link_libraries(${exe} PRIVATE stdc++fs AMS torch Catch2::Catch2WithMain) - target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_LINK_TARGETS}) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES} CATCH_CONFIG_PREFIX_ALL) endfunction() @@ -26,4 +26,3 @@ ADD_AMS_UNIT_TEST(AMS_EXPLICIT ams_explicit_end_to_end) BUILD_UNIT_TEST(int_interface int_interface.cpp) ADD_AMS_UNIT_TEST(AMS_INT_INTERFACE int_interface) - diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt index e3123fc7..fe71057f 100644 --- a/tests/AMSlib/db/CMakeLists.txt +++ b/tests/AMSlib/db/CMakeLists.txt @@ -1,5 +1,5 @@ function(BUILD_UNIT_TEST exe source) - add_executable(${exe} ${source}) + blt_add_executable(NAME ${exe} SOURCES ${source}) target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) @@ -8,14 +8,14 @@ function(BUILD_UNIT_TEST exe source) target_include_directories(${exe} PRIVATE ${AMS_TEST_ROOT}) target_compile_features(${exe} PRIVATE cxx_std_17) - target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_LINK_TARGETS}) - if (WITH_CALIPER) + if (ENABLE_CALIPER) message(STATUS "Building witth caliper ${exe}") target_link_libraries(${exe} PRIVATE caliper) endif() - if (WITH_RMQ) + if (ENABLE_RMQ) target_link_libraries(${exe} PRIVATE amqpcpp) if (OPENSSL_FOUND) target_link_libraries(${exe} PRIVATE OpenSSL::SSL OpenSSL::Crypto) @@ -25,7 +25,7 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() - if (WITH_MPI) + if (ENABLE_MPI) target_link_libraries(${exe} PRIVATE MPI::MPI_CXX) endif() @@ -38,4 +38,5 @@ function(ADD_DB_UNIT_TEST name exec) endfunction() BUILD_UNIT_TEST(db_hdf5 db_hdf5.cpp) +target_link_libraries(db_hdf5 PRIVATE fmt::fmt) ADD_DB_UNIT_TEST(DB::HDF5 db_hdf5) diff --git a/tests/AMSlib/downstream/CMakeLists.txt b/tests/AMSlib/downstream/CMakeLists.txt new file mode 100644 index 00000000..e160b4fd --- /dev/null +++ b/tests/AMSlib/downstream/CMakeLists.txt @@ -0,0 +1,46 @@ +# Copyright 2021-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +set(AMS_DOWNSTREAM_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/consumer_mock") +set(AMS_DOWNSTREAM_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/consumer_mock-build") +set(AMS_DOWNSTREAM_PACKAGE_DIR "${PROJECT_BINARY_DIR}/src/AMSlib") + +set(AMS_DOWNSTREAM_CONFIGURE_ARGS + -DAMS_DIR:PATH=${AMS_DOWNSTREAM_PACKAGE_DIR} + -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER} +) + +if (CMAKE_BUILD_TYPE) + list(APPEND AMS_DOWNSTREAM_CONFIGURE_ARGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}) +endif() + +foreach (_hint fmt_DIR Torch_DIR HDF5_DIR hdf5_DIR ZLIB_DIR caliper_DIR + amqpcpp_DIR OpenSSL_ROOT_DIR CUDAToolkit_DIR HIP_DIR) + if (DEFINED ${_hint} AND NOT "${${_hint}}" STREQUAL "") + list(APPEND AMS_DOWNSTREAM_CONFIGURE_ARGS + -D${_hint}:PATH=${${_hint}}) + endif() +endforeach() + +add_test(NAME AMS_DOWNSTREAM_CONSUMER_CONFIGURE + COMMAND ${CMAKE_COMMAND} + -S ${AMS_DOWNSTREAM_SOURCE_DIR} + -B ${AMS_DOWNSTREAM_BINARY_DIR} + ${AMS_DOWNSTREAM_CONFIGURE_ARGS}) +set_tests_properties(AMS_DOWNSTREAM_CONSUMER_CONFIGURE + PROPERTIES + FIXTURES_SETUP AMSDownstream + LABELS DOWNSTREAM) + +add_test(NAME AMS_DOWNSTREAM_CONSUMER_BUILD + COMMAND ${CMAKE_COMMAND} + --build ${AMS_DOWNSTREAM_BINARY_DIR} + --config $) +set_tests_properties(AMS_DOWNSTREAM_CONSUMER_BUILD + PROPERTIES + FIXTURES_REQUIRED AMSDownstream + LABELS DOWNSTREAM) diff --git a/tests/AMSlib/downstream/consumer_mock/CMakeLists.txt b/tests/AMSlib/downstream/consumer_mock/CMakeLists.txt new file mode 100644 index 00000000..ee80d6e3 --- /dev/null +++ b/tests/AMSlib/downstream/consumer_mock/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright 2021-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required(VERSION 3.21) + +project(AMSConsumer LANGUAGES CXX) + +find_package(AMS REQUIRED) + +add_executable(ams_consumer main.cpp) +target_compile_features(ams_consumer PRIVATE cxx_std_17) +target_link_libraries(ams_consumer PRIVATE AMS::AMS) diff --git a/tests/AMSlib/downstream/consumer_mock/main.cpp b/tests/AMSlib/downstream/consumer_mock/main.cpp new file mode 100644 index 00000000..c601248d --- /dev/null +++ b/tests/AMSlib/downstream/consumer_mock/main.cpp @@ -0,0 +1,15 @@ +/* + * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other + * AMSLib Project Developers + * + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "AMS.h" + +int main() +{ + ams::AMSExecutor exec = 0; + (void)exec; + return 0; +} diff --git a/tests/AMSlib/models/CMakeLists.txt b/tests/AMSlib/models/CMakeLists.txt index 0d58e4fd..f22726ab 100644 --- a/tests/AMSlib/models/CMakeLists.txt +++ b/tests/AMSlib/models/CMakeLists.txt @@ -30,7 +30,7 @@ set(GENERATED_CPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_cpu_random.pt ) -if (WITH_CUDA OR WITH_HIP) +if (ENABLE_CUDA OR ENABLE_HIP) set(GENERATED_GPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_duq_max.pt ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_duq_mean.pt diff --git a/tests/AMSlib/perf_regression/CMakeLists.txt b/tests/AMSlib/perf_regression/CMakeLists.txt index 4478ec47..4437ef04 100644 --- a/tests/AMSlib/perf_regression/CMakeLists.txt +++ b/tests/AMSlib/perf_regression/CMakeLists.txt @@ -1,14 +1,14 @@ function(BUILD_TEST exe source) - add_executable(${exe} ${source}) + blt_add_executable(NAME ${exe} SOURCES ${source}) target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" "${PROJECT_SOURCE_DIR}/src/AMSlib/include" ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) message("On test defines are ${AMS_APP_DEFINES}") target_link_libraries(${exe} PRIVATE AMS torch) - target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) - if (WITH_CALIPER) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_LINK_TARGETS}) + if (ENABLE_CALIPER) target_link_libraries(${exe} PRIVATE caliper) endif() - if (WITH_RMQ) + if (ENABLE_RMQ) target_link_libraries(${exe} PRIVATE amqpcpp) if (OPENSSL_FOUND) target_link_libraries(${exe} PRIVATE OpenSSL::SSL OpenSSL::Crypto) @@ -18,7 +18,7 @@ function(BUILD_TEST exe source) target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() - if (WITH_MPI) + if (ENABLE_MPI) target_link_libraries(${exe} PRIVATE MPI::MPI_CXX) endif() endfunction() diff --git a/tests/AMSlib/torch/CMakeLists.txt b/tests/AMSlib/torch/CMakeLists.txt index 341a6610..8f566eff 100644 --- a/tests/AMSlib/torch/CMakeLists.txt +++ b/tests/AMSlib/torch/CMakeLists.txt @@ -6,11 +6,11 @@ endfunction() function(BUILD_UNIT_TEST exe source) - add_executable(${exe} ${source}) + blt_add_executable(NAME ${exe} SOURCES ${source}) target_compile_features(${exe} PRIVATE cxx_std_17) - if (WITH_CUDA) + if (ENABLE_CUDA) target_link_libraries(${exe} PRIVATE CUDA::cudart) - elseif(WITH_HIP) + elseif (ENABLE_HIP) target_link_libraries(${exe} PRIVATE hip::host) endif() @@ -18,16 +18,20 @@ function(BUILD_UNIT_TEST exe source) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) target_include_directories(${exe} PRIVATE ${AMS_TEST_ROOT}) target_link_libraries(${exe} PRIVATE stdc++fs AMS torch Catch2::Catch2WithMain) - target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + target_link_libraries(${exe} PRIVATE tl::expected) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_LINK_TARGETS}) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES} CATCH_CONFIG_PREFIX_ALL) endfunction() BUILD_UNIT_TEST(ams_surrogate_tests evaluate_model.cpp) +target_link_libraries(ams_surrogate_tests PRIVATE fmt::fmt) ADD_TORCH_UNIT_TEST(Surrogate ams_surrogate_tests) BUILD_UNIT_TEST(ams_test_base_model test_model.cpp) +target_link_libraries(ams_test_base_model PRIVATE fmt::fmt nlohmann_json::nlohmann_json) ADD_TORCH_UNIT_TEST(BaseModel ams_test_base_model) BUILD_UNIT_TEST(ams_test_inference_model test_inference_model.cpp) +target_link_libraries(ams_test_inference_model PRIVATE nlohmann_json::nlohmann_json) ADD_TORCH_UNIT_TEST(InferenceModel ams_test_inference_model) diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 2f8cd927..b649351a 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -5,29 +5,30 @@ function(ADD_WORKFLOW_UNIT_TEST name exec) endfunction() function(BUILD_UNIT_TEST exe source) - add_executable(${exe} ${source}) + blt_add_executable(NAME ${exe} SOURCES ${source}) target_compile_features(${exe} PRIVATE cxx_std_17) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) target_include_directories(${exe} PRIVATE ${AMS_TEST_ROOT}) target_link_libraries(${exe} PRIVATE stdc++fs AMS torch Catch2::Catch2WithMain) + target_link_libraries(${exe} PRIVATE tl::expected) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES} CATCH_CONFIG_PREFIX_ALL) - target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_LINK_TARGETS}) - if(WITH_CUDA) + if (ENABLE_CUDA) target_link_libraries(${exe} PRIVATE CUDA::cudart) - elseif(WITH_HIP) + elseif (ENABLE_HIP) target_link_libraries(${exe} PRIVATE hip::host) endif() - if (WITH_CALIPER) + if (ENABLE_CALIPER) target_link_libraries(${exe} PRIVATE caliper) endif() - if (WITH_RMQ) + if (ENABLE_RMQ) target_link_libraries(${exe} PRIVATE amqpcpp) if (OPENSSL_FOUND) target_link_libraries(${exe} PRIVATE OpenSSL::SSL OpenSSL::Crypto) @@ -37,7 +38,7 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() - if (WITH_MPI) + if (ENABLE_MPI) target_link_libraries(${exe} PRIVATE MPI::MPI_CXX) endif() endfunction() @@ -46,6 +47,7 @@ BUILD_UNIT_TEST(operations operations.cpp) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::OPERATIONS operations) BUILD_UNIT_TEST(evaluate_in_and_outs evaluate_in_and_outs.cpp) +target_link_libraries(evaluate_in_and_outs PRIVATE fmt::fmt) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::EVALUATE_IN_OUTS evaluate_in_and_outs) BUILD_UNIT_TEST(tensor_bundle tensor_bundle.cpp) @@ -55,6 +57,7 @@ BUILD_UNIT_TEST(eval_context eval_context.cpp) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::EVAL_CONTEXT eval_context) BUILD_UNIT_TEST(pointwise pointwise_layout_transform.cpp) +target_link_libraries(pointwise PRIVATE fmt::fmt) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::POINTWISE pointwise) BUILD_UNIT_TEST(action action.cpp) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f4e11848..f67311cf 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -23,10 +23,8 @@ if(NOT H5PY_CHECK_RESULT EQUAL 0) ) endif() -if (WITH_AMS_LIB) - add_subdirectory(AMSlib) -endif() +add_subdirectory(AMSlib) -if (WITH_WORKFLOW) +if (ENABLE_WORKFLOW) add_subdirectory(AMSWorkflow) endif()