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?
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?
Câu trả lời:
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 .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
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 allvà clean.
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.
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 ^^ "
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ê.
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.