내 Makefile
모습은 다음과 같습니다.
%.foo: %.bar
cp $< $@
test: *.foo
echo *.foo
내 디렉토리에는 2개의 파일이 있습니다: a.bar
및 b.bar
. 이것을 실행하면 make test
출력은 다음과 같습니다.
cp b.bar *.foo
echo *.foo
*.foo
*.foo
또한 현재 디렉터리에 파일을 생성합니다.
사실 나는 이것을 보기를 기대하고 있었다:
cp a.bar a.foo
cp b.bar b.foo
echo *.foo
a.foo b.foo
그리고 이것을 달성하는 방법은 무엇 a.foo
입니까 ?b.foo
답변1
이 경우 함수를 사용하여 와일드카드를 명시적으로 처리해야 합니다 wildcard
(적어도GNU가 만든다):
%.foo: %.bar
cp $< $@
foos = $(patsubst %.bar,%.foo,$(wildcard *.bar))
test: $(foos)
echo $(foos)
$(wildcard *.bar)
로 끝나는 모든 파일을 확장하고 .bar
, 다음으로 patsubst
바꾸기를 호출하면 모든 대상이 예상한 대로 처리됩니다..bar
.foo
답변2
처음에는 *.foo 파일이 없습니다. 따라서 make가 하는 일은 *.foo
문자 그대로 make를 만드는 방법을 찾는 것입니다. 첫 번째 규칙이 바로 그 일을 합니다. Make는 $<
첫 번째 전제조건( *.bar
이 경우에는 )으로 확장됩니다. b.bar
그런 다음 Make는 쉘 명령을 실행합니다 cp b.bar *.foo
. *.foo가 없기 때문에 쉘은 이를 cp b.bar *.foo
문자 그대로 확장합니다. 이것이 *.foo
파일을 얻는 방법입니다.
를 실행하여 이를 확인할 수 있습니다 make -d test
.
전제 조건 목록을 기반으로 목표 목록을 생성하여 원하는 것을 얻을 수 있습니다.
TARGETS = $(patsubst %.bar,%.foo,$(wildcard *.bar))
%.foo: %.bar
@cp $< $@
test: $(TARGETS)
@echo $(TARGETS)
echo *.foo