在 Linux 中从源代码构建软件

CompTIABeginner
立即练习

简介

在本实验中,你将学习在 Linux 系统上从源代码构建和安装软件的基本流程。对于那些在发行版软件包管理器中无法获取的应用程序,或者当你需要启用特定的自定义功能时,这是一项至关重要的技能。你将以实际的 Pure-FTPd 服务器为例,了解基于源代码安装工作流的每一个阶段。

你将首先使用 tar 命令从压缩归档文件(通常称为 tarball)中提取源代码。接下来,你将通过运行 ./configure 脚本来准备构建环境,并使用 make 命令将源代码编译为可执行程序。编译成功后,你将使用 make install 将软件安装到系统范围内。最后,你将学习如何正确卸载软件并清理源代码文件,从而完成源代码安装的整个生命周期。

使用 tar 提取源代码

在此步骤中,你将学习如何使用 tar 命令提取通常被称为「tarball」的源代码归档文件。软件源代码通常以 .tar.gz 等压缩归档文件的形式分发,以便将所有必要的文件打包在一起并减小整体文件大小。

首先,让我们确认源代码归档文件是否存在于我们当前的工作目录 ~/project 中。使用 ls -l 命令列出文件及其详细信息。

ls -l

你应该能在输出中看到 pure-ftpd-1.0.53.tar.gz 文件。

total 748
-rw-r--r-- 1 labex labex 765432 Nov 10 12:00 pure-ftpd-1.0.53.tar.gz

现在,我们将使用 tar 命令提取该归档文件的内容。我们将使用的选项包括:

  • -xextract,从归档文件中提取文件。
  • -z:使用 gzip 解压归档文件(由 .gz 扩展名标识)。
  • -vverbose,详细输出,在提取文件时列出所有文件。
  • -f:指定要处理的归档文件的 filename(文件名)。

在终端中运行以下命令来提取归档文件:

tar -zxvf pure-ftpd-1.0.53.tar.gz

-v 选项会使 tar 打印出它提取的每个文件的名称。输出内容会很长,但应该类似于下面的示例,显示正在创建的目录结构和文件。

pure-ftpd-1.0.53/
pure-ftpd-1.0.53/AUTHORS
pure-ftpd-1.0.53/README
pure-ftpd-1.0.53/README.LDAP
pure-ftpd-1.0.53/README.MySQL
pure-ftpd-1.0.53/README.PGSQL
...
pure-ftpd-1.0.53/src/puredb_p.h
pure-ftpd-1.0.53/src/pure-quotacheck.c
pure-ftpd-1.0.53/src/pure-uploadscript.c

命令完成后,将创建一个包含源代码的新目录。让我们再次使用 ls -l 查看这个新目录。

ls -l

现在,你应该能看到 pure-ftpd-1.0.53 目录以及原始的 tarball 文件。

total 752
drwxr-xr-x 10 labex labex    4096 Nov 10 12:05 pure-ftpd-1.0.53
-rw-r--r--  1 labex labex  765432 Nov 10 12:00 pure-ftpd-1.0.53.tar.gz

你已经成功从归档文件中提取了源代码。在下一步中,我们将进入这个新目录并开始配置和编译过程。

使用 ./configure 和 make 配置并编译软件

在此步骤中,你将针对特定系统配置源代码,然后将其编译为可执行程序。这是在 Linux 系统上从源代码构建软件的标准两步流程。

首先,你需要将当前位置更改为上一步创建的目录。使用 cd 命令进入 pure-ftpd-1.0.53 目录。

cd ~/project/pure-ftpd-1.0.53

现在你已经进入了源代码目录,流程的第一部分是运行 configure 脚本。该脚本会检查你的系统,确认构建软件所需的所有工具、库和依赖项是否齐备。然后,它会生成一个 Makefile,其中包含了编译过程的指令。

要运行该脚本,你必须在其名称前加上 ./。这会告诉 shell 在当前目录中查找 configure 脚本。

./configure

脚本将运行一系列检查,你会看到大量输出滚动。这是正常的。运行成功后,将以类似下方的摘要结束。

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
...
checking for OpenSSL... no
...
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating man/Makefile
...
config.status: executing depfiles commands

Pure-FTPd has been configured.

注意 config.status: creating Makefile 这一行。这确认了 Makefile 已成功创建。

流程的第二部分是编译代码。make 命令会读取 Makefile 并使用正确的选项运行编译器(如 gcc),将人类可读的源代码(.c 文件)转换为机器可执行的二进制文件。

现在,运行 make 命令。

make

此过程可能需要一点时间。你会看到许多输出行,因为 make 会为每个源代码文件调用编译器。这就是实际的编译过程。

(CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/labex/project/pure-ftpd-1.0.53/config/missing automake-1.15 --gnu src/Makefile)
...
gcc -g -O2 -Wall -W -Wshadow -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -c pure-ftpd.c
...
gcc -g -O2 -Wall -W -Wshadow -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline   -o pure-ftpd pure_ftpd-pure-ftpd.o pure_ftpd-log.o ...
...
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.53/src'

一旦 make 命令完成且没有报错,软件就编译成功了。二进制文件现在可以安装到系统中了,你将在下一步中完成此操作。

使用 make install 安装软件

在此步骤中,你将把编译好的软件安装到你的系统中。使用 make 编译源代码后,生成的二进制文件和其他必要组件(如文档和配置文件)仍保留在源代码目录中。make install 命令会将这些文件复制到标准的系统级位置,以便可以从任何地方运行该软件。

确保你仍处于 ~/project/pure-ftpd-1.0.53 目录中。

安装过程通常需要向 /usr/local/bin/usr/local/sbin 等目录写入文件,这些目录由 root 用户拥有。因此,你必须使用 sudo 命令以管理员权限执行 make install

运行以下命令安装 Pure-FTPd:

sudo make install

make install 命令将读取 Makefile 并执行安装指令。你将看到显示文件被创建并复制到系统目录的输出。

make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.53/src'
/usr/bin/mkdir -p '/usr/local/sbin'
/usr/bin/install -c pure-ftpd pure-pw pure-pwconvert pure-authd pure-certd pure-uploadscript pure-quotacheck '/usr/local/sbin'
/usr/bin/mkdir -p '/usr/local/share/man/man8'
/usr/bin/install -c -m 644 ../man/pure-ftpd.8 ../man/pure-pw.8 ../man/pure-pwconvert.8 ../man/pure-authd.8 ../man/pure-certd.8 '/usr/local/share/man/man8'
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.53/src'
make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.53'
/usr/bin/mkdir -p '/usr/local/etc'
/usr/bin/install -c -m 644 pure-ftpd.conf '/usr/local/etc'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.53'

软件现已安装完毕。验证此操作的一个简单方法是使用 which 命令,它会在系统的 PATH 中搜索可执行文件并打印其完整路径。

which pure-ftpd

如果安装成功,你应该会看到以下输出,表明 pure-ftpd 可执行文件现在位于标准的系统目录中。

/usr/local/sbin/pure-ftpd

软件安装完成后,从技术上讲它已经可以进行配置和使用了。不过,在本练习中,下一步将指导你完成卸载它的过程。

使用 make uninstall 和 rm 卸载软件并清理

在最后一步中,你将学习如何正确卸载从源代码安装的软件并清理构建文件,将系统恢复到原始状态。这是手动管理软件的重要组成部分。

大多数使用 Makefile 的编写规范的源代码包都提供了一个 uninstall 目标。该目标旨在撤销 make install 的操作,删除所有复制到系统目录的文件。

首先,确保你仍处于 ~/project/pure-ftpd-1.0.53 目录中。就像安装过程需要管理员权限一样,卸载过程也需要。使用 sudo 运行 make uninstall 命令。

sudo make uninstall

你将看到显示文件正从安装它们的系统目录中被删除的输出。

make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.53/src'
rm -f /usr/local/sbin/pure-ftpd /usr/local/sbin/pure-pw /usr/local/sbin/pure-pwconvert /usr/local/sbin/pure-authd /usr/local/sbin/pure-certd /usr/local/sbin/pure-uploadscript /usr/local/sbin/pure-quotacheck
rm -f /usr/local/share/man/man8/pure-ftpd.8 /usr/local/share/man/man8/pure-pw.8 /usr/local/share/man/man8/pure-pwconvert.8 /usr/local/share/man/man8/pure-authd.8 /usr/local/share/man/man8/pure-certd.8
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.53/src'
make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.53'
rm -f /usr/local/etc/pure-ftpd.conf
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.53'

要确认软件已被删除,你可以再次使用 which 命令。

which pure-ftpd

这一次,该命令应该不会产生任何输出,因为 pure-ftpd 可执行文件已从 /usr/local/sbin 中删除,并且在系统的 PATH 中也无法再找到它。

现在软件已卸载,最后一步是删除源代码目录本身。你不能在进入目录的同时删除它,所以首先导航回项目的根目录。

cd ~/project

现在,使用带有 -r(递归)选项的 rm 命令来删除 pure-ftpd-1.0.53 目录及其所有内容。

rm -r pure-ftpd-1.0.53

如果成功,此命令不会产生任何输出。你可以通过列出 ~/project 目录的内容来验证其是否已被删除。

ls -l

pure-ftpd-1.0.53 目录现已消失,只剩下原始的 tarball 文件。

total 748
-rw-r--r-- 1 labex labex 765432 Nov 10 12:00 pure-ftpd-1.0.53.tar.gz

恭喜!你已经成功完成了从源代码构建软件的整个过程:提取、配置、编译、安装,最后是卸载和清理。

总结

在本实验中,你学习了在 Linux 系统上从源代码构建和安装软件的标准程序。你首先使用 tar 命令提取了一个压缩的源代码归档文件,也称为 tarball (.tar.gz)。提取完成后,你进入源代码目录并运行了 ./configure 脚本,该脚本通过检查系统依赖项并创建 Makefile 来为编译准备软件。最后,你使用 make 命令将源代码编译为可执行的二进制文件,并使用 make install 将软件复制到相应的系统目录中。

此外,你还练习了删除软件和清理构建环境的正确方法。你学习了如何使用 make uninstall 命令从系统中删除已安装的文件。为了完成清理过程,你使用 rm 命令删除了原始源代码目录,确保系统恢复到了之前的状态。