我怎样才能将变量值更改为目标?

时间:2011-02-14 12:17:37

标签: makefile gnu-make nested-loops

这里我再次提出另一个问题我试图处理(几乎没有),我已经设置了几个我想要读取的值,但是当我尝试在循环内部进行更改时它不起作用; $(FOUND)仍然和第一次一样,我可能做得不好?是设置变量或将其更改为其他方式的其他方法吗?

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

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

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

时更改

对此有何建议?

非常感谢你

1 个答案:

答案 0 :(得分:1)

上面的代码有几个问题,以至于很难理解你的意图。这是一个部分列表(抱歉,如果我听起来像微软clippy)

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

修改:

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

如果您正在尝试计算base-dir或relative-dir,请注意$(CURDIR)中保存的current-working-directory的概念可能与您期望的一样,也可能不是。

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