2013-12-17 36 views
6

Tôi đã gặp một số hành vi kỳ lạ khi sử dụng Thực hiện gần đây (v3.81).Tôi có thể yêu cầu Thực hiện bỏ qua các biến môi trường không?

Giả sử tôi đã Makefile sau:

FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

all: 
    @echo "Hi" 

clean: 
    @echo "Hi again" 

Có vẻ đơn giản đủ, đúng không? Đáng chú ý, FOOBAR là một "biến mở rộng đệ quy", do đó, nó không nên được đánh giá cho đến khi tôi đề cập đến nó. Lưu ý rằng tôi không bao giờ đề cập đến nó. Cũng lưu ý rằng nonexistentdirectory không tồn tại như bạn mong đợi.

Bây giờ giả sử tôi đặt FOOBARtrong vỏ trước khi tôi gọi một mục tiêu Make:

compy386$ FOOBAR="stuff" make clean 
find: nonexistentdirectory: No such file or directory 
Hi again 

Tại sao FOOBAR đang được đánh giá? Rõ ràng nó có một cái gì đó để làm với thực tế là biến được định nghĩa trong trình bao. Tôi có dự đoán rằng người dùng có thể đã đặt các biến số trong trình bao của họ không? Tôi làm gì sai ở đây?!

Trả lời

2

FOOBAR đang được đánh giá vì bạn đang chạy công thức (cho clean) và FOOBAR tồn tại trong môi trường khi nhập vào make. Bởi vì FOOBAR tồn tại trong môi trường nhập cảnh, nó trở thành một biến được xuất khẩu, có nghĩa là make sẽ cung cấp nó như một phần của môi trường cho bất kỳ chương trình nào trong công thức. make không phải là trường hợp đặc biệt echo; nó chỉ sử dụng cái được tìm thấy trong đường dẫn của bạn. Và không thể biết liệu tiện ích đó có tham chiếu đến biến môi trường cụ thể hay không, vì vậy nó phải xuất tất cả các biến đã xuất, có nghĩa là nó phải đánh giá FOOBAR.

(Vì lời chính thức, xem đoạn thứ ba của Variables from the Environment trong thực hiện thủ công. Cũng xem công thức trên recursive make invocation.)

Để trả lời các câu hỏi trực tiếp, bạn có thể nói make bỏ qua thực tế là một biến đến từ môi trường, để nó không tái xuất nó, bằng cách không xuất nó:

unexport FOOBAR 
0

Thêm một ? trước = như:

FOOBAR ?= $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

này sẽ sử dụng biến môi trường nếu thiết lập và chỉ đánh giá nếu đặt hoặc rỗng.

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