저는 make
makefile을 사용하는 방법을 배우고 있어서 다음과 같은 작은 파일을 작성했습니다.
%.markdown: %.html
pandoc -o $< $@
하지만 달리면 " 무슨 일이 일어났나요?"라는 make
말밖에 나오지 않습니다.make: *** No targets. Stop.
답변1
질문:
당신의 문제는 make
당신의 목표를 모른다는 것입니다.
예를 들어 위의 Makefile을 실행하면 make stackoverflow.markdown
작동합니다.
make
그러나 대상을 생성하는 방법만 지정하고 대상을 생성하지 않기 때문에 실패합니다.
~처럼라이야즈가 나왔어요위의 패턴 규칙은 다음과 같습니다.암시적 규칙.
파일 생성:
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
설명하다:
SRC
.html
Makefile을 통해 모든 소스 파일(다음으로 끝나는) 가져오기wildcard
.
아스팔트대안나열된 각 소스 파일의 SRC
대상은 .markdown
..html
. 가짜항상 쓸모가 없어 항상 실행되는 비물리적 대상을 나열합니다. 일반적으로 all
및 입니다 clean
.
이것표적all
:
종속성이 있는 모든 파일 (오른쪽에 나열된 파일 *.markdown
) 이는 이러한 목표가 모두 구현되었음을 의미합니다.
%.markdown: %.html
pandoc -o $< $@
이 코드 조각은 다음과 같이 말합니다. 로 끝나는 모든 대상은 .markdown
동일한 이름을 가진 파일에 종속되지만 종속성은 .html
.This 로 끝납니다.와일드카드%
*
껍질 처럼 취급됩니다 . 그러나 오른쪽 경주는 %
왼쪽 경주와 비교됩니다.원천.
노트앞의 공백 시퀀스는 표준으로 정의되었기 때문에 pandoc
a입니다 .TABmake
마지막으로 가짜 clean
대상은 이 Makefile을 사용하여 생성된 파일 시스템을 정리하는 방법을 설명합니다. 이 경우 모든 대상(이름이 *.markdown
.
답변2
Makefile에 정의된 대상이 없습니다. 명령줄에서 대상을 지정할 수 있습니다. make something.markdown
레시피를 사용하여 something.markdown
대상을 생성합니다 something.html
.
또는 기본 대상을 지정하는 Makefile에 규칙을 추가할 수 있습니다.
all: file1.markdown file2.markdown
all: *.markdown
막 달리고 있을 때 make
,첫 번째 규칙의 첫 번째 대상이 기본 대상입니다.. 호출할 필요는 없습니다 all
.
그래서 위의 대상에는 all
전제 조건으로 만들고 싶은 모든 파일이 있으므로 , make all
나열된 모든 파일을 만듭니다.