在Makefile中是否可以“取消设置”环境变量?

25
我正在使用GNU make,在一个具有构建系统的项目中包含第三方库。当该构建系统调用时,如果在环境中定义了CFLAGS,则会变得混乱不堪。出于其他原因,我希望在我的环境中定义CFLAGS。该库的构建是从另一个makefile中调用的,所以我可以这样说:

3rdparty: $(MAKE) -f Makefile.3rdparty

但我想确保在调用第三方Makefile时取消设置CFLAGS。我能找到的最接近的方法是:

CFLAGS:=

但这仍然使CFLAGS在环境中设置,只是为空字符串而已。除了做一些可怕的事情,比如说:

3rdparty: bash -c "unset CFLAGS; $(MAKE) -f Makefile.3rdparty"

是否有一种简单的方法可以从我的主makefile中“取消”CFLAGS变量,以便在调用第三方库时根本不存在于环境中?

4个回答

31

以下的方法对您不起作用吗?

unexport CFLAGS
3rdparty:
        $(MAKE) -f Makefile.3rdparty

确实如此!我之前不知道“unexport”关键字,现在我知道了。谢谢! - Jay Walker
1
你如何只针对“3rdparty”配方执行此操作,而不是可能需要该变量的其他配方? - user5359531
@user5359531 我所看到的唯一方法是在每个配方行前加上 unset CFLAGS && ...,或者使用 .ONESHELL 并将 unset CFLAGS 添加为第一行配方。但是,如果变量为空也可以的话,您还可以添加一个目标特定的变量定义,例如 3rdparty: CFLAGS:= - fuujuhi

3

从版本3.82开始,make命令新增了“undefine”指令:

undefine CFLAGS 

1
没有为我取消导出环境变量 - Mike D

1
如果您需要在配方中定义变量,并且仅不希望在子制造过程中定义它,则可能会出现问题。另一种解决方法是使用env -来调用子制造过程,并明确设置子制造过程中需要设置的任何环境变量,例如:
env - PATH="$$PATH" LD_LIBRARY_PATH="$$LD_LIBRARY_PATH" $(MAKE) -f Makefile.3rdparty

-6

在Linux中取消设置环境变量。

使用:

export -n MY_ENV_VARIABLE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接