在make文件中读取环境变量

时间:2013-05-31 08:40:36

标签: android-ndk makefile

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

如何在makefile中使用此变量(例如)包含一些源文件?

LOCAL_SRC_FILES = $(MY_ENV_VARIABLE)/libDEMO.so

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

注意:在我的情况下,这需要使用Android NDK进行构建,但我想这一般适用于制作。

3 个答案:

答案 0 :(得分:15)

只是添加一些信息......

在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不正确并将尝试替换make中的变量M,并将其附加到Y_ENV_VARIABLE)...

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

答案 1 :(得分:11)

确保从shell导出变量。运行:

echo $MY_ENV_VARIABLE

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

env | grep MY_ENV_VARIABLE

如果不存在,请务必在运行make之前运行export MY_ENV_VARIABLE

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

答案 2 :(得分:3)

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

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

由于我无法保证在我想运行makefile的所有机器上export编辑此变量,我使用以下内容从makefile中获取变量:

OSTYPE = $(shell echo $$OSTYPE)

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

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

修改

我在尝试使用jozxyqk's answer中的信息后发现的一些内容,都来自makefile:

  • 如果我在配方中运行@echo $$OSTYPE@echo "$$OSTYPE",则该变量已成功扩展为cygwin
  • 但是,在ifeq ($$OSTYPE,cygwin)ifeq ("$$OSTYPE","cygwin")这样的条件下使用它并不会扩展它。
  • 因此,首先设置TEST = "$$OSTYPE"之类的变量会导致echo $(TEST)打印cygwin(扩展由echo调用完成)但是没有&# 39;在条件下工作 - ifeq ($(TEST),cygwin)是假的。