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

gim*_*ilk 9 command cmake

我有一个生成.so库的现有cmake文件.我想修改它,然后它将复制.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)
Run Code Online (Sandbox Code Playgroud)

我意识到有比硬编码库名更好的方法,我只是这样做,而我试图弄清楚如何让它工作.我错过了什么会导致我的复制/重命名自定义命令运行?注意:这不是安装时间的事情.谢谢

Fra*_*ser 17

我坚持你最初的使用想法add_custom_command.但是,我建议你使用add_custom_command(TARGET ...)表格而不是add_custom_command(OUTPUT ...).

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}'")
Run Code Online (Sandbox Code Playgroud)

这会将命令添加为test's 的构建后事件.正如您所确定的那样,硬编码库名称并不是很好; 因此CMake提供了"生成器表达式"来处理这个问题.无论平台或编译器如何,生成器表达式都会$<TARGET_FILE:test>解析为由其创建的库的完整路径test.请注意,生成器表达式只能在COMMAND参数中使用; 例如,你不能在COMMENT零件中使用它们.

实际的命令是${CMAKE_COMMAND}使用-E命令行选项调用CMake本身().这提供了一种实现副本的跨平台方式,因为cp它不是Windows命令.要查看所有-E选项,请运行cmake -E help.


New*_*Bee 8

你可以考虑使用 configure_file

configure_file("path-to-your-so-file.so" "new-path-to-your-so-file.so" COPYONLY)
Run Code Online (Sandbox Code Playgroud)


Ver*_*ahn 6

add_custom_target(CopyAndRename
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so
)
Run Code Online (Sandbox Code Playgroud)

add_custom_target引入了一个名为CopyAndRename的新目标.你可以运行它:

make CopyAndRename
Run Code Online (Sandbox Code Playgroud)