2012-10-19 30 views
8

Tôi cố gắng triển khai hệ thống xây dựng không đệ quy trong dự án hiện tại của mình. Những gì tôi đấu tranh với là phạm vi biến. Nhắm mục tiêu các biến cụ thể không phù hợp với nhu cầu của tôi vì thường biến xác định mục tiêu chứ không phải điều kiện tiên quyết. Những gì tôi cần là:GNU Make. Các biến có phạm vi giới hạn đối với một Makefile duy nhất

Makefile1:

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

Và kết quả tôi muốn là 'original_value'.

Có chiến lược nào để biến nó thành hiện thực không?

EDIT: Giải pháp duy nhất tôi đi cho thời điểm này là để buộc và tổ chức bản thân mình để đặt tất cả inlcudes ở cuối mỗi Makefile nói riêng và sử dụng ngay lập tức gán biến: =

+0

Giải pháp đó nghe khá hay. Có gì sai với nó? Và cái gì là 'SOMEVAR', nó được dùng để làm gì? – Beta

+1

Điều tôi không thích trong giải pháp này là nó rất run rẩy. Nếu một số người nghèo sẽ mất vị trí của tôi sẽ không nhận được ý tưởng và địa điểm bao gồm một nơi khác, ông sẽ nhận được tấn bất ngờ –

+1

Nếu Makefile2 được bao gồm nhiều hơn một lần, và nó định nghĩa một công thức đề cập đến '$ (SOMEVAR)' , sau đó nó sẽ phá vỡ khủng khiếp --- các biến bên trong công thức được đánh giá khi các công thức được thực thi, có nghĩa là tất cả chúng sẽ thấy giá trị cuối cùng '$ (SOMEVAR)', chứ không phải giá trị của nó khi công thức được xác định. –

Trả lời

5

Một chiến lược là giải pháp lỗi thời để thay đổi tên biến khi tất cả những gì bạn có là biến toàn cầu: thêm tiền tố vào tên biến của bạn dưới dạng không gian tên của người nghèo.

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

Hey mau, với một quy ước như thế này nó như thể mỗi makefile có các biến địa phương riêng của mình (hoặc, ít nhất, các biến riêng của mình trong một không gian tên không xung đột với bất kỳ makefiles nào khác).

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