あるメイクファイルを別のメイクファイルから呼び出すと、予期しない結果が得られます。 2つのメイクファイルがあります。1つは/path/to/project/makefile
と呼ばれ、もう1つは/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番目のケースでは、適切なディレクティブを見つけることができます(出力が間違ったディレクトリを検索していることを示している場合) /path/to/project
の代わりに/path/to/makefile/gtest-1.4.0/make/
でrm
コマンドを実行します。
メイクファイルを相互に呼び出すための基本的な何かが欠けていますか?ひどい概念上の間違いを犯したか、よくある落とし穴に陥ったか?ディレクトリを効果的に変更し、最初のディレクトリから2番目のmakefileを呼び出すにはどうすればよいですか?私の理解では、make -f <name>
を呼び出すだけで十分だということでした。
これは、bashのmake/gmake 3.81です。
私はあなたが何を求めているのかはあまり明確ではありませんが、-f
コマンドラインオプションを使用すると、ファイルを指定するだけです-makeにディレクトリを変更するよう指示しません。別のディレクトリで作業を行う場合は、cd
ディレクトリに移動する必要があります。
clean:
cd gtest-1.4.0 && $(MAKE) clean
Makefile
の各行は個別のシェルで実行されるため、ディレクトリを元に戻す必要はありません。
make
の-f
の代わりに、-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
http://www.gnu.org/software/make/manual/make.html#Recursion
subsystem:
cd subdir && $(MAKE)
または、同等に、これ:
subsystem:
$(MAKE) -C subdir
$(TESTS)
が空であることが明らかであるため、1.4.0のmakefileは事実上
all:
clean:
rm -f gtest.a gtest_main.a *.o
確かに、すべては何の関係もありません。 cleanは、rm -f gtest.a ...
のとおりに実行します