2011-10-22 8 views
12

私はC++プロジェクトでANTLRを使用しようとしています。私は、指定された文法のためにANTLRジェネレータを実行するためのターゲットを作り、それに依存してメインprjctを作りました。指定されたファイルが変更されたかどうかCMakeターゲットを実行する方法?

ADD_CUSTOM_TARGET(GenerateParser 
    COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
          -o ${PROJECT_SOURCE_DIR}/src/MyGrammar 
) 

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) 
ADD_DEPENDENCIES(MainProject GenerateParser) 

問題は、ANTLRジェネレータがプロジェクトをビルドして十分な時間を消費するたびに発生することです。文法が変更されたかどうかだけをどのように動かすことができますか?あるいは、ANTLRを古くなった文法のためだけにパーサーを生成させることも可能かもしれません。

答えて

9

add_custom_command あなたが正しくそれへの呼び出しを構築する場合は、トリックを行います。ここで

ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/src/MyGrammar 
    COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
    -o ${PROJECT_SOURCE_DIR}/src/MyGrammar 
    DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar.g 
) 

ADD_CUSTOM_TARGET(GenerateParser ALL 
    DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar 
) 

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) 
ADD_DEPENDENCIES(MainProject GenerateParser) 

は、カスタムの目標は、すべての時間「を構築」しますが、それがどうなる唯一のことは、その出力は、それが依存のカスタムコマンドを構築しているが、ifと:

このような何か作業をする必要がありますカスタムコマンドの出力がそのDEPENDSファイルに関して古くなっている場合に限ります。ソースファイルを生成し

追加対象:カスタムターゲットと提案したソリューションのほか

3

add_custom_commandはトリックですか?ここでは、DEPENDS [depends ...]を指定して、従属ファイルが変更されたときにのみコマンドを実行させることができます。

http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_custom_command

add_custom_command(OUTPUT output1 [output2 ...] 
       COMMAND command1 [ARGS] [args1...] 
       [COMMAND command2 [ARGS] [args2...] ...] 
       [MAIN_DEPENDENCY depend] 
       [DEPENDS [depends...]] 
       [IMPLICIT_DEPENDS <lang1> depend1 ...] 
       [WORKING_DIRECTORY dir] 
       [COMMENT comment] [VERBATIM] [APPEND]) 
+1

動作しないようです。私はDEPENDSがターゲットだけで動作することを理解していました。依存ターゲットが変更されるたびに(libary rebuiltなど)コマンドが実行されます。 – DikobrAz

2

、あなたの目標は、いくつかの生成源に依存する場合の一般的なワークフローは次のようです。間違いを避けるためにフルパスを使用することをお勧めします。

add_custom_command(OUTPUT ${GENERATED_SOURCE_FILE} 
    COMMAND ${GENERATION COMMAND} 
    DEPENDS ${DEPENDENCIES} 
) 

生成されたソースファイルのGENERATEDプロパティを設定します。だから、cmakeはソースファイルの欠落については不平を言うことはありません。

set_source_files_properties(${GENERATED_SOURCE_FILE} PROPERTIES 
    GENERATED TRUE 
) 

生成されたソースをいつものようにターゲットに追加します。 $ {} DEPENDENCIESファイルの一部が変更された場合

add_executable(${YOUR_TARGET} SOURCES ${GENERATED_SOURCE_FILE}) 

はそう提案した例では$ {GENERATIONコマンドは}にのみ起動されます。

+0

[docs](https://cmake.org/cmake/help/v3.6/command/add_custom_command.html)によれば、ファイルを手動で「GENERATED」とマークする必要はありません。デフォルト。 –

関連する問題