You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Makefile生成目录结构扁平化的源码tar压缩包

实现Makefile打包tar.gz目录扁平化的方案

你不需要额外复制临时文件,利用tar自带的路径修改功能即可实现打包目录扁平化,操作如下:

首先修正你现有Makefile的两个问题:

  1. FILES变量定义多套了一层$(),会导致取值异常
  2. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:09:03