2022-10-31 18:15:50 +08:00
|
|
|
# Standard CMake library installation procedure
|
|
|
|
#
|
|
|
|
# Usage:
|
|
|
|
# include(InstallLibrary)
|
|
|
|
# install_library(my_target)
|
|
|
|
#
|
|
|
|
# Module dependencies:
|
|
|
|
# CMakePackageConfigHelpers
|
|
|
|
# GNUInstallDirs
|
|
|
|
#
|
|
|
|
# Preconditions:
|
|
|
|
# Assumes that standard, global CMake variables are accessible, such as PROJECT_NAME
|
|
|
|
|
|
|
|
set(INSTALL_LIBRARY_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}")
|
|
|
|
|
|
|
|
macro(install_library target_name)
|
2024-08-15 16:04:44 +08:00
|
|
|
# component_name is an optional argument, and will default to the given target_name
|
|
|
|
set(COMPONENT_NAME ${target_name})
|
|
|
|
set(extra_args ${ARGN})
|
|
|
|
list(LENGTH extra_args num_extra_args)
|
|
|
|
if(${num_extra_args} GREATER 0)
|
|
|
|
list(GET extra_args 0 COMPONENT_NAME)
|
|
|
|
endif()
|
|
|
|
|
2022-10-31 18:15:50 +08:00
|
|
|
include(GNUInstallDirs)
|
|
|
|
set(REPRESENTATIVE_TARGET_NAME ${target_name})
|
|
|
|
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
|
|
|
|
|
|
|
# Set install destinations and associate installed target files with an export
|
|
|
|
install(TARGETS ${REPRESENTATIVE_TARGET_NAME}
|
|
|
|
EXPORT ${PROJECT_NAME}-targets
|
2024-08-15 16:04:44 +08:00
|
|
|
COMPONENT ${COMPONENT_NAME}
|
|
|
|
RUNTIME
|
|
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME}
|
|
|
|
LIBRARY
|
|
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME}
|
|
|
|
NAMELINK_COMPONENT ${COMPONENT_NAME}
|
|
|
|
ARCHIVE
|
|
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME}
|
|
|
|
PUBLIC_HEADER
|
|
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME}
|
2022-10-31 18:15:50 +08:00
|
|
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
|
|
|
|
|
|
|
# Write build-tree targets
|
|
|
|
export(TARGETS ${REPRESENTATIVE_TARGET_NAME}
|
|
|
|
FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake
|
|
|
|
NAMESPACE ${PROJECT_NAME}::)
|
|
|
|
# Allow find_package to locate package without installing it (find it's build-tree)
|
|
|
|
export(PACKAGE ${PROJECT_NAME})
|
|
|
|
|
|
|
|
# Write install-tree targets
|
|
|
|
install(EXPORT ${PROJECT_NAME}-targets
|
|
|
|
FILE ${PROJECT_NAME}Targets.cmake
|
|
|
|
NAMESPACE ${PROJECT_NAME}::
|
2024-08-15 16:04:44 +08:00
|
|
|
DESTINATION ${INSTALL_CONFIGDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME})
|
2022-10-31 18:15:50 +08:00
|
|
|
|
|
|
|
include(CMakePackageConfigHelpers)
|
|
|
|
|
|
|
|
# Generate build-tree configuration
|
|
|
|
set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
|
|
|
set(LIB_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
configure_package_config_file("${INSTALL_LIBRARY_SOURCE_DIR}/Config.cmake.in"
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
|
|
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
|
|
|
|
PATH_VARS INCLUDE_DIR LIB_DIR
|
|
|
|
INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
|
|
|
|
# Generate install-tree configuration
|
|
|
|
set(INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
|
|
|
|
set(LIB_DIR ${CMAKE_INSTALL_LIBDIR})
|
|
|
|
configure_package_config_file("${INSTALL_LIBRARY_SOURCE_DIR}/Config.cmake.in"
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.install.cmake"
|
|
|
|
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
|
|
|
|
PATH_VARS INCLUDE_DIR LIB_DIR)
|
|
|
|
|
|
|
|
# Generate package version file
|
|
|
|
write_basic_package_version_file(
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
|
|
|
VERSION ${PROJECT_VERSION}
|
|
|
|
COMPATIBILITY SameMajorVersion)
|
|
|
|
|
|
|
|
# Install the install-tree configuration
|
|
|
|
install(FILES
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.install.cmake"
|
|
|
|
DESTINATION ${INSTALL_CONFIGDIR}
|
2024-08-15 16:04:44 +08:00
|
|
|
RENAME "${PROJECT_NAME}Config.cmake"
|
|
|
|
COMPONENT ${COMPONENT_NAME})
|
2022-10-31 18:15:50 +08:00
|
|
|
|
|
|
|
# Install package version file
|
|
|
|
install(FILES
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
2024-08-15 16:04:44 +08:00
|
|
|
DESTINATION ${INSTALL_CONFIGDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME})
|
2022-10-31 18:15:50 +08:00
|
|
|
|
|
|
|
# Install include files
|
2024-08-15 16:04:44 +08:00
|
|
|
install(DIRECTORY include/
|
|
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
|
|
COMPONENT ${COMPONENT_NAME})
|
2022-10-31 18:15:50 +08:00
|
|
|
endmacro()
|