151

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

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

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

4

4 に答える 4

139

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

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

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

于 2010-02-05T09:30:18.783 に答える
138

の代わりに-f、オプションmakeを使用したい場合があり-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
于 2012-05-02T14:38:55.390 に答える
53

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

 subsystem:
         cd subdir && $(MAKE)

または、同等に、これ:

 subsystem:
         $(MAKE) -C subdir
于 2013-08-02T10:51:55.830 に答える
1

空であることは明らかで$(TESTS)あるため、1.4.0 makefile は効果的に

all: 

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

確かに、すべては何の関係もありません。そしてクリーンはそれが言うことを正確に行いますrm -f gtest.a ...

于 2010-02-05T10:17:32.387 に答える