[makefile] 다른 Makefile에서 Makefile을 호출하는 방법은 무엇입니까?

한 메이크 파일을 다른 메이크 파일에서 호출하는 예상치 못한 결과가 나타납니다. 하나는 호출 /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현재 작업 디렉토리에 들어간다고합니다. 첫 번째 경우에는 수행 할 작업이 없다고 생각하고 두 번째 경우에는 적절한 지시문을 찾을 수 있습니다 (출력이 잘못된 디렉토리를보고 있다고 말할 때). 대신 에서 rm명령 을 실행합니다 ./path/to/project/path/to/makefile/gtest-1.4.0/make/

서로 메이크 파일을 호출하는 데 근본적인 것이 있습니까? 심각한 개념상의 실수를 저질렀거나 일반적인 함정에 부딪 혔습니까? 어떻게 효과적으로 디렉토리를 변경하고 첫 번째에서 두 번째 makefile을 호출합니까? 내 이해는 단순히 부르는 것만 make -f <name>으로도 충분하다는 것입니다.

이것은 bash의 make / gmake 3.81입니다.



답변

나는 당신이 무엇을 요구하는지 너무 명확하지 않지만 -f명령 줄 옵션을 사용하여 파일을 지정하기 만하면됩니다. 이것은 make가 디렉토리를 변경하도록 지시하지 않습니다. 다른 디렉토리에서 작업 cd하려면 다음 디렉토리 로 이동 해야합니다 .

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

의 각 줄은 Makefile별도의 셸 에서 실행되므로 디렉토리를 다시 변경할 필요가 없습니다.


답변

대신의 -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


답변

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

 subsystem:
         cd subdir && $(MAKE)

또는 동등하게 다음과 같습니다.

 subsystem:
         $(MAKE) -C subdir


답변

$(TESTS)비어있는 것 같아서 1.4.0 메이크 파일이 효과적으로

all:

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

사실, 모두 할 일이 없습니다. 그리고 clean은 그것이 말하는 것과 정확히 일치합니다.rm -f gtest.a ...


답변