cmake文件生成 - 更优雅的替代方案?

时间:2014-02-28 21:06:14

标签: c++ makefile cmake

我想在Makefile中看到你在下面看到的内容,但是使用cmake:

/// 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)
  • 是否真的有必要额外执行“add_custom_target”?
  • 您能提出更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:0)

不,add_custom_target不是必需的。顺便说一下,你的CMakeLists.txt并不完全正确。

查看http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F

正如您所看到的,程序源列表foo.c中提到了生成的文件ADD_EXECUTABLE(foo foo.c),这就是为什么它会自动放入foo依赖项列表中。< / p>