2013-03-10 3 views
2

필자는 메이크 파일에서 자동 의존성을 사용하려고 잠시 동안 노력해 왔지만, 단지 프로젝트를 퍼팅하는 것보다 더 복잡한 구조를 사용하기 때문에 많은 노력이 필요하다. 루트 폴더의 모든 파일 내 메이크 파일에이 코드 조각을 사용하려고했습니다메이크 파일과 프로젝트 디렉토리 구조의 자동 의존성

:

OBJECTS_DIR = obj/ 
SRCS_DIR = src/ 
#source files list, i.e : src/foo.cpp src/bar/foo2.cpp 
SOURCES = $(shell find $(SRCS_DIR) -name \*.cpp | xargs -d '\n') 
#object files list, i.e : obj/foo.o obj/foo2.o 
OBJECTS = $(addprefix $(OBJECTS_DIR), $(notdir $(SOURCES:.cpp=.o))) 
DEPS = $(OBJECTS_DIR)make.dep 

myproject : $(OBJECTS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ 

$(OBJECTS) : $(SOURCES) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] -c $(filter %/$(notdir $(@:.o=.cpp)), $(SOURCES)) 

$(DEPS): $(SOURCES) 
    $(CC) -MM $(SOURCES) > $(DEPS) 

-include $(DEPS) 

all : myproject 

clean : 
    @-rm -f $(RELEASE_DIR)* $(OBJECTS_DIR)* 

나는 OBJ/make.dep 파일의 모든 종속성을 저장하고 싶습니다. 이것은 (여기 푸에서는 foo2 포함) 나에게 다음과 같은 출력을 제공합니다

foo2.o: src/bar/foo2.cpp src/bar/headers/foo2.h 
foo.o: src/foo.cpp src/bar/headers/foo2.h 

나는 다음과 같은 출력을하기 위해 오브젝트 파일의 각 이름을 변경하고 싶습니다 : OBJ/foo2.o : SRC/바 /에서는 foo2 .cpp src/bar/headers/foo2.h obj/foo.o : src/foo.cpp src/bar/headers/foo2.h

결과가없는 -MT 옵션을 사용해 보았습니다. 또한, -include $ (DEPS)는 내가 만든 종속성을 포함 할 정도로 충분합니까? make.dep 파일에 기록 된 행에 의해 OBJECT 규칙에서 $ (filter %/$ (notdir $ (@ :. o = .cpp)), $ (SOURCES)를 대체하지 않아야합니까?

통찰력을 미리 주셔서 감사합니다. 다른 방법으로 메이크 파일을 개선 할 수 있는지 알려주세요.

답변

1

1 개의 파일에 모든 종속성을 저장하는 이유는 무엇입니까? 일반적으로 각 객체 파일에는 컴파일 중에 만들어진 자체 .d 파일이 있으며 그 파일은 -include입니다. 그런 경우에 -MT 플래그 등을 초기 컴파일과 동일한 명령에 추가하여 오브젝트 디렉토리와 이름을 올바로 가져 오는 것이 훨씬 더 간단합니다.

나는이 질문에 대한 답변의 라인을 따라 뭔가 더 할 것 :

make include directive and dependency generation with -MM

좋은 점은 당신이 필요하지 않을 수 있도록 모든 종속성 세대는 컴파일 단계에서 일어날 것입니다 gcc를 추가로 호출하십시오. 하나의 파일에 모든 의존성을 갖는 것은 아마도 작은 파일에 대해서는 괜찮을 것이지만, 메이크 파일을 확장하려는 경우에는 위와 같은 일을하는 것이 가장 좋습니다.

+0

모든 종속성을 포함하는 하나의 파일 만 만들 것입니다. 영감으로 [이 링크] (http://stackoverflow.com/questions/1979912/problem-generating-dependencies-in-makefile-using-mm)를 사용했습니다. – Aserre

+0

댓글을 달기 위해 업데이트되었습니다. – ThePosey

+0

감사합니다. 나는 1 개의 큰 파일이 더 빨랐을 것이라고 생각했다. .. – Aserre

1

.o 파일을 생성하려면 패턴 규칙을 사용해야합니다.

$(OBJECTS_DIR)/%.o : %.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

OBJECTS_DIR을 대상 경로에 추가하려면 종속 파일을 처리해야합니다. sed은 이것을 간단하게 만듭니다. 또한 파일을 .h에 의존하기를 원할 수도 있습니다.

$(DEPS): $(SOURCES) $(shell find . -name '*.h') 
     $(CC) -MM $(SOURCES) | sed 's#^\(.*:\)#$(OBJECTS_DIR)\1#' > $(DEPS)