编写Makefile批量压缩当前目录子目录遇问题求助
解决Makefile批量生成所有子目录压缩包的问题
我看了你的Makefile代码,问题出在默认目标的选择上——当你直接运行make时,Make会默认执行文件中定义的第一个目标,也就是$(ZIPS)展开后的第一个.zip文件,所以只会生成第一个子目录的压缩包。我们只需要调整默认目标,再优化下压缩命令,就能实现批量生成所有子目录的压缩包了。
修复后的Makefile代码
# 将dist设为默认目标,直接运行make就会执行该目标 .DEFAULT_GOAL := dist # 获取当前目录下所有子目录(带末尾斜杠) SUBDIRS := $(wildcard */) # 将子目录名去掉斜杠,加上.zip后缀,生成压缩包文件名列表 ZIPS := $(addsuffix .zip,$(subst /,,$(SUBDIRS))) # 模式规则:每个%.zip依赖对应的子目录%(仅检查目录是否存在,不依赖目录内容变化) $(ZIPS) : %.zip : | % # 使用-r参数递归压缩子目录下的所有内容(包括嵌套子目录) zip -r $@ $* # 批量生成所有压缩包的目标 dist: $(ZIPS)
关键改动说明
- 设置默认目标:添加
.DEFAULT_GOAL := dist,让dist成为Make默认执行的目标,这样直接运行make就会触发所有压缩包的构建,无需显式指定make dist。 - 优化zip命令:把
zip $@ $*/*改成zip -r $@ $*,加上-r参数可以递归压缩子目录下的所有内容(包括嵌套的子目录和文件),原来的写法只会压缩子目录下的直接文件,漏掉嵌套目录。 - 简化压缩路径:用
$*代替$*/*,直接指定子目录名,让zip递归处理整个子目录,更简洁可靠。
额外扩展(可选)
如果需要清理生成的压缩包,可以添加一个clean目标:
clean: rm -f $(ZIPS)
运行make clean就能一键删除所有生成的.zip文件。
内容的提问来源于stack exchange,提问作者Joar
相关产品推荐
相关产品推荐

