2012-04-15 34 views
6

Đây là một Makefile đơn giản:Cách đặt biến môi trường trong công thức makefile?

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done 
    @echo $$var 

Tôi cho rằng giá trị của "var" là "0 1 2 3 4", nhưng sản lượng là:

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
       <--- NOTHING!!! 

Như bạn có thể nhìn thấy người cuối cùng echo là "NOTHING". Chuyện gì thế?

+0

tôi nghi ngờ rằng mỗi lệnh công thức được gọi trong một subshell, vì vậy "var" được định nghĩa trong công thức đầu tiên không thể gọi trong dòng thứ hai. Thê nay đung không? –

Trả lời

10

Từ here:

Khi đó là thời gian để thực hiện công thức nấu ăn để cập nhật một mục tiêu, họ được thực hiện bằng cách gọi một subshell mới cho mỗi dòng của công thức ...

Xin lưu ý: điều này ngụ ý rằng thiết lập các biến shell và gọi các lệnh shell như cd để đặt ngữ cảnh cục bộ cho mỗi quá trình sẽ không ảnh hưởng đến các dòng sau trong công thức. Nếu bạn muốn sử dụng cd để ảnh hưởng đến câu lệnh tiếp theo, hãy đặt cả hai câu lệnh vào một dòng công thức duy nhất. Sau đó make sẽ gọi một trình bao để chạy toàn bộ dòng và trình bao sẽ thực hiện các câu lệnh theo thứ tự.

Hãy thử như sau:

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done; \ 
    echo $$var 
+0

Vâng, nó hoạt động! Cảm ơn! Có rất nhiều bẫy trong Makefile ~ –

+0

@Li, bạn được chào đón –

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