Ubuntu上通过源码包编译安装软件包
2020-04-04 10:35:42 +08 字数:1302 标签: LinuxDebian/Ubuntu系列(也许得加上所有Linux发行版),官方源自带的软件包, 包括可执行文件、静态链接库、动态链接库,在源中都有对应的源码包。 通过下载对应的源码包,可以离线构建其对应的软件包。
以下以gcc
为例,介绍如果查询软件包、下载源码包,以及通过源码包构建其软件包。
查询软件 ¶
在https://packages.ubuntu.com/,可通过搜索,查找到所有官方软件包。
比如,gcc
的16.04(xenial)地址:https://packages.ubuntu.com/xenial/gcc
在其左上角,可以找到gcc
对应的源码包:gcc-defaults。
除了gcc
外,它还对应了cpp
、g++
等几十个软件包。
下载源码包 ¶
以下在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需要的软件包,如make
、python
等。
离线构建 ¶
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中已经包含了所有软件的源码的对应版本。
从本文也大概可看出,一个开源发行版的第一方软件生态建设,是怎样一个流程。