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


125

한 메이크 파일을 다른 메이크 파일에서 호출하는 예상치 못한 결과가 나타납니다. 하나는 호출 /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입니다.


3
나는 make -f gtest-1.4.0/make/Makefile clean당신 대신에 $(MAKE) -C gtest-1.4.0/make clean. 왜 가짜 표적을 정의하지 않았습니까?
dma_k 2010-06-22

답변:


112

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

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

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


67
수동으로 dir로 이동 cd하는 대신 옵션을 gtest-1.4.0사용해야합니다 . -Cmake
Tader 2014 년

29
또는 최소한 &&cd와 make 명령 사이에 확실히 사용해야 합니다. 그렇지 않으면 cd가 실패하면 여전히 실행됩니다 make clean... 잘못된 디렉토리에서 !! 또한 $(MAKE)재귀 make할 때 항상 맨손이 아닌을 사용해야 합니다. : 뭔가 같은 cd gtest-1.4.0 && $(MAKE) clean
매드 사이언티스트

3
@Tader : 사양에-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 메이크 파일이 효과적으로

all: 

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

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


$ (TESTS)는 a wildcard및 a로 정의 patsubst되지만 디렉터리가 효과적으로 변경되지 않았기 때문에 기본 메이크 파일에서 빈 값을 반환합니다. 좋은 눈.
Chris Tonkinson 2010
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.