【发布时间】:2015-01-17 15:39:42
【问题描述】:
即使这方面的话题很多,我也找不到解决办法。 我想在 GNU make Makefile 中结合两种技术,从带有文件的目录树中创建几个 Debian 包:
- 根据相应目录中的文件树创建一个 Debian 软件包,例如a.deb 依赖于 a/ 目录下的所有文件,因此如果 a/foo/bar 发生更改,将生成 a.deb
- 对具有相同构建规则和操作的多个包执行此操作,例如目标 a.deb 依赖于目录 a/ 中的文件树,b.deb 来自 b/ 直到 z.deb 来自 z/
以下看起来不错,但它没有找到必备文件:
TARGETS = a.deb b.deb z.deb
all: $(TARGETS)
%.deb: $(shell find % -type f)
$(TARGETS):
@echo "#### Building $@ due to \"$?\" ####"
仅出于测试目的,我使用简单的“echo”而不是“find”测试了规则,这很好用(但当然只依赖于目录中的目标,而不是完整的文件树):
TARGETS = a.deb b.deb z.deb
all: $(TARGETS)
%.deb: $(shell echo %/ )
$(TARGETS):
@echo "#### Building $@ due to \"$?\" ####"
如果我将目标文件名硬编码到“查找”内的规则中,它会起作用:
TARGETS = a.deb b.deb z.deb
all: $(TARGETS)
a.deb: $(shell find a/ -type f)
b.deb: $(shell find b/ -type f)
z.deb: $(shell find z/ -type f)
$(TARGETS):
@echo "#### Building $@ due to \"$?\" ####"
但现在我必须维护包名称的更改或在文件中的 3 个位置添加新包以保持一致。
维护makefile既烦人又危险,有没有更好的方法?
`
【问题讨论】:
-
一种可能的不同方法是,如果您将所有文件都置于版本控制之下,并且不添加任何新文件。然后你可以设置你的版本控制系统自动提交新的更改,并运行你的 Debian 包构建作为 post-commit 钩子的一部分。
-
哦,多么好的建议:是的,所有文件也都在 Git 版本控制之下,所以应该有一个选项可以在提交时触发 Debian 包构建。这需要改变工作行为,因为目前我有几个提交,直到一个包发布发生......呃,我必须考虑......无论如何谢谢!
-
如果你觉得有用,我可以正式回答。我在想象一个场景,你有多个存储库,但这将取决于你想要做什么的细节。
-
我认为不需要正式的答案,因为它更像是一种解决方法/更好的方法,完全省略了 Makefile。潜在的 Makefile 问题仍然存在