패턴과 일치하는 모든 파일에 규칙을 적용하도록 make에게 지시하는 방법이 있습니까?

패턴과 일치하는 모든 파일에 규칙을 적용하도록 make에게 지시하는 방법이 있습니까?

저는 디렉토리 구조가 다음과 같은 프로젝트를 진행하고 있습니다.

inputs/
   a.txt
   b.txt
   c.txt

outputs/
   a.out
   b.out
   c.out

makefile

폴더의 파일은 outputs폴더의 파일에서 생성되며 inputs입력 파일 중 하나가 변경될 때마다 자동으로 업데이트하고 싶습니다.

나는 패턴 규칙을 사용하여 makefile을 생성하여 이를 수행하려고 했습니다. (질문을 간단하게 하기 위해 입력 파일을 변환하지 않고 복사만 했습니다)

outputs/%.txt: inputs/%.out
    cp $< $@

그러나 이 메이크파일은 내가 원하는 효과를 제대로 얻지 못합니다. 실행하면 make outputs/a.txt내가 작성한 규칙이 적용되고 출력 파일이 오래된 경우 출력 파일이 재생성됩니다. 그러나 방금 실행하면 다음과 같습니다 make.

make: *** No targets.  Stop.

기본적으로 입력 폴더의 각 파일에 대해 출력 파일을 생성하고 싶다는 것을 make에게 알릴 수 있는 방법이 있습니까?

편집하다: 출력 파일이 입력 파일과 다른 파일 접미사를 갖게 됩니다.

답변1

일반적으로 다음과 같은 makefile을 사용하여 이 작업을 수행합니다.

IN = $(wildcard inputs/*.txt)
OUT = $(subst inputs/,outputs/,$(IN))

outputs/%.txt: inputs/%.txt
        cp $< $@

default:  $(OUT)

이로 인해 기본 대상(파일의 첫 번째 대상)이 OUT디렉터리 문자열이 입력에서 출력으로 변경되는 기존 파일의 전역 확장에 종속됩니다.IN


접미사를 변경하려는 경우 대상에서 작동하는 다른 내장 함수가 많이 있습니다. 예를 들어 중간 작업을 추가할 수 있습니다.

IN2 = $(addsuffix .out,$(basename $(IN)))

basename함수는 후행을 제거 .txt하고 addsuffix후행을 추가합니다 .out.

관련 정보