2

我试图让 CMake 用 ANTLR 生成源文件但没有成功。

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

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

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

4

2 回答 2

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。(您不需要调用中的SOURCES参数add_custom_target,但此便利功能将 MyGrammar.g 添加到目标文件中,在 MSVC 等 IDE 中可见)

于 2013-01-16T23:45:44.457 回答
0

有点离题,但也许对你有用。 在这里,您将找到 ANTLR C 运行时库的 CMake 构建文件。

生成的源与从元数据生成的任何其他源相同。您可以使用 QT 的 UIC 编译器宏作为示例:

    宏(QT4_WRAP_UI 输出文件)
    QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN})
    FOREACH (它 ${ui_files})
      GET_FILENAME_COMPONENT(输出文件 ${it} NAME_WE)
      GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
      SET(输出文件 ${CMAKE_CURRENT_BINARY_DIR}/ui_${输出文件}.h)
         ADD_CUSTOM_COMMAND(输出 ${outfile}
         命令 ${QT_UIC_EXECUTABLE}
         ARGS ${ui_options} -o ${outfile} ${infile}
         MAIN_DEPENDENCY ${infile} VERBATIM)
      SET(${outfiles} ${${outfiles}} ${outfile})
    ENDFOREACH (它)
    ENDMACRO (QT4_WRAP_UI)
于 2013-01-17T18:01:55.160 回答