나는 make
파일을 만들고 사용하는 법을 배우고 있으므로이 작은 파일을 썼습니다.
%.markdown: %.html
pandoc -o $< $@
그러나 내가 달리면 make
내가 make: *** No targets. Stop.
무슨 일이 일어나고 있습니까?
답변
문제:
당신의 문제는 make
당신의 목표에 대해 모른다는 것입니다.
make stackoverflow.markdown
예를 들어 위의 Makefile을 실행할 수 있으며 작동합니다.
make
그러나 대상을 작성하는 방법 만 지정하고 어떤 대상을 작성하지 않았기 때문에 실패합니다.
leiaz가 지적한 것처럼 위의 패턴 규칙을 암시 적 규칙 이라고합니다 .
메이크 파일 :
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
설명:
SRC
.html
Makefile을 통해 모든 소스 파일 (로 끝나는 파일)을 가져옵니다 wildcard
.
TAR은 대체 에 나열된 각 소스 파일 SRC
대상이 끝나는와 .markdown
대신을 .html
.
.PHONY의 목록에서 오래된 항상 때문에 항상 실행되는 비 물리적 대상 – 다음은 자주 all
와 clean
.
대상all
종속성 (파일의 우측에 나열된 갖는 :
전체) *.markdown
파일. 이는 이러한 모든 대상이 실행됨을 의미합니다.
%.markdown: %.html
pandoc -o $< $@
이 스 니펫은 다음과 같이 말합니다.로 끝나는 각 대상 .markdown
은 종속성이로 끝나는 것을 제외하고 동일한 이름을 가진 파일에 의존합니다 .html
. 와일드 카드는%
A와 볼 수있다 *
껍질에있다. 은 %
오른쪽에, 그러나, 왼쪽의 일치에 비교됩니다. 소스 .
주 의 공백 시퀀스 뿅가 pandoc
있는 TAB, 이후 make
이 표준으로 정의합니다.
마지막으로, 가짜 clean
대상은이 Makefile로 작성한 파일에서 시스템을 정리하는 방법을 보여줍니다. 이 경우 모든 대상 (이름이 지정된 파일)을 삭제합니다 *.markdown
.
답변
Makefile에 정의 된 대상이 없습니다. 명령 행에서 대상을 지정할 수 있습니다 make something.markdown
만들 수있는 조리법 사용 something.markdown
에서을 something.html
.
또는 기본 대상을 지정하는 규칙을 Makefile에 추가 할 수 있습니다.
all: file1.markdown file2.markdown
또는 와일드 카드로 :
all: *.markdown
그냥 실행하면 make
, 첫 번째 규칙의 첫 번째 목표는 기본 목표입니다 . 호출 할 필요는 없습니다 all
.
위의 대상 all
에는 전제 조건으로 만들려는 모든 파일이 있으므로 사용자 make all
가 목록에있는 모든 파일을 만듭니다.