cmake - 如何使 CMake 的 add_custom_command(TARGET ... POST_BUILD ...) 依赖于常规文件?
问题描述
由于非常特殊的需要,我有一个静态库,我需要在创建后对其进行“后处理”。所以我有这个:
add_library(CANopenNode2 STATIC
...)
add_custom_command(TARGET CANopenNode2 POST_BUILD
COMMAND objcopy --redefine-syms=renames.txt $<TARGET_FILE:CANopenNode2>)
我的问题是整个构建步骤不依赖于renames.txt
常规文件 - 如果我更改它,库不会重新归档或重新处理。add_custom_command(TARGET ... POST_BUILD ...)
签名不接受任何DEPENDS
参数。我尝试了一些常规技巧来创建自定义命令(取决于该文件),包装在自定义目标中,然后将其标记为我的静态库的依赖项CANopenNode2
,但我很可能做错了什么,因为它在全部。由于我稍后需要将此“后处理”库链接到我的可执行文件,因此我更愿意以POST_BUILD
某种方式使用,因为我猜想使用常规自定义命令(可能依赖于文件)也会很复杂,就在其他方面,但我显然愿意接受建议。
有什么方法可以简单地使整个库依赖于这个常规文件,还是 CMake 使这件事变得非常复杂?
解决方案
就我而言,我想出的最佳解决方案是:
add_custom_command(OUTPUT CANopenNode2.c
COMMAND ${CMAKE_COMMAND} -E touch CANopenNode2.c
DEPENDS ${CMAKE_CURRENT_LIST_DIR}/renames.txt)
add_library(CANopenNode2 STATIC
...
CANopenNode2.c)
add_custom_command(TARGET CANopenNode2 POST_BUILD
COMMAND objcopy --redefine-syms=${CMAKE_CURRENT_LIST_DIR}/renames.txt $<TARGET_FILE:CANopenNode2>)
这基本上会生成一个空源文件(取决于我的常规renames.txt
文件),然后将其与其他对象一起存档在静态库中。每当renames.txt
更改时,都会重新生成这个空源,重新归档并正确处理库。
我尝试或考虑过的另外两个解决方案:
LINK_DEPENDS
静态库的属性。不起作用,因为静态库没有链接步骤。这是构建可执行文件时的最佳解决方案,但对于静态库来说它没有用。OBJECT_DEPENDS
静态库中存档的源文件之一的属性。这可以正常工作,但是在我的情况下会很不方便,因为我编译了两次源代码,生成了两个静态库,但只想对其中一个进行后处理。使用这种方法,当renames.txt
文件发生变化时,CMake 将重建两个静态库,而我只需要重建其中一个。
推荐阅读
- docker-compose - TestContainers:重用来自 DockerComposeContainer 的网络以在其他 GenericContainer 中使用?
- wordpress - WordPress Loop Post Types as List und inset sub-posts in
- ->
- ->
- typescript - TypeScript createProgram 抛出 'ts.sys 未定义'
- angular - 如何在角度 4 中使用管道获得 HH:MM
- linux - psplash 图像不出现 (yocto & qemu)
- javascript - 控制台戳中的毫秒似乎在 node.js 中不起作用
- python-3.x - Netmiko:AttributeError:“NoneType”对象没有属性“recv_ready”
- python - Powershell 给出“路径中未找到 Python”错误
- docker - 运行 golang http.Client 的 Docker 容器出现错误“证书由未知机构签名”
- api - Aurelia 调用 .NET 核心 API 2.0 时出现 CORS 错误