2012-03-07 58 views
9

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.

Trả lời

1

Như tôi đã đề cập trong một số ý kiến, mục tiêu thực tế của tôi là làm cho kịch bản tạo ra tên tập tin dựa trên các thiết lập đối tượng đã được biên soạn với. Sau đó tôi cần một kịch bản khác để tạo ra một danh sách được định dạng đặc biệt của tất cả các tên tập tin được tạo ra (đích là một hệ thống nhúng không có trình biên dịch JIT trên đó). Tại bất kỳ thời điểm nào, có hơn ba mươi thiết lập có khả năng có thể ảnh hưởng đến nhị phân, và điều này có thể được sử dụng trên nhiều hơn một mô-đun trong tương lai, vì vậy tôi muốn một cái gì đó có thể mở rộng.

Giải pháp của tôi như sau. Thay vì đi qua các biến trong, tôi sửa đổi kịch bản của tôi để ra một chuỗi makefile-được phân tách dựa trên cài đặt:

-include $(SOME_MK_FILE) 

$(SOME_MK_FILE) : .phony 
    script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE) 

someFilename := $(shell script2.pl $(VAR1)) 

script.pl kết quả đầu ra một chuỗi trông giống như sau:

VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33) 

và script2 kết quả đầu ra một tên tập tin mà trông giống như 'someFilename.X1_y.X2_n.elf'

và sau đó, sau này, trong quy tắc khác, tôi có:

someobj: somedep 
    script3.pl $(someFilename) >> builtfiles.txt 

xây dựng đúng tệp builtfiles.txt (mà lần lượt là đầu vào cho một tập lệnh khác ...). Cuối cùng, đây là một giải pháp cho thực tế là làm cho không thể chuyển môi trường của nó đến $ (shell). Nó không quá đẹp nhưng nó hoạt động.

John

4

Có vấn đề gì với điều này?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

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

+0

@ 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

+0

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

5

Đây có phải là những gì bạn muốn không?

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

+0

Không chính xác, không. Những gì tôi muốn là xây dựng một số tệp nhị phân và đặt tên cho chúng theo cấu hình hiện tại. Trong khi tôi có thể xuất một cách rõ ràng từng cài đặt tôi muốn, giải pháp này không thể mở rộng được. Vì vậy, những gì tôi cần làm là chạy một kịch bản có quyền truy cập vào tất cả các thiết lập makefile. Sau đó nó sẽ có thể xuất ra một tên tập tin. Tên tệp mà cuối cùng sẽ cần phải được chuyển vào một tập lệnh khác sau này, vì vậy tên tệp sẽ phải giải quyết sớm hơn là sau này. – John

+1

Điều này có thể đã không giúp OP nhưng nó chính xác là những gì tôi cần tìm kiếm câu hỏi này. Chúc mừng! –

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