2010-11-19 40 views
3

하위 디렉토리의 makefile을 포함하는 Makefile이 있습니다. 그러나 내가 원하는 것은 이러한 "하위"메이크 파일을 선택된 대상의 기본에 포함시키는 것입니다.은 대상에 따라 파일을 포함합니다.

배경은 하위 메이크 파일이 다른 개체 파일을 정의하고 이러한 개체 파일에 따라 대상 실행 파일을 만들어야한다는 것입니다. 서브 makefile1 가정

가변

 
OBJECTS := foo.o foo1.o 

서브 makefile2가

 
OBJECTS := bar.o bar1.o 

세트와 일반 규칙 것 설정 :

 
lib/%.so: $(OBJECTS) 
    link $^ -o [email protected] 

목표가있다 (예를 들어) :

 
foo: lib/foo.so 
 
bar: lib/bar.so 

반면 대상 foo는 foo 메이크 파일, 대상 막대 bar-makefile을 포함해야합니다.

이 상황을 어떻게 처리 할 수 ​​있습니까?

덕분에, 기독교

답변

2

당신이 요구하고 특정 일 - 조건 포함 - 만들기에 어렵다. 그것은 할 수 있지만 우아한 아니에요.

원하는 효과를 얻으려면 여러 가지 방법이 있습니다. MAKECMDGOALS에서 조건부를 사용할 수 있습니다. makefile에서 두 번째 makefile을 호출하고 사용할 하위 디렉토리의 이름을 전달할 수 있습니다. 그러나 (상황에 대한 자세한 내용을 모른 채) 나는이 방법은 tidiest 생각 :

include sub-makefile1 
FOO_OBJECTS := $(OBJECTS) 

include sub-makefile2 
BAR_OBJECTS := $(OBJECTS) 

lib/%.so: 
    link $^ -o [email protected] 

lib/foo.so: $(FOO_OBJECTS) 

lib/bar.so: $(BAR_OBJECTS) 

foo bar : % : lib/%.so 

이 (당신은 한 줄 또는 두 개의 저장 foo_OBJECTS 같은 변수 이름을 가진 영리한 될 수 있지만, 그 반대 좋습니다.)

+0

감사합니다! 사실, 나는 lib/% .so : 규칙에 대한 전제 조건이나 lib/foo.so : 규칙에서 전달 된 사실을 알 필요가 없다는 것을 알지 못했다. 또한 정적 패턴 규칙을 가진 것은 새로운 것입니다. 당신은 제가 찾고있는 것과 정확히 같습니다. –

2

베타는 $(MAKECMDGOALS)을 언급하지만, 그것을 설명하지 않은 : make가 대화 형으로 호출 될 때에만 작동으로

ifeq ($(MAKECMDGOALS),foo) 
include sub-makefile1 
endif 
ifeq ($(MAKECMDGOALS),bar) 
include sub-makefile2 
endif 

# Rest of Makefile follows... 

이 같은 좋은 생각이 아니다. 당신은 재귀 적 make를 호출 foobar을 위해 만드는 규칙에 의해이 문제를 해킹 할 수 있습니다 귀하의 답변에 대한

ifeq ($(MAKECMDGOALS),foo) 
include sub-makefile1 
foo: # ... 
    # Normal commands to build foo 
else 
foo: 
    $(MAKE) $< 
endif 

ifeq ($(MAKECMDGOALS),bar) 
include sub-makefile2 
bar: # ... 
    # Normal commands to build bar 
else 
bar: 
    $(MAKE) $< 
endif 
관련 문제