diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index d58ffcc..af98b17 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -1,7 +1,12 @@ cmake_minimum_required(VERSION 3.12.0) # older would work, but could give warnings on policy CMP0074 -project(petsird VERSION 0.7.2) +project(petsird VERSION 0.7.3 LANGUAGES CXX) +include(GNUInstallDirs) +set(PETSIRD_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/PETSIRD-0.7") -set(CMAKE_CXX_STANDARD 17) +include(CMakePackageConfigHelpers) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) if(WIN32) add_compile_options(/W3 /WX) @@ -19,10 +24,73 @@ endif() # sourcesOutputDir: ../cpp/generated/petsird add_subdirectory(generated/petsird) -# create a petsird library target -# Currently it is just empty, but allows creating target properties which are transitive -add_library(petsird) -target_link_libraries(petsird PUBLIC petsird_generated) -target_include_directories(petsird PUBLIC "${PROJECT_SOURCE_DIR}/generated") +target_include_directories(petsird_generated + PUBLIC + $ + $ +) add_subdirectory(helpers) + +add_library(PETSIRD::generated ALIAS petsird_generated) +add_library(PETSIRD::helpers ALIAS petsird_helpers) + + +add_library(petsird STATIC) +add_library(PETSIRD::petsird ALIAS petsird) + +target_link_libraries(petsird + PUBLIC + PETSIRD::generated + INTERFACE + PETSIRD::helpers +) + +if(CMAKE_CXX_STANDARD) + target_compile_features(petsird PUBLIC cxx_std_${CMAKE_CXX_STANDARD}) +else() + target_compile_features(petsird PUBLIC cxx_std_17) +endif() + +# target_compile_features(petsird INTERFACE cxx_std_17) + +install(TARGETS petsird petsird_generated petsird_helpers + EXPORT petsirdTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +install(EXPORT petsirdTargets + NAMESPACE PETSIRD:: + DESTINATION ${PETSIRD_CMAKE_DIR} +) + +install( + DIRECTORY generated/petsird/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/petsird +) + +install( + DIRECTORY helpers/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) + + +configure_package_config_file( + cmake/PETSIRDConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/PETSIRDConfig.cmake + INSTALL_DESTINATION ${PETSIRD_CMAKE_DIR} +) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/PETSIRDConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/PETSIRDConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/PETSIRDConfigVersion.cmake + DESTINATION ${PETSIRD_CMAKE_DIR} +) diff --git a/cpp/cmake/PETSIRDConfig.cmake.in b/cpp/cmake/PETSIRDConfig.cmake.in new file mode 100644 index 0000000..d901470 --- /dev/null +++ b/cpp/cmake/PETSIRDConfig.cmake.in @@ -0,0 +1,12 @@ +@PACKAGE_INIT@ +include(CMakeFindDependencyMacro) +find_dependency(date) +find_dependency(xtensor-blas) +if(@PETSIRD_GENERATED_USE_NDJSON@) + find_dependency(nlohmann_json) +endif() +if(@PETSIRD_GENERATED_USE_HDF5@) + find_dependency(HDF5 COMPONENTS CXX) +endif() +include("${CMAKE_CURRENT_LIST_DIR}/petsirdTargets.cmake") +check_required_components(PETSIRD) diff --git a/cpp/helpers/CMakeLists.txt b/cpp/helpers/CMakeLists.txt index 127bcc0..ed5553b 100644 --- a/cpp/helpers/CMakeLists.txt +++ b/cpp/helpers/CMakeLists.txt @@ -3,11 +3,34 @@ find_package(xtensor-blas REQUIRED) # create a petsird_helpers library target # Currently it is just empty, but allows creating target properties which are transitive add_library(petsird_helpers INTERFACE) -target_link_libraries(petsird_helpers INTERFACE petsird xtensor-blas) -target_include_directories(petsird_helpers INTERFACE "${PROJECT_SOURCE_DIR}/helpers/include") +# Future change for when we have sources: +# add_library(petsird_helpers ${PETSIRD_HELPERS_SOURCES}) + +target_include_directories(petsird_helpers + INTERFACE + $ + $ +) + +target_link_libraries(petsird_helpers + INTERFACE + petsird_generated + xtensor-blas +) add_executable(petsird_generator petsird_generator.cpp) -target_link_libraries(petsird_generator petsird_helpers) +target_link_libraries(petsird_generator PRIVATE petsird_generated petsird_helpers) add_executable(petsird_analysis petsird_analysis.cpp) -target_link_libraries(petsird_analysis petsird_helpers) +target_link_libraries(petsird_analysis PRIVATE petsird_generated petsird_helpers) + +foreach(t petsird petsird_generated petsird_helpers) + if(TARGET ${t}) + get_target_property(_libs ${t} INTERFACE_LINK_LIBRARIES) + if(_libs) + list(FILTER _libs EXCLUDE REGEX "xtensor") + set_target_properties(${t} + PROPERTIES INTERFACE_LINK_LIBRARIES "${_libs}") + endif() + endif() +endforeach()