【问题标题】:Prevent variables from being rewritten in Makefiles?防止变量在 Makefile 中被重写?
【发布时间】:2011-01-19 12:07:38
【问题描述】:

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

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

1) 从网上下载应用程序的源代码到/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”在本地重新定义变量时忽略或动态重写它们?

谢谢。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    ?= 运算符只会在未设置变量时定义它。

    VAR ?= value
    

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

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

    然后

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

    但是

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

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

    【讨论】:

    • 非常感谢。我将尝试 ?=
    • 被覆盖,除非使用override 指令更新,至少在 GNU Make 中。
    【解决方案2】:

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

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

    $ make ... RANLIB=myranlib CC=mycc
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2011-10-06
      相关资源
      最近更新 更多