繁体   English   中英

对于Makefile变量中的每个目标

[英]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 其他部分描述了应如何使用适当的规则来构建app1app2等...)。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM