是否有可能从一个生成文件更新环境? 我想能够创build一个目标来为它们设置客户端环境variables。 像这样的东西:
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执行本身设置类path。
或者我想以错误的方式做这件事,还有更好的办法吗?
不,您不能以这种方式更新调用过程中的环境。 通常,子进程不能修改父进程的环境。 从cmd shell运行时,Windows上的批处理文件是一个值得注意的例外。 基于你展示的例子,我猜你不是在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”成为脚本的参数,而不是硬编码。
从你的问题,我假设你正在使用bash shell。
您可以将变量定义放在shell脚本中,如下所示:
AXIS2_HOME=/usr/local/axis2-1.4.1 export AXIS2_HOME #etc
然后将脚本编入当前的环境中
source <filename>
要不就
. <filename>
这在当前shell中执行脚本(即没有子进程),所以任何环境都会改变脚本将会持续下去。
快速的答案是肯定的,但是在你的代码中,你需要在setenv:指令中定义变量。 在Makefile的开头执行它使得它成为Makefile的局部变量。 我将在文件的顶部使用LOCAL _…,然后将其设置在带有VAR = LOCAL_VAR等的setenv:指令中。还要记住,您只需要使用make setenv来调用makefile。 我真的会考虑在bash脚本中这样做,因为变量需要在Makefile之外创建。 一旦变量已经在环境中生成,您应该能够从Makefile中分配和导出。