cmake自定义命令来复制和重命名

2024-01-12

我有一个现有的 cmake 文件,可以生成 .so 库。我想修改它,以便它可以制作 .so 的副本,命名为其他名称。这大概是我所拥有的:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)
PROJECT(test1)

SET(TEST_SOURCES f1.c)
ADD_LIBRARY(test SHARED ${TEST_SOURCES})
ADD_CUSTOM_COMMAND(
    OUTPUT custom1
    COMMAND cp libtest.so custom1
    DEPENDS libtest.so)

我意识到有比硬编码库名称更好的方法,我只是在尝试弄清楚如何使其工作时才这样做。 我缺少什么会导致我的复制/重命名自定义命令运行? 注意:这不是安装时的事情。 谢谢


我会坚持你最初的使用想法add_custom_command http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command%3aadd_custom_command。但是,我建议您使用add_custom_command(TARGET ...)形式而不是add_custom_command(OUTPUT ...).

The OUTPUT版本旨在将输出文件用作同一 CMakeLists.txt 中不同 CMake 目标中的源文件。构建此目标时(在开始时)会调用自定义命令,因为目标需要文件在此时存在。

在您的情况下,没有目标依赖于您的文件 - 它是构建过程的产物。

如果你使用add_custom_command(TARGET ...),这保证了每次重建目标时都会执行该命令。使用add_custom_target要求您记住在原始目标(test在这种情况下)已更新。它还不必要地添加到您的目标列表中 - 对于小型项目来说可能不是问题,但对于较大的项目来说可能是这样。

这是我设置命令的方式:

SET(COPY_TO_PATH custom1)
ADD_CUSTOM_COMMAND(TARGET test POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy
                       $<TARGET_FILE:test>
                       ${COPY_TO_PATH}
                   COMMENT "Copying 'test' library to '${COPY_TO_PATH}'")

这会将命令添加为构建后事件test的。正如您正确地确定的那样,硬编码库名称并不好;因此 CMake 提供了“生成器表达式”来处理这个问题。生成器表达式$<TARGET_FILE:test>解析为创建的库的完整路径test,无论平台或编译器如何。请注意,生成器表达式只能在COMMAND争论;你不能在COMMENT部分例如。

实际的命令是调用 CMake 本身(${CMAKE_COMMAND})及其-E命令行选项 http://www.cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a-E。这提供了一种跨平台的方式来实现复制,因为cp不是 Windows 命令。查看全部-E选项,运行cmake -E help.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake自定义命令来复制和重命名 的相关文章

随机推荐