11
我正在使用CMake来构建我的C++项目,它具有多个可执行文件和库(同一项目的所有部分)。所有工作都很好,但是我的一个可执行文件是创建一些库类的代码生成器。我已经掌握了所有这一代人的工作,但是在构建库之前无法弄清楚如何调用这个可执行文件(codegen)。我在Linux环境中。希望有人能回答这个问题。获得CMake在构建库之前执行项目中的目标
我正在使用CMake来构建我的C++项目,它具有多个可执行文件和库(同一项目的所有部分)。所有工作都很好,但是我的一个可执行文件是创建一些库类的代码生成器。我已经掌握了所有这一代人的工作,但是在构建库之前无法弄清楚如何调用这个可执行文件(codegen)。我在Linux环境中。希望有人能回答这个问题。获得CMake在构建库之前执行项目中的目标
在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)
感谢杰克, 应该标记代码生成器编写generated.cpp/h的文件到当前目录或简单的将他们输出标准输出并让OUTPUT部分写入它们?如果是这样,我只是在写作时将它们与EOF分开? – Mark 2011-03-22 10:04:54
我越来越认为递归构建系统不起作用。他们不使用'make',他们不使用'automake',我不相信他们使用'CMake'。是否有任何理由不能在顶层的'CMakeLists.txt'中完成这一切?如果它太大,使用'include'。 您仍然需要输出到文件。 'add_custom_command'中的'OUTPUT'行只是告诉CMake你正在生成的文件(因为它没有办法独立工作),所以继续使用'ofstream'或其他来产生你的头文件和源文件。 – 2011-03-22 10:59:15
谢谢杰克,我会考虑移动到一个CMakeLists,看起来会更容易维护等。 – Mark 2011-03-22 11:06:00