2016-09-23 11 views
0

2つの異なる実行可能ファイルによって動的に生成されるソースとソースに依存するライブラリを構築しようとしています。私は2つのジェネレータを持っています。

最初に、ソースが表示され、コンテキストが明確になります。アプリケーションは、ディレクトリ内のコードであり、事前ビルドされていません。

add_library(app STATIC app.c) 

App.cは生成されたhdr1.hに依存します。これは生成されたファイルです。だから私はそうのようなhdr1.hの世代を追加します。

add_executable(hdr_maker1 src1.c) 

Hdr_maker1 exeファイルは、独自のソースsrc1.cを持っていますが、それは今度は別のexeファイルで を作っている第二のファイルhdr2.hに依存します。

add_executable(hdr_maker2 src2.c) 

その後、私はhdr_maker2はそのターン中で使用されているhdr1.hを生成するために構築されたときに順番にhdr_maker1で使用されているhdr2.hを生成するために最初に実行してこれらのファイルの依存関係や実行を指定しようターゲットライブラリ。

# pseudo target to make hdr2.h by executing hdr_maker2 
add_custom_target(HDR_MAKER2 DEPENDS hdr2.h) 
# for the command portion, hdr2.h is specifed a second time 
# so that hdr_maker2 makes its output file as hdr2.h 
add_custom_command(OUTPUT hdr2.h COMMAND $<TARGET_FILE:hdr_maker2> hdr2.h) 

# this one depends upon its own src and the generated hdr2.h src 
add_custom_target(HDR_MAKER1 DEPENDS hdr1.h hdr2.h) 
add_custom_command(OUTPUT hdr1.h COMMAND $<TARGET_FILE:hdr_maker1> hdr1.h) 

# 
add_dependencies(app HDR_MAKER1) 

結果は、それがhdr_maker2を作ることであるが、それはhdr_maker2に必要なヘッダを行うhdr_maker2を実行する前にhdr_maker1作るしよう。このパターンは、擬似ターゲットを1つだけ作成したい場合に機能します。すなわち、アプリが単純に1つの.hに依存している場合、アプリをビルドする前にメーカーをビルドして実行します。

FWIW、私もこれを行うことにより、チェーンに依存関係を試してみた:

# hdr_maker1 makes hdr1.h, but depends upon hdr2.h 
# which uses the existing dependncy. 
add_custom_target(HDR_MAKER1 DEPENDS hdr1.h) 
add_custom_command(OUTPUT hdr1.h COMMAND $<TARGET_FILE:hdr_maker1> hdr1.h DEPENDS hdr2.h) 

を、私はまた、このようなチェーンの依存関係に試してみた:Tsvarevへ

# 
add_dependencies(app HDR_MAKER1) 
add_dependencies(HDR_MAKER1 HDR_MAKER2) 
+0

は '...しかし、それはhdr_maker2'に必要なヘッダを作るhdr_maker2を実行する前にhdr_maker1を作るしようとしましたか?いずれの場合でも、ライブラリ/実行ファイルが生成されたヘッダファイルに依存する場合、このファイルをソースリストに追加するだけです: 'add_library(app STATIC app.c hdr1.h)'。 – Tsyvarev

+0

私はこれを明日試すことができますが、私はそれがうまくいくとは思わない。このエラーは、最初のコマンドを実行せずに2番目のジェネレータを作成しようとしているときに発生します。それは鎖です。 exe2はhdr 2を作成します。exe 1はhdr2.hが必要です。 exe 2はビルドして実行する必要があります。そのため、exe 2を実行しないと失敗します。 exe 1が実行されると、hd1.hが生成されます。 hdr1.hを使用して最終ライブラリを構築します。あなたの提案は高く評価されていますが、ほとんど役に立たないでしょう。私の理解は、ソースとしてリストされたhdrsが無視されることです。また、exe1のビルド前にexe2の実行を接続しません。 – netskink

+0

'私の理解は、ソースとしてリストされたhdrsは無視されます。 ' - ヘッダーはコンパイラによって無視されますが、ファイルレベルの依存関係で考慮されます。 'また、exe1のビルド前にexe2の実行を接続しません.' - この接続は' add_custom_command'で '$ 'ジェネレータの式を使うたびにCMakeによって自動的に調整されます。さらに、 'add_custom_command(COMMAND exe2 ...)'だけを使っても構いません.CMakeはexe2を実行ファイルへのフルパスで置き換えるのに十分スマートです。ところで、あなたのコードでは、**同じ* OUTPUT ***の2つの 'add_custom_command'があります。 – Tsyvarev

答えて

0

おかげで、ここにあります書き換えられたソリューションここでの誤植last`hdr_maker2`です -

# specifying hdr1.h as one of the sources will chain hdr1.h to 
# be made by its generator. 
add_library(app STATIC app.c hdr1.h) 

# specifying hdr2.h as one of the source will chain hdr2.h to 
# be made by its generator. 
add_executable(hdr_maker1 src1.c hdr2.h) 

# hdr2.h can be made without dependencies 
add_executable(hdr_maker2 src2.c) 

# These are used a custom targets since in real project, 
# the making of the makers will be conditional. In the 
# first build the makes are built. The second time 
# the .exes will be found and used to build the source. 
# ie. the .exes are not built. 
add_custom_target(HDR_MAKER2 DEPENDS hdr2.h) 
add_custom_command(OUTPUT hdr2.h COMMAND $<TARGET_FILE:hdr_maker2> hdr2.h) 

add_custom_target(HDR_MAKER1 DEPENDS hdr1.h) 
add_custom_command(OUTPUT hdr1.h COMMAND $<TARGET_FILE:hdr_maker1> hdr1.h) 
+0

ライブラリとexecutalbeが対応するヘッダーの唯一のユーザーである場合、 'add_custom_target'呼び出しを省略することができます。その場合、ヘッダーを生成するコマンドは、それに対応してターゲット 'app'と' hdr_maker1'の一部になります。 – Tsyvarev