【问题标题】:Export env var in make file so it's available to sub make files在 make 文件中导出 env var,以便它可用于子 make 文件
【发布时间】:2019-09-23 11:42:25
【问题描述】:

我在顶级 makefile 中有以下规则。我想在这个级别设置一个环境变量,以便所有子 make 规则都可以访问它。

请问这是怎么做到的?

get:
    for i in $(STACK_DIRS) ; do \
        cd $(CURDIR)/$${i} && make get ; \
    done \

【问题讨论】:

  • 哪个变量? make STACK_DIRS='$(STACK_DIRS)' get 应该可以轻松解决这个问题(前提是 STACK_DIRS 不包含任何单引号。)
  • 一个新的环境变量。假设 foo=bar。
  • export foo 在 Makefile 中可以做到这一点。
  • 能否提供一个完整的例子?
  • 您永远不应该使用make 来调用make 的递归调用。您应该始终使用变量$(MAKE)

标签: makefile gnu-make


【解决方案1】:

导出变量的shell命令是export

get:
    for i in $(STACK_DIRS) ; do \
        foo="bar"; export foo; cd $(CURDIR)/$${i} && make get ; \
    done

虽然你不妨直接说

get:
    for i in $(STACK_DIRS) ; do \
        cd $(CURDIR)/$${i} && make foo="bar" get ; \
    done

一个更惯用的方法是分别运行每个目标。我们为每个$i 创建.$i.get_done,如下所示:

.PHONY: get
get: $(patsubst %,.%.get_done,$(STACK_DIRS))
.%.get_done:
    cd $(CURDIR)/$* && make foo="bar" get

现在如果.ick.get_done 存在,则意味着get 运行在子目录ick 中,如果它比它的所有依赖项都新,则不需要重新制作。

【讨论】:

  • 我猜$(CURDIR) 在这里是不必要的,但这是推测性的,所以我没有删除它。
  • 您也可以直接使用 GNU make 的 export 命令将 makefile 变量导出到它调用的任何命令,例如 export foo = bar(不在配方中)。
  • 是的,这就是我认为 OP 一开始想要的,但他们说他们没有在 cmets 上提出这个问题。我猜他们希望每次迭代都有一个单独的值或类似的东西。
猜你喜欢
  • 2023-03-06
  • 2010-12-02
  • 2013-04-17
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多