我的 makefile 如下所示
apps = app1 app2 app3
all: dir app1 app2 app3 zip 清理
现在我想在 apps
变量列表上做一些循环,
有点像
`loop on apps
endloop`
是否可以在 makefile 中对其进行循环,我需要在 apps
变量列表上进行循环
更新
假设这个变量(apps
) 是由我的程序在make
文件中生成的,它为每个项目提供不同的apps 值,有时是 apps= app1 app2
有时是 apps= app1
有时可以是 20 个应用或更多 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
出现以下错误:
make: *** 没有规则来制作 target
app1',foo' 需要。停止。
最佳答案
我看到你有点来回走动,所以让我发表评论,这可能有帮助,也可能没有帮助。
通常您不会在 make 配方中编写循环,因为 make 本身提供“循环”。因此,当您编写如下规则时:
all: app1 app2 app3 app4
make 将尝试构建这些先决条件中的每一个,一次一个。因此,如果您想要一个 makefile 为 apps
变量中的每个条目回显一行,您可以这样做:
all: $(apps)
$(apps):
@echo $@
这告诉 make 从目标 all
开始,并尝试“构建”它的每个先决条件,这些先决条件是 apps
变量中的值。
然后您为如何构建应用程序定义一个规则,对于每个应用程序,您说规则是 echo $@
其中 $@
是 automatic variable扩展到当前正在构建的目标。
在 make 中,语法:
foo bar biz:
some command
是写作的缩写,与写作相同:
foo:
some command
bar:
some command
biz:
some command
编写 makefile 时的关键是您要考虑如何编写规则以从零个或多个先决条件文件创建一个 文件(目标)。然后让 make 担心如何将所有这些先决条件连接在一起并正确排序。
预计到达时间
如果您想要为保存在 $(apps)
变量中的长列表中的一个特定目标制定特殊规则,您可以这样做:
$(filter-out bar,$(apps)):
@echo print $@
bar:
some other command
关于linux - 对于 Makefile 变量的每个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52282549/