2012-03-11 43 views
6

Một phần của makefile cho dự án C++ của tôi sử dụng lệnh diff để so sánh hai tệp được xuất bởi mã được xây dựng gần đây. Vấn đề là nếu các tập tin khác nhau, kịch bản bạn không thất bại và nên tiếp tục. Có nhiều tệp cần được so sánh và tôi cần xem tất cả trước khi tập lệnh xây dựng kết thúc. Ví dụ: một cái gì đó như thế này,Makefile thất bại khi sử dụng khác nhau trên các tệp khác nhau

diff: * 
     diff $(TEST)/T4.board $(TEST)/T4.board 
     diff $(TEST)/T4.board $(TEST)/sample.board 

Dòng đầu tiên không gây ra vấn đề gì vì các tệp giống nhau. Dòng thứ hai so sánh các tệp khác nhau và khi sự khác biệt được hiển thị, tôi thấy

Makefile:102: recipe for target `diff' failed 
make: *** [diff] Error 1 

và tập lệnh dừng lại. Làm cách nào để tôi tiếp tục?

+0

'diff' nên trở về 0 nếu thành công và 1 trên thất bại. Câu hỏi đặt ra là làm thế nào để tôi đối phó với thất bại? Tôi đã chỉ sử dụng makefiles trong một tuần hoặc lâu hơn. – gsingh2011

Trả lời

5

Make toàn bộ công thức của bạn để trở không có lỗi:

diff: * 
    diff $(TEST)/T4.board $(TEST)/T4.board  || exit 0 
    diff $(TEST)/T4.board $(TEST)/sample.board || exit 0 

Người ta có thể sử dụng echo 'Files differ' thay vì exit 0.

+0

Cảm ơn, cả hai tùy chọn đều hoạt động. Tôi nghĩ rằng đó là loại ngu ngốc mặc dù makefiles không có một tùy chọn để bỏ qua lỗi. Đối với những thứ như 'diff', trả về 1 không phải là kết thúc của thế giới, và thêm số 0 xuất cảnh vào cuối mỗi diff có thể gây phiền nhiễu. – gsingh2011

+1

@ gsingh2011: Makefiles có tùy chọn bỏ qua lỗi. Xem câu trả lời của tôi. – thiton

+0

@ gsingh2011 Ồ, tôi quên mất nó, bạn chỉ cần thêm dấu trừ ('-') trước lệnh để bỏ qua mã thoát của nó. Xem câu trả lời của thiton. –

7

Như GNU làm bang tay trong section 5.5 "Errors", bạn có thể bỏ qua tình trạng trở lại của một lệnh bằng cách đặt trước lệnh với -:

diff: * 
    -diff $(TEST)/T4.board $(TEST)/T4.board 
    -diff $(TEST)/T4.board $(TEST)/sample.board 
+0

+1, tôi quên mất cách bản địa để ngăn chặn các lỗi trong GNU Make. –

Các vấn đề liên quan