Thật khó để tin, nhưng có vẻ như với tôi rằng thành ngữ Makefile phổ biến "> $ @" là sai. Đặc biệt, một mục tiêu có quy tắc có một lệnh thất bại nhưng sử dụng chuyển hướng này sẽ thất bại lần đầu tiên nhưng không phải lần sau. Điều này là bởi vì mặc dù lệnh không thành công, việc chuyển hướng "thành công" theo ý nghĩa tạo ra một mục tiêu cập nhật (mặc dù không có độ dài).
Dường như với tôi rằng điều đúng đắn cần làm là chuyển hướng đến tạm thời và thành công khi đổi tên tạm thời thành mục tiêu.
Dưới đây là ví dụ và Makefile:
bad-target:
command-that-will-fail > [email protected]
good-target:
command-that-will-fail > [email protected] || (rm [email protected]; false)
mv [email protected] [email protected]
clean:
rm -f bad-target good-target
Và đây là một chuỗi các lệnh minh họa vấn đề và giải pháp của nó:
$ make clean
rm -f bad-target good-target
$ make bad-target
command-that-will-fail > bad-target
/bin/sh: command-that-will-fail: not found
make: *** [bad-target] Error 127
$ make bad-target
make: `bad-target' is up to date.
$ make good-target
command-that-will-fail > good-target.tmp || (rm good-target.tmp; false)
/bin/sh: command-that-will-fail: not found
make: *** [good-target] Error 1
$ make good-target
command-that-will-fail > good-target.tmp || (rm good-target.tmp; false)
/bin/sh: command-that-will-fail: not found
make: *** [good-target] Error 1
Rất tốt, cảm ơn bạn! .DELETE_ON_ERROR rất hữu ích. –
Có cách nào để chỉ nhận hành vi DELETE_ON_ERROR cho các quy tắc cụ thể không? – Will