2009-06-10 7 views
8

n 튜플 목록을 사용하여 정리할 수있는 Makefile을 많이 작성하고 있습니다. 그러나 나는 이것을 제대로 (그리고 깔끔하게) 할 방법을 찾을 수 없다. 지금까지 나는 $ (쉘 ...)tr, sed 또는 그 외의 메이크 파일 표준을 사용하여 만 나왔습니다. 예를 들어Makefile에서리스트를 반복 할 수 있습니까?

, 나는이 일을하고 싶습니다 : 메이크에 N -tuple 목록을 반복 할 수있는 좋은 방법이

XYZs = \ 
    dog.c pull_tail bark \ 
    duck.c chase  quack \ 
    cow.c tip  moo 

all: 
    @- $(foreach X Y Z,$(XYZs), \ 
     $(CC) $X -o bully/$Y ; \ 
     ln bully/$Y sounds/$Z ; \ 
    ) 

있습니까? 감사!

답변

10

Makefile은 기본적으로 선언적이므로 본인 스스로가 원하는 것을 제공한다고 생각하지 않습니다. 그러나 특정 문자열 값을 특정 대상과 연관시키려는 것 같으므로 GNU make의 Target specific variable values 기능이 유용 할 수 있습니다. 변수 값의 모든 종속성에 대한 효과 도 것을 당신이 목표 특정 변수, 를 정의 때 대상 특정 변수의 또 하나의 특징은

있다

:이 설명서에서 발췌 한 것입니다 이 대상은 입니다 (종속성이 의 고유 한 대상 지정 변수 값보다 우선하지 않는 한). 따라서, 예를 들어,이 같은 문 :

prog : CFLAGS = -g

prog : prog.o foo.o bar.o

prog에 대한 명령 스크립트에서 -gCFLAGS을 설정하지만, 그것은 또한 명령에 -gCFLAGS를 설정합니다 prog.o, foo.o, 및 bar.o를 작성하는 스크립트 및 해당 종속성을 작성하는 모든 명령 스크립트 .

아직 읽지 않았다면 GNU make 설명서가 꽤 좋습니다.

편집 : 당신이 당신의 의견에 대한 질문 일을하려면

dog: ANIMAL=dog.c BULLY=pull_tail SOUND=bark 

사용 : 당신은 거꾸로하고있는

dog: ANIMAL=dog.c 
dog: BULLY=pull_tail 
dog: SOUND=bark 
+0

쿨하고 중간에있을 수 있습니다! 이 작업을 수행하는 구문이 있습니까? 개 : ANIMAL = dog.c BULLY = 풀 _ 소리 SOUND = 나무 껍질 – Dylan

+0

+1, 아주 좋네요. –

+2

문제는 make가 선언적이라는 것이 아니라 자주 사용되는 패턴에 대한 선언적 구문을 제공하지 않는다는 것입니다. – reinierpost

0

.

당신은 스크립트 인 것처럼 다루려고합니다. 그것은 Y가 아니라 X를 생성하는 방법에 관한 일련의 규칙입니다. 그런 다음 make 엔진은 그 결과를 얻기 위해 일어날 필요가있는 것을 파악합니다.

예를 들어 실제로 생성 단계에 스크립트를 사용해야합니다. 아마 make에서 호출하는 것이지만, CC에 대한 처리를하게하십시오.

+4

이것은 처음에는 존재할 이유가없는 make의 한계이며 어쨌든 $ (foreach)로 해결할 수 있습니다. – reinierpost

2

내가 아는 바는 없지만 그것이 강제로 명령형 언어로 작동하도록 만들었 기 때문입니다.GNU에서

는 아마 같은 것을 할 싶어합니다 .c 인 파일을 당신을 위해 연결을 처리하기위한 기본 규칙을, 더 나은 아직

pull_tail : SOUND=bark 
pull_tail : dog.c 
     $(CC) $< -o $^ 
     ln [email protected] $(SOUND) 

chase : SOUND=quack 
chase : duck.c 
     $(CC) $< -o $^ 
     ln [email protected] $(SOUND) 

... 

또는를 재정의하지만 이름의 이상한 구조 (프로그램 이름은 소스 이름과 어휘 관계가 없습니다).

당신이 손 편집의 많은없이 신속하게 재 구축 할 수 있도록하려면 무엇을, 당신은 아마 데이터로부터 메이크 framgment를 다시 생성 및 확인 GNU의 include 기능을 사용하는 스크립트를 작성하려면

...

5

foreach에서 GNU Make 매뉴얼을 확인합니다. 다음은 다른 프로젝트에서 사용한 임의의 저널입니다 ... 예제는 불완전하지만 어쩌면 아이디어를 줄 수 있습니까? 나는 더 많은 시간을 가지고있는 경우에 나는

REMAKE_PROGS:= dog duck cow 

XYZs = \ 
    dog.c pull_tail bark \ 
    duck.c chase  quack \ 
    cow.c tip  moo 

$(foreach src, $(XYZs), $(eval $MAKE $(src)) 

$(REMAKE_PROGS): 
     @echo "\n# === [email protected] linking\n" 
     $(call compile,[email protected],$([email protected]),$(CXX),$(MPICXX),$(LDFLAGS) $(LIBS) $(SYSLIBS) $(OTHER_LIB) $(EXTRA_LD_FLAGS)) 
     @echo "\n# --- [email protected] compiled\n" 

define compile 
    @mkdir -p $(dir $(1)) 
    $(if ${ANNOUNCE},@echo "\n# +++ ${MAKECMDGOALS} compiling\n" $(eval ANNOUNCE=)) 
    $(call compiler,$(1),NOMPI,$(3),$(4)) 
    $(eval MY_FLAGS=$(FLAGS_$(1)) $(5)) 
    $(if $(filter %xlf %xlf90,$(COMPILER_$(1))),$(eval MY_FLAGS:=$(MY_FLAGS:-D%=-WF,-D%))) 
    $(strip $(COMPILER_$(1)) $(2) $(MY_FLAGS) -o $(1)) 
endef 
+0

foreach-call-make가 아니라 foreach-eval-call을 사용하고 있습니다. 이것은 추한 것입니다. http://www.gnu.org/software/automake/manual/make/Eval-Function.html#Eval-Function – reinierpost

0

당신은 oc 파일을 컴파일과 같은 확장자를 가진 파일의 집합에 대한 기본 규칙을 사용할 수 있습니다 ... 나중에 정리 수 있습니다. 물론 특별한 파일 확장자에 국한되지 않습니다. .c 일련의 파일을 컴파일을 위해이 같은 그것을 할 수 :

OBJS = foo.o bar.o baz.o 
OUT = myprog 

all: $(OBJS) 
     $(SILENT) echo "LD [email protected]" 
     $(SILENT) $(CPP) -o $(OUT) $^ $(LDFLAGS) 

%.o: %.c 
     $(SILENT) echo "CC $<" 
     $(SILENT) $(CC) $(CCOPTS) -o [email protected] -c $< 
+0

을 참조하십시오. 문제는 "현재 $ (OBJ) 값"을 패턴 규칙. GNU make는 선언적 문법을 제공하지 않으며 $ (foreach)는 추악한 (그러나 완벽하게 기능하는) 해결책이다. – reinierpost

6

감사를 힌트 - 일부 해킹 후 나는 이것이 내가 바라던 더 생각 :

XYZs = \ 
    dog.c:pull_tail:bark \ 
    duck.c:chase:quack \ 
    cow.c:tip:moo 

all: 
    @- $(foreach XYZ,$(XYZs), \ 
     $(eval X = $(word 1,$(subst :, ,$(XYZ)))) \ 
     $(eval Y = $(word 2,$(subst :, ,$(XYZ)))) \ 
     $(eval Z = $(word 3,$(subst :, ,$(XYZ)))) \ 
     \ 
     $(CC) $X -o bully/$Y ; \ 
     ln bully/$Y sounds/$Z ; \ 
    ) 

수있는 사람 더 잘하니?

관련 문제