cmake add_custom_command依赖于对象库



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

这是我目前简化的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>
)

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

#include <iostream>
extern char const *getVersion();
int main() {
    std::cout << getVersion() << std::endl;
}

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

如何让 cmake 在且仅当version-test-objects有任何更改时重新生成version.cpp

DEPENDS version-test-objects仅指定目标级别的依赖项,这意味着此命令可能会在构建目标version-test-objects后运行。 您陈述了每当更新version-test-objects的任何对象文件部分时都应运行该命令的要求。 因此,这些也必须列在DEPENDS中。 这可以被认为是关于对象库和普通库之间差异的错误。

# 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 生成文件生成器。 这可能不适用于 CMake 3.8 或更早版本,因为发行说明指出此表达式直到 3.9 才添加。 如果是这种情况,您可能需要创建一个使用所有对象的虚拟存档,然后将其用作依赖项。

最新更新