C++ cmake文件生成--一个更优雅的替代方案?

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

我希望通过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_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,无论您是否更改了源代码。我明白了,我想我涵盖了所有可能的选项。你要么做我给你看的,要么做你上面提到的。