17

add_custom_commandに苦労しています。問題を詳しく説明させてください。

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

perl trans.pl source.cxx -o source_cxx_tro

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

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

次に、これらのコマンド(source_cxx_tro、header_hxx_tro)から生成された出力に対して別のperlスクリプトを実行します。

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)

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

助言がありますか ?

よろしくお願いします、スーリヤ

4

2 に答える 2

31

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(
    出力${file_tro}
    コマンド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(
  出力Foo.trx  
  コマンドperl${CMAKE_CURRENT_SOURCE_DIR} /combine.pl $ {trofiles} -o Foo.trx
  ${trofiles}に依存します
)。
add_custom_target(do_trofiles DEPENDS Foo.trx)
add_dependencies(Foo do_trofiles)
于 2010-03-02T09:56:28.740 に答える
3

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

これはあなたが望むものに近いかもしれません: https ://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-do-i-use-cmake-to-build-latex-documents

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

于 2010-03-02T04:31:08.890 に答える