【问题标题】:Why does including a file in my Makefile change my Makefile-directory variable?为什么在我的 Makefile 中包含一个文件会更改我的 Makefile 目录变量?
【发布时间】:2020-03-01 17:25:26
【问题描述】:

为了从不同位置调用我的 Makefile 而不会弄乱相对路径,我使用 another answer 中给出的 Makefile 变量引用路径:

DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

当我包含其他文件时,我知道MAKEFILE_LIST 会有所不同,但由于我在进行任何包含之前将其值存储在变量中,所以我很惊讶变量值不同。

例子:

$ tree .
.
├── another_file
└── subdirectory
    └── Makefile

$ cat Makefile
DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

test:
    @echo $(DIR)

#include $(DIR)/../another_file

$ make
/subdirectory

正如预期的那样。但是如果我取消注释包含行,我会得到

$ make
/

这对我来说没有意义,因为 another_file 仍然包含在内,没有错误表明 $(DIR) 的值是 /subdirectory

注意make目标放在include语句之前,切换顺序时行为不会改变。猜猜这是由于预处理造成的,但它仍然没有向我解释为什么 $(DIR) 似乎有不同的值。

$ make --version
GNU Make 3.81
...
This program built for i386-apple-darwin11.3.0

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这是因为MAKEFILE_LIST 的值在include 之后发生了变化,并且变量DIR 的扩展发生在使用时。

    我在你的 Makefile 中添加了info 进行演示

    DIR=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
    
    $(info list1 $(MAKEFILE_LIST))
    $(info dir1 $(DIR))
    
    test:
        @echo $(DIR)
    
    include $(DIR)/../another_file
    
    $(info list2 $(MAKEFILE_LIST))
    $(info dir2 $(DIR))
    

    输出

    $ make
    list1  Makefile
    dir1 /home/lesmana/tmp/maek/subdir
    list2  Makefile /home/lesmana/tmp/maek/subdir/../another_file
    dir2 /home/lesmana/tmp/maek
    /home/lesmana/tmp/maek
    

    注意MAKEFILE_LIST 的值在include 之后如何变化以及DIR 的值。

    解决此问题的一种方法是通过使用 := 而不是 = 强制立即扩展 DIR

    DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
    

    这样DIR 的值只计算一次,即使MAKEFILE_LIST 改变也不会改变。

    另一种方法是使用firstword 而不是lastword

    还要注意DIRtest 的配方中的扩展发生在执行该配方之前。这就是为什么include 相对于test 发生在哪里并不重要。

    阅读此处了解更多信息:


    我不知道如何看待这个shell 构造来获取Makefile 的目录。通常来自更高层的 Makefile 包括来自 subdirs 的 Makefile。但是你有你的用例。我不会在这里争论。我希望我对变量风格的解释有所帮助。

    【讨论】:

    • 很棒的解释,非常感谢!我完全错过了 make 中变量扩展的概念,你可以强制立即扩展。我同意,在树的上方包含一个文件似乎很奇怪。但在我的情况下,兄弟目录中也需要 env 配置。
    • 刚刚注意到关于DIR 变量的原始帖子实际上使用了立即扩展运算符。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多