[英]For each on target of Makefile variable
我有如下的makefile
apps = app1 app2 app3
all: dir app1 app2 app3 zip cleanup
现在,我想对可变的apps
列表进行一些循环,
就像是
`loop on apps
endloop`
是否可以在makefile中对其进行循环,我需要对apps
变量列表进行循环
更新
可以说这个变量( apps
)是由我的程序在make
文件中生成的,它为每个项目提供了不同的app值,有时其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: *** No rule to make target
app1',而foo'. Stop.
需要foo'. Stop.
foo'. Stop.
我看到您来回走了一点,所以让我发表评论可能会或可能不会有帮助。
通常,您不会在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
编写makefile时至关重要的是,您要考虑如何编写规则以从零个或多个前提文件中创建一个文件(目标)。 然后,让您担心如何将所有这些先决条件连接在一起并正确订购它们。
ETA如果要对$(apps)
变量中包含的一长串目标中的特定目标使用特殊规则,可以执行以下操作:
$(filter-out bar,$(apps)):
@echo print $@
bar:
some other command
也许您想要类似的东西(我假设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
并且您可能对make中的foreach
函数 (或它的eval
函数 ,也许与其他函数混合)感兴趣
最后,您的makefile(或其中包含的某些部分)可以由某些(shell,AWK,Python等)脚本(或什至是其他用C ++,Java,Ocaml编码的程序)生成。
我建议使用remake作为remake -x
来调试您的Makefile
您也可以生成一些子submakefile
并在某些配方中运行$(MAKE) -f submakefile
。
我强烈建议您花至少一个小时完全阅读GNU的make文件编码在你的东西之前Makefile
。 而且您可能还需要阅读bash
的文档 。
最后,您可能会考虑使用其他一些构建自动化工具,例如ninja
(其原理有所不同 :应该会生成 build.ninja
文件,并且您必须为其提供生成器)
对于您的下一个问题,请提供一些MCVE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.