Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 48 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
cmake_minimum_required(VERSION 3.16)
project(pdg VERSION 0.1.0 LANGUAGES CXX)

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
Expand All @@ -23,9 +26,10 @@ add_library(pdg STATIC
src/mc.cpp
)
add_library(pdg::pdg ALIAS pdg)
target_compile_features(pdg PUBLIC cxx_std_17)
target_include_directories(pdg PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

if(PDG_WARNINGS)
Expand All @@ -46,6 +50,17 @@ if(PDG_BUILD_TESTS)
target_link_libraries(test_${t} PRIVATE pdg)
add_test(NAME ${t} COMMAND test_${t})
endforeach()

add_test(NAME package-consumer
COMMAND ${CMAKE_COMMAND}
"-DPDG_BINARY_DIR=${CMAKE_BINARY_DIR}"
"-DPDG_SOURCE_DIR=${CMAKE_SOURCE_DIR}"
"-DPDG_BUILD_CONFIG=$<CONFIG>"
"-DPDG_GENERATOR=${CMAKE_GENERATOR}"
"-DPDG_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}"
"-DPDG_GENERATOR_TOOLSET=${CMAKE_GENERATOR_TOOLSET}"
-P "${CMAKE_SOURCE_DIR}/cmake/test_package.cmake"
)
endif()

if(PDG_BUILD_EXAMPLES)
Expand All @@ -55,5 +70,35 @@ if(PDG_BUILD_EXAMPLES)
endforeach()
endif()

install(TARGETS pdg EXPORT pdgTargets ARCHIVE DESTINATION lib)
install(DIRECTORY include/pdg DESTINATION include)
set(PDG_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/pdg")

install(TARGETS pdg
EXPORT pdgTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(DIRECTORY include/pdg DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

configure_package_config_file(
cmake/pdgConfig.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/pdgConfig.cmake"
INSTALL_DESTINATION "${PDG_INSTALL_CMAKEDIR}"
)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/pdgConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)

install(EXPORT pdgTargets
FILE pdgTargets.cmake
NAMESPACE pdg::
DESTINATION "${PDG_INSTALL_CMAKEDIR}"
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/pdgConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/pdgConfigVersion.cmake"
DESTINATION "${PDG_INSTALL_CMAKEDIR}"
)
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,20 @@ ctest --test-dir build

C++17, CMake >= 3.16. Tested with GCC 13; CI also builds MSVC and clang.

To install `pdg` and consume it from another CMake project:

```bash
cmake --install build --prefix /path/to/pdg-install
```

```cmake
find_package(pdg CONFIG REQUIRED)
target_link_libraries(my_app PRIVATE pdg::pdg)
```

Pass the install prefix through `CMAKE_PREFIX_PATH` when configuring the
consumer project if it is outside CMake's standard search locations.

## Usage

3-DoF, classic Mars descent numbers:
Expand Down
8 changes: 8 additions & 0 deletions cmake/pdgConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
@PACKAGE_INIT@

include(CMakeFindDependencyMacro)
find_dependency(Threads)

include("${CMAKE_CURRENT_LIST_DIR}/pdgTargets.cmake")

check_required_components(pdg)
65 changes: 65 additions & 0 deletions cmake/test_package.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
cmake_minimum_required(VERSION 3.16)

foreach(required_var PDG_BINARY_DIR PDG_SOURCE_DIR PDG_BUILD_CONFIG PDG_GENERATOR)
if(NOT DEFINED ${required_var} OR "${${required_var}}" STREQUAL "")
message(FATAL_ERROR "${required_var} is required")
endif()
endforeach()

set(test_root "${PDG_BINARY_DIR}/package-test")
set(install_dir "${test_root}/install")
set(consumer_build_dir "${test_root}/consumer-build")
file(REMOVE_RECURSE "${test_root}")

execute_process(
COMMAND "${CMAKE_COMMAND}" --install "${PDG_BINARY_DIR}"
--prefix "${install_dir}" --config "${PDG_BUILD_CONFIG}"
RESULT_VARIABLE install_result
COMMAND_ECHO STDOUT
)
if(NOT install_result EQUAL 0)
message(FATAL_ERROR "pdg installation failed with exit code ${install_result}")
endif()

set(configure_args
-S "${PDG_SOURCE_DIR}/tests/package_consumer"
-B "${consumer_build_dir}"
-G "${PDG_GENERATOR}"
"-DCMAKE_BUILD_TYPE=${PDG_BUILD_CONFIG}"
"-DCMAKE_PREFIX_PATH=${install_dir}"
)
if(DEFINED PDG_GENERATOR_PLATFORM AND NOT "${PDG_GENERATOR_PLATFORM}" STREQUAL "")
list(APPEND configure_args -A "${PDG_GENERATOR_PLATFORM}")
endif()
if(DEFINED PDG_GENERATOR_TOOLSET AND NOT "${PDG_GENERATOR_TOOLSET}" STREQUAL "")
list(APPEND configure_args -T "${PDG_GENERATOR_TOOLSET}")
endif()

execute_process(
COMMAND "${CMAKE_COMMAND}" ${configure_args}
RESULT_VARIABLE configure_result
COMMAND_ECHO STDOUT
)
if(NOT configure_result EQUAL 0)
message(FATAL_ERROR "consumer configuration failed with exit code ${configure_result}")
endif()

execute_process(
COMMAND "${CMAKE_COMMAND}" --build "${consumer_build_dir}"
--config "${PDG_BUILD_CONFIG}"
RESULT_VARIABLE build_result
COMMAND_ECHO STDOUT
)
if(NOT build_result EQUAL 0)
message(FATAL_ERROR "consumer build failed with exit code ${build_result}")
endif()

execute_process(
COMMAND "${CMAKE_CTEST_COMMAND}" -C "${PDG_BUILD_CONFIG}" --output-on-failure
WORKING_DIRECTORY "${consumer_build_dir}"
RESULT_VARIABLE test_result
COMMAND_ECHO STDOUT
)
if(NOT test_result EQUAL 0)
message(FATAL_ERROR "consumer test failed with exit code ${test_result}")
endif()
11 changes: 11 additions & 0 deletions tests/package_consumer/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 3.16)
project(pdg_package_consumer LANGUAGES CXX)

enable_testing()

find_package(pdg 0.1 CONFIG REQUIRED)

add_executable(pdg_package_consumer main.cpp)
target_link_libraries(pdg_package_consumer PRIVATE pdg::pdg)

add_test(NAME pdg-package-consumer COMMAND pdg_package_consumer)
9 changes: 9 additions & 0 deletions tests/package_consumer/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#include <pdg/linalg.hpp>

#include <cmath>

int main()
{
const double values[] = {3.0, 4.0};
return std::abs(pdg::norm2(values, 2) - 5.0) < 1e-12 ? 0 : 1;
}