Tôi đang học cách sử dụng make
và 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 make
và 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à make
khô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.markdown
ví 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)
SRC
nhậ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 SRC
một mục tiêu kết thúc bằng .markdown
thay 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 all
và 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 *.markdown
tậ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 .markdown
phụ 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 pandoc
là a TAB, vì make
định nghĩa đó là một tiêu chuẩn.
Cuối cùng, clean
mụ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
.
makefile
tạ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.markdown
sẽ sử dụng công thức để tạo something.markdown
từ đó 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 all
có 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ê.
pandoc
lệ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.