我按照以下食谱从源代码构建了一个包:
echo "deb-src http://archive.ubuntu.com/ubuntu focal main" >> /etc/apt/sources.list
echo "deb-src http://archive.ubuntu.com/ubuntu focal-updates main" >> /etc/apt/sources.list
apt update
apt source package
apt build-dep -y package
cd package/
dpkg-buildpackage
我想在 aarch64 主机上针对 amd64 目标交叉编译此包。哪些部分可能需要修改?
例如,我可以从以下开始:
# basically, set up the apt repos for both amd64 and aarch64
sed -i '/^deb / {p; s/^deb /deb [arch=arm64] /}' /etc/apt/sources.list
sed -i 's,^deb http://ports.ubuntu.com/ubuntu-ports/,deb [arch=amd64] http://archive.ubuntu.com/ubuntu/,' /etc/apt/sources.list
echo "deb-src [arch=amd64] http://archive.ubuntu.com/ubuntu focal main" >> /etc/apt/sources.list
echo "deb-src [arch=amd64] http://archive.ubuntu.com/ubuntu focal-updates main" >> /etc/apt/sources.list
dpkg --add-architecture amd64
apt update
# install the cross compiler
apt install -y gcc-x86-64-linux-gnu
apt source package:amd64
apt build-dep -y package:amd64
cd package/
dpkg-buildpackage --target-arch=amd64
但这似乎并不完整。例如,如果我正在构建 Linux 内核,dpkg-buildpackage
则会抱怨我缺少诸如 之类的依赖项libudev-dev
,并且它会调用make ARCH=arm64 CROSS_COMPILE=
which 用于主持人架构,而不是目标。
答案1
这是关于该主题的一个老问题:如何交叉构建 Debian 软件包。
tshepang 的回答指出使用dpkg-buildpackage --host-arch=amd64
而不是--target-arch=
.根据广泛使用的定义,这对我来说是违反直觉的主持人和目标交叉编译时,但是Debian 的命名法略有不同,并且target-arch
仅在构建编译器等时使用。
例如,如果我正在构建 Linux 内核,
dpkg-buildpackage
则会抱怨我缺少诸如libudev-dev
...之类的依赖项
我解决了这个问题,--no-check-builddeps
但我还没有弄清楚为什么dpkg-buildpackage
相信缺少一些依赖项。