我有一个生成.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)
我意识到有更好的方法而不是硬编码库名称,我只是这样做,而我试图弄清楚如何让它工作。 我错过了什么会导致我的复制/重命名自定义命令运行? 注意:这不是安装时间的事情。 感谢
答案 0 :(得分:16)
我坚持使用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}'")
这会将命令添加为test
的构建后事件。正如您所正确指出的那样,硬编码库名称并不是很好;因此CMake提供了“生成器表达式”来处理这个问题。无论平台或编译器如何,生成器表达式$<TARGET_FILE:test>
都会解析为test
创建的库的完整路径。请注意,生成器表达式只能在COMMAND
参数中使用;例如,您无法在COMMENT
部分使用它们。
实际命令正在调用CMake本身(${CMAKE_COMMAND}
)及其-E
command line option。这提供了一种实现副本的跨平台方式,因为cp
不是Windows命令。要查看所有-E
选项,请运行cmake -E help
。
答案 1 :(得分:6)
add_custom_target(CopyAndRename
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so
)
add_custom_target引入了一个名为CopyAndRename的新目标。您可以使用以下命令运行它:
make CopyAndRename
答案 2 :(得分:1)
您可以考虑使用configure_file
configure_file("path-to-your-so-file.so" "new-path-to-your-so-file.so" COPYONLY)