gpt4 book ai didi

makefile - 条件生成文件中的变量?

转载 作者:行者123 更新时间:2023-12-02 15:22:00 26 4
gpt4 key购买 nike

显然 GNU Make 条件中没有 bool 类型,所以这似乎是最好的解决方案:

$(DEF_TARGET):
if [ "$(CHECK)" != "y" ]; then \
var=foo; \
$(if $(filter foo,$(var)),result=true,result=false); \
fi

问题是无论var=foo还是var=barresult总是false。将 $(var) 替换为 foobar 将产生正确的结果。

为什么这行不通?有没有更好的解决方案?

下面的 makefile 使用命令 make -f make.txt 运行

.PHONY: all
all:
X=aaa; \
Y=aaa; \
if [[ '$(filter $(X),$(Y))' ]]; then echo "matched!"; else echo "not matched!"; fi

输出:

X=aaa; \
Y=aaa; \
if [[ '' ]]; then echo "matched!"; else echo "not matched!"; fi
not matched!

为什么在目标配方中为XY赋值会失败?

最佳答案

Apparently there is no boolean type in GNU Make conditionals

很明显there is , 否则 $(if ...) 宏的存在就没有意义了!

阅读食谱的方法(即构建目标的 shell 命令 block )就是理解 make 将配方存储为单个递归扩展变量。只有当 make 需要将一些命令传递给 shell 时,配方才会展开。

配方被完整展开一次。然后逐行执行生成的扩展的每一行。每次执行都在 shell 的实例中运行。

所以,拿你原来的makefile,假设您已要求 make 构建 ${DEF_TARGET}Make 扩展了配方:

if [ "$(CHECK)" != "y" ]; then \
var=foo; \
$(if $(filter foo,$(var)),result=true,result=false); \
fi
  • ${CHECK} 变成空(说)
  • $(if $(filter foo,$(var)),result=true,result=false)
    • 首先,${var} 被扩展并且也变为空(​​比方说)。请注意,配方中的 var=foo由 make 解释!这是一个 shell 命令。

    • 接下来,$(filter foo,) 被扩展并且也是空的。

    • 接下来 make 扩展 $(if ,result=true,result=false),当然会生成 result=false .

      if [ "" != "y" ]; then \
      var=foo; \
      result=false; \
      fi
      由于反斜杠,

      Make 将其视为一行。

所以,不要混淆 shell 变量和 make 变量。当 shell 获取配方时,所有 make 变量都已消失。Make 对 shell 变量一无所知。

你原来的 shell 片段可能是这样的:

result=$(if $(filter y,${CHECK}),true,false)

(TIMTOWTDI 适用)。shell 获取 result=trueresult=false 取决于 make 变量 CHECK 的值。

关于makefile - 条件生成文件中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35114352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com