문제

makefile에서 환경을 업데이트 할 수 있습니까? 클라이언트 환경 변수를 설정하기 위해 대상을 만들 수 있기를 원합니다. 이 같은:

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

고객이 단순히 할 수 있도록 :

make setenv all
java MainClass

그리고 Java 실행 자체를위한 클래스 경로를 설정할 필요없이 작동하도록하십시오.

아니면 내가 이것을 잘못하고 더 나은 방법이 있습니까?

도움이 되었습니까?

해결책

아니요, 이런 식으로 호출 프로세스에서 환경을 업데이트 할 수 없습니다. 일반적으로 하위 프로세스는 부모 프로세스의 환경을 수정할 수 없습니다. 주목할만한 예외 중 하나는 CMD 쉘에서 실행될 때 Windows의 배치 파일입니다. 당신이 보여주는 예를 바탕으로, 당신은 창에서 실행되지 않는 것 같습니다.

일반적으로 달성하려는 일은 환경을 설정 한 다음 의도 한 프로세스를 호출하는 쉘 스크립트로 수행됩니다. 예를 들어, 다음과 같은 go.sh 스크립트를 작성할 수 있습니다.

!#/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

Go.sh 실행 파일을 만들면 이제 앱을 다음과 같이 실행할 수 있습니다. ./go.sh. 원한다면 스크립트도 더 정교하게 만들 수 있습니다. 예를 들어, "Mainclass"를 스크립트의 매개 변수를 하드 코딩하는 대신 매개 변수로 만들 수 있습니다.

다른 팁

당신의 질문에서 나는 당신이 배쉬 쉘을 사용하고 있다고 가정합니다.

변수 정의를 쉘 스크립트에 배치 할 수 있습니다.

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

그리고 source 현재 환경에 대한 스크립트

source <filename>

아니면 그냥

. <filename>

스크립트를 실행합니다 현재 쉘에서 (예 : 아동 과정 없음) 따라서 스크립트가 변경하는 환경이 변경됩니다.

빠른 대답은 예이지만 코드에서는 Setenv : Directive의 변수를 정의해야합니다. Makefile의 시작 부분에서 수행하면 MakeFile의 로컬 변수가됩니다. Local _... 파일의 상단에서 SetEnv : var = local_var 등의 지시문에 설정하십시오. 또한 Make Setenv만으로 makefile을 호출해야한다는 것을 기억하십시오. 변수를 makefile 외부에서 만들어야하므로 Bash 스크립트에서 이것을 실제로 살펴 봅니다. 환경에서 변수가 생성되면 makefile에서 할당하고 내보낼 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top