代码之家  ›  专栏  ›  技术社区  ›  vinni_f

makefile使用目标中定义的变量[重复]

  •  3
  • vinni_f  · 技术社区  · 7 年前

    如何使用make目标中定义的变量

    .PHONY: foo
    
    VAR_GLOBAL=$(shell cat /tmp/global)
    
    foo:
        echo "local" > /tmp/local
        VAR_LOCAL=$(shell cat /tmp/local)
        echo ${VAR_GLOBAL}
        echo ${VAR_LOCAL}
    

    以下是执行输出:

    $ echo global > /tmp/global
    $ make foo
    echo "local" > /tmp/local
    VAR_LOCAL=local
    echo global
    global
    echo
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   vinni_f    7 年前

    正如@KelvinSherlock所指出的,这是 another question

    以下是我的问题的具体解决方案:

    .PHONY: foo
    
    VAR_GLOBAL=$(shell cat /tmp/global)
    
    foo:
        echo "local" > /tmp/local
        $(eval VAR_LOCAL := $(shell cat /tmp/local))
        echo ${VAR_GLOBAL}
        echo ${VAR_LOCAL}
    
        2
  •  2
  •   Basile Starynkevitch    7 年前

    您可能想使用 override directive 在一个 target-specific variable assignment ,请尝试:

    foo: override LS_LOCAL=$(shell ls /var | tail -1)
        echo ${LS_GLOBAL}
        echo ${LS_LOCAL}
    

    如果 LS_LOCAL 从未定义(即使是内置规则),您可能不需要 override 关键字。

    顺便说一句,你可能会避免 $(shell ls /var | tail -1) 通过使用 wildcard function 结合 lastword function (可能与 notdir function ),因此您可以编写代码 $(lastword $(wildcard /var/*)) $(notdir $(lastword $(wildcard /var/*))) 相反但是,请注意扩展顺序,以及带有空格的文件名。最后 shell function 可能使用您的 $PATH variable (如果有什么奇怪的事情发生 ls 程序出现在前面 /bin/ls ). 可能使用 $(shell /bin/ls /var | /usr/bin/tail -1) 可能更好。

    同时调查 Guile-extended make ; 考虑一下其他因素 build-automation ninja 和/或生成 Makefile (或其他构建配置)具有类似 configure script 通过生成 autoconf cmake .

    还请注意,配方中的命令可以由几个物理反斜杠行组成(因此在 相同的 外壳)。也许你可以考虑

      export MY_VAR=$$(ls /var | tail); \
      dosomething; \
      use $$MY_VAR
    

    在一些食谱里面。