Skip to content

Commit 366205a

Browse files
committed
cmake: several improvements for installing/subproject use
- add separate options ULOG_CPP_INSTALL and ULOG_CPP_BUILD_TESTS - use cmake install path variables - do not install headers and cmake files when used as subproject This is important when e.g. building a debian package using this via submodule or FetchContent.
1 parent ea6a4f8 commit 366205a

File tree

2 files changed

+79
-40
lines changed

2 files changed

+79
-40
lines changed

CMakeLists.txt

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,54 @@
11
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
22

3-
project(ulog_cpp LANGUAGES CXX)
3+
project(ulog_cpp
4+
VERSION 1.0.0
5+
LANGUAGES CXX
6+
DESCRIPTION "C++ library for handling ULog files"
7+
)
48

5-
# Determine if ulog_cpp is built as a subproject (using add_subdirectory) or if it is the main project.
6-
set(MAIN_PROJECT OFF)
7-
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
8-
set(MAIN_PROJECT ON)
9-
endif()
9+
include(CMakeDependentOption)
10+
11+
cmake_dependent_option(ULOG_CPP_INSTALL "Install the ulog_cpp folder to include/ during install process"
12+
ON "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
13+
cmake_dependent_option(ULOG_CPP_BUILD_TESTS "Build ulog_cpp tests" ON
14+
"CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
1015

1116
# Default to C++17
1217
if(NOT CMAKE_CXX_STANDARD)
1318
set(CMAKE_CXX_STANDARD 17)
19+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
20+
set(CMAKE_CXX_EXTENSIONS OFF)
1421
endif()
1522

1623
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
1724

1825
add_subdirectory(ulog_cpp)
1926

20-
if(MAIN_PROJECT)
27+
# Only create and install the config files if this is the main project
28+
if(ULOG_CPP_INSTALL)
29+
include(GNUInstallDirs)
2130
include(CMakePackageConfigHelpers)
2231

23-
write_basic_package_version_file(
24-
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
25-
VERSION 1.0.0
26-
COMPATIBILITY AnyNewerVersion
27-
)
32+
# Create a config file that includes the export
33+
configure_package_config_file(
34+
${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
35+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
36+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
37+
)
2838

29-
configure_package_config_file(
30-
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in"
31-
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
32-
INSTALL_DESTINATION lib/cmake/${PROJECT_NAME}
33-
)
39+
# Create a version file
40+
write_basic_package_version_file(
41+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
42+
VERSION ${PROJECT_VERSION}
43+
COMPATIBILITY SameMajorVersion
44+
)
3445

35-
install(FILES
36-
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
37-
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
38-
DESTINATION lib/cmake/${PROJECT_NAME}
39-
)
46+
# Install the config files
47+
install(FILES
48+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
49+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
50+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
51+
)
4052

4153

4254
add_compile_options(
@@ -69,7 +81,10 @@ if(MAIN_PROJECT)
6981
include(clang_format)
7082

7183
add_subdirectory(examples)
72-
add_subdirectory(test)
84+
85+
if (ULOG_CPP_BUILD_TESTS)
86+
add_subdirectory(test)
87+
endif()
7388

7489
endif()
7590

ulog_cpp/CMakeLists.txt

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,48 @@ add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
1010

1111
target_include_directories(${PROJECT_NAME}
1212
PUBLIC
13-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
14-
$<INSTALL_INTERFACE:include/ulog_cpp>
13+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
14+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
1515
)
1616

17-
install(TARGETS ${PROJECT_NAME}
18-
EXPORT ${PROJECT_NAME}Targets
19-
ARCHIVE DESTINATION lib
20-
LIBRARY DESTINATION lib
21-
RUNTIME DESTINATION bin
22-
)
17+
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
2318

24-
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
25-
DESTINATION include/ulog_cpp
26-
FILES_MATCHING PATTERN "*.hpp"
27-
)
19+
if(ULOG_CPP_INSTALL)
20+
# Set the target properties
21+
set_target_properties(${PROJECT_NAME} PROPERTIES
22+
VERSION ${PROJECT_VERSION}
23+
SOVERSION ${PROJECT_VERSION_MAJOR}
24+
PUBLIC_HEADER ""
25+
)
2826

29-
install(EXPORT ${PROJECT_NAME}Targets
30-
FILE ${PROJECT_NAME}Targets.cmake
31-
NAMESPACE ${PROJECT_NAME}::
32-
DESTINATION lib/cmake/${PROJECT_NAME}
33-
)
27+
# Install the library
28+
install(TARGETS ${PROJECT_NAME}
29+
EXPORT ${PROJECT_NAME}Targets
30+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
31+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
32+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
33+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
34+
)
35+
36+
# Install headers preserving directory structure
37+
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
38+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
39+
FILES_MATCHING
40+
PATTERN "*.hpp"
41+
PATTERN "*.h"
42+
)
43+
44+
# Generate and install the export
45+
include(CMakePackageConfigHelpers)
46+
install(EXPORT ${PROJECT_NAME}Targets
47+
FILE ${PROJECT_NAME}Targets.cmake
48+
NAMESPACE ${PROJECT_NAME}::
49+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
50+
)
51+
52+
# Export the target for the build tree
53+
export(TARGETS ${PROJECT_NAME}
54+
NAMESPACE ${PROJECT_NAME}::
55+
FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake
56+
)
57+
endif()

0 commit comments

Comments
 (0)