0

ディレクトリ内の特殊なMakefileが親ディレクトリ内のメインのMakefileに依存する場合に従うパターンは何ですか?

私は持っています:

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

/Makefile私が持っている:

TESTING_COMMAND=something
dotest1:
    make -C tests/ $@

/tests/makefile私は持っています

dotest1:
    $(TESTING_COMMAND) $?

私が実行した場合:

me@host:/ $ Make dotest1

できます。しかし、私がテストディレクトリから実行する場合:

me@host:/tests/ $ Make dotest1

$(TESTING_COMMAND)が空であるため、シェルでテストファイルを実行しようとします。そのため、最初の引数がシェルに渡されるコマンドになります。

/tests/または/src/ dirで実行された場合、必ずしもそれが機能する必要はありませんが、正常に失敗する方法が必要です。

4

2 に答える 2

2

コマンドライン(または環境)を介してすべてを送信しようとすることは、私には悪い考えのように思えます。それがインクルージョンが発明された理由です。共通の値をのような別のファイルに入れてconfig.mkから、すべてのmakefileで次を使用します。

include config.mk

それらを含めるために。

于 2012-04-11T06:00:23.343 に答える
1

あなたのデザインは私を怖がらせます、しかしこれはメインのMakefileのトリックをします:

TESTING_COMMAND=something
dotest1:
    make -C tests/ $@ TESTING_COMMAND=$(TESTING_COMMAND)

うまく失敗したい場合tests/Makefileは、いくつかのオプションがあります。その1つのターゲットのみがに依存してTESTING_COMMANDいる場合は、警告を出力して何もしないようにすることができます。

ifdef TESTING_COMMAND
dotest1:
    $(TESTING_COMMAND) $?
else
dotest1:
    @echo warning: TESTING_COMMAND not defined
endif

または、Makefile全体がそれに依存している場合は、Makeに警告を出力させるか、中止することができます。

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

サブメイク(実行するサブメイクtests/Makefile)を中止させても、それを呼び出したメイクプロセスの実行を継続することもできますが、それは一種の苦痛です。

于 2012-04-10T23:18:28.657 に答える