克隆新存储库后如何在运行时注入新的 Make 目标?

How can I inject new Make targets in runtime after clonning a new repository?

我的 CI 设置如下:首先,我使用带有几个目标的 Makefile 检查目标存储库。

fooRepo
--- Makefile
...

然后我 运行 git clone ...barRepo.git 包含一堆 *.mk 文件,我想 注入 这样我就可以能够 运行 在我克隆它之后 CI 管道中那些 *.mk 文件的目标。

克隆后我的文件夹结构:

fooRepo
--- Makefile # contains init
--- barRepo
------- 123.mk # contains bar-init target

我预期的 CI 管道:

- git clone fooRepo
- make init
- git clone barRepo
- # run something to enable bar-init target
- make bar-init

我尝试过的方法是使用

创建 includes.txt 文件
include ./barRepo/123.mk

和运行

- git clone fooRepo
- make init
- git clone barRepo
- make -f includes.txt
- make bar-init

但即便如此,我还是收到了 bar-init 目标未找到的错误(虽然包含已成功执行?)

你的问题有点不清楚 -- 你还没有向我们展示你的 makefile -- 但我会试一试。

看起来您的第一步 git clone fooRepo 发生在存在任何 makefile 之前,因此必须从命令行进行。

不清楚您希望 init 规则做什么,也不清楚其他规则依赖于它,所以我暂时将其省略。

最后三个步骤是有趣的部分:

- git clone barRepo
- # run something to enable bar-init target
- make bar-init

直观的直接方法是为 barRepoinclude barRepo/123.mk 设置规则并调用 bar-init。问题是 Make 会在执行任何规则之前尝试扩展 include 语句,这意味着在执行 barRepo 规则之前,这意味着 123.mk 还不存在,这意味着include 语句将不起作用。

解决方法是运行制作两次。更准确地说,要让 Make clone barRepo,然后在 123.mk 到位后调用 itself。这是一种递归生成,当您为要包含的文件提供规则时,它会自动发生;如果该文件不存在或已过期,Make 将尝试构建它,然后自行重启。

-include barRepo/123.mk

bar-init:

barRepo:
    clone barRepo somehow

barRepo/123.mk: barRepo
    @:  # the rule must have a command; this command does nothing

每次调用 make 都有自己的设置。第二个 运行 不“记住”第一个 运行 的上下文。而不是两次不同的 make 调用:make -f includes.txt 后跟 make bar-init,您需要 运行 一次调用将 makefile 提供给 运行 和要构建的目标:

make -f includes.txt bar-init