2017-10-02 3 views
0

は以下のMakefile-fオプションを指定してmakefileを呼び出すと、サブメイクを呼び出すルールが破られるのはなぜですか?

prereqrule: 
     @echo "Executing prereqrule" 

submakerule: 
     @echo "Executing submakerule" 

check: prereqrule 
     [email protected]$(MAKE) submakerule 

が、私は別のディレクトリからチェックルールを実行することを検討してください。最初のアプローチは2番目のアプローチでは機能しません。

$ make -C MakefileQuestion check 
Executing prereqrule 
Executing submakerule 

submakeruleが-f

$ make -f MakefileQuestion/Makefile check 
Executing prereqrule 
make[1]: *** No rule to make target `submakerule'. Stop. 
make: *** [check] Error 2 

を見つけることができない-fバージョンが生成されたサブ作る呼び出しでsubmakeruleを見つけることができない理由は何ですか?


私はこれを「修正」しています。 $THIS_FILEパラメータを使用します。用

THIS_FILE := $(lastword $(MAKEFILE_LIST)) 
workingcheck: prereqrule 
     [email protected]$(MAKE) -f $(THIS_FILE) submakerule 

作品

$ make -C MakefileQuestion workingcheck 
Executing prereqrule 
Executing submakerule 
$ make -f MakefileQuestion/Makefile workingcheck 
Executing prereqrule 
Executing submakerule 

-fアプローチが動作しない理由を私は主に興味を持ってに近づく両方。 2つのユースケース(-C-f)のmakeの実装では、2番目のサブケースに-f $THIS_FILEが渡される必要があります。

答えて

0

変数MAKEの値は、makeが呼び出されたファイル名です。 -fまたは-tのような他のパラメータは含まれません。実行した場合、最初に実行したことを除いて、他の再帰的なmakeコマンドを実行することはできません。意味がありません。

-Cは、シェルが最初にディレクトリを変更するように指示するために機能します。これにより、ディレクトリを明示的に指定することなく、その後のmakeを実行することができます。

+0

これはどのように動作するのですか?$(MAKE)変数に関連しています。その[doc](https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html)によれば、 '/ bin/make'のような値をとりますが、私の場合は'/Applications/Xcode。app/Contents/Developer/usr/bin/make' –

+0

また、なぜ '-f $(THIS_FILE)'を明示的に渡す必要があるのか​​尋ねていません。私はなぜそれが最初に必要なのか理解していない。 –

0

私は今起こっていることを理解していると思います。私はmakeについてより根本的な混乱がありました。

次のルール

check: prereqrule 
     [email protected]$(MAKE) submakerule 

pwdから

/Applications/Xcode.app/Contents/Developer/usr/bin/make submakerule

を実行させます。

実行ディレクトリにMakefileが含まれていないため、makeはそのエラーを出力します。

これに似ています。 -f $(THIS_FILE)を渡す

~/DirWithoutMakefile$ make check 
make: *** No rule to make target `check'. Stop. 

pwd内の任意のメイクファイルを見つけることではないのではなく、右のメイクファイルを使用しています。

関連する問題