我试图让 CMake 用 ANTLR 生成源文件但没有成功。
这里我用来生成这些文件的命令:
$ antlr grammar/MyGrammar.g -fo src/parser
我的可执行目标是在 中定义的PROJECT/src/CMakeLists.txt
,而不是PROJECT/CMakeLists.txt
.
如果您说要从内部执行此命令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 中可见)
有点离题,但也许对你有用。 在这里,您将找到 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)