Một ví dụ nhỏ:Tại sao makefile này xóa mục tiêu của tôi?
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Tại sao hành động cuối cùng là rm foo.log? Làm cách nào để loại bỏ nó?
Một ví dụ nhỏ:Tại sao makefile này xóa mục tiêu của tôi?
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Tại sao hành động cuối cùng là rm foo.log? Làm cách nào để loại bỏ nó?
Bạn đang thực hiện a.txt
bằng một chuỗi quy tắc ẩn (trong trường hợp này là quy tắc ngầm mà bạn tự xác định). Vì vậy, hãy xem xét foo.log
an intermediate file và xóa nó khi nó đã phục vụ mục đích của nó. Bạn có thể ghi đè lên hành vi này bằng cách tuyên bố foo.log
một mục tiêu TRUNG:
.SECONDARY: foo.log
Theo mặc định, GNU làm loại bỏ các file trung gian. Vì% .txt phụ thuộc vào% .log, hãy thực hiện muốn xóa tệp .log. Để ngăn chặn hành vi đó bạn đánh dấu chúng là quý giá với. PRECIOUS hoặc .SECONDARY.
.PRECIOUS: foo.log
Ngoài ra, bạn có thể làm cho nó để không có tệp trung gian nào bị loại bỏ bằng cách sử dụng .SECONDARY không có phụ thuộc.
.SECONDARY:
Xem phần this của GNU làm thủ công.
.SECONDARY:% .log # không hoạt động, tôi nên làm gì để tạo quy tắc chung? –
Nếu bạn muốn tất cả các trung gian ở lại, chỉ cần khai báo một mục tiêu .SECONDARY: không có phụ thuộc. Ngoài ra, bạn có thể sử dụng ký tự đại diện với. PRECIOUS. tức là. PRECIOUS:% .log – Sean
@Sean: Kỳ lạ rằng ký tự đại diện hoạt động với PRECIOUS, nhưng không phải với SECONDARY ... – Beta