2011-03-21 49 views
11

我正在使用CMake来构建我的C++项目,它具有多个可执行文件和库(同一项目的所有部分)。所有工作都很好,但是我的一个可执行文件是创建一些库类的代码生成器。我已经掌握了所有这一代人的工作,但是在构建库之前无法弄清楚如何调用这个可执行文件(codegen)。我在Linux环境中。希望有人能回答这个问题。获得CMake在构建库之前执行项目中的目标

回答

17

CMakeLists.txt

首先,定义你的可执行文件:

add_executable(marks-code-generator gen.cpp) 

然后,定义自定义命令生成源:

add_custom_command(OUTPUT generated.cpp generated.hpp 
        COMMAND marks-code-generator ARGS args here maybe 
        MAIN_DEPENDENCY input-file.in 
        DEPENDS marks-code-generator 
        COMMENT here we go! 
        VERBATIM) 

选项VERBATIM确保特定平台转义正确完成。 COMMENT将在执行时打印出来,给出类似[ 66%] here we go!的东西。

最后,命名源列表中生成的源为您真正的程序:

add_executable(some-program generated.cpp generated.hpp non-generated.cpp foo.cpp) 
+0

感谢杰克, 应该标记代码生成器编写generated.cpp/h的文件到当前目录或简单的将他们输出标准输出并让OUTPUT部分写入它们?如果是这样,我只是在写作时将它们与EOF分开? – Mark 2011-03-22 10:04:54

+0

我越来越认为递归构建系统不起作用。他们不使用'make',他们不使用'automake',我不相信他们使用'CMake'。是否有任何理由不能在顶层的'CMakeLists.txt'中完成这一切?如果它太大,使用'include'。 您仍然需要输出到文件。 'add_custom_command'中的'OUTPUT'行只是告诉CMake你正在生成的文件(因为它没有办法独立工作),所以继续使用'ofstream'或其他来产生你的头文件和源文件。 – 2011-03-22 10:59:15

+0

谢谢杰克,我会考虑移动到一个CMakeLists,看起来会更容易维护等。 – Mark 2011-03-22 11:06:00

相关问题