Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/export config package #82

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 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
22 changes: 13 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ jobs:
fail-fast: false
matrix:
config:
- {name: "Ubuntu Clang 20", os: ubuntu-24.04, toolchain: "clang-20", clang_version: 20, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" "}
- {name: "Ubuntu Clang 20", os: ubuntu-24.04, toolchain: "clang-20", clang_version: 20, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" "}
# Note: clang-19 + Asan setup causes errors on some platforms. Temporary skip some checks via .asan_options.
- {name: "Ubuntu Clang 19", os: ubuntu-24.04, toolchain: "clang-19", clang_version: 19, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" ", asan_options: "new_delete_type_mismatch=0"}
- {name: "Ubuntu Clang 18", os: ubuntu-24.04, toolchain: "clang-18", clang_version: 18, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" "}
- {name: "Ubuntu Clang 17", os: ubuntu-24.04, toolchain: "clang-17", clang_version: 17, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" "}
- {name: "Ubuntu GCC 14", os: ubuntu-24.04, toolchain: "gcc-14", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" "}
- {name: "Ubuntu GCC 13", os: ubuntu-24.04, toolchain: "gcc-13", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" "}
- {name: "Ubuntu GCC 12", os: ubuntu-24.04, toolchain: "gcc-12", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" "}
- {name: "Ubuntu Clang 19", os: ubuntu-24.04, toolchain: "clang-19", clang_version: 19, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" ", asan_options: "new_delete_type_mismatch=0"}
- {name: "Ubuntu Clang 18", os: ubuntu-24.04, toolchain: "clang-18", clang_version: 18, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" "}
- {name: "Ubuntu Clang 17", os: ubuntu-24.04, toolchain: "clang-17", clang_version: 17, installed_clang_version: 17, cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" "}
- {name: "Ubuntu GCC 14", os: ubuntu-24.04, toolchain: "gcc-14", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" "}
- {name: "Ubuntu GCC 13", os: ubuntu-24.04, toolchain: "gcc-13", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" "}
- {name: "Ubuntu GCC 12", os: ubuntu-24.04, toolchain: "gcc-12", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Debug;Asan\" "}
steps:
- uses: actions/checkout@v3
with:
Expand Down Expand Up @@ -83,7 +83,7 @@ jobs:
echo ${{ matrix.config.cmake_args }}
echo ${{ matrix.config.toolchain }}
rm -rf .build
cmake ${{ matrix.config.cmake_args }} -DCMAKE_INSTALL_PREFIX=.install -DCMAKE_TOOLCHAIN_FILE="etc/${{ matrix.config.toolchain }}-toolchain.cmake" -B .build -S .
cmake ${{ matrix.config.cmake_args }} -DCMAKE_INSTALL_PREFIX=.install -DCMAKE_PREFIX_PATH=.install -DCMAKE_TOOLCHAIN_FILE="etc/${{ matrix.config.toolchain }}-toolchain.cmake" -B .build -S .
- name: CMake ASAN Build
run: |
set -x
Expand All @@ -106,4 +106,8 @@ jobs:
- name: Install
run: |
set -x
cmake --install .build --config RelWithDebInfo --component beman_optional26_development --verbose
cmake --install .build --config RelWithDebInfo --verbose
- name: CMake Debug Test
run: |
set -x
cmake --build .build --config Debug --target test -- -k 0
41 changes: 26 additions & 15 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@
#
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

cmake_minimum_required(VERSION 3.27)
set(CMAKE_SKIP_TEST_ALL_DEPENDENCY FALSE)
ClausKlein marked this conversation as resolved.
Show resolved Hide resolved

cmake_minimum_required(VERSION 3.27...3.31)

project(beman_optional26 VERSION 0.0.0 LANGUAGES CXX)

# Includes
include(CTest)
include(FetchContent)
include(CPack)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

set(TARGETS_EXPORT_NAME ${CMAKE_PROJECT_NAME}Targets)
set(TARGET_PACKAGE_NAME ${PROJECT_NAME})
set(TARGETS_EXPORT_NAME ${TARGET_PACKAGE_NAME}-targets)
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_PACKAGE_NAME})

option(
OPTIONAL26_ENABLE_TESTING
Expand All @@ -20,6 +25,8 @@ option(

# Build the tests if enabled via the option OPTIONAL26_ENABLE_TESTING
if(OPTIONAL26_ENABLE_TESTING)
include(FetchContent)

# Fetch GoogleTest
FetchContent_Declare(
googletest
Expand All @@ -29,12 +36,15 @@ if(OPTIONAL26_ENABLE_TESTING)
e39786088138f2749d64e9e90e0f9902daa77c40 # release-1.15.0
)
FetchContent_MakeAvailable(googletest)

enable_testing()
endif()

set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ON)

# Create the library target and named header set for beman_optional26
add_library(beman_optional26 INTERFACE)
add_library(Beman::Optional26::beman_optional26 ALIAS beman_optional26)
target_sources(
beman_optional26
PUBLIC FILE_SET beman_optional26_headers TYPE HEADERS BASE_DIRS include
Expand All @@ -59,23 +69,24 @@ add_subdirectory(include/beman/optional26)

add_subdirectory(examples)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: examples should be optional with an option(OPTIONAL26_ENABLE_EXAMLPES ...)


include(CMakePackageConfigHelpers)
# install
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-config-version.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)

# This will be used to replace @PACKAGE_cmakeModulesDir@
set(cmakeModulesDir cmake/beman)
configure_package_config_file(
cmake/Config.cmake.in
BemanOptional26Config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional26/
PATH_VARS cmakeModulesDir
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-config.cmake
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)

install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/BemanOptional26Config.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional26/
COMPONENT beman_optional26_development
FILES
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-config-version.cmake
DESTINATION ${INSTALL_CONFIGDIR}
)

# Coverage
Expand Down
61 changes: 22 additions & 39 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"version": 6,
"cmakeMinimumRequired": {
"major": 3,
"minor": 29,
"minor": 27,
"patch": 2
},
"configurePresets": [
Expand All @@ -14,7 +14,17 @@
"binaryDir": "${sourceDir}/.build/${presetName}",
"installDir": "${sourceDir}/.install/${presetName}",
"cacheVariables": {
"CMAKE_CONFIGURATION_TYPES": "RelWithDebInfo;Debug;Tsan;Asan"
"CMAKE_PREFIX_PATH": {
"type": "path",
"value": "${sourceDir}/.install/${presetName}"
},
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_CONFIGURATION_TYPES": "RelWithDebInfo;Debug;Tsan;Asan",
"CMAKE_CXX_EXTENSIONS": false,
"CMAKE_CXX_STANDARD": "20",
"CMAKE_CXX_STANDARD_REQUIRED": true,
"CMAKE_EXPORT_COMPILE_COMMANDS": true,
"CMAKE_SKIP_TEST_ALL_DEPENDENCY": false
}
},
{
Expand Down Expand Up @@ -85,38 +95,27 @@
{
"name": "common",
"hidden": true,
"configuration": "Asan",
"configuration": "Debug",
"targets": [
"all_verify_interface_header_sets",
"all"
"all",
"install"
]
},
{
"name": "system",
"inherits": "common",
"configurePreset": "system",
"targets": [
"all_verify_interface_header_sets",
"all"
]
"configurePreset": "system"
},
{
"name": "gcc-14",
"inherits": "common",
"configurePreset": "gcc-14",
"targets": [
"all_verify_interface_header_sets",
"all"
]
"configurePreset": "gcc-14"
},
{
"name": "gcc-13",
"inherits": "common",
"configurePreset": "gcc-13",
"targets": [
"all_verify_interface_header_sets",
"all"
]
"configurePreset": "gcc-13"
},
{
"name": "gcc-12",
Expand All @@ -131,45 +130,29 @@
{
"name": "clang-19",
"inherits": "common",
"configurePreset": "clang-19",
"targets": [
"all_verify_interface_header_sets",
"all"
]
"configurePreset": "clang-19"
},
{
"name": "clang-18",
"inherits": "common",
"configurePreset": "clang-18",
"targets": [
"all_verify_interface_header_sets",
"all"
]
"configurePreset": "clang-18"
},
{
"name": "clang-17",
"inherits": "common",
"configurePreset": "clang-17",
"targets": [
"all_verify_interface_header_sets",
"all"
]
"configurePreset": "clang-17"
},
{
"name": "clang-16",
"inherits": "common",
"configurePreset": "clang-16"
"targets": [
"all_verify_interface_header_sets",
"all"
]
}
],
"testPresets": [
{
"name": "common",
"hidden": true,
"configuration": "Asan",
"configuration": "Debug",
"output": {
"outputOnFailure": true
},
Expand Down
30 changes: 19 additions & 11 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,15 @@
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
# cmake-format: on

set(BEMAN_OPTIONAL26_LIBRARY "beman_optional26")
cmake_minimum_required(VERSION 3.27...3.31)

include(GNUInstallDirs)
project(beman_optional26_example VERSION 0.0.0 LANGUAGES CXX)

set(BEMAN_OPTIONAL26_LIBRARY "Beman::Optional26::beman_optional26")

if(PROJECT_IS_TOP_LEVEL)
find_package(beman_optional26 0.0.0 EXACT REQUIRED)
endif()

# List of all buildable examples.
set(EXAMPLES
Expand All @@ -27,13 +33,15 @@ foreach(example ${EXAMPLES})
# Link example with the library.
target_link_libraries(${example} "${BEMAN_OPTIONAL26_LIBRARY}")

# Install .
install(
TARGETS
${example}
COMPONENT
beman_optional26_examples
DESTINATION
${CMAKE_INSTALL_BINDIR}
)
if(NOT PROJECT_IS_TOP_LEVEL)
# Install .
install(
TARGETS
${example}
COMPONENT
beman_optional26_examples
DESTINATION
${CMAKE_INSTALL_BINDIR}
)
endif()
endforeach()
4 changes: 2 additions & 2 deletions include/beman/optional26/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ install(

install(
EXPORT beman_optional26_export
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional26/
DESTINATION ${INSTALL_CONFIGDIR}
NAMESPACE Beman::Optional26::
FILE beman_optional26.cmake
FILE beman_optional26-config-targets.cmake
EXPORT_LINK_INTERFACE_LIBRARIES
COMPONENT beman_optional26_development
)
25 changes: 23 additions & 2 deletions src/beman/optional26/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ target_sources(

target_link_libraries(
beman_optional26_test
PRIVATE beman_optional26 GTest::gtest GTest::gtest_main
PRIVATE Beman::Optional26::beman_optional26 GTest::gtest GTest::gtest_main
)

# Issue #32: Re-enable ASAN run CI/clang-19.
Expand All @@ -41,7 +41,10 @@ gtest_add_tests(TARGET beman_optional26_test "" AUTO)

add_library(constructor_fails test_constructor_fail.cpp)

target_link_libraries(constructor_fails PRIVATE beman_optional26)
target_link_libraries(
constructor_fails
PRIVATE Beman::Optional26::beman_optional26
)

set_target_properties(
constructor_fails
Expand All @@ -59,3 +62,21 @@ set_tests_properties(constructor_fails PROPERTIES WILL_FAIL true)
# Alternatively -- check for a particular regex to pass
# set_tests_properties(constructor_fails PROPERTIES PASS_REGULAR_EXPRESSION
# "Assert true")

# test if the targets are findable from the build directory
if(CMAKE_BUILD_TYPE STREQUAL Debug)
add_test(
NAME find-package-test
COMMAND
${CMAKE_CTEST_COMMAND}
# --verbose
--output-on-failure -C $<CONFIG> --build-and-test
"${PROJECT_SOURCE_DIR}"
"${CMAKE_CURRENT_BINARY_DIR}/find-package-test" --build-generator
${CMAKE_GENERATOR} --build-makeprogram ${CMAKE_MAKE_PROGRAM}
--build-options "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
"-DCMAKE_BUILD_TYPE=$<CONFIG>"
"-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
)
endif()
Loading