gnu make의 동작에 관한 질문이 있습니다. 특히, 종속성 대상이 아직 존재하지 않는 파일을 생성하면 "마스터"대상이 완료되면 삭제됩니다.주요 타겟이 완료되면 종속성에 의해 생성 된 파일이 삭제됩니다.
왜 이런 일이 발생했는지에 대한 이유는 분명 있지만 어떻게 해결할 수 있습니까?
나는 아래 상황에 대해 자세히 설명하고 내가하려는 일의 개념을 보여주는 예제 Makefile을 추가했다.
입력 해 주셔서 감사합니다.
상황 :
(실제 메이크의 작업 "더미 예") 아래 예 파일의 목적은 마크 다운 파일로부터 "HTML"AND "PDF"를 생성한다.
기본 목표는 재귀 적으로 의존성과 회전에 %.html
을 가지고 목표 %.pdf
, 결과적으로 %.md
를 호출합니다 pdf
입니다. 지금까지 디렉토리가 markdown 파일 만 포함하고 있다면 "pdf"가 생성되기 전에 "html"파일을 생성 할 것입니다.
예제를 실행하면 %.pdf
대상이 완료된 후 "html"파일이 삭제된다는 것을 알 수 있습니다. 단자의 출력은 다음과 같습니다 그러나
[email protected] $ make
Generated: sof_example.md
Generated: sof_example.html
Generated: sof_example.pdf
rm sof_example.html sof_example.md
[email protected] $
파일 (들)의 출력은 make
을 executiong 이전에 존재하는 경우 :
[email protected] $ make clean
[email protected] $ touch sof_example.html sof_example.md
[email protected] $ make
Generated: sof_example.pdf
[email protected] $
나는 우아하게이 문제를 해결할 수있는 방법 즉, 거기에 더 많은 재귀 호출을 추가하지 않거나 을 가진 예제에만 적용하면 make
이 실행될 때마다 %.pdf
이 수행되므로 종속성이 바람직하지 않습니다.
예제 파일 : 당신의 암시 patterm 규칙의 체인 때문에
# --------------------------------------------------------------------------- #
# summary: Make file generating 'html' and 'pdf' from a markdown ('md') file
# usage: make
# note: Recursive
# --------------------------------------------------------------------------- #
TARGETS := sof_example
SHELL=/bin/bash
.PHONY: all clean
all: pdf
# Dummy target, the markdown file will normally located in TARGETS
%.md:
@touch $(@)
@printf "Generated: %s\n" $(@)
# HTML target: Generates HTML file from markdown
%.html: %.md
@touch $(@)
@printf "Generated: %s\n" $(@)
# PDF target: Generates pdf version of the HTML, e.g. using `wkhtmltopdf`
%.pdf: %.html
@touch $(@)
@printf "Generated: %s\n" $(@)
pdf html:
@$(MAKE) --no-print-directory $(addsuffix .$(@), $(TARGETS))
# Will remove ALL files with name TARGETS, regardless of suffix
clean:
@$(RM) $(TARGETS).*
# EoF