Makefile 이상한 변수 대체

Makefile 이상한 변수 대체

Makefile모습은 다음과 같습니다.

%.foo: %.bar
    cp $< $@

test: *.foo
    echo *.foo

내 디렉토리에는 2개의 파일이 있습니다: a.barb.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

관련 정보