2012-10-23 3 views
1

I 다음 메이크 파일이 : 나는 DIR/%/abc.txt가 생성 될 때마다 DIR/%/def.xtx을 생성 할메이크 : 묵시적 규칙 : 같은 목표 다른 전제 조건

all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt 

DIR/%/abc.txt: DIR/%/def.xtx # rule #1 
    mkdir -p $(@D) 
    touch [email protected] 

DIR/%.txt: # rule #2 
    mkdir -p $(@D) 
    touch [email protected] 

DIR/%.xtx: 
    touch [email protected] 

을; 그렇지 않으면 DIR/%.txt 만 생성하십시오.

그러나 위의 makefile을 GNU Make 3.81과 함께 사용하면 DIR/3/abc.txt 만 생성되고 DIR/%/def.xtx은 생성되지 않습니다. 우리가 얻을 GNU 수 있도록 사용자 설명서에있는 "묵시적 규칙 검색 알고리즘"다음

:

(1) N라는 디렉토리 부분이라고 D 및 나머지로 분할 t. 예를 들어, t가 'src/foo.o'이면 d는 'src /'이고 n은 'foo.o'입니다. DIR/3/abc.txt, d = DIR/3n = abc.txt를 들어

.

(2) 대상이 t 또는 n과 일치하는 모든 패턴 규칙의 목록을 만듭니다. 대상 패턴에 슬래시가 있으면 t와 일치합니다. 그렇지 않으면 n에 대해.

규칙 # 1과 # 2가 일치합니다.

(3) 해당 목록에있는 규칙이 모두 일치 규칙이 아닌 경우 목록에서 모든 비 - 말기 일치 항목 규칙을 제거하십시오.

확실히 : 목록에서 규칙이 제거되지 않습니다.

(4) 제조법이없는 모든 규칙을 목록에서 제거하십시오.

규칙이 제거되지 않았습니다.

(5)에서의 각 패턴 규칙 :

(5.A) 상기 타겟 패턴의 '%'와 일치하는 t의 비어 있지 않은 부분 또는 N이고 스템 (S)을 찾기 .

규칙 # 1의 경우, s = 3. 규칙 # 2 용 , s = 3/abc

(5.b) '%'를위한 S 치환하여 사전 이름을 계산한다; 대상 패턴에 슬래시가 없으면 d를 각 전제 조건 이름의 앞에 추가하십시오.

규칙 # 1의 경우 : DIR/3/abc.txt: DIR/3/def.xtx 규칙 # 2에는 전제 조건이 없습니다.

(5.c) 모든 필수 구성 요소가 존재하는지 또는 존재해야하는지 테스트합니다. (파일 이름이 메이크 파일에서 대상 또는 명시 적 선행 조건으로 언급되는 경우, 파일 이름이 있어야한다고 말합니다.)

확실하지 않은 경우 : DIR/3/def.xtxDIR/%.xtx:으로 언급됩니다.

이 길고 긴 설명 후, 제 생각으로 저는 (5.c)에서 틀렸을 것입니다. the manual에서

+0

틀릴 수도 있지만,'%'는 무언가와'/'가 일치 할 것이라고 생각하지 않습니다. 그러므로 위의 내용이'Makefile'의 전부라고 가정하면'DIR/3/def.txt'와 일치하는 규칙이 없으며'make'는''DIR/3/def.txt "또는 그 라인을 따라 뭔가. – twalberg

+0

그것 [%]는 것들을'/'와 일치시킵니다; 그렇지 않으면'DIR/0/a.txt','DIR/1/b.txt' 그리고'DIR/2/c'는 건드리지 않을 것입니다; 하지만 그들은 그렇습니다. –

+0

새로운 것을 배웠습니다 ... 효과가있는 것 같습니다. 그래서, 아마도'DIR/3/def.xtx'는 제 3의 규칙에'mkdir' 부분이 없기 때문에 생성되지 않을 것입니다. 'DIR/3/abc.txt'의 전제 조건이기 때문에 디렉토리가 존재하기 전에 먼저 빌드해야하기 때문에 규칙 1의'mkdir'은 규칙 3을 실행하기 전에 발생하지 않습니다. – twalberg

답변

3

,

그 전제 조건이 실제로 존재하거나 언급 항상 다른 묵시적 규칙을 체인 에 의해 이루어져야 전제 조건으로 규칙보다 우선하는 규칙입니다.

규칙 # 1은 체인을 필요로하지만 규칙 # 2는 전제 조건이 없으므로 DIR/3/abc.txt을 만들 때 # 1을 # 2 위로 선택합니다.

편집 : 당신은 디렉토리 목록을 감당할 수 있다면

가 :

all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt 

ABC_TXT := $(addsuffix /abc.txt, $(DIRS)) 

$(ABC_TXT): DIR/%/abc.txt : DIR/%/def.xtx 

DIR/%.txt: 
    mkdir -p $(@D) 
    touch [email protected] 

DIR/%.xtx: 
    touch [email protected] 

을 (그리고 그것은 중복을 피할 수 :

DIRS := DIR/0 DIR/1 DIR/2 DIR/3 

그때 당신은 static pattern rule와 함께 할 수 있습니다 .txt 규칙의!)

+0

규칙 # 1보다 규칙 # 2가 선택되는 이유에 대한 답을 얻을 수 있지만 어떻게이 동작을 피할 수 있습니까?! –

+0

레시피에서 제반 사항을 명시 적으로 만들 수 있습니다 (즉,'make DIR/$ */def.xtx').하지만 매우 비효율적입니다. 다른 방법이 있습니까?! –

+0

@AdrianoCarvalho : 그것에 작업 중 ... – Beta