web-dev-qa-db-ja.com

cmake add_custom_command

Add_custom_commandに苦労しています。問題を詳しく説明します。

私はこれらのcxxファイルとhxxファイルのセットを持っています。それぞれに対してPerlスクリプトを実行して、特定の種類の翻訳ファイルを生成します。コマンドは次のようになります

Perl trans.pl source.cxx -o source_cxx_tro

同様にheader.hxxファイルについても同様です。

だから私はいくつかの複数のコマンド(それぞれがファイルに対して)になるでしょう

次に、これらのコマンドから生成された出力(source_cxx_tro、header_hxx_tro)で別のPerl scripnを実行します

Perl combine.pl source_cxx_tro header_hxx_tro -o dir.trx

dir.trxは出力ファイルです。

私はこのようなものを持っています。

Loop_Over_All_Files()
Add_Custom_Command (OUTPUT ${trofile} COMMAND Perl trans.pl ${file} -o ${file_tro})
List (APPEND trofiles ${file_tro})
End_Loop()

Add_Custom_Command (TARGET LibraryTarget POST_BUILD COMMAND Perl combine.pl ${trofiles} -o LibraryTarget.trx)

私が期待するのは、ポストビルドターゲットをビルドするときに、trofileが最初にビルドされることです。しかし、そうではありません。 $ {trofiles}はビルドされていないため、ビルド後のコマンドは失敗します。 POST_BUILDコマンドが前のカスタムコマンドに依存していることを確認する方法はありますか?

助言がありますか ?

事前に感謝、スーリヤ

16
Surya

Add_custom_commandを使用してファイル変換チェーンを作成する

  • *。(cxx | hxx)-> * _(cxx | hxx)_tro
  • * _(cxx | hxx)_tro-> Foo.trx

add_custom_targetを使用して、最後の変換をcmakeの最初のクラスエンティティにします。デフォルトでは、ALLでマークするか、ビルドされた別のターゲットに依存させない限り、このターゲットはビルドされません。

 set(SOURCES foo.cxx foo.hxx)
 add_library(Foo $ {SOURCES})
 
 set(trofiles)
 foreach(_file $ {SOURCES})
 string(REPLACE "。" "_" file_tro $ {_ file})
 set(file_tro "$ {file_tro} _tro")
 add_custom_command(
 OUTPUT $ {file_tro} 
 COMMAND Perl $ {CMAKE_CURRENT_SOURCE_DIR} /trans.pl $ {CMAKE_CURRENT_SOURCE_DIR}/$ {_ file} -o $ {file_tro} 
依存$ {_ file} 
)
 list(APPEND trofiles $ {file_tro})
 endforeach()
 add_custom_command(
 OUTPUT Foo.trx 
 COMMAND Perl $ {CMAKE_CURRENT_SOURCE_DIR} /combine.pl $ {trofiles} -o Foo.trx 
 DEPENDS $ {trofiles} 
)
 add_custom_target(do_trofiles DEPENDS Foo.trx)
 add_dependencies(Foo do_trofiles)
31
Maik Beckmann

カスタムコマンドの出力を使用するカスタムターゲットを作成します。次に、ADD_DEPENDENCIESを使用して、コマンドが正しい順序で実行されるようにします。

これはあなたが望むものに近いかもしれません: http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_CMake_to_build_LaTeX_documents.3F

基本的に、生成されたファイルごとに1つのadd_custom_commandを実行し、それらのファイル(trofiles)のリストを収集してから、リストtrofilesにDEPENDSを指定してadd_custom_targetを使用します。次に、add_dependenciesを使用して、LibraryTargetをカスタムターゲットに依存させます。次に、ライブラリターゲットをビルドする前に、カスタムターゲットをビルドする必要があります。

3
Bill Hoffman