Linux 对于Makefile变量的每个目标

Linux 对于Makefile变量的每个目标,linux,makefile,gnu-make,gnu,Linux,Makefile,Gnu Make,Gnu,我已经创建了如下所示的makefile apps=app1 app2 app3 全部:目录app1 app2 app3 zip清理 现在我想在各种应用程序列表上做一些循环 差不多 `loop on apps endloop` 是否可以在makefile中循环,我需要在应用程序可变列表中循环 更新 假设这个变量apps是由我的程序在make文件中生成的,它为每个项目提供不同的应用值,有时它的apps=app1 app2有时它的apps=app1,有时可以是20个或更多apps=app1 app

我已经创建了如下所示的makefile

apps=app1 app2 app3

全部:目录app1 app2 app3 zip清理

现在我想在各种应用程序列表上做一些循环

差不多

`loop on apps

endloop`
是否可以在makefile中循环,我需要在应用程序可变列表中循环

更新

假设这个变量apps是由我的程序在make文件中生成的,它为每个项目提供不同的应用值,有时它的apps=app1 app2有时它的apps=app1,有时可以是20个或更多apps=app1 app2 appN

我如何在各种应用程序上迭代并执行某些操作,例如在每次迭代中打印以下内容:

now im in `app1`
now im in `app2`
etc
在尝试以下操作时

.PHONY: foo
all: foo
APPS = app1 app2 app3 app4
foo : $(APPS)
    for $$f in $(APPS); do echo $$f is here; done
我得到了以下错误:


make:**无规则生成targetapp1',foo需要。停止。

也许您想要类似的东西,我假设Makefile的其他部分描述了app1和app2等。。。应该建立适当的规则

foo: app1 app2 app3 app4 
     for f in $^ ; do echo $$f is here ; done
还是稍微好一点

APPS = app1 app2 app3 app4
foo : $(APPS)
     for f in $(APPS); do echo $$f is here; done
你可能会对这个品牌感兴趣,或者是它的,或者是和其他东西混合在一起

最后,您的makefile或其中的某些部分可以由shell、AWK、Python等生成。。。脚本,甚至是另一个程序,用C++,java,OcAML编码,不管你想要什么 我建议使用remake-x来调试Makefile

您还可以生成一些子kefile,并在某些配方中运行$MAKE-f子kefile

我强烈建议在编写Makefile中的代码之前,至少花一个小时阅读整个文档。你可能还需要阅读

最后,您可以考虑一些其他的构建自动化工具,比如他的哲学不同:Buff.Nuja文件将被生成,并且必须为它提供一个生成器< /P>


关于你的下一个问题,请提供一些

我知道你已经反复讨论过了,所以让我发表一个可能有用也可能没有用的评论

一般来说,您不会在make食谱中编写循环,因为make本身提供循环。因此,当您编写一条规则时,如:

all: app1 app2 app3 app4
make将尝试构建这些先决条件中的每一个,一次一个。因此,如果您希望有一个makefile为apps变量中的每个条目回显一行,您可以这样做:

all: $(apps)

$(apps):
        @echo $@
这告诉make从目标all开始,并尝试构建其每个先决条件,即apps变量中的值

然后定义如何构建应用程序的规则,对于每个应用程序,您都说该规则是echo$@其中$@是扩展到当前构建目标的

在make中,语法为:

foo bar biz:
        some command
是书写的简写形式,与以下内容相同:

foo:
        some command
bar:
        some command
biz:
        some command
在编写makefiles时,关键的一点是,您需要考虑如何编写一个规则,从零个或多个必备文件创建一个文件目标。然后,您就可以担心如何将所有这些先决条件连接在一起,并正确地对它们进行排序

埃塔 如果要为$apps变量中长列表中的一个特定目标设置特殊规则,可以执行以下操作:

$(filter-out bar,$(apps)):
        @echo print $@

bar:
        some other command

你到底想在清单上写什么。您可以使用带有for循环的shell命令…@BasileStarynkevitch-您能提供一个示例吗?我如何在每次迭代中迭代并打印应用程序的值?如果你想改进它,我可能会提供一个,并确切地告诉你想在列表上做什么。但我不知道你想做什么…我也不明白你所说的打印应用程序的值是什么意思。。你的问题真的不清楚。@BasileStrynkevitch-假设这个变量apps是由我的golang程序在make文件中生成的,它为每个项目提供不同的应用程序值,有时它的apps=app1 app2有时它的apps=app1,有时可能是20个或更多apps=app1 app2 appi尝试你的答案并得到错误,make:**无规则生成目标app1',foo需要。停止有什么想法吗?在你的问题中显示A谢谢,但我照样复制了你的示例,它不起作用,错误与以前一样,它对你有效吗?我不知道,因为我仍然不理解你的问题。闻起来很像@BasileStarynkevitch:for$$f in$^;do echo$$f在这里;做的可能不是你想的。是不是因为f在$^;do echo$$f在这里;做了吗?在另一个提案中输入了相同的错误。非常感谢,这是我需要的:1+,一个问题,如果我想让酒吧运行其他命令,我该怎么做?你可以像我的上一个例子那样写出所有规则,而不是为所有$app写一条规则。如果您有很多应用程序,但只希望其中一个应用程序不同,则必须将$apps:target更改为$filter out bar,$apps:以使其不会为bar创建规则,然后为bar创建单独的规则:这符合您的要求。您可以将其添加到答案中吗?