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



我的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目标未找到的错误(包括成功执行了吗?)

make的每次调用都有自己的设置。第二次运行不会"记住"。第一次运行的上下文。与两次不同的make:make -f includes.txtmake bar-init调用不同,您需要运行一次调用,同时提供要运行的make文件和要构建的目标:

make -f includes.txt bar-init

你的问题有点不清楚——你还没有给我们看你的makefile——但是我会试一试。

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

不清楚您想要init规则做什么,也不清楚其他规则依赖于它,所以我现在将把它放在这里。

最后三步是有趣的部分:

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

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

解决方案是运行Make两次。更准确地说,要让Make克隆barRepo,然后在123.mk到位后调用本身。这是递归生成的一种类型,当您为要包含的文件提供规则时自动发生;如果该文件不存在或过期,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

这是在makefiles中注入东西的另一种方式:"-E"选项允许Make计算Makefile语法中的任意表达式,例如包含语句,在读取makefile文件之前。

最新更新