72

CMake セマンティクスでは、「ターゲット」と「コマンド」の間にある種の違いがあり、私を困惑させています。Makefile では、そのような違いはありません。

targetname:dependency
    command

つまり、ターゲットは、生成された同じ名前のファイルに対応します。

CMake には、機能が重複する「add_custom_command」や「add_custom_target」などのコマンドがあり、公式ドキュメントでさえセマンティクスが混乱しています。つまり、「Mastering CMake, 5th edition」の 110 ページの「Adding a custom target」の下にあります。

DEPENDS 引数は、カスタム ターゲットとカスタム コマンドの間の依存関係を設定します。

私の理解では、ターゲット(生成されたファイル)には依存関係(他のファイル、生成されたかどうかに関係なく)と、実際に生成を行うコマンドがあります。ターゲットがコマンドに依存していると言うのは無意味です。さらに悪いことに、「add_custom_command」には 2 つのフレーバーがあり、追加のコマンドを既存のターゲットにアタッチするか、コマンドをエーテルに吐き出します。

なぜこの区別が存在するのか、誰か説明してもらえますか?

4

2 に答える 2

56

ターゲット

add_executable一般に、ターゲットは、 oradd_libraryを呼び出すことによって定義され、多くのプロパティを設定できる実行可能ファイルまたはライブラリで構成されます。

これらは相互に依存関係を持つことができます。これは、これらのようなターゲットの場合、依存関係が依存関係の後にビルドされることを意味します。

ただし、 を介して「カスタム ターゲット」を定義することもできますadd_custom_target。ドキュメントから:

指定されたコマンドを実行する指定された名前のターゲットを追加します。ターゲットには出力ファイルがなく、コマンドがターゲットの名前でファイルを作成しようとしても、常に期限切れと見なされます。ADD_CUSTOM_COMMAND を使用して、依存関係のあるファイルを生成します。デフォルトでは、カスタム ターゲットに依存するものはありません。ADD_DEPENDENCIES を使用して、他のターゲットとの間で依存関係を追加します。

したがって、これらは、exe または lib を生成するものを表していないという点で「通常の」ターゲットとは異なりますが、依存関係の有無など、ターゲットが持つことができるすべてのプロパティの恩恵を受けます。それらは、構築可能なターゲットとして表示されます (例:make MyCustomTargetまたはmsbuild MyCustomTarget.vcxproj)。それらを構築するときは、それらに設定されたコマンドを呼び出すだけです。それらが他のターゲット (通常またはカスタム) に依存している場合、これらが最初にビルドされます。


カスタム コマンド

経由で定義されたカスタム コマンドadd_custom_commandは、「ビルド可能な」オブジェクトではなく、ターゲットのように設定可能なプロパティがないという点でまったく異なります。 CMakeLists.txt。

これは基本的に、依存ターゲットを構築する前に呼び出されるコマンド (またはコマンドのセット) です。ここで「依存する」が実際に意味するのはそれだけです (少なくとも私はそう見ています) - A が B に依存している場合、A が構築される前に B が構築/実行されると言っているだけです。

カスタム コマンドの依存先は、フォームを使用して明示的に設定することも、add_custom_command(TARGET target ...フォームを介して生成されたファイルを含むターゲットを作成することによって暗黙的に設定することもできますadd_custom_command(OUTPUT output1 ...

最初のケースでは、 がビルドされるたびtargetに、カスタム コマンドが最初に実行されます。

2 番目のケースでは、もう少し複雑です。カスタム コマンドに、その出力ファイルに依存するターゲットがある場合 (および出力ファイルがまだ存在しない場合)、これらの依存オブジェクトが構築される前に呼び出されます。依存関係は、実行時に暗黙的に作成されます。たとえば、を介して生成されたファイルはadd_library(MyLib output1.h ... )どこにありますか。output1.hadd_custom_command(OUTPUT output1.h ... )

于 2012-08-15T23:12:37.470 に答える