C++ cmake文件生成--一个更优雅的替代方案?
我希望通过cmake获得您在Makefile中看到的以下内容:C++ cmake文件生成--一个更优雅的替代方案?,c++,makefile,cmake,C++,Makefile,Cmake,我希望通过cmake获得您在Makefile中看到的以下内容: /// Makefile all: main header_moc.h : header.h ./mokker.sh header_moc.h main : header_moc.h header.h g++ main.cpp 文件内容如下: /// header.h void foo(){} 唯一的cpp: /// main.cpp #include "header.h" #include "header
/// Makefile
all: main
header_moc.h : header.h
./mokker.sh header_moc.h
main : header_moc.h header.h
g++ main.cpp
文件内容如下:
/// header.h
void foo(){}
唯一的cpp:
/// main.cpp
#include "header.h"
#include "header_moc.h"
int main(int, char**){
return 0;
}
脚本生成虚拟moc文件:
/// mokker.sh
touch $1
这是cmake文件:
/// CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(test)
macro(generate_file target name)
add_custom_command(
OUTPUT ${name}_moc.h
COMMAND ${CMAKE_SOURCE_DIR}/mokker.sh ${name}_moc.h
DEPENDS ${name}.h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
add_custom_target(${target}_${name}_moc DEPENDS ${name}_moc.h)
add_dependencies(${target} ${target}_${name}_moc)
endmacro()
add_executable(test main.cpp header.h)
generate_file(test header)
真的有必要做额外的添加自定义目标吗?
你能提出更优雅的解决方案吗?
否,不需要添加自定义目标。顺便说一下,你的CMakeLists.txt并不完全正确 看看
如您所见,程序源列表中提到了生成的文件foo.c ADD_EXECUTABLEfoo foo.c,这就是为什么它会自动放入foo依赖项列表中。您好,是的,这是有意的。我这样做的原因是我不想在add_可执行级别上做。如果我在那里这样做,那些自动生成的文件将在IDE的项目浏览器中可见,他们会认为编辑它们是个好主意。不幸的是,add_dependenciestfoo.c不起作用。我觉得这有点让人费解,因为文档中说的ADD_依赖关系仅适用于顶级目标。因此,如果您需要使用add_依赖项,那么您必须像您一样为其创建自定义顶级目标。或者,您可以使用添加自定义命令目标预构建。。。它也会创建一个顶级目标,但在这种情况下,构建系统将始终重建目标,即重新生成${name}\u moc.h,无论您是否更改了源代码。我明白了,我想我涵盖了所有可能的选项。你要么做我给你看的,要么做你上面提到的。