Tôi muốn mở rộng ngay lập tức lệnh shell trong một Makefile, nhưng tôi muốn lệnh shell có quyền truy cập vào các biến môi trường trong Makefile. Nếu tôi sử dụng $ (shell ...), nó sẽ mở rộng ngay lập tức, nhưng không có quyền truy cập vào các biến. Nếu tôi sử dụng các backquotes, việc mở rộng không phải là ngay lập tức, và nó gây ra vấn đề cho tôi sau này trong Makefile. Tôi tự hỏi nếu có bất kỳ cách nào để làm cho các backquotes mở rộng ngay lập tức, hoặc để vượt qua môi trường hiện tại đến một $ (shell) lệnh.Xuất biến môi trường sang Makefile shell
Ví dụ, makefile sau:
SOME_VAR := some_val
export SOME_VAR
VAR1 := `echo $$SOME_VAR`
export VAR1
VAR2 := `echo $$VAR1`
all:
@echo VAR1=$(VAR1)
@echo VAR2=$(VAR2)
Will đầu ra:
~/tmp/t2> make
VAR1=some_val
VAR2=`echo $SOME_VAR`
Nơi tôi muốn nó in "var2 = some_val". Ví dụ thực sự phức tạp hơn một chút (các biến môi trường được thừa hưởng từ các tệp makefiles gốc và tôi đang cố gắng sử dụng tập lệnh perl để chỉnh sửa các biến), nhưng nguyên tắc thì giống nhau.
Mọi trợ giúp đều được đánh giá cao.
Hmmm ... có, ví dụ của tôi có sơ hở. ..Trong ví dụ trên, VAR1 được mở rộng trong Makefile, nhưng những gì tôi cần là VAR1 được mở rộng trong kịch bản lệnh shell. Tức là, tôi đang gọi một kịch bản perl cần truy cập ENV {'VAR1'}. Nếu được gọi từ $ (shell ...), tập lệnh sẽ không có kiến thức về VAR1. Tôi sẽ chỉnh sửa câu hỏi của tôi với một ví dụ tốt hơn. Cảm ơn. – John
@ John, tôi thực sự không thể hiểu những gì bạn đang cố gắng làm ở đây. Tôi có thể đưa ra một vài dự đoán, nhưng tôi nghĩ sẽ nhanh hơn nếu bạn chỉnh sửa câu hỏi của mình. – Beta
Những gì tôi thực sự cố gắng làm: Tôi có một makefile đó là nghĩa vụ phải xây dựng một tập tin đối tượng và đặt tên nó theo các thiết lập cấu hình nó được xây dựng với. Tôi có một kịch bản perl dịch các thiết lập cấu hình vào một tên. Để làm việc này, script perl phải có quyền truy cập vào các thiết lập cấu hình (phải sử dụng backquotes cho điều đó). Điều này sẽ được tốt bằng chính nó, nhưng sau đó tên phải được sử dụng trong một kịch bản perl khác. Bởi vì tên không được mở rộng khi thời gian tập lệnh thứ hai được chạy, nó gây ra lỗi. Tôi đang tìm cách giải quyết. – John