Skip to content

Commit c45f20e

Browse files
authored
Use ctest --build-and-test (#1)
* Use ctest --build-and-test * Move sub presets to cmake/presets * Final cleanup
1 parent 20e6a1e commit c45f20e

File tree

9 files changed

+52
-35
lines changed

9 files changed

+52
-35
lines changed

.cmake-format.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
format:
2-
line_width: 123
2+
line_width: 120
33
tab_size: 4
44
max_subgroups_hwrap: 4
55
max_pargs_hwrap: 4

CMakeLists.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ project(mylib VERSION 1.0.0 DESCRIPTION "Template for C++ library built with CMa
88
include(cmake/utils.cmake)
99
include(GNUInstallDirs)
1010

11-
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" is_top_level)
12-
1311
# MYLIB_SHARED_LIBS option (undefined by default) can be used to force shared/static build
14-
option(MYLIB_BUILD_TESTS "Build mylib tests" ${is_top_level})
15-
option(MYLIB_BUILD_EXAMPLES "Build mylib examples" ${is_top_level})
12+
option(MYLIB_BUILD_TESTS "Build mylib tests" ${PROJECT_IS_TOP_LEVEL})
13+
option(MYLIB_BUILD_EXAMPLES "Build mylib examples" ${PROJECT_IS_TOP_LEVEL})
1614
option(MYLIB_BUILD_DOCS "Build mylib documentation" OFF)
17-
option(MYLIB_INSTALL "Generate target for installing mylib" ${is_top_level})
15+
option(MYLIB_INSTALL "Generate target for installing mylib" ${PROJECT_IS_TOP_LEVEL})
1816
set_if_undefined(
1917
MYLIB_INSTALL_CMAKEDIR
2018
"${CMAKE_INSTALL_LIBDIR}/cmake/mylib"
@@ -40,7 +38,7 @@ if(NOT DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES)
4038
endif()
4139

4240
# Neither of these two are technically needed, but they make the expectation clear
43-
set_if_undefined(CMAKE_CXX_STANDARD 20)
41+
set_if_undefined(CMAKE_CXX_STANDARD 17)
4442
set_if_undefined(CMAKE_CXX_EXTENSIONS FALSE)
4543

4644
set_if_undefined(CMAKE_CXX_VISIBILITY_PRESET hidden)
@@ -101,15 +99,16 @@ if(MYLIB_INSTALL AND NOT CMAKE_SKIP_INSTALL_RULES)
10199

102100
write_basic_package_version_file(mylib-config-version.cmake COMPATIBILITY SameMajorVersion)
103101

102+
# cmake-format: off
104103
install(TARGETS mylib
105104
EXPORT mylib_export
106105
RUNTIME COMPONENT mylib
107106
LIBRARY COMPONENT mylib NAMELINK_COMPONENT mylib-dev
108-
ARCHIVE COMPONENT mylib-dev FILE_SET HEADERS COMPONENT mylib-dev
109-
INCLUDES
110-
COMPONENT mylib-dev
111-
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
107+
ARCHIVE COMPONENT mylib-dev
108+
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
109+
FILE_SET HEADERS COMPONENT mylib-dev
112110
)
111+
# cmake-format: on
113112

114113
set(targets_file "mylib-shared-targets.cmake")
115114

@@ -124,8 +123,9 @@ if(MYLIB_INSTALL AND NOT CMAKE_SKIP_INSTALL_RULES)
124123
NAMESPACE mylib::
125124
)
126125

127-
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/mylib-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/mylib-config-version.cmake"
128-
COMPONENT mylib-dev DESTINATION "${MYLIB_INSTALL_CMAKEDIR}"
126+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/mylib-config.cmake"
127+
"${CMAKE_CURRENT_BINARY_DIR}/mylib-config-version.cmake" COMPONENT mylib-dev
128+
DESTINATION "${MYLIB_INSTALL_CMAKEDIR}"
129129
)
130130

131131
if(MSVC)

CMakePresets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"patch": 0
77
},
88
"include": [
9-
"CMake${hostSystemName}Presets.json"
9+
"cmake/presets/CMake${hostSystemName}Presets.json"
1010
],
1111
"buildPresets": [
1212
{
File renamed without changes.
File renamed without changes.

CMakeLinuxPresets.json renamed to cmake/presets/CMakeLinuxPresets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
"name": "Debug",
3030
"description": "Possix preset for library developers",
3131
"inherits": [
32-
"Release",
3332
"dev-mode",
33+
"Release",
3434
"clang-tidy"
3535
]
3636
}

CMakeWindowsPresets.json renamed to cmake/presets/CMakeWindowsPresets.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
"name": "Debug",
3131
"description": "Windows preset for library developers",
3232
"inherits": [
33-
"Release",
34-
"dev-mode"
33+
"dev-mode",
34+
"Release"
3535
],
3636
"generator": "Visual Studio 17 2022"
3737
}

examples/add/CMakeLists.txt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
cmake_minimum_required(VERSION 3.14)
1+
cmake_minimum_required(VERSION 3.25...3.30)
22
project(mylib-add LANGUAGES CXX)
33

44
include("../../cmake/utils.cmake")
5-
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" is_top_level)
65

7-
if(is_top_level)
8-
find_package(mylib REQUIRED)
6+
if(PROJECT_IS_TOP_LEVEL)
7+
find_package(mylib 1.0.0 REQUIRED)
98
endif()
109

1110
set(sources main.cpp)
@@ -15,6 +14,6 @@ add_executable(mylib-add)
1514
target_sources(mylib-add PRIVATE ${sources})
1615
target_link_libraries(mylib-add PRIVATE mylib::mylib)
1716

18-
if(NOT is_top_level)
17+
if(NOT PROJECT_IS_TOP_LEVEL)
1918
win_copy_deps_to_target_dir(mylib-add mylib::mylib)
2019
endif()

tests/CMakeLists.txt

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
cmake_minimum_required(VERSION 3.25...3.30)
2-
project(mylib-tests)
2+
project(mylib-tests LANGUAGES CXX)
33

44
#----------------------------------------------------------------------------------------------------------------------
55
# general settings and options
66
#----------------------------------------------------------------------------------------------------------------------
77

88
include("../cmake/utils.cmake")
9-
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" is_top_level)
109

11-
if(is_top_level)
10+
if(PROJECT_IS_TOP_LEVEL)
1211
enable_testing()
1312

1413
# Neither of these two are technically needed, but they make the expectation clear
15-
set_if_undefined(CMAKE_CXX_STANDARD 20)
14+
set_if_undefined(CMAKE_CXX_STANDARD 17)
1615
set_if_undefined(CMAKE_CXX_EXTENSIONS FALSE)
1716
endif()
1817

@@ -23,24 +22,26 @@ endif()
2322
include(FetchContent)
2423
FetchContent_Declare(
2524
googletest URL https://github.com/google/googletest/archive/refs/tags/v1.15.2.tar.gz DOWNLOAD_EXTRACT_TIMESTAMP ON
26-
DOWNLOAD_NO_PROGRESS ON
25+
DOWNLOAD_NO_PROGRESS ON FIND_PACKAGE_ARGS NAMES GTest
2726
)
2827

2928
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) # do not override parent project's runtime settings on Windows
3029
set(INSTALL_GTEST OFF)
31-
32-
# For simplicity, always build googletest as static library. This prevents mylib-tests executable from
33-
# complaining about missing googletest DLLs on Windows.
34-
set(BUILD_SHARED_LIBS OFF)
30+
set(BUILD_GMOCK OFF)
3531

3632
FetchContent_MakeAvailable(googletest)
3733

3834
#----------------------------------------------------------------------------------------------------------------------
3935
# tests dependencies
4036
#----------------------------------------------------------------------------------------------------------------------
4137

42-
if(is_top_level)
43-
find_package(mylib REQUIRED)
38+
if(PROJECT_IS_TOP_LEVEL)
39+
find_package(mylib 1.0.0 QUIET)
40+
if(NOT mylib_FOUND)
41+
message(STATUS "find_package(mylib) was NOT found, use as subproject ...")
42+
# test if the targets are usable if used as subproject
43+
add_subdirectory(.. mylib EXCLUDE_FROM_ALL)
44+
endif()
4445
endif()
4546

4647
#----------------------------------------------------------------------------------------------------------------------
@@ -57,9 +58,26 @@ source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" FILES ${sources})
5758
add_executable(mylib-tests)
5859
target_sources(mylib-tests PRIVATE ${sources})
5960

60-
target_link_libraries(mylib-tests PRIVATE mylib::mylib gtest_main)
61+
target_link_libraries(mylib-tests PRIVATE mylib::mylib GTest::gtest_main)
62+
63+
if(NOT PROJECT_IS_TOP_LEVEL)
64+
# test if the targets are findable from the build directory
65+
# cmake-format: off
66+
add_test(find-package-test
67+
${CMAKE_CTEST_COMMAND}
68+
-C ${CMAKE_BUILD_TYPE}
69+
--build-and-test
70+
"${CMAKE_CURRENT_SOURCE_DIR}"
71+
"${CMAKE_CURRENT_BINARY_DIR}/find-package-test"
72+
--build-generator ${CMAKE_GENERATOR}
73+
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
74+
--build-options
75+
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
76+
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
77+
"-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
78+
)
79+
# cmake-format: on
6180

62-
if(NOT is_top_level)
6381
win_copy_deps_to_target_dir(mylib-tests mylib::mylib)
6482
endif()
6583

0 commit comments

Comments
 (0)