2017-12-14 8 views
0

私のプロジェクトでは、いくつかの出力ファイルを同時に生成するアクションがあります。それらの1つにコンパイルターゲットのようなルールが含まれています。GNU Make:.INTERMEDIATEターゲットの複数出力ルールは、生成されたインクルードされたメイクファイルと組み合わせることはできません。

ここには、私が実行したいと思う小さなメークファイルがあります。これは上で実行する必要があるため、

*** No rule to make target 'compile'. Stop. 

2番目の呼び出しは、私が作る一度だけ実行したいと思います!!!! compiling !!! 出力と通常動作します:

SHELL = cmd.exe 
rules_InputFiles = makefile 
rules_OutputFiles = exec\rules.mk exec\other.mk 

$(rules_OutputFiles): exec\rules.temp 

.INTERMEDIATE: exec\rules.temp 
exec\rules.temp: $(rules_InputFiles) 
    $(info == generating rules.mk and rules2.mk (due to $?) ==) 
    if not exist exec mkdir exec 
    @echo compile: >exec\rules.mk 
    # precede the second @echo with a tab character 
    @echo <tab>@echo !!!! compiling !!! >>exec\rules.mk 
    @echo compile2: >exec\other.mk 
    # precede the second @echo with a tab character 
    @echo <tab>@echo !!!! compiling2 !!! >>exec\other.mk  

-include exec\rules.mk 

メイクエラーメッセージにこのメイク結果のmake compileを呼び出します相互作用なしにサーバーを構築します。

このメイクファイルは、constructed included makefilesのルールと中間ターゲットを持つ複数のターゲットの生成の組み合わせです。

私の質問です:私の目標を達成するためにこのメイクファイルを変更できますか?

いくつかの回避策を試しました。その1つは、中間ターゲットを省略し、rules.mkをマーカーファイルとして使用することです。これは、狂った科学者の記事に相当しますが、必要な依存関係は含まれていません。

ルールを$(rules_OutputFiles): $(rules_InputFiles)と再入力すると、レシピが2回実行されますが、これは望ましくありません。

答えて

0

これは中間となりませんの場合はになりますので、になります。その初期ます-のmakefileアップツーデートの段階では

は、それがexec/rules.mkを更新するために持っていることを見てください。 これを実行する前に、exec/rules.tempを更新する必要があります。

  • exec/rules.temp
    • 存在しませんがためのレシピを実行しますexec/rules.tempexec/rules.mkためのレシピが
      • は何もしない作り、そして悲しいことに、このことに気づいていない存在しない
    • ファイルはのレシピの副作用として魔法のように作成されました

だけexec/rules.mkのレシピを追加し、これが事実であることを証明するために。 何でもできます。 最も簡単なものは次のとおりです。

exec/rules.mk: ; 

この単純な追加により、 は今それをexec/rules.mkが実際にそれが最後の読み取りを更新されているかどうかを確認します(または読み取りに失敗しました)でしょうします。 ジョブが完了しました。 (別にある危険なスタイルであなたのメイクファイルを残してからの教訓:。を作るためにあなたは嘘をつかない場合はあなたの人生はずっとずっと幸せになります。)

関連する問題