12

ここでよく聞かれるCMakeについて質問がありますが、どれも私の問題を解決していないようです。

detailsサブディレクトリには、次のCMakeLists.txtものが含まれています。

add_custom_command(OUTPUT part.out
                   COMMAND foo --input=part.src --output=part.out
                   DEPENDS part.src)

add_custom_target(part_out
                  DEPENDS part.out)

メインディレクトリには、別のファイルを生成するためCMakeLists.txtに使用するがあります。part.out

add_custom_command(OUTPUT full.out
                   COMMAND bar --input=./details/part.out --output=full.out)

add_custom_target(full_out
                  DEPENDS full.out)

問題は、ここで3つのことを実行したいということです。

  1. part.out存在しない場合は、生成する必要があります
  2. part.out古くなっている(part.srcより新しい)場合はpart.out再生したい
  3. full.out古くなっている(part.outより新しいfull.out、またはfull.out存在しない)場合は、(再)生成したい

したがって、追加DEPENDS ./details/part.outするadd_custom_command(OUTPUT full.out)とポイント2と3が達成されますが、ポイント1は達成されません。削除part.outしてから呼び出すmake full_outと、作成するルールがないというエラーが発生するためです./details/part.out(別のディレクトリからのルールであるため)。

追加または追加DEPENDS full_outすると、ポイント1と2が達成されますが、3は達成されません。これは、再生成されたとしても、ファイル自体に依存しないため、再生成されないためです。add_custom_command(OUTPUT full.out)add_custom_target(full_out)part.outfull.outpart.out

では、どうすれば両方のシナリオを接続できますか?両方を追加することを考えていましDEPENDSたが、それが常に機能するかどうかをどうやって知ることができますか?そのような場合、ビルドの順序がここで重要になることを意味します。

4

1 に答える 1

25

CMakeドキュメントadd_custom_target

デフォルトでは、カスタムターゲットに依存するものはありません。ADD_DEPENDENCIESを使用して、他のターゲットとの間で依存関係を追加します。

だから私はターゲットを「接続」することを提案します

ADD_DEPENDENCIES( full_out part_out )

編集: 実例

結局のところ、ソースファイルのプロパティを設定する必要がありますpart.out

これが私の作業例です(VS2008を使用したWindowsで試してみました):

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 )
project( full )

add_subdirectory( details )

add_custom_command( OUTPUT full.out 
               COMMAND ${CMAKE_COMMAND} -E copy ./details/part.out full.out
               DEPENDS details/part.out 
               )


add_custom_target( full_out
               DEPENDS full.out details/part.out details/part.src
              )


set_source_files_properties( details/part.out PROPERTIES GENERATED TRUE ) 


add_dependencies( full_out part_out )

details / CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 )
project(part)

add_custom_command(OUTPUT part.out
               COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/part.src part.out
               DEPENDS part.src)

add_custom_target(part_out
              DEPENDS part.out)

この例は、述べた3つのケースすべてで機能しました。

于 2012-11-20T13:20:30.930 に答える