CMakePackageConfigHelpers 用cmake建立自己的package
CONFIGURE_PACKAGE_CONFIG_FILE(<input> <output> INSTALL_DESTINATION <path>
[PATH_VARS <var1> <var2> ... <varN>]
[NO_SET_AND_CHECK_MACRO]
[NO_CHECK_REQUIRED_COMPONENTS_MACRO])
示例代码
set(IVCOMMON_CMAKE_DIR share/ivcommon/cmake)
include(CMakePackageConfigHelpers)
configure_package_config_file(
ivcommon-config.cmake.in
${PROJECT_BINARY_DIR}/cmake/ivcommon/ivcommon-config.cmake
PATH_VARS IVCOMMON_CMAKE_DIR
INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ivcommon
)
或
set(INCLUDE_INSTALL_DIR include/ ... CACHE )
set(LIB_INSTALL_DIR lib/ ... CACHE )
set(SYSCONFIG_INSTALL_DIR etc/foo/ ... CACHE )
...
include(CMakePackageConfigHelpers)
configure_package_config_file(FooConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake
INSTALL_DESTINATION ${LIB_INSTALL_DIR}/Foo/cmake
PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR)
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
VERSION 1.2.3
COMPATIBILITY SameMajorVersion )
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
DESTINATION ${LIB_INSTALL_DIR}/Foo/cmake )
input 输入文件 后缀为-config.cmake.in 或 Config.cmake.in
output 输出文件 -config.cmake 或 Config.cmake
INSTALL_DESTINATION .cmake 文件的安装目录
PATH_VARS 后面接的每一个变量都有形参、实参两种意义:
形参是指在cmake.in 中可以用 @PACKAGE_IVCOMMON_CMAKE_DIR@ @PACKAGE_INCLUDE_INSTALL_DIR@ @PACKAGE_SYSCONFIG_INSTALL_DIR@来引用这些变量值
实参是指这些变量会将他们的值传递到函数内部,给形参。如果是相对路径也会自动转换为安装到的全局路径
cmake.in 文件内编写如下,两种方法生成 <package>_INCLUDE_DIRS 等变量
1、
@PACKAGE_INIT@
set_and_check(IVCOMMON_CMAKE_DIR "@PACKAGE_IVCOMMON_CMAKE_DIR@")
include("${IVCOMMON_CMAKE_DIR}/IVCOMMONTargets.cmake")
list(APPEND ivcommon_INCLUDE_DIRS ${PACKAGE_PREFIX_DIR}/include ${PACKAGE_PREFIX_DIR}/include/ivcommon ${PACKAGE_PREFIX_DIR}/include)
list(APPEND ivcommon_LIBRARIES ${PACKAGE_PREFIX_DIR}/lib/libivcommon.so)
list(APPEND ivcommon_PROTO_DIR ${PACKAGE_PREFIX_DIR}/include/)
check_required_components(ivcommon)
2、
set(FOO_VERSION x.y.z)
...
@PACKAGE_INIT@
...
set_and_check(FOO_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
set_and_check(FOO_SYSCONFIG_DIR "@PACKAGE_SYSCONFIG_INSTALL_DIR@")
check_required_components(Foo)