是否可以从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执行本身设置类路径。
或者我希望以错误的方式做到这一点,还有更好的方法吗?
答案 0 :(得分:5)
不,您无法以这种方式更新调用过程中的环境。通常,子进程无法修改父进程的环境。一个值得注意的例外是Windows上的批处理文件,从cmd shell运行时。根据您显示的示例,我猜您不是在Windows上运行。
通常,您要完成的是使用shell脚本完成设置环境然后调用您的预期进程。例如,您可以编写一个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”作为脚本的参数而不是对其进行硬编码。
答案 1 :(得分:4)
从你的问题我假设你正在使用bash shell。
您可以将变量定义放在shell脚本中,如下所示:
AXIS2_HOME=/usr/local/axis2-1.4.1
export AXIS2_HOME
#etc
然后source
脚本进入当前环境,用
source <filename>
或只是
. <filename>
执行当前shell中的脚本 (即没有子进程),因此脚本所做的任何环境更改都将保持不变。
答案 2 :(得分:-5)
快速回答是肯定的,但是在您的代码中,您需要在setenv:指令中定义变量。在Makefile的开头做它使它成为Makefile的局部变量。我会在文件的顶部使用LOCAL _...然后在setenv:指令中使用VAR = LOCAL_VAR等设置它...还要记住,您只需要使用make setenv调用makefile。我真的会考虑在bash脚本中执行此操作,因为变量需要在Makefile之外创建。在环境中生成变量后,您应该能够从Makefile中分配和导出。