防止在Makefile中重写变量?

时间:2011-01-19 12:07:39

标签: makefile

我正在学习Makefile和应用程序交叉编译,我想找到一种方法来防止在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等),有效地删除我在顶部选择的值 - level 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”在本地重新定义变量时忽略或者在运行时重写它们? / p>

谢谢。

2 个答案:

答案 0 :(得分:2)

?=运算符只会在未设置的情况下定义变量。

VAR ?= value

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

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

然后

$ make
Makefile:2: *** [hello].  Stop.

$ make VAR='value overridden'
Makefile:2: *** [value overridden].  Stop.

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

答案 1 :(得分:1)

使通过make命令行传递的变量覆盖makefile赋值。 http://www.gnu.org/software/make/manual/make.html#Override-Directive

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

$ make ... RANLIB=myranlib CC=mycc