[unix] Make를 사용한“No target”오류

나는 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.htmlMakefile을 통해 모든 소스 파일 (로 끝나는 파일)을 가져옵니다 wildcard.

TAR은 대체 에 나열된 각 소스 파일 SRC대상이 끝나는와 .markdown대신을 .html.

.PHONY의 목록에서 오래된 항상 때문에 항상 실행되는 비 물리적 대상 – 다음은 자주 allclean.

대상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가 목록에있는 모든 파일을 만듭니다.


답변