Tôi đang sử dụng GNU tạo 3,81. Đây là một tệp thử nghiệm biểu thị sự cố:Làm cách nào để sử dụng các macro để tạo nhiều mục tiêu/quy tắc Makefile bên trong foreach? Hành vi bí ẩn
define BOZO
a$(1): b c
touch a$(1)
endef
$(foreach i,1 2 3,$(call BOZO,$(i)))
Ý tưởng ở đây là sử dụng mẫu macro (BOZO) để tạo quy tắc tuân theo mẫu có thể dự đoán được.
Vấn đề: khi tôi chạy thực hiện trên makefile này tôi nhận được một lỗi nói:
Makefile.fake:10: *** multiple target patterns. Stop.
(nơi dòng 10 là phù hợp với foreach).
Bây giờ, tôi biết lỗi đó thường chỉ ra điều gì. Hãy xem dòng đó mở rộng ra bằng cách sử dụng hàm info
để gửi mở rộng ra tiêu chuẩn. Tôi thay đổi dòng 10 là:
$(info $(foreach i,1 2 3,$(call BOZO,$(i))))
và tôi chạy:
$ make -n
a1: b c
touch a1
a2: b c
touch a2
a3: b c
touch a3
make: *** No targets. Stop.
Lưu ý rằng "không có mục tiêu" thông điệp được mong đợi, kể từ khi $ (thông tin ...) chức năng đánh giá để trống nhưng nguyên nhân tạo thành in quy tắc được tạo.
Hãy chạy những quy tắc đó sau đó phải không?
$make -n > out.txt
make: *** No targets. Stop.
$make -f out.txt a1 a2 a3
touch a1
touch a2
touch a3
$
AAARGH! Các quy tắc hoạt động tốt. Vì vậy ... là lỗi trong thực hiện, hoặc trong sự hiểu biết của tôi?
Một đầu mối cuối cùng mà có thể giúp chẩn đoán: nếu tôi thay đổi dòng foreach để:
$(foreach i,1,$(call BOZO,$(i)))
(nên foreach rằng chỉ có một lần lặp)
và sau đó làm
$make a1
Tôi gặp lỗi khác:
make: *** No rule to make target `a1'. Stop.
Tôi không biết cách nào để "nhìn thấy" việc mở rộng $(foreach)
làm cho ngoại trừ $(info)
và đầu ra của nó là hợp pháp, vì vậy tôi khá bối rối.
D'OH! Được rồi, tôi mới sử dụng các macro Makefile. Tôi vẫn không hiểu tại sao điều này là cần thiết, nhưng nó hoạt động nên tôi sẽ suy ngẫm về nó. Cảm ơn! – Joe