2009-03-24 37 views
5

Có thể cập nhật môi trường từ một tệp makefile không? Tôi muốn có thể tạo một mục tiêu để thiết lập các biến môi trường máy khách cho chúng. Một cái gì đó như thế này:Có thể makefile cập nhật môi trường gọi điện không?

AXIS2_HOME ?= /usr/local/axis2-1.4.1 
JAVA_HOME ?= /usr/java/latest 
CLASSPATH := foo foo 

setenv: 
    export AXIS2_HOME 
    export JAVA_HOME 
    export CLASSPATH 

Vì vậy mà khách hàng chỉ có thể làm:

make setenv all 
java MainClass 

và có nó làm việc mà không có họ cần phải thiết lập classpath để thực hiện java mình.

Hoặc tôi đang tìm cách làm điều này một cách sai và có cách nào tốt hơn?

Trả lời

5

Không, bạn không thể cập nhật môi trường trong quá trình gọi theo cách này. Nói chung, một tiến trình con không thể sửa đổi môi trường của tiến trình cha. Một ngoại lệ đáng chú ý là các tệp lô trên Windows, khi chạy từ một trình bao cmd. Dựa trên ví dụ bạn hiển thị, tôi đoán bạn hiện không chạy trên Windows.

Thông thường, những gì bạn đang cố gắng hoàn thành được thực hiện bằng tập lệnh trình bao để thiết lập môi trường và sau đó gọi quy trình dự định của bạn. Ví dụ, bạn có thể viết một kịch bản go.sh như thế này:

!#/bin/sh 
AXIS2_HOME=/usr/local/axix2-1.4.1 
JAVA_HOME=/usr/java/latest 
CLASSPATH=foo foo 
export AXIS2_HOME 
export JAVA_HOME 
export CLASSPATH 
java MainClass 

Make go.sh thực thi và bây giờ bạn có thể chạy ứng dụng của bạn như ./go.sh. Bạn có thể làm cho kịch bản của bạn phức tạp hơn, nếu bạn thích - ví dụ, bạn có thể muốn làm cho "MainClass" một tham số cho kịch bản chứ không phải là khó mã hóa nó.

+0

Hoặc, bạn có thể bỏ qua dòng cuối cùng ('java MainClass') và sau đó báo cho người dùng của bạn biết * nguồn * tập lệnh, được dự định chính xác cho tình huống của bạn trong việc thiết lập biến môi trường trong quá trình shell chính. – JasonSmith

+0

Thông tin bên lề: Các tệp .BAT và .CMD trên các cửa sổ được xử lý trong cùng một cá thể của CMD.EXE đang nhắc và thực hiện các lệnh tương tác. Điều này tương đương với lệnh nguồn trong csh hoặc. lệnh trong sh. – RBerteig

-5

Câu trả lời nhanh là có, tuy nhiên trong mã của bạn, bạn sẽ cần xác định các biến trong chỉ thị setenv:. Thực hiện nó ở đầu Makefile làm cho nó trở thành một biến cục bộ cho Makefile. Tôi sẽ sử dụng LOCAL _... ở trên cùng của tập tin sau đó đặt nó trong setenv: chỉ thị với VAR = LOCAL_VAR vv ... Cũng nên nhớ rằng bạn sẽ cần phải gọi makefile chỉ với setenv. Tôi thực sự sẽ xem xét thực hiện điều này trong một kịch bản bash khi biến cần phải được tạo ra bên ngoài Makefile. Khi biến đã được tạo trong môi trường, bạn có thể gán và xuất từ ​​Makefile.

4

Từ câu hỏi của bạn Tôi giả sử bạn đang sử dụng bash shell.

Bạn có thể đặt các định nghĩa biến trong một kịch bản shell, như vậy:

AXIS2_HOME=/usr/local/axis2-1.4.1 
export AXIS2_HOME 
#etc 

Và sau đó source kịch bản vào môi trường hiện nay, với

source <filename> 

hoặc chỉ

. <filename> 

Điều đó thực thi tập lệnh trong sh hiện tại ell (tức là không có tiến trình con), vì vậy bất kỳ thay đổi môi trường nào mà kịch bản lệnh tạo ra sẽ vẫn tồn tại.

+0

Cảm ơn. Tôi thích cách này.Tôi sẽ thêm một mục tiêu vào makefile để tạo ra tệp này để đặt classpath và thêm vào tài liệu mà nó cần phải có nguồn gốc. – brofield

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