2015-01-08 16 views
7

đầ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

Trả lời

6

quy tắc mẫu làm việc khác với quy tắc ngầm. Trong khi một quy tắc ngầm như

a b c: d 
     command 

tương đương với ký hiệu còn

a: d 
     command 
b: d 
     command 
c: d 
     command 

này KHÔNG giữ cho các quy tắc mẫu. Các quy tắc mẫu với nhiều mục tiêu được yêu cầu rõ ràng để xây dựng tất cả mục tiêu của chúng trong một lần gọi duy nhất là command. Vì vậy bạn sẽ phải viết

$ cat GNUmakefile 
all: de/x.o en/x.o es/x.o 

de/%.o: %.c 
     @echo [email protected] from $< 
en/%.o: %.c 
     @echo [email protected] from $< 
es/%.o: %.c 
     @echo [email protected] from $< 
$ gmake 
de/x.o from x.c 
en/x.o from x.c 
es/x.o from x.c 

Các tài liệu liên quan được tìm thấy trong 10.5.1 Giới thiệu về mẫu Rules của cuốn cẩm nang GNU thực hiện:

quy tắc mẫu có thể có nhiều hơn một mục tiêu. Không giống như các quy tắc bình thường, điều này không hành động như nhiều quy tắc khác nhau với cùng một điều kiện tiên quyết và công thức. Nếu quy tắc mẫu có nhiều mục tiêu, hãy biết rằng công thức của quy tắc có trách nhiệm thực hiện tất cả các mục tiêu. Công thức được thực hiện chỉ một lần để thực hiện tất cả các mục tiêu. Khi tìm kiếm quy tắc mẫu phù hợp với mục tiêu, các mẫu đích của quy tắc khác với quy tắc phù hợp với mục tiêu cần quy tắc là ngẫu nhiên: hãy lo lắng về việc cung cấp công thức và điều kiện tiên quyết cho tệp hiện có trong câu hỏi. Tuy nhiên, khi công thức của tệp này được chạy, các mục tiêu khác được đánh dấu là đã được cập nhật.

+0

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

+2

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

+1

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

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