防止在Makefiles中重写变量?

防止在Makefiles中重写变量?,makefile,Makefile,我正在学习Makefiles和应用程序交叉编译,我想找到一种方法来防止变量在Makefiles中被重新定义 例如,我编写了一个顶级Makefile/usr/src/someapp.mk,它将 1) 将应用程序的源代码从web下载到/usr/src/someapp-1.2.3中/ 2) 解开源头,以及 3) 运行其原始/usr/src/someapp-1.2.3/Makefile 由于原始Makefile是作为独立脚本编写的,因此它会在不知情的情况下(重新)使用本地值定义常见的可疑对象(CC、AR

我正在学习Makefiles和应用程序交叉编译,我想找到一种方法来防止变量在Makefiles中被重新定义

例如,我编写了一个顶级Makefile/usr/src/someapp.mk,它将

1) 将应用程序的源代码从web下载到/usr/src/someapp-1.2.3中/

2) 解开源头,以及

3) 运行其原始/usr/src/someapp-1.2.3/Makefile

由于原始Makefile是作为独立脚本编写的,因此它会在不知情的情况下(重新)使用本地值定义常见的可疑对象(CC、AR/RANLIB等),从而有效地删除我在顶级Makefile中选择的值:

#My top-level /usr/src/someapp.mk:
all:
    wget someapp-1.2.3.tar.gz
    tar xzvf someapp-1.2.3.tar.gz
    cd someapp-1.2.3 && $(MAKE)

#Original Makefile from www /usr/src/someapp-1.2.3/Makefile:
#RANLIB locally redefined... :-/
RANLIB=ranlib

all:
    $(RANLIB)...
我希望用户能够下载原始源代码,而不是提供我自己的、修改过的版本:有没有办法让“make”在本地重新定义变量时忽略它们,或者动态地重写它们


谢谢。

如果变量未设置,
?=
运算符将仅定义变量

VAR ?= value
到目前为止,最有用的方法是在make命令行上定义变量。这些变量在make期间变为只读

$ cat Makefile
VAR := hello
$(error [${VAR}])
然后

但是


这表明您的代码段
cd someapp-1.2.3&&$(MAKE)
变成
$(MAKE)-C someapp-1.2.3 RANLIB=myval

通过MAKE命令行覆盖makefile分配传递的MAKE变量

按如下方式调用该第三方makefile:

$ make ... RANLIB=myranlib CC=mycc

谢谢。我将尝试?=重写,除非用GNU Make中的
override
指令更新。
$ make VAR='value overridden'
Makefile:2: *** [value overridden].  Stop.
$ make ... RANLIB=myranlib CC=mycc