如何将ANTLR与CMake集成?

时间:2013-01-16 17:26:14

标签: cmake antlr

我正在努力让CMake使用ANTLR生成源文件,但没有任何成功。

这是我用来生成这些文件的命令:

$ antlr grammar/MyGrammar.g -fo src/parser

我的可执行目标是在PROJECT/src/CMakeLists.txt中定义的,而不是PROJECT/CMakeLists.txt

2 个答案:

答案 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)