2011-10-26 6 views
1

내 메이크 다음과 같은 :업데이트하기 쉬운 메이크 파일은 어떻게 만듭니 까?

FOO_OBJECT_FILES := $(OBJDIR)/Foo.cpp.o 
BAR_OBJECT_FILES := $(OBJDIR)/Bar.cpp.o $(OBJDIR)Bar.c.o 
ALL_OBJECT_FILES := $(FOO_OBJECT_FILES) $(BAR_OBJECT_FILES) 

$(BINDIR)/Foo.a: $(FOO_OBJECT_FILES) 
    # Rules for making a static library out of Foo's object files go here. 

$(BINDIR)/Bar.a: $(BAR_OBJECT_FILES) 
    # This uses the exact same command sequence as the previous rule. 

$(BINDIR)/All.a: $(ALL_OBJECT_FILES) 
     # Ditto. 

# ... 

때 이상의 대상이 프로젝트에 추가됩니다 ( 아닌 경우), 개발자는 적어도 세 가지 업데이트해야합니다 :

  1. 목록을 새 대상의 개체 파일
  2. 모든 개체 파일 목록
  3. 다른 대상과 동일한 규칙을 사용하는 경우에도 새 대상을 만들기위한 대상

이 과정을 단순화하는 방법이 있습니까? 그렇지 않습니까?

와일드 카드 규칙을 사용했지만 매크로와 함께 작동하지 않는 것처럼 보입니다.

$(BINDIR)/%.a: $(%_OBJECT_FILES) 
    # ... 

개체 파일 목록을 규칙으로 처리 할 수 ​​있지만 최종 대상 규칙은 개체 파일에 직접 액세스 할 수 없습니다.

OBJECT_FILES_Foo: $(OBJDIR)/Foo.cpp.o 
OBJECT_FILES_Bar: $(OBJDIR)/Bar.cpp.o $(OBJDIR)Bar.c.o 
OBJECT_FILES_All: FOO_OBJECT_FILES BAR_OBJECT_FILES 

$(BINDIR)/%.a: OBJECT_FILES_% 
    # This rule can't see into the object file lists to use them to build. 

더 좋은 방법은 없을까요?

+1

* "더 좋은 방법이 없을까요?"* - 'automake'가 만들어진 종류가 아닙니다. 재귀 적으로 make를 호출하기 전에 일부 변수를 설정하여이 작업을 수행 할 수 있다고 생각하지만, 더 간단하거나 더 좋다고 생각하지 않습니다. – Flexo

답변

1

아마도 이렇게할만한 방법이 있습니다. 그러한 방법 중 하나는 다음과 같습니다. 새로운 목표를 위해 수행해야하는 모든 작업은 모듈 목록에 이름을 추가하고 모듈의 종속성 목록을 제공합니다.

 
BINDIR := bin 
OBJDIR := obj 

MODULES := Foo Bar 

Foo_OBJS := $(OBJDIR)/Foo.cpp.o 
Bar_OBJS := $(OBJDIR)/Bar.cpp.o $(OBJDIR)/Bar.c.o 

##################################################### 
#             # 
# Nothing below here should need to be altered. # 
#             # 
##################################################### 

All_OBJS := $(foreach mod, $(MODULES),$($(mod)_OBJS)) 

define rule 
$(BINDIR)/$(1).a: $($(1)_OBJS) 
    @echo 
    @echo 'Target: [email protected]' 
    @echo 'Deps : $$^' 
endef 

$(foreach lib, All $(MODULES), $(eval $(call rule,$(lib)))) 

########################################### 
#           # 
# The next part is just here for testing. # 
#           # 
########################################### 

.PHONY: all 
all: $(foreach lib, All $(MODULES),$(BINDIR)/$(lib).a) 

%.o: 
    @echo Making [email protected] 
1

약 1과 2를 많이 할 수는 없지만, 이것은 메이크가 추론 할 수없는 임의의 것입니다. 당신은 3 약간 향상시킬 수

$(BINDIR)/%.a: 
    # commands for making a static library 

# adding a new target: 
QUARTZ_OBJECT_FILES := $(OBJDIR)/Quartz.cpp.o $(OBJDIR)Arbitrary.o 
ALL_OBJECT_FILES += $(QUARTZ_OBJECT_FILES) 
$(BINDIR)/Quartz.a: $(QUARTZ_OBJECT_FILES) 

당신은 하나에 그 세 줄을 줄이기 위해 템플릿을 사용할 수 있습니다

$(eval $(call template, QUARTZ_OBJECT_FILES, $(OBJDIR)/Quartz.cpp.o $(OBJDIR)Arbitrary.o)) 

하지만 그것이 정말 가치가있다?

1

다른 답변은 수동 메이크 파일 쓰기에 대한 좋은 해결책을 제공했지만 automake를 사용하여 빌드 프로세스를 쉽게 수행 할 수 있습니다.