我的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.txt
和make 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