我正在努力让CMake使用ANTLR生成源文件,但没有任何成功。
这是我用来生成这些文件的命令:
$ antlr grammar/MyGrammar.g -fo src/parser
我的可执行目标是在PROJECT/src/CMakeLists.txt
中定义的,而不是PROJECT/CMakeLists.txt
。
答案 0 :(得分:2)
如果您要在PROJECT/src/CMakeLists.txt
内执行此命令,则以下内容应该有效:
execute_process(COMMAND antlr grammar/MyGrammar.g -fo src/parser
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..)
根据您的评论,您似乎希望每次构建可执行文件时都调用它。
要将antlr调用与可执行文件绑定,可以使用add_custom_command
add_custom_command(TARGET MyExe PRE_BUILD
COMMAND antlr grammar/MyGrammar.g -fo src/parser
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..)
如果MyExe目标已过期,这只会执行antlr调用。如果更改了MyGrammar.g,但MyExe不需要重建,则antlr不会运行。
如果您有多个依赖于运行antlr的目标,或者您希望能够随时调用antlr命令,则可以使用add_custom_target
。这会将antlr命令添加为新的伪目标。如果你只是构建这个目标,它所做的只是调用antlr。对于依赖于它的每个目标,请使用add_dependencies
:
add_custom_target(Antlr
COMMAND antlr grammar/MyGrammar.g -fo src/parser
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..
SOURCES ../grammar/MyGrammar.g)
add_dependencies(MyExe Antlr)
add_dependencies(MyOtherExe Antlr)
和以前一样,只有在需要重建其中一个依赖目标或者显式构建新的自定义目标“Antlr”时才会调用antlr。 (你不需要{em>需要 SOURCES
调用中的add_custom_target
参数,但是这个便利功能将MyGrammar.g添加到目标的文件中,可以在像MSVC这样的IDE中看到)
答案 1 :(得分:0)
有点偏离主题,但也许它对你有用。 Here您将找到ANTLR C runtimme库的CMake构建文件。
生成的源与从元数据生成的任何其他源相同。 您可以使用QT的UIC编译器宏作为示例:
MACRO (QT4_WRAP_UI outfiles ) QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN}) FOREACH (it ${ui_files}) GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h) ADD_CUSTOM_COMMAND(OUTPUT ${outfile} COMMAND ${QT_UIC_EXECUTABLE} ARGS ${ui_options} -o ${outfile} ${infile} MAIN_DEPENDENCY ${infile} VERBATIM) SET(${outfiles} ${${outfiles}} ${outfile}) ENDFOREACH (it) ENDMACRO (QT4_WRAP_UI)