cmake add_custom_command取决于对象库

时间:2019-05-29 08:57:27

标签: cmake

我正在尝试使用add_custom_command使用cmake生成版本文件。我只希望在另一个目标(对象库)有任何更改的情况下(重新)生成版本文件。

这是我当前的简化CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)
project (version-test)

# Object file compilation target.
add_library(version-test-objects OBJECT main.cpp)

# Version object file target.
add_custom_command(OUTPUT version.cpp
    COMMAND date "+char const *getVersion\\\(\\\) { return \\\"%Y-%m-%d %H:%M:%S\\\"\; }"
    > version.cpp
    DEPENDS version-test-objects
)
add_library(version-test-version OBJECT
    version.cpp
)

# Binary target.
add_executable(version-test
    $<TARGET_OBJECTS:version-test-objects>
    $<TARGET_OBJECTS:version-test-version>
)

为了完整起见,我简化了main.cpp:

#include <iostream>

extern char const *getVersion();

int main() {
    std::cout << getVersion() << std::endl;
}

version.cpp与第一个版本一起生成良好。但是,对源的更改(例如touch main.cpp)仅重建version-test-objects并链接可执行文件,而不会重新生成version.cpp

仅在version.cpp进行任何更改的情况下,如何才能使cmake重新生成version-test-objects

1 个答案:

答案 0 :(得分:0)

DEPENDS version-test-objects仅指定目标级别相关性,这意味着在构建目标version-test-objects之后该命令可能会运行。您声明了要求version-test-objects的任何目标文件部分得到更新时都应运行该命令的要求。因此,这些也必须在DEPENDS中列出。可以将其视为关于OBJECT库和普通库之间差异的错误。

# Version object file target.
add_custom_command(OUTPUT version.cpp
    COMMAND date "+char const *getVersion\\\(\\\) { return \\\"%Y-%m-%d %H:%M:%S\\\"\; }"
    > version.cpp
    DEPENDS version-test-objects $<TARGET_OBJECTS:version-test-objects>
)

这对我使用CMake 3.13 Makefile生成器有效。这可能在CMake 3.8或更早版本中不起作用,因为发行说明指出直到3.9才添加此表达式。如果是这种情况,您可能需要创建一个使用所有对象的虚拟存档,然后将其用作依赖项。

相关问题