对于Makefile变量中的每个目标

时间:2018-09-11 18:57:30

标签: linux makefile gnu-make gnu

我有一个如下的makefile

apps = app1 app2 app3

all: dir app1 app2 app3 zip cleanup

现在,我想对apps变量列表进行一些循环,

类似

`loop on apps

endloop`

makefile中是否可以在其上循环,我需要在apps变量列表上进行循环

更新

让我说这个变量(apps)是由我的程序在make文件中生成的,它为每个项目提供不同的应用值,有时是{{1 }}有时是apps= app1 app2,有时可能是20个或更多apps= app1

如何迭代apps= app1 app2 appN变量并执行某些操作,例如在每次迭代中打印如下内容:

apps

尝试以下操作

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 app1',make: *** No rule to make target需要

1 个答案:

答案 0 :(得分:6)

我看到你来回走了一点,所以让我发表评论可能会或可能不会有帮助。

通常,您不会在make配方中编写循环,因为make本身提供了“循环”。因此,当您编写如下规则时:

all: app1 app2 app3 app4

make将尝试一次构建其中的每个先决条件。因此,如果您想要一个使apps变量中的每个条目都回显一行内容的makefile,您可以这样做:

all: $(apps)

$(apps):
        @echo $@

这告诉make从目标all开始,并尝试“构建”其每个前提条件,即apps变量中的值。

然后,您定义了一个有关如何构建应用程序的规则,对于每个应用程序,您都说该规则为echo $@,其中$@automatic variable,并扩展为当前正在构建的目标。

在制造中,语法为:

foo bar biz:
        some command

是写作的简写并且与之相同:

foo:
        some command
bar:
        some command
biz:
        some command

编写makefile的关键是,您认为如何编写规则以从零个或多个前提文件中创建一个一个文件(目标)。然后让您担心如何将所有这些先决条件连接在一起并正确订购它们。

ETA 如果您想为$(apps)变量中包含的长列表中的一个特定目标设置特殊规则,则可以执行以下操作:

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

bar:
        some other command