GNU Makefile 놀라움

GNU Makefile 놀라움

저는 GNU make를 사용하여 간단한 2단계 프로젝트 Makefile을 구축하려고 합니다.

내가 따르고 싶은 논리는

  1. gcc -M먼저 (를 통해 ) 종속성을 구축합니다.
  2. 두 번째 단계 빌드를 위해 생성된 .dep 파일을 Makefile에 포함했습니다.

내 프로젝트의 관련 부분은 다음과 같습니다.

MAKEDEP:=$(CXX) $(CXXFLAGS) -M
ALL_SRCS:=$(ALL_OBJS:.o:.cc)
CXX_DEPS:=$(patsubst %.o,.%.dep,$(ALL_OBJS))

-include $(CXX_DEPS)

%.o: %.cc .%.dep
        $(CXX) $(CXXFLAGS) -c -o $@ $<

.%.dep: %.cc
        $(MAKEDEP) -o $@ $<

clean:
        $(RM) -vf $(ALL_OBJS) $(ALL_LIBS) $(ALL_APPS)

dep: $(CXX_DEPS)

한 가지 예외를 제외하고는 모든 것이 잘 작동합니다.을 실행하면 make clean종속성이 다시 빌드됩니다!clean: dep단순한 선이 아닌 선이 있는 것과 같습니다 clean:.

$ make clean
g++ -Wall -std=c++11 -M -o .file1.dep file1.cc
g++ -Wall -std=c++11 -M -o .file2.dep file2.cc
g++ -Wall -std=c++11 -M -o .file3.dep file3.cc
rm -vf file1.o file2.o file3.o app
$

배경은 무엇입니까? 정리하기 전에 종속성을 다시 빌드해야 하는 이유는 무엇입니까? 나는 그런 의존을 하지 않았다.

답변1

make에 이러한 파일을 포함하도록 요청했기 때문에 make는 규칙에 따라 빌드합니다.

이제 프로젝트에서 이 문제를 어떻게 해결했는지 기억해 보겠습니다.

먼저 우리는 어쨌든 대상 파일을 빌드해야 하기 때문에 처음에는 추가 종속성에 대해 신경 쓰지 않는다는 것을 깨달으십시오.

.cc그런 다음 종속성을 추가(또는 제거)하는 경우 이미 종속된 항목( 기존 항목 또는 그 중 하나 ) 을 변경해야 합니다 .h.

요약하면 현재 상태의 전체 종속성 목록이 필요하지 않으며 이전 상태의 종속성으로 충분합니다. 따라서 .deps를 s와 동시에 빌드 할 수 있습니다 .o(단 하나의 패스만 필요하므로 더 빠릅니다 CC).

[다음 포인트는 잘 모르겠습니다]

이제 종속성을 부트스트랩해야 합니다. a가 생성될 .dep때마다 더미(빈) 파일을 생성하는 규칙을 작성합니다 .cc(매우 빠를 수 있음).

이제 이러한 더미 .dep파일을 생성한 다음 정리해야 합니다. 재귀적 make를 피하는 경우 오류를 해결하기 위해 정리가 필요하지 않습니다(디스크 공간을 절약하기 위해 정리만 하면 됩니다).

마지막 단계는 한 수준의 재귀를 추가하는 것입니다(재귀적 make는 (일반적으로) 해로운 것으로 간주된다는 점을 기억하십시오)http://lcgapp.cern.ch/project/architecture/recursive_make.pdf)

실행할 수 없는 규칙을 처리하기 위해 또 다른 makefile을 호출하는 깨끗한 규칙을 위한 간단한 makefile을 작성하십시오.

아마도 마지막 단계만 필요할 것입니다. 하지만 답변의 시작 부분은 makefile을 개선하는 방법을 보여주기 때문에 삭제하지 않겠습니다.

관련 정보