2011-10-27 39 views
5

Tôi muốn xây dựng một quy tắc như thế này trong Makefile của tôi:thực hiện: thực hiện một hành động cho mỗi điều kiện tiên quyết

log: test_A test_B 
    ./test_A >> [email protected] 
    ./test_B >> [email protected] 

nhưng test_Atest_B là một phần của một biến $(TESTS).

Vì vậy, có thể thực hiện một hành động (ở đây: gọi chương trình) cho mỗi điều kiện tiên quyết trong GNU/thực hiện không?

Lưu ý: How do I make a makefile rule execute its prerequisites? không hoàn toàn giải quyết vấn đề này, vì mục tiêu log là bắt buộc (make log).

Trả lời

15

Về cơ bản bạn muốn lặp qua các điều kiện tiên quyết. Các cách rõ ràng để làm điều này là để đá trái banh vào vỏ:

log: test_A test_B 
     for f in $^; do ./$$f; done 

Hoặc bạn có thể viết các vòng lặp như một GNU Make foreach vòng lặp, mặc dù bạn phải cẩn thận rằng các lệnh mà kết quả từ cơ thể của vòng lặp xuất hiện trên dòng riêng biệt (thông qua define) hoặc được chấm dứt với một terminator vỏ (ví dụ, một dấu chấm phẩy, đó là dễ dàng hơn):

log: test_A test_B 
     $(foreach f,$^,./$(f);) 

Cuối cùng, trong trường hợp này bạn có thể viết một cách ngắn gọn hơn và obscurely hơn như thay thế mẫu trên mỗi mục được lặp lại:

log: test_A test_B 
     $(patsubst %,./%;,$^) 

(. Tôi chắc chắn rằng bạn có thể thêm các chuyển hướng đầu ra và $(TESTS) biến nếu thích hợp)

+1

Cám ơn câu trả lời của bạn, nó khẳng định những gì tôi đã kết thúc với: '$ (thử nghiệm foreach, $ ^, $ (shell ./$(test) >> $ @)) ' – CJlano

+1

Nếu đó là các lệnh cho quy tắc _log_ của bạn, thì' $ (shell ...) 'là loại bỏ thứ: các lệnh cho quy tắc sẽ trống và các lệnh 'test_? 'sẽ xảy ra như một sản phẩm phụ của việc tìm ra các lệnh (thay vì xảy ra bằng cách thực hiện các lệnh). Về mặt triết học sai, và - thực tế hơn - không thể mở rộng để nắm bắt sự thất bại của một trong các kịch bản 'test_? 'Của bạn. (Nhưng dù sao nó sẽ xuất hiện mà bạn muốn đánh dấu câu trả lời này là chấp nhận ...) –

+0

Sẽ không lặp lại hai lần này, một lần cho test_A và một lần cho test_B? Tôi có một vấn đề tương tự và thực hiện là hành xử rất kỳ lạ. – Jaseem

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