2012-04-10 17 views
0

ディレクトリ内の特殊なMakefileが親ディレクトリの主要なものに依存する場合のパターンは何ですか?明示的なMakefileの依存関係

は私が持っている:/Makefile

/ 
/Makefile 
/src 
/src/Makefile 
/tests 
/tests/Makefile 

私が持っている:私は実行する場合/tests/makefile

TESTING_COMMAND=something 
dotest1: 
    make -C tests/ [email protected] 

iは

dotest1: 
    $(TESTING_COMMAND) $? 

を持っている:

[email protected]:/ $ Make dotest1 

それが動作します。しかし、私はテストのディレクトリから実行する場合:$(TESTING_COMMAND)が空であるので、それは最初の引数はシェルに渡されたコマンドになりましたですので

[email protected]:/tests/ $ Make dotest1 

それは、シェルのテストファイルを実行しようとします。

/tests /または/ src/dirで実行すると必ずしも動作する必要はありませんが、正常に機能しないようにする必要があります。

+0

テスト/ makefileだけでメインのメークファイルに 'TESTING_COMMAND'を定義してもよろしいですか? – Beta

+0

私は質問を多く単純化しました:)私は共有されていることがたくさんあります。 – gcb

答えて

1

あなたのデザインが私をおびえさせるが、これは、メインのMakefileでトリックを行います:

TESTING_COMMAND=something 
dotest1: 
    make -C tests/ [email protected] TESTING_COMMAND=$(TESTING_COMMAND) 

あなたはtests/Makefileがよく失敗する場合は、オプションのカップルを持っています。それだけで一つのターゲットはTESTING_COMMANDに依存している場合、あなたはそれが警告を印刷し、何もしないことができます:

ifndef TESTING_COMMAND 
$(warning TESTING_COMMAND is undefined, but Make will try to us it anyway) 
$(error TESTING_COMMAND is undefined, Make will now abort) 
endif 
ifdef TESTING_COMMAND 
dotest1: 
    $(TESTING_COMMAND) $? 
else 
dotest1: 
    @echo warning: TESTING_COMMAND not defined 
endif 

それとも全体のMakefileがそれに依存している場合、あなたが印刷に警告を作成するか中止することができます

サブメイク(実行するものはtests/Makefile)を中止することもできますが、依然としてそれを起動したメイクプロセスは引き続き実行されますが、それは痛みです。

+0

完璧! 1つのvarを探しているifndefはすばらしく働いていました。デザインはそれほど恐ろしいものではありません:) 1つのコアメイクファイルでビルドアクターによってオーバーライドできるすべてを一元管理し、コード/ソースを含むディレクトリにロジックを残してください。 – gcb

2

コマンドライン(または環境)を通してすべてを送信しようとすると、私にとっては悪い考えです。これは、を発明したものです。

include config.mk 

をそれらが含ま取得する:すべてのあなたのメイクファイルでだけ使用し、別のファイルにconfig.mkのようなものを、あなたの共通の値を入れてください。

関連する問題