From 7ceaa52a1e6d1870f4fb041d6a52596b60f96530 Mon Sep 17 00:00:00 2001 From: Chuck Atkins <chuck.atkins@kitware.com> Date: Mon, 26 Jun 2017 12:50:04 -0400 Subject: [PATCH] Add package config files for build and install dirs. Fixes #153 --- CMakeLists.txt | 12 ++- bindings/python/CMakeLists.txt | 5 +- cmake/ADIOS2Config.cmake.in | 2 + cmake/ADIOS2ConfigCommon.cmake.in | 46 +++++++++++ cmake/ADIOS2ConfigInstall.cmake.in | 2 + cmake/ADIOSFunctions.cmake | 105 +++++++++++++++++++++---- cmake/DetectOptions.cmake | 8 +- source/adios2/CMakeLists.txt | 14 ++-- source/dataman/CMakeLists.txt | 39 ++++----- thirdparty/NLohmannJson/CMakeLists.txt | 6 +- 10 files changed, 183 insertions(+), 56 deletions(-) create mode 100644 cmake/ADIOS2Config.cmake.in create mode 100644 cmake/ADIOS2ConfigCommon.cmake.in create mode 100644 cmake/ADIOS2ConfigInstall.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index fda59429e..575b79a16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,8 @@ project(ADIOS2 VERSION 2.0.0) #------------------------------------------------------------------------------# # Some boilerplate to setup nice output directories #------------------------------------------------------------------------------# - include(GNUInstallDirs) +set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/adios2") list(INSERT CMAKE_MODULE_PATH 0 "${ADIOS2_SOURCE_DIR}/cmake") if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) @@ -83,9 +83,8 @@ if(ADIOS2_HAVE_MPI) add_definitions(-DOMPI_SKIP_MPICXX) endif() -GenerateADIOSConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python SysVShMem) -install( - FILES ${ADIOS2_BINARY_DIR}/adios2/ADIOSConfig.h +GenerateADIOSHeaderConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python SysVShMem) +install(FILES ${ADIOS2_BINARY_DIR}/source/adios2/ADIOSConfig.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2 ) @@ -125,6 +124,11 @@ if(BUILD_TESTING) add_subdirectory(testing) endif() +#------------------------------------------------------------------------------# +# Generating package configs +#------------------------------------------------------------------------------# +GenerateADIOSPackageConfig() + #------------------------------------------------------------------------------# # Configuration summary #------------------------------------------------------------------------------# diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt index 93fd50a56..1c3ced864 100644 --- a/bindings/python/CMakeLists.txt +++ b/bindings/python/CMakeLists.txt @@ -26,14 +26,11 @@ endif() string(REGEX REPLACE "^${PYTHON_PREFIX}/" "" CMAKE_INSTALL_PYTHONDIR "${PYTHON_SITE_PACKAGES}" ) -set(CMAKE_INSTALL_PYTHONDIR "${CMAKE_INSTALL_PYTHONDIR}" - CACHE INTERNAL "" FORCE -) set_target_properties(adios2py PROPERTIES OUTPUT_NAME adios2 LIBRARY_OUTPUT_DIRECTORY ${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR} RUNTIME_OUTPUT_DIRECTORY ${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR} ) -install(TARGETS adios2py +install(TARGETS adios2py DESTINATION ${CMAKE_INSTALL_PYTHONDIR} ) diff --git a/cmake/ADIOS2Config.cmake.in b/cmake/ADIOS2Config.cmake.in new file mode 100644 index 000000000..58d1afed2 --- /dev/null +++ b/cmake/ADIOS2Config.cmake.in @@ -0,0 +1,2 @@ +list(INSERT CMAKE_MODULE_PATH 0 "@ADIOS2_SOURCE_DIR@/cmake") +include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2ConfigCommon.cmake") diff --git a/cmake/ADIOS2ConfigCommon.cmake.in b/cmake/ADIOS2ConfigCommon.cmake.in new file mode 100644 index 000000000..4e108bf2b --- /dev/null +++ b/cmake/ADIOS2ConfigCommon.cmake.in @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.5) + +include(CMakeFindDependencyMacro) + +if(NOT @BUILD_SHARED_LIBS@) + set(ADIOS2_HAVE_BZip2 @ADIOS2_HAVE_BZip2@) + if(ADIOS2_HAVE_BZip2) + find_dependency(BZip2) + endif() + + set(ADIOS2_HAVE_ZFP @ADIOS2_HAVE_ZFP@) + if(ADIOS2_HAVE_ZFP) + find_dependency(ZFP) + endif() + + set(ADIOS2_HAVE_MPI @ADIOS2_HAVE_MPI@) + if(ADIOS2_HAVE_MPI) + find_dependency(MPI) + endif() + + set(ADIOS2_HAVE_ZeroMQ @ADIOS2_HAVE_ZeroMQ@) + if(ADIOS2_HAVE_ZeroMQ) + find_dependency(ZeroMQ) + endif() + + set(ADIOS2_HAVE_HDF5 @ADIOS2_HAVE_HDF5@) + if(ADIOS2_HAVE_HDF5) + find_dependency(HDF5 COMPONENTS C) + endif() + + set(ADIOS2_HAVE_ADIOS1 @ADIOS2_HAVE_ADIOS1@) + if(ADIOS2_HAVE_ADIOS1) + if(ADIOS2_HAVE_MPI) + find_dependency(ADIOS1 1.12.0) + else() + find_dependency(ADIOS1 1.12.0 sequential) + endif() + endif() +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2ConfigVersion.cmake") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ADIOS2 DEFAULT_MESSAGE ADIOS2_VERSION) + +include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2Targets.cmake") diff --git a/cmake/ADIOS2ConfigInstall.cmake.in b/cmake/ADIOS2ConfigInstall.cmake.in new file mode 100644 index 000000000..b2c1c180d --- /dev/null +++ b/cmake/ADIOS2ConfigInstall.cmake.in @@ -0,0 +1,2 @@ +list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/Modules") +include("${CMAKE_CURRENT_LIST_DIR}/ADIOS2ConfigCommon.cmake") diff --git a/cmake/ADIOSFunctions.cmake b/cmake/ADIOSFunctions.cmake index 37b4cf2e0..14f070fe2 100644 --- a/cmake/ADIOSFunctions.cmake +++ b/cmake/ADIOSFunctions.cmake @@ -3,22 +3,6 @@ # accompanying file Copyright.txt for details. #------------------------------------------------------------------------------# -function(GenerateADIOSConfig) - foreach(OPT IN LISTS ARGN) - string(TOUPPER ${OPT} OPT_UPPER) - if(ADIOS2_HAVE_${OPT}) - set(ADIOS2_HAVE_${OPT_UPPER} 1) - else() - set(ADIOS2_HAVE_${OPT_UPPER}) - endif() - endforeach() - - configure_file( - ${ADIOS2_SOURCE_DIR}/source/adios2/ADIOSConfig.h.in - ${ADIOS2_BINARY_DIR}/adios2/ADIOSConfig.h - ) -endfunction() - function(adios_option name description default) set(ADIOS2_USE_${name} ${default} CACHE STRING "${description}") set_property(CACHE ADIOS2_USE_${name} PROPERTY @@ -46,3 +30,92 @@ function(python_add_test name script) ENVIRONMENT "PYTHONPATH=${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR}:$ENV{PYTHONPATH}" ) endfunction() + +function(GenerateADIOSHeaderConfig) + foreach(OPT IN LISTS ARGN) + string(TOUPPER ${OPT} OPT_UPPER) + if(ADIOS2_HAVE_${OPT}) + set(ADIOS2_HAVE_${OPT_UPPER} 1) + else() + set(ADIOS2_HAVE_${OPT_UPPER}) + endif() + endforeach() + + configure_file( + ${ADIOS2_SOURCE_DIR}/source/adios2/ADIOSConfig.h.in + ${ADIOS2_BINARY_DIR}/source/adios2/ADIOSConfig.h + ) +endfunction() + +function(GenerateADIOSPackageConfig) + include(CMakePackageConfigHelpers) + + # Build interface configs + write_basic_package_version_file( + ${ADIOS2_BINARY_DIR}/ADIOS2ConfigVersion.cmake + COMPATIBILITY AnyNewerVersion + ) + export(EXPORT adios2Exports + FILE ${ADIOS2_BINARY_DIR}/ADIOS2Targets.cmake + NAMESPACE adios2:: + ) + configure_file( + ${ADIOS2_SOURCE_DIR}/cmake/ADIOS2ConfigCommon.cmake.in + ${ADIOS2_BINARY_DIR}/ADIOS2ConfigCommon.cmake + @ONLY + ) + configure_file( + ${ADIOS2_SOURCE_DIR}/cmake/ADIOS2Config.cmake.in + ${ADIOS2_BINARY_DIR}/ADIOS2Config.cmake + @ONLY + ) + + # Install interface configs + install( + FILES + ${ADIOS2_BINARY_DIR}/ADIOS2ConfigVersion.cmake + ${ADIOS2_BINARY_DIR}/ADIOS2ConfigCommon.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR} + ) + install(EXPORT adios2Exports + FILE ADIOS2Targets.cmake + NAMESPACE adios2:: + DESTINATION ${CMAKE_INSTALL_CMAKEDIR} + ) + configure_file( + ${ADIOS2_SOURCE_DIR}/cmake/ADIOS2ConfigInstall.cmake.in + ${ADIOS2_BINARY_DIR}/ADIOS2ConfigInstall.cmake + @ONLY + ) + install(FILES ${ADIOS2_BINARY_DIR}/ADIOS2ConfigInstall.cmake + RENAME ADIOS2Config.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR} + ) + + # Install helper find modules if needed + if(NOT BUILD_SHARED_LIBS) + if(ADIOS2_HAVE_BZip2) + install(FILES cmake/FindBZip2.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules + ) + install(FILES cmake/upstream/FindBZip2.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules/upstream + ) + endif() + if(ADIOS2_HAVE_ZFP) + install(FILES cmake/FindZFP.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules + ) + endif() + if(ADIOS2_HAVE_ZeroMQ) + install(FILES cmake/FindZeroMQ.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules + ) + endif() + if(ADIOS2_HAVE_ADIOS1) + install(FILES cmake/FindADIOS1.cmake + DESTINATION ${CMAKE_INSTALL_CMAKEDIR}/Modules + ) + endif() + endif() +endfunction() diff --git a/cmake/DetectOptions.cmake b/cmake/DetectOptions.cmake index 29237fcc4..eeff01f4f 100644 --- a/cmake/DetectOptions.cmake +++ b/cmake/DetectOptions.cmake @@ -3,6 +3,10 @@ # accompanying file Copyright.txt for details. #------------------------------------------------------------------------------# +# We'll need to install the private find modules to ensure our import libs +# are properly resovled +set(adios2_find_modules) + # This file contains the option and dependency logic. The configuration # options are designed to be tertiary: ON, OFF, or AUTO. If AUTO, we try to # determine if dependencies are available and enable the option if we find @@ -121,5 +125,5 @@ if(ADIOS2_USE_SysVShMem STREQUAL AUTO) set(ADIOS2_HAVE_SysVShMem OFF) endif() elseif(ADIOS2_USE_SysVShMem) - set(ADIOS2_HAVE_SysVShMem) -endif() \ No newline at end of file + set(ADIOS2_HAVE_SysVShMem TRUE) +endif() diff --git a/source/adios2/CMakeLists.txt b/source/adios2/CMakeLists.txt index 3787518f9..6c77dc0ce 100644 --- a/source/adios2/CMakeLists.txt +++ b/source/adios2/CMakeLists.txt @@ -44,9 +44,8 @@ add_library(adios2 target_include_directories(adios2 PUBLIC $<BUILD_INTERFACE:${ADIOS2_SOURCE_DIR}/source> - $<BUILD_INTERFACE:${ADIOS2_BINARY_DIR}> - $<INSTALL_INTERFACE:include> - PRIVATE ${ADIOS2_SOURCE_DIR}/source + $<BUILD_INTERFACE:${ADIOS2_BINARY_DIR}/source> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) target_link_libraries(adios2 PRIVATE adios2sys pugixml) @@ -139,19 +138,16 @@ set_target_properties(adios2 PROPERTIES SOVERSION ${ADIOS2_VERSION_MAJOR} ) -install( - FILES ADIOSMacros.h ADIOSTypes.h ADIOSMPICommOnly.h +install(FILES ADIOSMacros.h ADIOSTypes.h ADIOSMPICommOnly.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2 ) -install( - DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/core +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/core DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2 FILES_MATCHING REGEX "[^/]*\.(h|inl)$" ) # Library installation -install( - TARGETS adios2 EXPORT adios2 +install(TARGETS adios2 EXPORT adios2Exports RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/source/dataman/CMakeLists.txt b/source/dataman/CMakeLists.txt index 9dcfdef1a..acd59dde9 100644 --- a/source/dataman/CMakeLists.txt +++ b/source/dataman/CMakeLists.txt @@ -10,31 +10,42 @@ if(MSVC) message(FATAL_ERROR "DataMan is not currently compatible with MSVC") endif() -set(dataman_targets) - add_library(dataman DataManBase.cpp DataManBase.h DataMan.cpp DataMan.h CacheMan.cpp CacheMan.h ) -target_include_directories(dataman PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(dataman + PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> +) target_link_libraries(dataman PRIVATE adios2sys PUBLIC NLohmannJson ) -list(APPEND dataman_targets dataman) +set_target_properties(dataman PROPERTIES + VERSION ${ADIOS2_VERSION} + SOVERSION ${ADIOS2_VERSION_MAJOR} +) +install(TARGETS dataman EXPORT adios2Exports + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dataman +) # Add the dataman plugins as MODULE libraries instead of SHARED libraries. # MODULE libraries are designed to be plugins, i.e. shared libs that nobody # else links to. +set(dataman_modules) + add_library(dumpman MODULE DumpMan.h DumpMan.cpp) target_link_libraries(dumpman PRIVATE dataman) -list(APPEND dataman_targets dumpman) +list(APPEND dataman_modules dumpman) add_library(temporalman MODULE TemporalMan.h TemporalMan.cpp) target_link_libraries(temporalman PRIVATE dataman) -list(APPEND dataman_targets temporalman) +list(APPEND dataman_modules temporalman) if(ADIOS2_HAVE_ZeroMQ) find_package(ZeroMQ REQUIRED) @@ -44,14 +55,14 @@ if(ADIOS2_HAVE_ZeroMQ) ZmqMan.h ZmqMan.cpp ) target_link_libraries(zmqman PRIVATE dataman ZeroMQ::ZMQ) - list(APPEND dataman_targets zmqman) + list(APPEND dataman_modules zmqman) add_library(mdtmman MODULE StreamMan.h StreamMan.cpp MdtmMan.h MdtmMan.cpp ) target_link_libraries(mdtmman PRIVATE dataman ZeroMQ::ZMQ) - list(APPEND dataman_targets mdtmman) + list(APPEND dataman_modules mdtmman) endif() if(ADIOS2_HAVE_ZFP) @@ -60,18 +71,10 @@ if(ADIOS2_HAVE_ZFP) add_library(zfpman MODULE ZfpMan.h ZfpMan.cpp) target_link_libraries(zfpman PRIVATE dataman zfp::zfp) - list(APPEND dataman_targets zfpman) + list(APPEND dataman_modules zfpman) endif() -# Library versioning like this only makes sense for libdataman. The others are plugins -# loaded via dlopen. -set_target_properties(dataman PROPERTIES - VERSION ${ADIOS2_VERSION} - SOVERSION ${ADIOS2_VERSION_MAJOR} -) - -install( - TARGETS ${dataman_targets} EXPORT adios2 +install(TARGETS ${dataman_modules} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/thirdparty/NLohmannJson/CMakeLists.txt b/thirdparty/NLohmannJson/CMakeLists.txt index 7aaef186f..afe7c4a73 100644 --- a/thirdparty/NLohmannJson/CMakeLists.txt +++ b/thirdparty/NLohmannJson/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(NLohmannJson INTERFACE) -target_include_directories(NLohmannJson - INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/json/src +add_library(NLohmann::Json INTERFACE IMPORTED GLOBAL) +set_target_properties(NLohmann::Json PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/json/src ) -- GitLab