linux - 对于 Makefile 变量的每个目标

标签 linux makefile gnu-make gnu

我的 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: *** 没有规则来制作 targetapp1',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/

相关文章:

makefile - gnu make、microsoft nmake 和 posix standard make 有何相似/不同?

linux - 如何创建具有多个变量的环境以在 Linux 中运行程序?

c - 使用 Makefile 安装软件

c++ - 更新旧版 C makefile 以包含 C++ 源文件

makefile - Makefile中的可变目标

c - 如何使用 makefile 编译子目录中的文件

Linux - 查找在最后 X 秒内创建的文件

c - 设置段错误处理程序

linux - Shell - 如何在第 n 次出现管道后删除特定字符串

perl - 图片::Magick 安装错误 127