我正在尝试使用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
?
答案 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才添加此表达式。如果是这种情况,您可能需要创建一个使用所有对象的虚拟存档,然后将其用作依赖项。