Ubuntu上通过源码包编译安装软件包

Debian/Ubuntu系列(也许得加上所有Linux发行版),官方源自带的软件包, 包括可执行文件、静态链接库、动态链接库,在源中都有对应的源码包。 通过下载对应的源码包,可以离线构建其对应的软件包。

以下以gcc为例,介绍如果查询软件包、下载源码包,以及通过源码包构建其软件包。

查询软件

https://packages.ubuntu.com/,可通过搜索,查找到所有官方软件包。

比如,gcc的16.04(xenial)地址:https://packages.ubuntu.com/xenial/gcc

在其左上角,可以找到gcc对应的源码包:gcc-defaults。 除了gcc外,它还对应了cppg++等几十个软件包。

下载源码包

以下在Docker容器中,网络隔绝条件下进行。 在容器中,可下载gcc-defaults源码包:

cd ~
apt update
apt install -y dpkg-dev
apt-get source gcc-defaults

对Debian,源码包默认是处于注释状态,不可用。 需要在/etc/apt/sources.list中,取消那行注释。

通过apt-get source <PACKAGE>,可下载任意源码包。 在Ubuntu 16.04,执行完已自动解压。

# tree .
.
|-- gcc-defaults-1.150ubuntu1
|   |-- c89
|   |-- c89.1
|   |-- c99
|   |-- c99.1
|   |-- classpath.security
|   |-- debian
|   |   |-- README.Debian
|   |   |-- README.Debian.m4
|   |   |-- aot-compile
|   |   |-- aotcompile.py
|   |   |-- changelog
|   |   |-- classfile.py
|   |   |-- compat
|   |   |-- control
|   |   |-- control.cross-ada.in
|   |   |-- control.cross-ml.in
|   |   |-- control.cross.in
|   |   |-- control.doc
|   |   |-- control.hppa64.in
|   |   |-- control.native.in
|   |   |-- control.pkg-config.in
|   |   |-- control.source
|   |   |-- copyright
|   |   |-- copyright.libgcj-common
|   |   |-- cpp.postinst
|   |   |-- cpp.prerm
|   |   |-- dh_javadoc
|   |   |-- dh_nativejava
|   |   |-- disable_64_gcc
|   |   |-- g++.postinst.in
|   |   |-- g++.prerm
|   |   |-- g77-doc.prerm
|   |   |-- g77.postinst.in
|   |   |-- g77.prerm
|   |   |-- gcc.postinst.in
|   |   |-- gcc.preinst
|   |   |-- gcc.prerm
|   |   |-- gdc.preinst
|   |   |-- generate-cacerts.pl.in
|   |   |-- gfortran.postinst.in
|   |   |-- gfortran.prerm
|   |   |-- gij.prerm
|   |   |-- libgcj-bc.overrides
|   |   |-- libgcj-common.postinst
|   |   |-- libgcj-common.preinst
|   |   |-- libgcj-common.prerm
|   |   |-- postinst-rebuild-gcj-db
|   |   |-- postrm-rebuild-gcj-db
|   |   |-- rebuild-gcj-db
|   |   |-- rebuild-security-providers
|   |   `-- rules
|   |-- fsf-funding.7
|   |-- gfdl.7
|   `-- gpl.7
|-- gcc-defaults_1.150ubuntu1.dsc
`-- gcc-defaults_1.150ubuntu1.tar.gz

2 directories, 55 files

源码包中,gcc-defaults_1.150ubuntu1.tar.gz并不是直接的源码,而是构建相关配置文件,解压后就是gcc-defaults-1.150ubuntu1

准备编译依赖

apt-get build-dep gcc-defaults

这里会安装所有编译gcc-defaults需要的软件包,如makepython等。

离线构建

cd gcc-defaults-1.150ubuntu1
dpkg-buildpackage

大概需要2分钟。构建完成后,可以在上级目录查看构建产物:

# ls ..
cpp-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb             gccgo-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb                gfortran-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb
cpp-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb             gccgo-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb              gfortran-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb
cpp-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb           gccgo-doc_6-20160210-1ubuntu1_amd64.deb                         gfortran-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
cpp-doc_5.3.1-1ubuntu1_amd64.deb                           gccgo-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb       gfortran_5.3.1-1ubuntu1_amd64.deb
cpp-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb             gccgo-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb         gobjc++-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb
cpp-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb         gccgo-multilib_6-20160210-1ubuntu1_amd64.deb                    gobjc++-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb
cpp-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb               gccgo-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb                gobjc++-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb
cpp_5.3.1-1ubuntu1_amd64.deb                               gccgo-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb            gobjc++-multilib-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb
g++-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb             gccgo-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb                  gobjc++-multilib-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb
g++-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb             gccgo_6-20160210-1ubuntu1_amd64.deb                             gobjc++-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb
g++-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb           gcj-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb                  gobjc++-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
g++-multilib-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb    gcj-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb                  gobjc++-multilib_5.3.1-1ubuntu1_amd64.deb
g++-multilib-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb  gcj-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb                gobjc++-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb
g++-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb    gcj-jdk_5.3.1-1ubuntu1_amd64.deb                                gobjc++-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb
g++-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb      gcj-jre-headless_5.3.1-1ubuntu1_amd64.deb                       gobjc++-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
g++-multilib_5.3.1-1ubuntu1_amd64.deb                      gcj-jre_5.3.1-1ubuntu1_amd64.deb                                gobjc++_5.3.1-1ubuntu1_amd64.deb
g++-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb             gcj-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb                  gobjc-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb
g++-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb         gcj-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb              gobjc-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb
g++-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb               gcj-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb                    gobjc-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb
g++_5.3.1-1ubuntu1_amd64.deb                               gdc-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb                  gobjc-multilib-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb
gcc-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb             gdc-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb                  gobjc-multilib-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb
gcc-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb             gdc-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb                gobjc-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb           gdc-multilib-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb       gobjc-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-defaults-1.150ubuntu1                                  gdc-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb         gobjc-multilib_5.3.1-1ubuntu1_amd64.deb
gcc-defaults_1.150ubuntu1.dsc                              gdc-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb           gobjc-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-defaults_1.150ubuntu1.tar.gz                           gdc-multilib_5.3.1-1ubuntu1_amd64.deb                           gobjc-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-defaults_1.150ubuntu1_amd64.changes                    gdc-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb                  gobjc-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-doc_5.3.1-1ubuntu1_amd64.deb                           gdc-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb              gobjc_5.3.1-1ubuntu1_amd64.deb
gcc-hppa64-linux-gnu_5.3.1-1ubuntu1_amd64.deb              gdc-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb                    libgcj-bc_5.3.1-1ubuntu1_amd64.deb
gcc-multilib-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb    gdc_5.3.1-1ubuntu1_amd64.deb                                    libgcj-common_4.9.3-9ubuntu1_all.deb
gcc-multilib-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb  gfortran-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb             libphobos-dev_5.3.1-1ubuntu1_amd64.deb
gcc-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb    gfortran-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb             pkg-config-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb      gfortran-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb           pkg-config-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb
gcc-multilib_5.3.1-1ubuntu1_amd64.deb                      gfortran-doc_5.3.1-1ubuntu1_amd64.deb                           pkg-config-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb
gcc-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb             gfortran-multilib-arm-linux-gnueabi_5.3.1-1ubuntu1_amd64.deb    pkg-config-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb         gfortran-multilib-arm-linux-gnueabihf_5.3.1-1ubuntu1_amd64.deb  pkg-config-powerpc64le-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb               gfortran-multilib-powerpc-linux-gnu_5.3.1-1ubuntu1_amd64.deb    pkg-config-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gcc_5.3.1-1ubuntu1_amd64.deb                               gfortran-multilib-s390x-linux-gnu_5.3.1-1ubuntu1_amd64.deb
gccgo-aarch64-linux-gnu_5.3.1-1ubuntu1_amd64.deb           gfortran-multilib_5.3.1-1ubuntu1_amd64.deb

这些就是gcc-defaults对应的软件包,可直接在当前系统上安装使用。

结论

https://packages.ubuntu.com/source/xenial/,可以查看到Ubuntu 16.04所有的源码包。 这个页面是按类别给出子页面,底部有完整列表链接。 它们能够完整编译出https://packages.ubuntu.com/xenial/这个页面显示的所有软件包。

Linux发行版是通过对源码包进行版本管控,自动构建出对应的软件包。 虽然直接使用的是软件包,但发行的ISO中已经包含了所有软件的源码的对应版本。

从本文也大概可看出,一个开源发行版的第一方软件生态建设,是怎样一个流程。


相关笔记