Không có mục tiêu Lỗi lỗi sử dụng Make


12

Tôi đang học cách sử dụng makevà tạo tệp, vì vậy tôi đã viết tệp nhỏ này:

%.markdown: %.html
    pandoc -o $< $@

Nhưng khi tôi chạy make, tất cả những gì tôi nhận được là chuyện make: *** No targets. Stop.gì đang xảy ra?


Là những khoảng trắng hoặc một tab ở phía trước pandoclệnh. Make nổi tiếng là kén chọn về những người là một tab và không phải là không gian.
slm

@slm: đó là một tab. Tôi đã đọc ở đâu đó rằng EOL của Windows không tương thích, vì vậy tôi đã chuyển đổi toàn bộ tệp thành EOL tương thích với Unix.
ahmed

Câu trả lời:


17

Vấn đề:

Vấn đề của bạn là makekhông biết về mục tiêu của bạn.

Bạn có thể chạy Makefile ở trên với make stackoverflow.markdownví dụ và nó sẽ hoạt động.

make tuy nhiên, chỉ có thể thất bại, vì bạn chỉ chỉ định cách tạo mục tiêu của mình, nhưng không phải mục tiêu nào.

Như leiaz chỉ ra quy tắc mẫu ở trên được gọi là quy tắc ngầm .

Trang điểm:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)

Giải trình:

SRCnhận tất cả các tệp nguồn (những tệp kết thúc bằng .html) thông qua Makefile's wildcard.

TAR thay thế mỗi tệp nguồn được liệt kê trong SRCmột mục tiêu kết thúc bằng .markdownthay vì .html.

.PHONY liệt kê các mục tiêu phi vật lý luôn lỗi thời và do đó luôn được thực hiện - những mục tiêu này thường allclean.

Các mục tiêuall đã là phụ thuộc (các file được liệt kê ở phía bên phải của :) tất cả các *.markdowntập tin. Điều này có nghĩa là tất cả các mục tiêu này được thực hiện.

%.markdown: %.html
    pandoc -o $< $@

Đoạn mã này cho biết: Mỗi mục tiêu kết thúc bằng .markdownphụ thuộc vào một tệp có cùng tên, ngoại trừ việc phụ thuộc kết thúc bằng .html. Ký tự đại diện% sẽ được xem như một *cái vỏ. Các %bên phải, tuy nhiên, được so sánh với trận đấu ở phía bên trái. Nguồn .

Lưu ý rằng chuỗi khoảng trắng phía trước pandoclà a TAB, vì makeđịnh nghĩa đó là một tiêu chuẩn.

Cuối cùng, cleanmục tiêu giả mạo mô tả cách làm sạch hệ thống của bạn khỏi các tệp bạn đã tạo bằng Makefile này. Trong trường hợp này, nó sẽ xóa tất cả các mục tiêu (những tệp được đặt tên *.markdown.


1
Câu trả lời tuyệt vời và đây là những liên kết khác mà tôi tìm thấy khi cố gắng hiểu thêm về nó: chức năng ký tự đại diện , tham chiếu thay thếcác mục tiêu giả mạo .
ahmed

Một câu hỏi nữa xin vui lòng: có thể makefiletạo các tệp từ đầu hoặc nó chỉ cập nhật các tệp hiện có? Bởi vì khi tôi xóa các tập tin được tạo ra, nó dừng hoạt động. Câu hỏi ngớ ngẩn tôi biết, nhưng đây là Newfoundland đối với tôi ^^ "
ahmed

1
ý bạn là nếu không có tập tin .markdown thì chúng sẽ được tạo ra? vâng, nó nên làm điều đó theo như tôi biết
polym

1
Được rồi. Tôi sẽ làm thêm một số đào. Cảm ơn câu trả lời của bạn, cảm ơn bạn Tôi đang đi đúng hướng :)
ahmed

1
Chỉ muốn cảm ơn bạn cho câu trả lời tuyệt vời. Cách bạn đã giải thích rất dễ hiểu lý do đằng sau lệnh không hoạt động và hướng dẫn rất chi tiết về cách tiến hành. Cảm ơn một lần nữa.
zanona

5

Quy tắc mẫu là quy tắc ngầm.

Bạn không có mục tiêu được xác định trong Makefile của bạn. Bạn có thể chỉ định mục tiêu trên dòng lệnh: make something.markdownsẽ sử dụng công thức để tạo something.markdowntừ đó something.html.

Hoặc bạn có thể thêm vào Makefile của mình một quy tắc chỉ định các mục tiêu mặc định.

all: file1.markdown file2.markdown

Hoặc với ký tự đại diện:

all: *.markdown

Khi bạn chỉ chạy make, mục tiêu đầu tiên của quy tắc đầu tiên là mục tiêu mặc định . Nó không cần phải được gọi all.

Vì vậy, ở trên, mục tiêu allcó tất cả các tệp bạn muốn làm điều kiện tiên quyết, vì vậy khi bạn make all, nó sẽ tạo ra tất cả các tệp được liệt kê.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.