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は、依存ターゲットの1つを再構築する必要がある場合、または新しいカスタムターゲット「Antlr」を明示的にビルドした場合にのみ呼び出されます。(呼び出しで引数は必要ありませんが、この便利な機能により、MSVCなどのIDEに表示されるターゲットのファイルにMyGrammar.gが追加されます)SOURCES
add_custom_target
トピックから少し外れますが、多分それはあなたにとって役に立つでしょう。 ここには、ANTLR C ランタイム ライブラリの CMake ビルド ファイルがあります。
生成されたソースは、メタデータから生成された他のソースと同じです。例として、QT の UIC コンパイラ マクロを使用できます。
MACRO (QT4_WRAP_UI 出力ファイル) QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN}) FOREACH (それ ${ui_files}) GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) SET(出力ファイル ${CMAKE_CURRENT_BINARY_DIR}/ui_${出力ファイル}.h) ADD_CUSTOM_COMMAND(OUTPUT ${出力ファイル} コマンド ${QT_UIC_EXECUTABLE} ARGS ${ui_options} -o ${outfile} ${infile} MAIN_DEPENDENCY ${infile} VERBATIM) SET(${outfiles} ${${outfiles}} ${outfile}) ENDFOREACH (それ) ENDMACRO (QT4_WRAP_UI)