![如何在 Debian 安装文件中表示 $ARCH-pc-linux-gnu?](https://linux22.com/image/995447/%E5%A6%82%E4%BD%95%E5%9C%A8%20Debian%20%E5%AE%89%E8%A3%85%E6%96%87%E4%BB%B6%E4%B8%AD%E8%A1%A8%E7%A4%BA%20%24ARCH-pc-linux-gnu%EF%BC%9F.png)
我目前正在研究GNU Octave PPA。我的octave.install
文件(据我所知,它遵循与规则文件相同的格式约定)需要包含来自以下文件:
usr/lib/${DEB_HOST_MULTIARCH}/octave/${DEB_VERSION_UPSTREAM}/exec/x86_64-pc-linux-gnu/*
对于 64 位(或 amd64)版本:
usr/lib/${DEB_HOST_MULTIARCH}/octave/${DEB_VERSION_UPSTREAM}/exec/i386-pc-linux-gnu/*
适用于 32 位版本。我该如何编写安装文件,以便它能在这些相应的系统上包含这些文件?我尝试过:
ARCH=$(uname -m)
usr/lib/${DEB_HOST_MULTIARCH}/octave/${DEB_VERSION_UPSTREAM}/exec/$ARCH-pc-linux-gnu/*
希望规则文件和 shell 脚本在语法上的相似性能够使此行工作。但变量$ARCH
未被求值(即,它被保留为$ARCH
,而不是替换我在上一行中定义的值),并且构建失败(这里是构建日志)。
编辑:Launchpad 刚刚尝试构建建议,${ARCH}
以代替$ARCH
上述尝试修复。错误如下:
find debian/tmp -name '*.la' -delete
make[1]: Leaving directory `/<<PKGBUILDDIR>>'
dh_install -a -O--parallel
install -d debian/octave//usr/bin
cp -a debian/tmp/usr/bin/octave-4.2.0 debian/octave//usr/bin/
cp -a debian/tmp/usr/bin/octave-cli debian/octave//usr/bin/
cp -a debian/tmp/usr/bin/octave-cli-4.2.0 debian/octave//usr/bin/
cp -a debian/tmp/usr/share/applications debian/octave//usr/share/
install -d debian/octave/-m\)
cp -a debian/tmp/ARCH=\$\(uname debian/octave/-m\)/
cp: cannot stat ‘debian/tmp/ARCH=$(uname’: No such file or directory
dh_install: cp -a debian/tmp/ARCH=$(uname debian/octave/-m)/ returned exit code 1
make: *** [binary-arch] Error 2
dpkg-buildpackage: error: fakeroot debian/rules binary-arch gave error exit status 2
--------------------------------------------------------------------------------
Build finished at 20161117-1936
答案1
类似地${DEB_HOST_MULTIARCH}
,还有其他变量用于说明架构信息的详细信息。如以下 Debian 政策手册中所述:
4.9 主要构建脚本:
debian/rules
make
我们构建的架构和构建目标架构由使用实用程序 的变量确定dpkg-architecture
。您可以确定构建架构以及主机架构的 Debian 架构和 GNU 样式架构规范字符串。构建架构是在其上debian/rules
运行和执行包构建的架构。主机架构是将在其上安装和运行生成的包的架构。它们通常是相同的,但在交叉编译的情况下可能会有所不同(在不同架构的机器上为一种架构构建包)。以下是受支持的 make 变量的列表:
DEB_*_ARCH (the Debian architecture) DEB_*_ARCH_CPU (the Debian CPU name) DEB_*_ARCH_OS (the Debian System name) DEB_*_GNU_TYPE (the GNU style architecture specification string) DEB_*_GNU_CPU (the CPU part of DEB_*_GNU_TYPE) DEB_*_GNU_SYSTEM (the System part of DEB_*_GNU_TYPE)
其中
*
,要么BUILD
用于构建架构的规范,要么HOST
用于主机架构的规范。通过将所需的变量设置为合适的默认值,可以在规则文件中提供向后兼容性;有关详细信息,请参阅文档
dpkg-architecture
。重要的是要理解,
DEB_*_ARCH
字符串仅确定我们正在构建的 Debian 架构。它不应该用于获取 CPU 或系统信息;DEB_*_ARCH_CPU
和DEB_*_ARCH_OS
变量应该用于此目的。GNU 样式变量通常只应与上游构建系统一起使用。
你要找的是DEB_HOST_GNU_CPU
。因此新的安装行应该是:
usr/lib/${DEB_HOST_MULTIARCH}/octave/${DEB_VERSION_UPSTREAM}/exec/${DEB_HOST_GNU_CPU}-pc-linux-gnu/*
您可以通过运行以下命令在本地机器上查看这些变量的值:
~$ dpkg-architecture
DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_BUILD_MULTIARCH=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_MULTIARCH=x86_64-linux-gnu
DEB_TARGET_ARCH=amd64
DEB_TARGET_ARCH_BITS=64
DEB_TARGET_ARCH_CPU=amd64