Skip to content

Commit 6835fd3

Browse files
committed
Add reusable CMake install rule
1 parent aee2abf commit 6835fd3

3 files changed

Lines changed: 131 additions & 25 deletions

File tree

‎CMakeLists.txt‎

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -258,41 +258,23 @@ if(STDC_BUILD_TESTS)
258258
endif()
259259

260260
if(STDC_INSTALL)
261-
# Add install target
262261
set(_install_dir ${CMAKE_INSTALL_LIBDIR}/cmake/${STDC_INSTALL_NAME})
263262

264-
# Add version file
265-
write_basic_package_version_file(
266-
"${CMAKE_CURRENT_BINARY_DIR}/${STDC_INSTALL_NAME}ConfigVersion.cmake"
263+
stdc_add_install_rule(
264+
NAME ${STDC_INSTALL_NAME}
267265
VERSION ${PROJECT_VERSION}
268266
COMPATIBILITY SameMajorVersion
267+
INSTALL_DIR ${_install_dir}
268+
CONFIG_TEMPLATE ${CMAKE_CURRENT_LIST_DIR}/${STDC_INSTALL_NAME}Config.cmake.in
269+
NAMESPACE stdcorelib::
270+
EXPORT ${STDC_INSTALL_NAME}Targets
271+
WRITE_CONFIG_OPTIONS NO_CHECK_REQUIRED_COMPONENTS_MACRO
269272
)
270273

271-
# Add configuration file
272-
configure_package_config_file(
273-
${CMAKE_CURRENT_LIST_DIR}/${STDC_INSTALL_NAME}Config.cmake.in
274-
"${CMAKE_CURRENT_BINARY_DIR}/${STDC_INSTALL_NAME}Config.cmake"
275-
INSTALL_DESTINATION ${_install_dir}
276-
NO_CHECK_REQUIRED_COMPONENTS_MACRO
277-
)
278-
279-
# Install cmake files
280-
install(FILES
281-
"${CMAKE_CURRENT_BINARY_DIR}/${STDC_INSTALL_NAME}Config.cmake"
282-
"${CMAKE_CURRENT_BINARY_DIR}/${STDC_INSTALL_NAME}ConfigVersion.cmake"
283-
DESTINATION ${_install_dir}
284-
)
285274
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
286275
DESTINATION ${_install_dir}
287276
)
288277

289-
# Install cmake targets files
290-
install(EXPORT ${STDC_INSTALL_NAME}Targets
291-
FILE "${STDC_INSTALL_NAME}Targets.cmake"
292-
NAMESPACE stdcorelib::
293-
DESTINATION ${_install_dir}
294-
)
295-
296278
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
297279
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
298280
FILES_MATCHING PATTERN "*.h"

‎cmake/AddInstallRule.cmake‎

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
#[==[.rst:
2+
.. cmake:command:: stdc_add_install_rule
3+
4+
Add the common package configuration and export installation rules for a
5+
CMake project.
6+
7+
.. code-block:: cmake
8+
9+
stdc_add_install_rule(
10+
[NAME <name>]
11+
[VERSION <version>]
12+
[COMPATIBILITY <compatibility>]
13+
[INSTALL_DIR <dir>]
14+
[CONFIG_TEMPLATE <file>]
15+
[NAMESPACE <namespace>]
16+
[EXPORT <sets...>]
17+
18+
[WRITE_VERSION_OPTIONS <options...>]
19+
[WRITE_CONFIG_OPTIONS <options...>]
20+
)
21+
22+
Include ``GNUInstallDirs`` and ``CMakePackageConfigHelpers`` before calling
23+
this function.
24+
#]==]
25+
function(stdc_add_install_rule)
26+
set(options)
27+
set(oneValueArgs NAME VERSION COMPATIBILITY INSTALL_DIR CONFIG_TEMPLATE NAMESPACE)
28+
set(multiValueArgs WRITE_VERSION_OPTIONS WRITE_CONFIG_OPTIONS EXPORT)
29+
cmake_parse_arguments(FUNC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
30+
31+
if(DEFINED CMAKE_INSTALL_LIBDIR)
32+
set(_lib_dir "${CMAKE_INSTALL_LIBDIR}")
33+
else()
34+
set(_lib_dir lib)
35+
endif()
36+
37+
if(FUNC_NAME)
38+
set(_name "${FUNC_NAME}")
39+
elseif(PROJECT_NAME)
40+
set(_name "${PROJECT_NAME}")
41+
else()
42+
set(_name unknown)
43+
endif()
44+
45+
if(FUNC_VERSION)
46+
set(_version "${FUNC_VERSION}")
47+
elseif(PROJECT_VERSION)
48+
set(_version "${PROJECT_VERSION}")
49+
else()
50+
set(_version 0.0.0.0)
51+
endif()
52+
53+
if(FUNC_COMPATIBILITY)
54+
set(_compatibility "${FUNC_COMPATIBILITY}")
55+
else()
56+
set(_compatibility AnyNewerVersion)
57+
endif()
58+
59+
if(FUNC_INSTALL_DIR)
60+
set(_install_dir "${FUNC_INSTALL_DIR}")
61+
else()
62+
set(_install_dir "${_lib_dir}/cmake/${_name}")
63+
endif()
64+
65+
if(FUNC_CONFIG_TEMPLATE)
66+
set(_config_template "${FUNC_CONFIG_TEMPLATE}")
67+
else()
68+
set(_config_template "${CMAKE_CURRENT_LIST_DIR}/${_name}Config.cmake.in")
69+
endif()
70+
71+
set(_namespace)
72+
73+
if(FUNC_NAMESPACE)
74+
set(_namespace NAMESPACE "${FUNC_NAMESPACE}")
75+
endif()
76+
77+
set(_export_files)
78+
79+
foreach(_item IN LISTS FUNC_EXPORT)
80+
install(EXPORT "${_item}"
81+
FILE "${_item}.cmake"
82+
DESTINATION "${_install_dir}"
83+
${_namespace}
84+
)
85+
list(APPEND _export_files "${_item}.cmake")
86+
endforeach()
87+
88+
get_filename_component(_config_template "${_config_template}" ABSOLUTE)
89+
90+
if(NOT EXISTS "${_config_template}")
91+
set(_config_content "@PACKAGE_INIT@\n\n")
92+
93+
foreach(_item IN LISTS _export_files)
94+
string(APPEND _config_content
95+
"include(\"\${CMAKE_CURRENT_LIST_DIR}/${_item}\")\n"
96+
)
97+
endforeach()
98+
99+
set(_config_template "${CMAKE_CURRENT_BINARY_DIR}/${_name}Config.cmake.in")
100+
file(WRITE "${_config_template}" "${_config_content}")
101+
endif()
102+
103+
write_basic_package_version_file(
104+
"${CMAKE_CURRENT_BINARY_DIR}/${_name}ConfigVersion.cmake"
105+
VERSION "${_version}"
106+
COMPATIBILITY "${_compatibility}"
107+
${FUNC_WRITE_VERSION_OPTIONS}
108+
)
109+
110+
configure_package_config_file(
111+
"${_config_template}"
112+
"${CMAKE_CURRENT_BINARY_DIR}/${_name}Config.cmake"
113+
INSTALL_DESTINATION "${_install_dir}"
114+
${FUNC_WRITE_CONFIG_OPTIONS}
115+
)
116+
117+
install(FILES
118+
"${CMAKE_CURRENT_BINARY_DIR}/${_name}Config.cmake"
119+
"${CMAKE_CURRENT_BINARY_DIR}/${_name}ConfigVersion.cmake"
120+
DESTINATION "${_install_dir}"
121+
)
122+
endfunction()

‎stdcorelibConfig.cmake.in‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
include(CMakeFindDependencyMacro)
44

55
include("${CMAKE_CURRENT_LIST_DIR}/stdcorelibTargets.cmake")
6+
67
include("${CMAKE_CURRENT_LIST_DIR}/cmake/AddDoxygenDocs.cmake")
8+
include("${CMAKE_CURRENT_LIST_DIR}/cmake/AddInstallRule.cmake")
79
include("${CMAKE_CURRENT_LIST_DIR}/cmake/AddWinRC.cmake")

0 commit comments

Comments
 (0)