0

在这里,我又遇到了另一个 make 问题,我试图处理(几乎没有),我已经设置了几个我想要读取的值,但是当我尝试在循环内进行更改时它不起作用;$(FOUND) 仍然和第一次一样,我做错了什么?是否有其他方法来设置变量或将它们更改为?

这是我与此问题相关的代码的一部分:

$(shell for d in $(INPUT); \
        do \
            $(if $(FOUND) -eq 1, REL=$(REL)../); \
            $(if $(findstring $(WORD),$(INPUT)), \
                echo '$(WORD)../'; FOUND=1)\
        done)

$(FOUND) 变量在外部定义,但希望它在获得 $(WORD) 时更改

有什么建议吗???

太感谢了

4

1 回答 1

1

上面的代码有几处错误,以至于很难理解你的意图。这是一个部分列表(对不起,如果我听起来像微软的剪辑)

  • 该代码$(if $(FOUND) -eq 1, REL=$(REL)../)看起来像是 gnu-make 语法和 shell 语法的混合体。
  • 你的循环似乎是多余的。您没有使用循环变量d,而是使用了处理整个序列的构造。例如:$(findstring $(WORD),$(INPUT)
  • 您似乎正在尝试生成类似 的代码echo '$(WORD)../',但该代码的上下文尚不清楚。如果超出规则,则代码没有意义。如果它在规则内,那么设置生成文件变量就太晚了。有一种方法可以解决这个问题,但首先你需要更好地阐明你的意图。
  • 我只能怀疑你打算拥有REL=$(REL)/..,或者REL=../$(REL)但我可能弄错了。
  • 最后,重要的是要了解在 Makefile 中真正应该做的是描述依赖图,并让 make 确定需要执行的操作顺序。因此,应尽量减少从您上面的代码中推断出的程序方法。

编辑:

如果我没看错的话,你正试图在 Makefile 中实现一个棘手的目标。让我向你保证,你的经验不足并不是你唯一的绊脚石。编写好的 Makefile 很难。如果您对此有任何控制权,我强烈建议您查看其他一些构建解决方案。例如,cmake可以为您编写好的 Makefile。

如果您尝试计算基本目录或相对目录,请注意保存的当前工作目录的概念可能是您所期望的,$(CURDIR)也可能不是您所期望的。

对于您的问题,您确实可以使用 GNU make$(foreach ...)构造,但是有几个函数旨在处理没有迭代的序列,这可能会更好地为您服务。

于 2011-02-14T13:04:55.200 回答