Step 11: Adding Export Configuration

谷歌翻译
在本教程中,我们添加了 CMake 安装项目库和头文件的功能。 我们还添加了打包此信息的功能,以便可以将其分发给其他人。Installing and TestingPackaging an Installer

下一步是添加必要的信息,以便其他 CMake 项目可以使用我们的项目,无论是从构建目录、本地安装还是打包时。

第一步是更新我们的install(TARGETS)命令不仅可以指定一个DESTINATION,还可以指定一个EXPORT。EXPORT关键字生成一个 CMake 文件,其中包含从安装树导入 install 命令中列出的所有目标的代码。因此,让我们继续并 通过更新命令来明确EXPORT库,如下所示:MathFunctionsinstallMathFunctions/CMakeLists.txt

MathFunctions/CMakeLists.txt
set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs}
EXPORT MathFunctionsTargets
DESTINATION lib)

install include headers

install(FILES MathFunctions.h DESTINATION include)
现在我们已经MathFunctions导出了,我们还需要明确安装生成的MathFunctionsTargets.cmake文件。这是通过在顶层底部添加以下内容来完成的CMakeLists.txt:

CMakeLists.txt
install(EXPORT MathFunctionsTargets
FILE MathFunctionsTargets.cmake
DESTINATION lib/cmake/MathFunctions
)
此时,您应该尝试运行 CMake。如果一切设置正确,您将看到 CMake 将生成如下错误:

Target “MathFunctions” INTERFACE_INCLUDE_DIRECTORIES property contains
path:

“/Users/robert/Documents/CMakeClass/Tutorial/Step11/MathFunctions”

which is prefixed in the source directory.
CMake 会告诉您,在生成导出信息期间,它将导出与当前计算机固有关联的路径,并且在其他计算机上无效。 解决方案是更新 MathFunctions target_include_directories()了解INTERFACE在构建目录中和安装/包中使用时需要不同的位置。这意味着将 target_include_directories()要求MathFunctions看起来像:

MathFunctions/CMakeLists.txt
target_include_directories(MathFunctions
INTERFACE
< B U I L D I N T E R F A C E : <BUILD_INTERFACE: <BUILDINTERFACE:{CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
更新完成后,我们可以重新运行 CMake 并验证它不再发出警告。

此时,我们已经正确打包了所需的目标信息,但我们仍然需要生成一个,MathFunctionsConfig.cmake以便 CMakefind_package()命令可以找到我们的项目。因此,让我们继续在项目的顶层添加一个名为的文件, Config.cmake.in其内容如下:

配置.cmake.in

@PACKAGE_INIT@

include ( “${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake” )
然后,为了正确配置和安装该文件,请将以下内容添加到顶层的底部CMakeLists.txt:

CMakeLists.txt
install(EXPORT MathFunctionsTargets
FILE MathFunctionsTargets.cmake
DESTINATION lib/cmake/MathFunctions
)

include(CMakePackageConfigHelpers)
接下来,我们执行configure_package_config_file()。此命令将配置提供的文件,但与标准有一些具体的区别configure_file()方式。要正确使用此功能,输入文件除了需要的内容外,还应包含一行文本@PACKAGE_INIT@。该变量将被替换为将设置值转换为相对路径的代码块。这些新值可以用相同的名称引用,但前面要加上前缀PACKAGE_。

CMakeLists.txt
install(EXPORT MathFunctionsTargets
FILE MathFunctionsTargets.cmake
DESTINATION lib/cmake/MathFunctions
)

include(CMakePackageConfigHelpers)

generate the config file that includes the exports

configure_package_config_file( C M A K E C U R R E N T S O U R C E D I R / C o n f i g . c m a k e . i n " {CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in " CMAKECURRENTSOURCEDIR/Config.cmake.in"{CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"
INSTALL_DESTINATION “lib/cmake/MathFunctions”
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
这write_basic_package_version_file()接下来是。此命令写入一个文件,该文件由find_package(),记录所需软件包的版本和兼容性。在这里,我们使用变量Tutorial_VERSION_* 并表示它与兼容AnyNewerVersion,这表示此版本或任何更高版本与请求的版本兼容。

CMakeLists.txt
write_basic_package_version_file(
C M A K E C U R R E N T B I N A R Y D I R / M a t h F u n c t i o n s C o n f i g V e r s i o n . c m a k e " V E R S I O N " {CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake" VERSION " CMAKECURRENTBINARYDIR/MathFunctionsConfigVersion.cmake"VERSION"{Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}”
COMPATIBILITY AnyNewerVersion
)
最后,设置要安装的两个生成的文件:

CMakeLists.txt
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake
DESTINATION lib/cmake/MathFunctions
)
此时,我们已经为项目生成了一个可重定位的 CMake 配置,可以在项目安装或打包后使用。如果我们希望我们的项目也可以从构建目录中使用,我们只需将以下内容添加到顶层的底部CMakeLists.txt:

CMakeLists.txt
export(EXPORT MathFunctionsTargets
FILE “${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsTargets.cmake”
)
通过这个导出调用,我们现在生成一个MathFunctionsTargets.cmake,允许构建目录中的配置MathFunctionsConfig.cmake被其他项目使用,而无需安装它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值