克隆新存储库后如何在运行时注入新的 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
直观的直接方法是为 barRepo
、include 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
我的 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
直观的直接方法是为 barRepo
、include 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