저는 디렉토리 구조가 다음과 같은 프로젝트를 진행하고 있습니다.
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
.