如何使用Makefile生成目录结构扁平化的源码tar压缩包
实现Makefile打包tar.gz目录扁平化的方案
你不需要额外复制临时文件,利用tar自带的路径修改功能即可实现打包目录扁平化,操作如下:
首先修正你现有Makefile的两个问题:
- FILES变量定义多套了一层
$(),会导致取值异常 - 缺少tar路径转换参数剥离子目录前缀
完整可运行的Makefile示例
# 自定义生成的压缩包名称 NAME ?= myTarball.tar.gz # 收集所有需要打包的目标文件 FILES := $(wildcard Makefile *.h *.hpp *.cpp test*.txt */test*.txt) $(NAME): $(FILES) COPYFILE_DISABLE=true tar -vczf $@ $(FILES) --transform='s|.*/||' # 可选:清理生成的压缩包 .PHONY: clean clean: rm -f $(NAME)
参数说明
--transform='s|.*/||'是GNU tar的内置参数,通过正则替换修改文件在压缩包内的存储路径:匹配所有到最后一个/为止的路径字符,替换为空,最终仅保留文件名,实现目录扁平化- 根目录下的文件路径本身不带
/,不会被该规则匹配,路径保持原样 - 如果使用macOS自带的BSD tar,将上述参数替换为
-s '/.*\///'即可,如需跨系统兼容可以添加自动判断逻辑:
# 自动适配GNU tar和BSD tar的转换参数 TAR_TRANSFORM := $(shell tar --help 2>&1 | grep -q -- '--transform' && echo "--transform='s|.*/||'" || echo "-s '/.*\///'") $(NAME): $(FILES) COPYFILE_DISABLE=true tar -vczf $@ $(FILES) $(TAR_TRANSFORM)
注意事项
如果不同子目录下存在同名的test*.txt文件,扁平化后会在压缩包内互相覆盖,需要提前避免这种情况。
内容的提问来源于stack exchange,提问作者pbb
相关产品推荐
相关产品推荐

