我有一个如下的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
需要
答案 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