V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
liyongjun0803
V2EX  ›  问与答

Makefile 依赖中的变量展开问题

  •  
  •   liyongjun0803 · 2020-12-16 17:16:39 +08:00 · 858 次点击
    这是一个创建于 1420 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Makefile:

    TARGET = test1
    TARGET += test3
    
    all: $(TARGET)
    	@echo $^
    	@echo $(TARGET)
    
    test1:
    test3:
    
    TARGET += test2
    

    执行结果:

    $ make
    test1 test3
    test1 test3 test2
    

    Makefile 中,等号赋值的变量,会在整个 Makefile 文件展开后,再决定变量的值,如 @echo $(TARGET) 打印 test1 test3 test2 。
    但是,不解的是,为什么依赖中的 TARGET 仅仅为 test1 test3 ?

    2 条回复    2020-12-17 09:26:24 +08:00
    SJ2050cn
        1
    SJ2050cn  
       2020-12-16 18:04:51 +08:00   ❤️ 1
    make 会先从上向下执行所有没缩进的语句,注意,是从头上下,在执行依赖项的时候,后面的赋值语句还没执行,接着,会执行缩进中的内容,所以你的 @echo $(TARGET)会执行全部赋值完后的结果。我们可以做一个小实验,
    ```
    Ranep = test1
    TARGET = $(Ranep) test3


    all: $(TARGET)
    @echo $^
    @echo $(TARGET)
    test1:
    test2:
    test3:

    Ranep = test2
    ```
    你可以看看输出结果你就知道了。总之,就是 make 会先执行没缩进的,再执行缩进的。
    liyongjun0803
        2
    liyongjun0803  
    OP
       2020-12-17 09:26:24 +08:00
    @SJ2050cn 学到了,感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 218ms · UTC 14:53 · PVG 22:53 · LAX 06:53 · JFK 09:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.