如何向pbuilder-dist指定nodoc或其他Debian构建配置文件
我之前也碰到过一模一样的Qt包构建依赖循环问题,折腾了好一阵才搞明白怎么正确传递构建配置文件参数,给你几个靠谱的解决方法:
方法一:命令行临时传递(单次构建)
pbuilder-dist是pbuilder的封装工具,你可以通过--pbuilder-options参数把环境变量直接传递给底层的pbuilder,确保它能进入chroot环境中。具体命令如下:
pbuilder-dist focal build ../qtbase_*.dsc --pbuilder-options="--environment DEB_BUILD_PROFILES=nodoc"
这个方式不用改任何配置,适合只需要单次用nodoc profile构建的场景。
方法二:修改配置文件永久生效
如果你经常需要用nodoc构建包,可以编辑用户目录下的pbuilder配置文件~/.pbuilderrc,添加一行环境变量声明:
export DEB_BUILD_PROFILES="nodoc"
保存后,以后每次运行pbuilder-dist都会自动加载这个配置,不用每次命令行重复输入。如果你的chroot环境已经存在,下次构建时配置会自动生效,不需要重新创建chroot。
方法三:用Hook脚本自定义环境
如果需要同时设置多个自定义参数或者执行预处理步骤,hook脚本会更灵活:
- 创建一个hook目录,比如
~/pbuilder-hooks - 在目录里新建一个脚本
00_set_build_profile,内容如下:
#!/bin/sh export DEB_BUILD_PROFILES="nodoc"
- 给脚本加上执行权限:
chmod +x ~/pbuilder-hooks/00_set_build_profile
- 构建时指定hook目录:
pbuilder-dist focal build ../qtbase_*.dsc --hookdir ~/pbuilder-hooks
为什么直接设置环境变量没效果?
你之前尝试直接在命令前加DEB_BUILD_PROFILES=nodoc没生效,是因为pbuilder默认会在启动chroot时清理大部分外部环境变量,普通的环境变量传递不会进入chroot内部,必须通过pbuilder自身的参数、配置文件或者hook脚本才能让变量在chroot里生效。
用上面的方法设置后,pbuilder-satisfydepends-funcs里的filter_restriction_deps逻辑就能正确识别nodoc profile,自动过滤掉标记为!nodoc的可选依赖,完美解决Qt包的依赖循环问题,不用再手动修改debian/control文件啦。
备注:内容来源于stack exchange,提问作者Keithel

