首页 > 解决方案 > 如何使 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 使这件事变得非常复杂?

标签: 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更改时,都会重新生成这个空源,重新归档并正确处理库。

我尝试或考虑过的另外两个解决方案:

  1. LINK_DEPENDS静态库的属性。不起作用,因为静态库没有链接步骤。这是构建可执行文件时的最佳解决方案,但对于静态库来说它没有用。

  2. OBJECT_DEPENDS静态库中存档的源文件之一的属性。这可以正常工作,但是在我的情况下会很不方便,因为我编译了两次源代码,生成了两个静态库,但只想对其中一个进行后处理。使用这种方法,当renames.txt文件发生变化时,CMake 将重建两个静态库,而我只需要重建其中一个。


推荐阅读