GNU make에서 여러 확장자를 가진 목록에서 각 파일의 확장자를 변경하는 방법은 무엇입니까?


82

GNU 메이크 파일에서 파일 목록 입력으로 새로운 확장자로 파일 목록 출력을 만들 수 있는지 궁금합니다.

입력에서 다음 목록을 얻습니다.

FILES_IN=file1.doc file2.xls

그리고 FILES_IN 변수 에서 내 makefile에이 변수를 만들고 싶습니다 .

FILES_OUT=file1.docx file2.xlsx

가능합니까? 어떻게 ?

파일 목록을 구문 분석하고 각 확장자 (.doc, .xls)를 감지하여 올바른 확장자로 대체해야하기 때문에 상당히 어렵습니다.

답변:


141

공백으로 구분 된 파일 이름 목록에서 확장자를 대체하는 것은 일반적인 요구 사항이며이를위한 기본 제공 기능이 있습니다. x목록의 모든 이름 끝에 를 추가하려면 다음을 수행하십시오.

FILES_OUT = $(FILES_IN:=x)

일반적인 형식은 $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). 이것은의 값을 취하고이 접미사로 끝나는 각 단어의 끝을 다음으로 VARIABLE대체합니다 (일치하지 않는 단어는 변경되지 않은 상태로 남음). GNU make는이 기능 (모든 make 구현에 존재하는) 대체 참조를 호출합니다 .OLD_SUFFIXNEW_SUFFIX

방금 변경하려는 경우 .doc.docx.xls.xlsx이 기능을 사용하면 중간 변수를 사용해야합니다.

FILES_OUT_1 = $(FILES_IN:.doc=.docx)
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx)

약간 더 일반적인 구문을 사용할 수도 있습니다 $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). 이 기능은 GNU make에 고유하지 않지만 일반 접미사 변경 대체만큼 이식성이 없습니다.

: 당신은 같은 줄에 여러 대체 체인 수있는 GNU 메이크 기능도 있습니다 patsubst기능 .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))

3
또는 FILES_OUT := $(patsubst %,%x,$(FILES_IN))규칙이 실제로 그렇게 일반화 될 수 있다면.
tripleee

이 운영자의 이름은 무엇입니까? 설명서를 확인하고 싶은데 적절한 이름을 찾을 수 없습니다.
rph

1
@rkioji 무슨 연산자? 에 대한 GNU make 매뉴얼에 대한 링크를 제공합니다. $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)다른 무엇을 참조하고 있습니까?
Gilles 'SO- 사악한 중지

@Gilles 오 예, 링크를 보지 못했습니다. 나는 "대체"를 언급했다. 감사!
rph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.