Skip to content

Commit

Permalink
Correctness (#24)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
friendlyanon and friendlyanon authored Mar 14, 2021
1 parent 27f4ead commit a604977
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 19 deletions.
67 changes: 51 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
cmake_minimum_required(VERSION 3.14)

set(PACKAGE_PROJECT_ROOT_PATH
"${CMAKE_CURRENT_LIST_DIR}"
CACHE INTERNAL "The path to the PackageProject directory"
Expand All @@ -10,7 +12,7 @@ function(packageProject)
cmake_parse_arguments(
PROJECT
""
"NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY;VERSION_HEADER;NAMESPACE;DISABLE_VERSION_SUFFIX"
"NAME;VERSION;INCLUDE_DIR;INCLUDE_DESTINATION;BINARY_DIR;COMPATIBILITY;VERSION_HEADER;NAMESPACE;DISABLE_VERSION_SUFFIX;ARCH_INDEPENDENT"
"DEPENDENCIES"
${ARGN}
)
Expand Down Expand Up @@ -55,46 +57,79 @@ function(packageProject)
target_include_directories(
${PROJECT_NAME} ${VISIBILITY} "$<BUILD_INTERFACE:${PROJECT_VERSION_INCLUDE_DIR}>"
)
install(DIRECTORY ${PROJECT_VERSION_INCLUDE_DIR}/ DESTINATION ${PROJECT_INCLUDE_DESTINATION})
install(
DIRECTORY ${PROJECT_VERSION_INCLUDE_DIR}/
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
COMPONENT "${PROJECT_NAME}_Development"
)
endif()

set(wbpvf_extra_args "")
if(NOT DEFINED PROJECT_ARCH_INDEPENDENT)
get_target_property(target_type "${PROJECT_NAME}" TYPE)
if(TYPE STREQUAL "INTERFACE_LIBRARY")
set(PROJECT_ARCH_INDEPENDENT YES)
endif()
endif()

if(PROJECT_ARCH_INDEPENDENT)
set(wbpvf_extra_args ARCH_INDEPENDENT)
endif()

write_basic_package_version_file(
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY ${PROJECT_COMPATIBILITY}
COMPATIBILITY ${PROJECT_COMPATIBILITY} ${wbpvf_extra_args}
)

install(
TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}Targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
COMPONENT Runtime
COMPONENT "${PROJECT_NAME}_Runtime"
NAMELINK_COMPONENT "${PROJECT_NAME}_Development"
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
COMPONENT Development
COMPONENT "${PROJECT_NAME}_Development"
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
COMPONENT Runtime
COMPONENT "${PROJECT_NAME}_Runtime"
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
COMPONENT Runtime
PUBLIC_HEADER DESTINATION ${PROJECT_INCLUDE_DESTINATION} COMPONENT Development
COMPONENT "${PROJECT_NAME}_Runtime"
PUBLIC_HEADER DESTINATION ${PROJECT_INCLUDE_DESTINATION} COMPONENT "${PROJECT_NAME}_Development"
INCLUDES
DESTINATION "${PROJECT_INCLUDE_DESTINATION}"
)

configure_package_config_file(
${PACKAGE_PROJECT_ROOT_PATH}/Config.cmake.in "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION lib/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
set("${PROJECT_NAME}_INSTALL_CMAKEDIR"
"${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}"
CACHE PATH "CMake package config location relative to the install prefix"
)

mark_as_advanced("${PROJECT_NAME}_INSTALL_CMAKEDIR")

configure_file(
${PACKAGE_PROJECT_ROOT_PATH}/Config.cmake.in
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY
)

install(
EXPORT ${PROJECT_NAME}Targets
DESTINATION lib/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
DESTINATION "${${PROJECT_NAME}_INSTALL_CMAKEDIR}"
NAMESPACE ${PROJECT_NAMESPACE}
COMPONENT "${PROJECT_NAME}_Development"
)

install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
DESTINATION lib/cmake/${PROJECT_NAME}${PROJECT_VERSION_SUFFIX}
install(
FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
DESTINATION "${${PROJECT_NAME}_INSTALL_CMAKEDIR}"
COMPONENT "${PROJECT_NAME}_Development"
)

install(DIRECTORY ${PROJECT_INCLUDE_DIR}/ DESTINATION ${PROJECT_INCLUDE_DESTINATION})
install(
DIRECTORY ${PROJECT_INCLUDE_DIR}/
DESTINATION ${PROJECT_INCLUDE_DESTINATION}
COMPONENT "${PROJECT_NAME}_Development"
)

set(${PROJECT_NAME}_VERSION
${PROJECT_VERSION}
Expand Down
3 changes: 0 additions & 3 deletions Config.cmake.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
@PACKAGE_INIT@

include(CMakeFindDependencyMacro)

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

include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
check_required_components("@PROJECT_NAME@")
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ packageProject(
COMPATIBILITY AnyNewerVersion
# (optional) option to disable the versioning of install destinations
DISABLE_VERSION_SUFFIX YES
# (optional) option to ignore target architecture for package resolution
# defaults to YES for header only (i.e. INTERFACE) libraries
ARCH_INDEPENDENT YES
)
```

Expand Down

0 comments on commit a604977

Please sign in to comment.