【问题标题】:How to make CMake's add_custom_command(TARGET ... POST_BUILD ...) depend on regular file?如何使 CMake 的 add_custom_command(TARGET ... POST_BUILD ...) 依赖于常规文件?
【发布时间】:2020-07-09 18:19:45
【问题描述】:

由于非常特殊的需要,我有一个静态库,我需要在创建后对其进行“后期处理”。所以我有这个:

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 变得极其复杂的另一件事?

【问题讨论】:

  • @Tsyvarev - 感谢您提供的信息。我知道LINK_DEPENDS,但这只会影响最终二进制文件的链接。如果我为我的情况这样做,那么当常规文件更改时,库不会重新归档和重新处理 - 只有最终的可执行文件会再次重新链接......
  • 对不起,错过了构建没有链接步骤的静态库的点,只有编译一个。 OBJECT_DEPENDS 属性是否适合您,如that question 及其答案中所述?我可以“交换”重复的引用,但如果您觉得您的问题需要一个完全不同的答案,我会重新打开它。
  • @Tsyvarev - 最后我选择了add_custom_command(),它生成一个空源(取决于我的常规文件),然后与库一起存档。在我的情况下,添加OBJECT_DEPENDS 很不方便,因为我实际上编译了两次文件,但我只需要对库的一份副本进行后处理。
  • 好的,我重新打开了这个问题。随意写下你的答案。

标签: cmake


【解决方案1】:

就我而言,我想出的最佳解决方案是:

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 会重建两个静态库,而我只需要重建其中一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多