đầu tiên tôi muốn đặt mục tiêu phụ thuộc ngôn ngữ. Đặc biệt: Tôi có một tệp nguồn và tôi muốn tạo các Đối tượng khác nhau, nơi thêm vào thư mục ngôn ngữ tương ứng. Tập tin nguồn đơn sẽ khác nhau trong C-Flags, trình biên dịch sẽ nhận được. Miễn là tôi sử dụng nó một cách tĩnh, nó hoạt động khá tốt.GNU Makefile - Quy tắc mẫu với nhiều mục tiêu với một phụ thuộc bỏ qua tất cả các mục tiêu nhưng
de/info.o en/info.o es/info.o : info.c
$(ECHO) (DEP) $< for [email protected]
Bây giờ tôi nghĩ, thật tuyệt vời nếu nó năng động hơn một chút, trong trường hợp tôi sẽ thêm một tệp phụ thuộc ngôn ngữ mới. Vì vậy, tôi đã sử dụng một ký tự đại diện như sau:
de/%.o en/%.o es/%.o : %.c
$(ECHO) (DEP) $< for [email protected]
Nhưng bây giờ nó chỉ là mục tiêu đầu tiên và bỏ qua phần còn lại. The Make-Debug in nội dung sau:
Successfully remade target file `de/info.o'.
Considering target file `en/info.o'.
File `en/info.o' was considered already.
Chỉ trong trường hợp: Không, các đối tượng không tồn tại. Vì vậy, không có mục tiêu, nhưng một dependencie hiện có, vì vậy hãy thực hiện các quy tắc.
EDIT: Tìm thấy giải pháp cho vấn đề đó.
define FOO
$(1)/%.o : %.c
$(ECHO) $$< for $(1)
endef
$(foreach lang,$(LANGUAGE_LIST), $(eval $(call FOO,$(lang))))
Lấy cảm hứng từ: http://www.gnu.org/software/make/manual/make.html#Eval-Function
Ah ok, vâng tôi đã đọc điều này ... nhưng tôi nghĩ rằng đó sẽ là giải pháp đáng tin cậy cho vấn đề này. Vì bạn phải thêm mục tiêu mỗi khi bạn thêm ngôn ngữ. – Mario
Vâng, nếu lệnh của bạn là đa dòng, hãy xem xét xác định macro đa dòng có tên là 'lệnh' và sử dụng nó với' @ $ (lệnh gọi) '. Sau đó, mỗi ngôn ngữ mới chỉ yêu cầu thêm hai dòng. – Jens
macro là một gợi ý tốt! sự kết hợp của '$ (foreach,,)', '$ (eval)' và '$ (call)' đã giải quyết được vấn đề! Tôi chỉnh sửa bài đăng đầu tiên của mình. – Mario