2013-11-28 2 views
1

전산 실험에서 의존성을 관리하기 위해 makefile을 사용하고 있습니다. 여러 패턴의 타겟을 갖는 것이 매우 유용합니다.Makefile의 다중 패턴

, I는 어떤 조건을 가질 수있다 (10)

현 방금 복사 및 붙여 넣기 (1)를 통해 말, A와 B, 그리고 다른 폴드 교차 검증 실험 (데이터 즉, 분할)라고 A와 B에 대해 동일한 명령과 접기에 패턴 일치가 있지만 두 가지 이상의 조건이있을 경우 신속하게 유지 관리 문제가됩니다.

output-%.A: input-% 
run A input-$* output-$*.A 

output-%.B: input-% 
run B input-$* output-$*.B 

메이크 파일에서 더 좋은 방법이 있습니까? 그렇지 않은 경우이 문제를 해결할 수있는 다른 도구는 무엇입니까?

답변

2

Make의 단점은 와일드 카드를 잘 처리하지 못한다는 것입니다. 그러나이 makefile의 중복을 최소화하는 방법이 있습니다. 같은 것들을 해석,

output-%.A: input-% 
    run A $< [email protected] 

output-%.B: input-% 
    run B $< [email protected] 

그런 다음 우리는 규칙 템플릿을 정의 A의 및 B에 적합한 지 평가하기 위해 call을 사용하고 eval :

먼저, 약간의 규칙을 정리 automatic variables를 사용하자 실제 규칙 :

define fold-rule 
output-%.$(1): input-% 
     @echo run $(1) $$< [email protected]  # <-- note the doubled '$' 
endef 

$(eval $(call fold-rule,A)) 
$(eval $(call fold-rule,B)) 

마지막으로 우리는 변수에 조건을 놓고, 반복 처리는 foreach를 사용하여 :

CONDITIONS := A B 

define fold-rule 
output-%.$(1): input-% 
     @echo run $(1) $$< [email protected] 
endef 

$(foreach x, $(CONDITIONS), $(eval $(call fold-rule,$(x)))) 

이제 새로운 조건을 추가하려면 첫 번째 행을 수정하십시오.

예쁘지 않지만 작동합니다. $[]

+0

"나는 꽤 이상하지 않다"는 것에 동의하지 않습니다. 그것은 옳은 일이며 얻는 것만 큼 귀엽습니다. –

+0

좋은 답변 주셔서 감사합니다. 이건 보통입니다. 그래서 받아 들일 것입니다. –

1

매크로 함수로 변수를 사용하여 같은 makepp의 몇 가지 기능을 사용하여 초기 evalution는 간단합니다 : 당신이 많은 규칙을 만들려면

define runner 
output-%.$1: input-% 
    run $1 $$(input) $$(output) 
enddef 

$[runner A] 
$[runner B] 
$[runner C] 

이 여전히 너무 될 수있다 말 수가 많은. foreach 함수의 문제점은 결과를 공백으로 결합한다는 것입니다. 따라서 규칙을 분리하려면 마지막 빈 행을 빈 행으로 입력하면됩니다.

define runner 
output-%.$1: input-% 
    run $1 $$(input) $$(output) 
$() 
enddef 

$[foreach type,D E F,$[runner $[type]]]