6

是否可以从 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 执行设置类路径就可以工作。

还是我想以错误的方式做到这一点并且有更好的方法?

4

3 回答 3

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”作为脚本的参数,而不是对其进行硬编码。

于 2009-03-24T03:29:33.247 回答
4

根据您的问题,我假设您正在使用 bash shell。

您可以将变量定义放在 shell 脚本中,如下所示:

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

然后source把脚本放到当前环境中,用

source <filename>

要不就

. <filename>

这会在当前 shell 中执行脚本(即没有子进程),因此脚本所做的任何环境更改都将持续存在。

于 2009-03-24T03:51:57.173 回答
-5

快速回答是肯定的,但是在您的代码中,您需要在 setenv: 指令中定义变量。在 Makefile 的开头执行此操作使其成为 Makefile 的局部变量。我会在文件顶部使用 LOCAL_... 然后在 setenv: 指令中使用 VAR=LOCAL_VAR 等设置它...另外请记住,您只需要使用 make setenv 调用 makefile。我真的会考虑在 bash 脚本中执行此操作,因为需要在 Makefile 之外创建变量。在环境中生成变量后,您应该能够从 Makefile 进行分配和导出。

于 2009-03-24T03:31:26.973 回答