2012-08-09 3 views
1

빌드 프로세스의 일부로 m4로 일부 파일을 처리해야합니다. 이러한 파일은 '.in'확장자가 주어지며 최상위 디렉토리뿐만 아니라 하위 디렉토리에도 있습니다. 찾기를 사용하여 찾은 다음 쉘 루프에서 처리합니다.메이크 파일에서 m4로 파일 처리

출력 파일을 입력 파일과 같은 디렉토리에있는 파일 ('.in'확장자가 제거 된 파일)에 저장하는 간단한 규칙을 작성하는 일부 makefile 구문 마술이 있습니까?

내가 지금 내 메이크 파일에있는 것입니다 :

PROCESS_FILES=$(shell find . -name \*.in) 
WORK_FILES=$(subst .in,,$(PROCESS_FILES)) 



$(WORK_FILES): $(PROCESS_FILES) 
    for file in $(PROCESS_FILES); \ 
    do \ 
     m4 $$file > $${file%.*};\ 
    done 
+0

대답 아마 네,하지만 우리 중 일부는 m4에 익숙하지 않습니다. 지금 사용하고있는 (최소한의) 메이크 파일을 보여줄 수 있습니까? – Beta

+0

안녕하세요, 현재 사용중인 메이크 파일의 관련 섹션을 추가했습니다. – jira

답변

3

같은 것을 포함한다. 고전적인 표기법에서

, 그 같은 것입니다 :

# Not functional — see discussion 
.SUFFIXES: .in  # Add .in as a suffix 

M4  = m4 
M4FLAGS = 
M4SCRIPT = xyz.m4 

.in: 
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $* 

이 인식 된 접미사로 .in을 추가하고 당신이 지정된 명령을 사용하지 않고 파일에 .in 접미사 파일을 변환 말한다 3 개의 매크로로 $<은 확장명이 .in 인 파일의 이름입니다. $*은 확장자가없는 파일의 이름입니다.

변환 할 파일이 xyz.in과 같은 이름이고 xyz으로 변환해야하는 경우에만 해당 표기법이 작동합니다. xyz.h.inxyz.h으로 변환해야하는 경우에는 작동하지 않습니다.

접미사가 .h.in.h, 그러나 .h.in.h:make와 두 시작 사이의 변환에 대한 규칙 혼란 도착를되도록 지정하는 것이 가능하다. GNU 만들 그러나

이를 수용 할 수있는 접미사 규칙을 정의하기위한 대안 표기법이 있습니다

.SUFFIXES: .h.in .h  # Add .h.in and .h as suffixes 

M4  = m4 
M4FLAGS = 
M4SCRIPT = xyz.m4 

%.h: %.h.in 
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*.h 

%.h: %.h.in 라인은 두 개의 점으로 접미사를 처리 할 수 ​​있습니다. 유일한 불편은 .c.in 또는 .y.in 또는 .mk.in과 같은 각 확장에 대해 비슷한 매핑을 제공해야한다는 것입니다.

(맥 OS X 10.7.4에서 테스트. 그 메이크 xyz.mk 경우, 당신은 빈 파일 xyz.h.in을 만든 다음 make -n -f xyz.mk xyz.h을 실행하고 빌드 명령 m4 xyz.m4 xyz.h.in > xyz.h을 실행하는 것입니다 볼 수 있습니다.)

+0

고마워요. 조나단, 저에게 잘 맞습니다. – jira

0

당신은 소스 파일 path/to/file.in, %.in에서 %을 만들기위한 규칙, 모든해야 출력 파일 path/to/file에 대한 종속성이있는 경우 너는 필요해.

아마 당신은 find의 출력 측면에서 의존성을 표현하고 싶을 것입니다. GNU Make에서는 쉽습니다. 다른 방언으로, 아마 당신은 생성 할 그리고 당신은 그 접미사없이 파일 접미사 .in으로 파일을 변환하는 일련의 규칙을 쓸 수 find -name '*.in' | sed 's/\.in$//' >make.dep

관련 문제