21

我有一个名为 $MY_ENV_VARIABLE 的环境变量集。

如何在我的 makefile 中使用这个变量来(例如)包含一些源文件?

LOCAL_SRC_FILES = $(MY_ENV_VARIABLE)/libDEMO.so

像上面这样的东西似乎不起作用。

注意:在我的情况下,这是使用 Android NDK 构建所必需的,但我想这通常适用于 make。

4

3 回答 3

17

只是为了补充一些信息......

make 中访问环境变量的语法类似于 make 中的其他变量...

#export the variable. e.g. in the terminal,
export MY_ENV_VARIABLE="hello world"

...

#in the makefile (replace before call)
echo $(MY_ENV_VARIABLE)

这将在执行命令之前执行替换。相反,如果您希望在命令执行期间发生替换,则需要转义$(例如,echo $MY_ENV_VARIABLE不正确并将尝试替换Mmake 中的变量,并将其附加到Y_ENV_VARIABLE)...

#in the makefile (replace during call)
echo $$MY_ENV_VARIABLE
于 2013-12-10T05:46:32.967 回答
11

确保从 shell 中导出了变量。跑步:

echo $MY_ENV_VARIABLE

向您显示它是否已在您的 shell 中设置。但是要知道您是否已将其导出,以便子shell 和其他子命令(如 make)可以看到它尝试运行:

env | grep MY_ENV_VARIABLE

如果它不存在,请确保export MY_ENV_VARIABLE在运行 make 之前运行。

这就是您需要做的所有事情:make 在启动时会自动将所有环境变量导入为 make 变量。

于 2013-05-31T11:40:11.010 回答
3

我刚刚遇到了类似的问题(在 Cygwin 下):

  • 在 shell 上运行echo $OSTYPE会打印该值,但是
  • 运行env | grep OSTYPE不提供任何输出。

由于我不能保证这个变量export在我想要运行该 makefile 的所有机器上都被编辑,所以我使用以下命令从 makefile 中获取变量:

OSTYPE = $(shell echo $$OSTYPE)

当然也可以在如下条件下使用:

ifeq ($(shell echo $$OSTYPE),cygwin)
# ...do something...
else
# ...do something else...
endif

编辑:

在尝试了来自jozxyqk 的答案的信息后,我发现了一些东西,所有这些都来自 makefile:

  • 如果我运行@echo $$OSTYPE@echo "$$OSTYPE"在配方中,该变量将成功扩展为cygwin.
  • 但是,在类似ifeq ($$OSTYPE,cygwin)ifeq ("$$OSTYPE","cygwin")不扩展它的条件下使用它。
  • 因此,首先设置一个变量 likeTEST = "$$OSTYPE"将导致echo $(TEST)打印cygwin(扩展由echo调用完成)但在某种条件下不起作用 -ifeq ($(TEST),cygwin)是错误的,这是合乎逻辑的。
于 2015-07-03T05:31:55.093 回答