我正在维护和发布一个需要为Windows和Linux构建的开源软件包。我选择与mingw交叉编译,并使用Debian软件包来构建和维护我的Windows软件包的二进制文件。也就是说,我已经定义了Debian架构mingw-i686和mingw-amd64,对dpkg-cross和一些Debian安装脚本进行了轻微修改,以考虑PE命名方案(* .dll,* .dll.a而不是 .so。和* .so),并开始构建。
这非常顺利,直到最近,我可以根据安装计划使用Inno Setup轻松构建Windows设置,即需要为我的软件包安装.deb的列表。此列表由chroot-ed apt-get(带--print-uris
)生成,看起来像:
/projects/www/debian/dev/pool/dists/experimental/main/base/libfreetype6_2.4.4-1+mingw.1_mingw-amd64.deb
/projects/www/debian/dev/pool/dists/experimental/main/base/libwxmsw2.8_2.8.10.1-3.1_mingw-amd64.deb
[...]
基本上,我使用apt来解析依赖项和Inno Setup来进行安装。
当然,mingw-i686没有真正的debian系统,所以我无法本地运行。我通过将必要的文件放入目录并使用apt-get -o RootDir=
将apt的根目录更改为此目录来破解解决方案。这是有效的,因为apt-get从未真正地chrooted到这个目录,只在那里寻找它的数据库。
最近,一个新的apt版本被推入Debian测试,而这个apt版本确实实际上是chroot到RootDir。所以,我的RootDir解决方案变得不切实际,设置合适的chroot会做很多工作。
有没有人知道如何以其他方式获取包列表?也就是说,获取.deb的列表以及非本机架构上特定包的所有依赖项?
答案 0 :(得分:0)
我通过修复我的apt找到了解决方案。
我遇到了两个不同的问题:第一,apt和国外版本似乎目前在测试中被打破,因为multi-arch dpkg还没有在这里。 Apt尝试调用dpkg --print-foreign-architectures
,因为它是一个多拱dpkg调用而失败,因为dpkg还不是那么远。必须通过明确设置APT :: Architectures来解决这个问题。
其次,我只能通过调用apt as:
来重新生成apt的状态APT_CONFIG=apt.conf apt-get
并使用此配置文件:
APT::Architecture "@ARCH@";
APT::Architectures { "@ARCH@"; }
Dir::State "@TREE@/var/lib/apt";
Dir::Cache "@TREE@/var/cache/apt";
Dir::Etc "@TREE@/etc/apt";
Dir::Parts "@TREE@/etc/apt/apt.conf.d";
Dir::State::status "@TREE@/var/lib/dpkg/status";
APT::Get::Assume-Yes "true";
@ TREE @取代了我准备好的,干净的apt-tree和@ ARCH @取代了我的架构(mingw-i686)。它已经在精美的文档中,即使有点隐藏。