객체 확장이 변경될 때 makefile의 패턴 규칙

객체 확장이 변경될 때 makefile의 패턴 규칙

나는 각각 .png 또는 .pdf를 생성하는 .asy 파일 목록이 있는 makefile을 작성하려고 합니다.

파일을 보고 올바른 확장자를 얻었으므로 생성된 소스 및 개체 목록이 있습니다.

asy_to_ext = $(shell sed -n \
    's#^settings.outformat *= *"\([a-z]*\)" *;#\1#p' \
    $(file) | tail -1)
ASY_SRC := $(wildcard *.asy)
ASY_EXT := $(foreach file,$(ASY_SRC),$(asy_to_ext))
ASY_OBJ := $(ASY_SRC:.asy=.$(ASY_EXT))

내 질문은 다음과 같습니다. 이제 각 객체가 해당 소스에 종속된다는 것을 어떻게 알 수 있습니까? 단일 확장을 사용하면 정적 패턴 규칙이 트릭을 수행합니다.

$(ASY_OBJ) : %.png: %.asy
    asy -noView -nointeractiveView $<

그러나 매뉴얼에서 와일드카드가 포함된 패턴 규칙처럼 보이는 항목을 찾을 수 없습니다. 예를 들어 $(ASY_OBJ) : %.*: %.asy제가 선호하는 소스 목록을 사용하는 경우입니다 $(ASY_OBJ) : $(ASY_SRC).

이중 콜론 규칙도 시도했지만 규칙 중 하나가 일치하지 않을 때까지 첫 번째 개체만 처리하고 이상적으로는 ASY_OBJ가 .pdf 또는 .png와 동일한 값을 가지더라도 찾고 있습니다.

$(ASY_OBJ) :: %.png: %.asy
    asy -noView -nointeractiveView $<
$(ASY_OBJ) :: %.pdf: %.asy
    asy -noView -nointeractiveView $<

답변1

드디어 방법을 찾았으니 스스로 답해보겠습니다. 해결책은두 번째 확장, 전제 조건 목록에서 자동 변수를 사용할 수 있습니다. 이렇게 하면 대상의 확장자가 무엇이든 제거하고 .asy로 대체할 수 있습니다.

또한 ASY_EXT를 가져오는 기능이 제대로 작동하지 않는다는 사실도 인식하지 못했습니다. 이 문제는 다음에 제공된 매핑 기능을 사용하여 해결되었습니다.수동.

# function returning the extension of the generated file
asy_to_ext = $(shell sed -n \
    's#^settings.outformat *= *"\([a-z]*\)" *;#\1#p' \
    $(1) | tail -1)
map = $(foreach a,$(2),$(call $(1),$(a)))

ASY_SRC := $(wildcard *.asy)
ASY_EXT := $(call map,asy_to_ext,$(ASY_SRC))
# build the target list by adding the computed extension to the basename of the sources
ASY_OBJ := $(join $(basename $(ASY_SRC)),$(addprefix .,$(ASY_EXT)))

.PHONY: asy
asy : $(ASY_OBJ)

# compute the prerequisite by adding .asy to the basename of the target
.SECONDEXPANSION:
$(ASY_OBJ) : $$(addsuffix .asy,$$(basename $$@))
    asy -noView -nointeractiveView $<

관련 정보