別のMakefileからMakefileを呼び出す方法は?


125

あるメイクファイルを別のメイクファイルから呼び出すと、予期しない結果が出ます。2つのmakefileがあり、1つは/path/to/project/makefileと呼ばれ/path/to/project/gtest-1.4.0/make/Makefileます。前者を後者と呼んでいる。/ path / to / project / makefileには、

dev: $(OBJ_FILES)
  $(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT)
  $(MAKE) -f ./gtest-1.4.0/make/Makefile

clean:
  rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
  rm -f ../svn-commit.tmp~
  rm -f $(BIN_DIR)/$(PROJECT)
  make -f gtest-1.4.0/make/Makefile clean

そして/path/to/project/gtest-1.4.0/make/Makefile私は

all: $(TESTS)

clean:
  rm -f $(TESTS) gtest.a gtest_main.a *.o

次の発行:

cd /path/to/project
make

出力:

make -f ./gtest-1.4.0/make/Makefile
make[1]: Entering directory `/path/to/project'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/path/to/project'

ただし、次のコマンドを発行すると、

cd /path/to/project
make clean

そうですか:

make -f gtest-1.4.0/make/Makefile clean
make[1]: Entering directory `/path/to/project'
rm -f  gtest.a gtest_main.a *.o
make[1]: Leaving directory `/path/to/project'

理解できません:どちらの場合も、/path/to/project/makefile現在の作業ディレクトリに入っていると言われます。最初のケースでは、それは実行する必要があると考えていません(実行する場合)。2番目のケースでは、適切なディレクティブを見つけることができます(出力が間違ったディレクトリを検索していることを示している場合)。ではなく、でrmコマンドを実行します。/path/to/project/path/to/makefile/gtest-1.4.0/make/

makefileを相互に呼び出すための基本的な何かが欠けていますか?深刻な概念上の間違いを犯したり、よくある落とし穴にぶつかったりしましたか?ディレクトリを効果的に変更し、最初のmakefile内から2番目のmakefileを呼び出すにはどうすればよいですか?私の理解は、単に電話make -f <name>するだけで十分だということでした。

これはbashのmake / gmake 3.81です。


3
私はmake -f gtest-1.4.0/make/Makefile cleanあなたの代わりに言う方がいいと思います$(MAKE) -C gtest-1.4.0/make clean。なぜ偽のターゲットを定義していないのですか?
dma_k

回答:


112

私はあなたが何を求めているのか本当にはっきりしていませんが、-fコマンドラインオプションを使用することはファイルを指定するだけです-それはmakeにディレクトリを変更するように指示しません。別のディレクトリで作業を行う場合は、そのディレクトリに移動する必要がありますcd

clean:
    cd gtest-1.4.0 && $(MAKE) clean

の各行Makefileは個別のシェルで実行されるため、ディレクトリを元に戻す必要はありません。


67
代わりに、手動でのcd「にINGのgtest-1.4.0DIR、あなたが使用する必要がある-Cのオプションをmake
2012年

29
または、少なくとも、&&cdコマンドとmakeコマンドの間で確実に使用する必要があります。それ以外の場合、CDが失敗しても実行されmake cleanます...間違ったディレクトリで!! また、あなたは常にONLY使用する必要があります$(MAKE)決して裸の単語、make、再帰します。つまり、次のようなものです cd gtest-1.4.0 && $(MAKE) clean
MadScientist

3
@テーダー:仕様に-C含まれ
Janus Troelsen

1
gnu-makeに関するこの質問-Cは仕様にあります:gnu.org/software/make/manual/make.html#Recursion
Cas

123

代わりの-fmakeあなたが使用する場合があります-C <path>オプションを選択します。これは最初にをパス ' <path>'に変更してから、makeそこで呼び出します。

例:

clean:
  rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
  rm -f ../svn-commit.tmp~
  rm -f $(BIN_DIR)/$(PROJECT)
  $(MAKE) -C gtest-1.4.0/make clean

1
この方法が最善のようです。cd端末が無限ループに入る原因となる他の応答が来ます。
gbmhunter 2013年

$(MAKE)-C gtest-1.4.0 / make cleanが機能しません。$(MAKE)-C gtest-1.4.0 clean
Arigion


1

$(TESTS)空であることは明らかなので、1.4.0 makefileは事実上

all: 

clean:
  rm -f  gtest.a gtest_main.a *.o

実際、何もする必要はありません。そして、クリーンはそれが言うことを正確に行いますrm -f gtest.a ...


$(TESTS)はa wildcardとa patsubstで定義されていますが、ディレクトリが効果的に変更されていないため、これらはメインのmakefileから空を返します。いい目。
Chris Tonkinson、2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.