我正在尝试使用 CMake 作为我的构建工具驱动程序(我立即明确表示我对 CMake 很陌生,因为这是我的第一个自己的 CMake 项目)。我的项目主要是 C 语言,其中包含一些我将在这里称为 Z 的外来语言的文件。这些 Z 文件必须由他们的 Z 编译器处理以生成 .h 和 .c 文件。
我设法调整 CMake 处理 Z 编译和纯 C 文件之间的依赖关系并生成 Z -> .h 标头
add_custom_command( ...*details omitted*... )
set_source_file_properties(*generated-.h* PROPERTIES GENERATED TRUE)
并且 CMake C- #include
scanner 可以正确完成其余的工作。
现在,Z 文件使用与 C#include
构造等效的东西,我想在 Z 包含的文件之一发生更改时从自动重新编译中获利。
如果 aZ 包括 inc.Z,我试过:
set_source_file_properties(a.Z PROPERTIES OBJECT_DEPENDS inc.Z)
但这不会触发自动重新编译 aZ CMake 手册说此属性是为此目的而引入的,对于 C/C++ 不再需要。但是在我的 Z 案例中它是无效的。
如果我修改我的自定义命令如下:
add_custom_command( ... DEPENDS inc.Z ...)
我得到了想要的结果,但并不是所有的 Z 文件都依赖于 inc.Z(另一个可能依赖于 inc2.Z)。
然后我尝试使用动态生成DEPENDS
列表
get_source_file_property(dependencies ${filename} OBJECT_DEPENDS)
if(dependencies STREQUAL "NOTFOUND")
unset(dependencies)
else()
string(REPLACE ";" " " dependencies "${dependencies}")
endif()
add_custom_command(... DEPENDS $filename "$dependencies" ...)
并用
Make[2]: *** no rules to build target `-- content of dependencies variable --'
注意:错误在变量替换周围有或没有双引号是相同的
我猜 CMake 将我的依赖项列表解释为单个(不存在的)文件名,并且 make 无法处理它。无论如何,变量中提到的文件dependencies
并不是要编译的,只是要包含在某个地方。他们必须以自己的方式只作为依赖项。
我应该往哪个方向去达到预期的效果?
回想一下,这是我自己的第一个CMake项目,我当然犯了新手错误。
FWIW,我的平台是带有 CMake 2.8.9(不是前沿,但我只是在探索)和 KDevelop 4.x 的 Linux
谢谢你的帮助。