Makefile 如何将变量值更改为目标?

Makefile 如何将变量值更改为目标?,makefile,gnu-make,nested-loops,Makefile,Gnu Make,Nested Loops,在这里,我又遇到了另一个make问题,我试图处理(很难),我设置了几个我想make读取的值,但是当我尝试在循环内更改时,它不起作用$(发现)仍然和第一次一样,我能做什么坏事?另一种方法是设置变量还是将变量更改为 以下是与此问题相关的部分代码: $(shell for d in $(INPUT); \ do \ $(if $(FOUND) -eq 1, REL=$(REL)../); \ $(if $(findstring $(WOR

在这里,我又遇到了另一个make问题,我试图处理(很难),我设置了几个我想make读取的值,但是当我尝试在循环内更改时,它不起作用$(发现)仍然和第一次一样,我能做什么坏事?另一种方法是设置变量还是将变量更改为

以下是与此问题相关的部分代码:

$(shell for d in $(INPUT); \
        do \
            $(if $(FOUND) -eq 1, REL=$(REL)../); \
            $(if $(findstring $(WORD),$(INPUT)), \
                echo '$(WORD)../'; FOUND=1)\
        done)
$(已找到)变量在外部定义,但希望在获得$(WORD)时更改

有什么建议吗


非常感谢

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

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

编辑:

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

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


对于您的问题,您确实可以使用GNU make
$(foreach…)
construct,但是有几个函数被设计为不经过迭代就处理序列,这可能会更好地为您服务。

好吧,我做这个循环的方法与我在bash shell上做的方法相同,但这不起作用;是不是说meening不能用GNU Make管理shell循环?当您还没有学会如何编写简单的有效变量。@Beta嘿,但是..别这么说来吧..现在我处理变量很好…哈哈哈!@Chen Levy,谢谢你Chen,听起来真不错(不是microsoft),可能我的意图不清楚,但事实上,我混合了shell和make语法,这似乎是不允许的。我的主要意图是读取路径,当make读取此路径时,将替换每个目录,直到它找到$(WORD)by../(其相对路径)让我更改几个文件中的相对路径。但是在这段代码中,没有更改定义更改的$(REL)或$(FOUND)。希望现在更清楚了。非常感谢您的解释,它让我对该工具有了更多的了解。您好!@Boris the Spider,如果您喜欢他的解释,为什么不投票支持它(就像我一样)?@Beta投票需要声誉,我是新来的,先生…不需要这样对待其他人,包括我。希望你理解…Beta,抱歉,正如我说的我是新来的,但在GNU Make中较新,我只是试图理解并创建一些正确的Make。但这次需要学习Make中的循环。请耐心一点…谢谢C嗯,是$(foreach)吗?我正试图设置$(find)和$(REL)中的变量以使它们变为相对路径。谢谢你的建议。实际上我正在处理$(PWD)改变路径。我想你们称之为“棘手的目标”的make不太好,我需要实现纯GNU make代码来修复它,作为函数等等……谢谢,你们的回答太鼓舞人心了。祝你们好运