diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a4646c95f..f42c55584 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -218,6 +218,18 @@ jobs: ninja -C ${{ env.BUILD_DIR }} install echo "DFTD3_PREFIX=$PWD/_dist" >> $GITHUB_ENV + - name: Discover installed files (CMake) + if: ${{ matrix.build != 'fpm' }} + run: | + cmake -S test/export -B ${{ env.BUILD_DIR }}/discover-cmake -G Ninja -DCMAKE_PREFIX_PATH=$PWD/_dist/lib/cmake + cmake --build ${{ env.BUILD_DIR }}/discover-cmake + + - name: Discover installed files (Meson) + if: ${{ matrix.build != 'fpm' }} + run: | + meson setup ${{ env.BUILD_DIR }}/discover-meson test/export --pkg-config-path=$PWD/_dist/lib/pkgconfig + meson compile -C ${{ env.BUILD_DIR }}/discover-meson + - name: Create package if: ${{ matrix.build == 'meson' }} run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 0654c3cda..3eaf9b166 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,20 +29,20 @@ include(GNUInstallDirs) # General configuration information add_subdirectory("config") -if(NOT TARGET "OpenMP::OpenMP_Fortran" AND WITH_OpenMP) +if(NOT TARGET "OpenMP::OpenMP_Fortran" AND SDFTD3_WITH_OpenMP) find_package("OpenMP" REQUIRED) endif() # Collect subprojects +if(NOT TARGET "toml-f::toml-f") + find_package("toml-f" REQUIRED) +endif() if(NOT TARGET "mctc-lib::mctc-lib") find_package("mctc-lib" REQUIRED) endif() -if(NOT TARGET "mstore::mstore" AND WITH_TESTS) +if(NOT TARGET "mstore::mstore" AND SDFTD3_WITH_TESTS) find_package("mstore" REQUIRED) endif() -if(NOT TARGET "toml-f::toml-f") - find_package("toml-f" REQUIRED) -endif() set( lib-deps "mctc-lib::mctc-lib" @@ -61,6 +61,11 @@ add_library( "${PROJECT_NAME}-lib" "${srcs}" ) +add_library( + "${PROJECT_NAME}::${PROJECT_NAME}-lib" + ALIAS + "${PROJECT_NAME}-lib" +) set_target_properties( "${PROJECT_NAME}-lib" PROPERTIES @@ -75,7 +80,7 @@ target_link_libraries( PUBLIC "${lib-deps}" ) -if(WITH_OpenMP) +if(SDFTD3_WITH_OpenMP) target_link_libraries( "${PROJECT_NAME}-lib" PUBLIC @@ -96,6 +101,11 @@ add_subdirectory("app") # Export targets for other projects add_library("${PROJECT_NAME}" INTERFACE) +add_library( + "${PROJECT_NAME}::${PROJECT_NAME}" + ALIAS + "${PROJECT_NAME}" +) target_link_libraries("${PROJECT_NAME}" INTERFACE "${PROJECT_NAME}-lib") install( TARGETS @@ -123,7 +133,7 @@ install( "${CMAKE_CURRENT_BINARY_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${module-dir}" ) -if(WITH_API) +if(SDFTD3_WITH_API) install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" @@ -139,7 +149,7 @@ install( ) # add the testsuite -if(WITH_TESTS) +if(SDFTD3_WITH_TESTS) enable_testing() add_subdirectory("test") endif() diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index 7733a1ef8..57f5428aa 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -16,10 +16,19 @@ option(BUILD_SHARED_LIBS "Whether the libraries built should be shared" FALSE) -option(WITH_API "Enable support for C API via iso_c_binding module" TRUE) -option(WITH_OpenMP "Enable support for shared memory parallelisation with OpenMP" TRUE) -option(WITH_BLAS "Use external BLAS library" TRUE) -option(WITH_TESTS "Enable compilation of unit tests" TRUE) +if(NOT DEFINED WITH_API) + set(WITH_API TRUE) +endif() +if(NOT DEFINED WITH_OpenMP) + set(WITH_OpenMP TRUE) +endif() +if(NOT DEFINED WITH_TESTS) + set(WITH_TESTS TRUE) +endif() +option(SDFTD3_WITH_API "Enable support for C API via iso_c_binding module" ${WITH_API}) +option(SDFTD3_WITH_OpenMP "Enable support for shared memory parallelisation with OpenMP" ${WITH_OpenMP}) +option(SDFTD3_WITH_TESTS "Enable compilation of unit tests" ${WITH_TESTS}) +set(SDFTD3_USE_MCTCLIB TRUE) if(NOT DEFINED "${PROJECT_NAME}-dependeny-method") set( "${PROJECT_NAME}-dependency-method" @@ -56,7 +65,7 @@ install( include(CMakePackageConfigHelpers) configure_package_config_file( - "${CMAKE_CURRENT_SOURCE_DIR}/template.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/template-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) diff --git a/config/template-config.cmake b/config/template-config.cmake new file mode 100644 index 000000000..0f64702fd --- /dev/null +++ b/config/template-config.cmake @@ -0,0 +1,19 @@ +@PACKAGE_INIT@ + +set("SDFTD3_WITH_API" @SDFTD3_WITH_API@) +set("SDFTD3_WITH_OpenMP" @SDFTD3_WITH_OpenMP@) +set("SDFTD3_USE_MCTCLIB" @SDFTD3_USE_MCTCLIB@) + +if(NOT TARGET "@PROJECT_NAME@::@PROJECT_NAME@") + include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") + + include(CMakeFindDependencyMacro) + + if(NOT TARGET "OpenMP::OpenMP_Fortran" AND SDFTD3_WITH_OpenMP) + find_dependency("OpenMP") + endif() + + if(NOT TARGET "mctc-lib::mctc-lib" AND SDFTD3_USE_MCTCLIB) + find_dependency("mctc-lib") + endif() +endif() diff --git a/config/template-targets.cmake b/config/template-targets.cmake new file mode 100644 index 000000000..9b9f1b8ca --- /dev/null +++ b/config/template-targets.cmake @@ -0,0 +1,23 @@ +set(CMAKE_IMPORT_FILE_VERSION 1) + +set( + SDFTD3_INCLUDEDIRS + "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@" + "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/@module-dir@" +) +find_library( + SDFTD3_LIBRARIES + "@PROJECT_NAME@" + PATHS "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@" + NO_DEFAULT_PATH +) +set( + SDFTD3_DEPENDENCIES + "$<$:mctc-lib::mctc-lib>" + "$<$:OpenMP::OpenMP_Fortran>" +) + +add_library(@PROJECT_NAME@::@PROJECT_NAME@-lib INTERFACE IMPORTED) +add_library(@PROJECT_NAME@::@PROJECT_NAME@ ALIAS @PROJECT_NAME@::@PROJECT_NAME@-lib) +target_link_libraries(@PROJECT_NAME@::@PROJECT_NAME@-lib INTERFACE ${SDFTD3_LIBRARIES} ${SDFTD3_DEPENDENCIES}) +target_include_directories(@PROJECT_NAME@::@PROJECT_NAME@-lib INTERFACE ${SDFTD3_INCLUDEDIRS}) diff --git a/config/template.cmake b/config/template.cmake deleted file mode 100644 index 180e0a8a5..000000000 --- a/config/template.cmake +++ /dev/null @@ -1,28 +0,0 @@ -@PACKAGE_INIT@ - -set("@PROJECT_NAME@_WITH_API" @WITH_API@) -set("@PROJECT_NAME@_WITH_OpenMP" @WITH_OpenMP@) -set("@PROJECT_NAME@_WITH_BLAS" @WITH_BLAS@) -set( - "@PROJECT_NAME@_INCLUDE_DIRS" - "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@" - "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/@module-dir@" -) - -if(NOT TARGET "@PROJECT_NAME@::@PROJECT_NAME@") - include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") - - include(CMakeFindDependencyMacro) - - if(NOT TARGET "OpenMP::OpenMP_Fortran" AND "@PROJECT_NAME@_WITH_OpenMP") - find_dependency("OpenMP") - endif() - - if(NOT TARGET "BLAS::BLAS" AND "@PROJECT_NAME@_WITH_BLAS") - find_dependency("BLAS") - endif() - - if(NOT TARGET "mctc-lib::mctc-lib") - find_dependency("mctc-lib") - endif() -endif() diff --git a/meson.build b/meson.build index b0551898b..6f53dd27c 100644 --- a/meson.build +++ b/meson.build @@ -117,6 +117,40 @@ if install sdftd3_parameters, install_dir: get_option('datadir')/meson.project_name(), ) + + cmake_data = configuration_data({ + 'PROJECT_NAME': meson.project_name(), + 'PROJECT_VERSION': meson.project_version(), + 'PACKAGE_INIT': '', + 'CMAKE_INSTALL_PREFIX': get_option('prefix'), + 'CMAKE_INSTALL_INCLUDEDIR': get_option('includedir'), + 'CMAKE_INSTALL_LIBDIR': get_option('libdir'), + 'SDFTD3_WITH_API': get_option('api') ? 'ON' : 'OFF', + 'SDFTD3_WITH_OpenMP': get_option('openmp') ? 'ON' : 'OFF', + 'SDFTD3_USE_MCTCLIB': mctc_dep.type_name() != 'internal' ? 'ON' : 'OFF', + 'module-dir': module_id, + }) + cmake_files = [ + configure_file( + input: files('config'/'template-config.cmake'), + output: meson.project_name() + '-config.cmake', + configuration: cmake_data, + ), + configure_file( + input: files('config'/'template-targets.cmake'), + output: meson.project_name() + '-targets.cmake', + configuration: cmake_data, + ), + files('config'/'cmake'/'Findmctc-lib.cmake'), + files('config'/'cmake'/'Findmstore.cmake'), + files('config'/'cmake'/'Findtoml-f.cmake'), + files('config'/'cmake'/'s-dftd3-utils.cmake'), + ] + install_data( + cmake_files, + install_dir: get_option('libdir')/'cmake'/meson.project_name(), + install_tag: 'devel', + ) endif # Add the testsuite diff --git a/src/dftd3/CMakeLists.txt b/src/dftd3/CMakeLists.txt index b47e687cd..58e82ca72 100644 --- a/src/dftd3/CMakeLists.txt +++ b/src/dftd3/CMakeLists.txt @@ -36,7 +36,7 @@ list( "${dir}/utils.f90" "${dir}/version.f90" ) -if(WITH_API) +if(SDFTD3_WITH_API) list(APPEND srcs "${dir}/api.f90") endif() diff --git a/test/export/CMakeLists.txt b/test/export/CMakeLists.txt new file mode 100644 index 000000000..cd0b60e6d --- /dev/null +++ b/test/export/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.18) +project(test-test Fortran) + +find_package(s-dftd3 CONFIG REQUIRED) + +add_executable(test-test "example.f90") +target_link_libraries(test-test PUBLIC s-dftd3::s-dftd3) diff --git a/test/export/example.f90 b/test/export/example.f90 new file mode 100644 index 000000000..cb256ed39 --- /dev/null +++ b/test/export/example.f90 @@ -0,0 +1,4 @@ +program tester + use dftd3 + implicit none +end program tester diff --git a/test/export/meson.build b/test/export/meson.build new file mode 100644 index 000000000..d483bfb36 --- /dev/null +++ b/test/export/meson.build @@ -0,0 +1,7 @@ +project('test-test', 'fortran') + +executable( + 'test-test', + sources: ['example.f90'], + dependencies: [dependency('s-dftd3')], +)