Skip to content

Commit a604977

Browse files
authored
Correctness (#24)
* Make CMake 3.14 a minimum requirement Requiring CMake 3.14 as a minimum guarantees some features that will make the code simpler. * Install namelink only in dev component * Populate INTERFACE_INCLUDE_DIRECTORIES INCLUDES DESTINATION is a special form that adds the listed directories to the targets in the same install(TARGETS) command call at install time. This is preferable to the $<INSTALL_INTERFACE:...> generator expression. * Assign every install rule to a component * Make component names unique If every project assigns themselves to the same components, then it becomes impossible to tell individual packages apart. See Craig Scott's presentation on this bit: https://youtu.be/m0DwB4OvDXk?t=2168 * Use a cache variable for CMake package location Making the location of the CMake package config files configurable allows package managers and distro package maintainers to trivially redirect their location to another location. * Add the ARCH_INDEPENDENT parameter This option is useful for header only libraries that do not depend on architecture specifics. The parameter defaults to YES to disable target platform architecture check for package resolution. * Simplify the package config file The file never used or provided package components, so it is pointless to use configure_package_config_file. Co-authored-by: friendlyanon <friendlyanon@users.noreply.github.com>
1 parent 27f4ead commit a604977

3 files changed

Lines changed: 54 additions & 19 deletions

File tree

CMakeLists.txt

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
13
set(PACKAGE_PROJECT_ROOT_PATH
24
"${CMAKE_CURRENT_LIST_DIR}"
35
CACHE INTERNAL "The path to the PackageProject directory"
@@ -10,7 +12,7 @@ function(packageProject)
1012
cmake_parse_arguments(
1113
PROJECT
1214
""
13-
"NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY;VERSION_HEADER;NAMESPACE;DISABLE_VERSION_SUFFIX"
15+
"NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY;VERSION_HEADER;NAMESPACE;DISABLE_VERSION_SUFFIX;ARCH_INDEPENDENT"
1416
"DEPENDENCIES"
1517
${ARGN}
1618
)
@@ -55,46 +57,79 @@ function(packageProject)
5557
target_include_directories(
5658
${PROJECT_NAME} ${VISIBILITY} "$<BUILD_INTERFACE:${PROJECT_VERSION_INCLUDE_DIR}>"
5759
)
58-
install(DIRECTORY ${PROJECT_VERSION_INCLUDE_DIR}/ DESTINATION ${PROJECT_INCLUDE_DESTINATION})
60+
install(
61+
DIRECTORY ${PROJECT_VERSION_INCLUDE_DIR}/
62+
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
63+
COMPONENT "${PROJECT_NAME}_Development"
64+
)
65+
endif()
66+
67+
set(wbpvf_extra_args "")
68+
if(NOT DEFINED PROJECT_ARCH_INDEPENDENT)
69+
get_target_property(target_type "${PROJECT_NAME}" TYPE)
70+
if(TYPE STREQUAL "INTERFACE_LIBRARY")
71+
set(PROJECT_ARCH_INDEPENDENT YES)
72+
endif()
73+
endif()
74+
75+
if(PROJECT_ARCH_INDEPENDENT)
76+
set(wbpvf_extra_args ARCH_INDEPENDENT)
5977
endif()
6078

6179
write_basic_package_version_file(
6280
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
6381
VERSION ${PROJECT_VERSION}
64-
COMPATIBILITY ${PROJECT_COMPATIBILITY}
82+
COMPATIBILITY ${PROJECT_COMPATIBILITY} ${wbpvf_extra_args}
6583
)
6684

6785
install(
6886
TARGETS ${PROJECT_NAME}
6987
EXPORT ${PROJECT_NAME}Targets
7088
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
71-
COMPONENT Runtime
89+
COMPONENT "${PROJECT_NAME}_Runtime"
90+
NAMELINK_COMPONENT "${PROJECT_NAME}_Development"
7291
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
73-
COMPONENT Development
92+
COMPONENT "${PROJECT_NAME}_Development"
7493
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
75-
COMPONENT Runtime
94+
COMPONENT "${PROJECT_NAME}_Runtime"
7695
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
77-
COMPONENT Runtime
78-
PUBLIC_HEADER DESTINATION ${PROJECT_INCLUDE_DESTINATION} COMPONENT Development
96+
COMPONENT "${PROJECT_NAME}_Runtime"
97+
PUBLIC_HEADER DESTINATION ${PROJECT_INCLUDE_DESTINATION} COMPONENT "${PROJECT_NAME}_Development"
98+
INCLUDES
99+
DESTINATION "${PROJECT_INCLUDE_DESTINATION}"
79100
)
80101

81-
configure_package_config_file(
82-
${PACKAGE_PROJECT_ROOT_PATH}/Config.cmake.in "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
83-
INSTALL_DESTINATION lib/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
102+
set("${PROJECT_NAME}_INSTALL_CMAKEDIR"
103+
"${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}"
104+
CACHE PATH "CMake package config location relative to the install prefix"
105+
)
106+
107+
mark_as_advanced("${PROJECT_NAME}_INSTALL_CMAKEDIR")
108+
109+
configure_file(
110+
${PACKAGE_PROJECT_ROOT_PATH}/Config.cmake.in
111+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY
84112
)
85113

86114
install(
87115
EXPORT ${PROJECT_NAME}Targets
88-
DESTINATION lib/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
116+
DESTINATION "${${PROJECT_NAME}_INSTALL_CMAKEDIR}"
89117
NAMESPACE ${PROJECT_NAMESPACE}
118+
COMPONENT "${PROJECT_NAME}_Development"
90119
)
91120

92-
install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
93-
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
94-
DESTINATION lib/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
121+
install(
122+
FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
123+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
124+
DESTINATION "${${PROJECT_NAME}_INSTALL_CMAKEDIR}"
125+
COMPONENT "${PROJECT_NAME}_Development"
95126
)
96127

97-
install(DIRECTORY ${PROJECT_INCLUDE_DIR}/ DESTINATION ${PROJECT_INCLUDE_DESTINATION})
128+
install(
129+
DIRECTORY ${PROJECT_INCLUDE_DIR}/
130+
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
131+
COMPONENT "${PROJECT_NAME}_Development"
132+
)
98133

99134
set(${PROJECT_NAME}_VERSION
100135
${PROJECT_VERSION}

Config.cmake.in

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
@PACKAGE_INIT@
2-
31
include(CMakeFindDependencyMacro)
42

53
string(REGEX MATCHALL "[^;]+" SEPARATE_DEPENDENCIES "@PROJECT_DEPENDENCIES@")
@@ -10,4 +8,3 @@ foreach(dependency ${SEPARATE_DEPENDENCIES})
108
endforeach()
119

1210
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
13-
check_required_components("@PROJECT_NAME@")

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ packageProject(
3838
COMPATIBILITY AnyNewerVersion
3939
# (optional) option to disable the versioning of install destinations
4040
DISABLE_VERSION_SUFFIX YES
41+
# (optional) option to ignore target architecture for package resolution
42+
# defaults to YES for header only (i.e. INTERFACE) libraries
43+
ARCH_INDEPENDENT YES
4144
)
4245
```
4346

0 commit comments

Comments
 (0)