web-dev-qa-db-ja.com

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

あるメイクファイルを別のメイクファイルから呼び出すと、予期しない結果が得られます。 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です。

110
Chris Tonkinson

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

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

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

97
anon

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
112
Tader

http://www.gnu.org/software/make/manual/make.html#Recursion

 subsystem:
         cd subdir && $(MAKE)

または、同等に、これ:

 subsystem:
         $(MAKE) -C subdir
31
Aadishri

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

all: 

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

確かに、すべては何の関係もありません。 cleanは、rm -f gtest.a ...のとおりに実行します

1
John Knoeller