2016-05-31 2 views
1

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 

답변

1

당신이보고있는 것은 발생합니다

%.md -> %.html -> %.pdf 

는 추론 할 make을 이끌고 그 %.md%.html 단지 중간 물질 인 이다., 주어진 경우 %. 그리고 그 경우에 그것의 기본 가정은 당신이 중간체를 지키고 싶지 않다는 것입니다.

당신이 그래서 어디 메이크에서 에게 특별한 대상 .SECONDARY:를 선언함으로써 당신은 make 말할 수 중간체를 유지하려면 할 합니다.

.SECONDARY: 

전제 조건없이 모든 중간체가 보존됩니다. 선행 조건으로 예 :

.SECONDARY: $(addsuffix .html,$(TARGETS)) 

전제 조건 인 중간체 만 보존됩니다.

4.9 Special Built-in Target Names

관련 문제