如何在Autotools中运行make dist时修改tar包格式
解决Autotools
make dist 路径过长及tar o选项问题 问题
使用GNU Autotools构建C++项目时,make dist默认生成gnu格式tar包,该格式限制路径长度不超过99字符,导致部分长路径文件无法被正确打包。尝试通过TAR='tar --format=pax' make dist指定pax格式失败,原因是Autotools生成的tar命令包含o选项(对应--old-archive,强制v7格式),且参数顺序错误,触发tar报错:
tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
解决方案
1. 通过AM_INIT_AUTOMAKE移除o选项
在项目根目录的configure.ac文件中,修改AM_INIT_AUTOMAKE的初始化参数,添加tar-ustar选项:
AM_INIT_AUTOMAKE([tar-ustar])
执行以下命令更新配置文件:
autoreconf -vfi
之后再运行make dist,tar命令会自动去掉o选项,变为tar chf - target,此时可以正常通过TAR='tar --format=pax' make dist指定pax格式。
2. 自定义tar包装脚本(适配低版本Autotools)
如果无法修改configure.ac或Autotools版本较低,可创建一个shell脚本调整参数顺序:
创建mytar.sh:
#!/bin/sh # 跳过前4个参数,将格式参数追加到末尾 shift 4 exec tar chf - "$@" --format=pax
赋予执行权限:
chmod +x mytar.sh
执行make dist时指定该脚本:
TAR='./mytar.sh' make dist
3. 直接设置DIST_ARCHIVE_FORMAT(Autotools 1.16+)
若你的Autotools版本≥1.16,无需手动调整tar参数,直接设置环境变量指定格式:
DIST_ARCHIVE_FORMAT=pax make dist
该变量会让Autotools自动使用pax格式生成tar包,自动处理路径长度问题。
验证
生成tar包后,可通过以下命令确认格式:
tar -tf your-project.tar.gz --format=pax
若能正常列出所有文件且无报错,说明配置生效。
内容的提问来源于stack exchange,提问作者Timothy Liu
相关产品推荐
相关产品推荐

