Makefile이 호출 환경을 업데이트 할 수 있습니까?
문제
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에서 할당하고 내보낼 수 있어야합니다.