2011-06-20 12 views
10

Tiêu chí: Makefile là một GNU Tạo Makefile - Tôi không quan tâm đến makepp, qmake, cmake, v.v. cmake), nhưng điều này là dành cho công việc và tại nơi làm việc, chúng tôi sử dụng GNU Make. Giải pháp tối ưu là một giải pháp Makefile thuần túy hơn là một kịch bản lệnh vỏ mà các phân tích cú pháp tạo ra cho bạn.GNU Makefile tương đương với lệnh 'TRAP' của trình bao để nhận biết ngắn gọn về lỗi xây dựng khi thoát

Tôi cũng không muốn thực hiện giải pháp 'tiếp tục thất bại' - nếu nó bị hỏng, nó bị hỏng và cần được sửa. Tình hình là điều này, tôi đã có một makefile mà xây dựng một số thư mục song song - nếu một trong số họ không thành công, tất nhiên xây dựng toàn bộ không thành công, nhưng không phải cho đến khi tất cả chạy làm cho chạy đến hoàn thành (hoặc thất bại). Quay trở lại Điều này có nghĩa là lý do tại sao làm cho thực sự thất bại được chôn cất ở đâu đó một cách tùy tiện xa từ đầu ra của sản phẩm.

Dưới đây là một ví dụ về những gì tôi đã có:

all: $(SUBDIRS) 

SUBDIRS = \ 
    apple \ 
    orange \ 
    banana \ 
    pineapple \ 
    lemon \ 
    watermelon \ 
    grapefruit 

$(SUBDIRS): 
    cd [email protected] && $(MAKE) $(MFLAGS) 2>&1 | sed -e "s/^/$(notdir $(@)): /g" 

Nếu tôi chạy 'làm -j 5' và 'da cam' sẽ xảy ra thất bại - Tôi muốn thấy một bảng như thế này tại cuối của quá trình làm

apple  - passed 
    orange - FAILED 
    banana - passed 
    pineapple - passed 
    lemon  - passed 

tôi đã coi là một & & echo "thông qua"> .result || echo "FAILED"> .result, nhưng vẫn cần một số lệnh TRAP hoặc __onexit() để in chúng khi thoát.

Bất kỳ Makefile ninja nào có giải pháp thuần túy cho mục đích này?

không chỉnh sửa - giải pháp của tôi không thực sự hoạt động theo cách tôi đã hy vọng .. STYMIED!

+1

"nếu một trong số họ thất bại, tất nhiên toàn bộ xây dựng thất bại, nhưng không phải cho đến khi tất cả các hoạt động làm cho chạy đến khi kết thúc (hoặc thất bại)." Bạn có thể cải thiện tình huống đó bằng cách thêm vào trước 'pipet; set -o; 'để' $ (SUBDIRS) 'lệnh, do đó, mã thoát nonzero của một thất bại' $ (MAKE) 'không còn bị ẩn bởi lối ra thành công của' sed'. – slowdog

+0

Nếu 'cam' thất bại, bạn muốn nó tiếp tục với cam, chuối, v.v ...? – Beta

+0

@slowdog - Mã thoát của việc tạo ra không nhất thiết phải là vấn đề, nhưng đó là một điểm tốt, +1 cho bạn – synthesizerpatel

Trả lời

0

Cách duy nhất tôi thấy là tự thực hiện với một phụ thực hiện:

all : subdirs 

subdirs : 
    $(MAKE) -f $(lastword $(MAKEFILE_LIST)) subdirs-recursive || cat log 

subdirs-recursive: $(SUBDIRS) 
3

Khi bạn muốn làm để hủy bỏ tại sự thất bại đầu tiên, kết thúc ngay lập tức và giết tất cả các công việc trên máy bay thay vì chờ đợi họ kết thúc, bạn cần phải vá GNU Make như thế này http://lists.gnu.org/archive/html/bug-make/2009-01/msg00035.html

sau đó, bạn cần phải thiết lập một cái bẫy cho mỗi vỏ mà làm cho gọi (cũng như set -o pipefail nếu bạn sử dụng một ống), như mô tả trong bài viết này http://lists.gnu.org/archive/html/help-make/2009-02/msg00011.html

Tóm lại:

target1: 
    trap 'kill $$(jobs -p)'; command && something || something-else 
target2: 
    trap 'kill $$(jobs -p)'; set -o pipefail; command | sed '...'