在 Linux 中从源码构建软件

CompTIABeginner
立即练习

介绍

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

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

这是一个引导实验,提供了逐步指导以帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 98%。它获得了学习者 100% 的好评率。

使用 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 命令提取该归档文件的内容。我们将使用的选项包括:

  • -x:从归档文件中提取(extract)文件。
  • -z:使用 gzip 解压归档文件,这由 .gz 扩展名指示。
  • -v:显示详细(verbose)输出,列出正在提取的所有文件。
  • -f:指定要处理的归档文件名(filename)。

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

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

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

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

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

ls -l

你现在应该能看到 pure-ftpd-1.0.50 目录与原始的 tarball 文件并列。

total 752
drwxr-xr-x 10 labex labex    4096 Nov 10 12:05 pure-ftpd-1.0.50
-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.50 目录。

cd ~/project/pure-ftpd-1.0.50

现在你已进入源代码目录,流程的第一部分是运行 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.50/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.50/src'

一旦 make 命令无错误完成,软件就成功编译好了。二进制文件现在已准备好安装到系统中,你将在下一步进行此操作。

使用 make install 安装软件

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

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

安装过程通常需要将文件写入 /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.50/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.50/src'
make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50'
/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.50'

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

which pure-ftpd

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

/usr/local/sbin/pure-ftpd

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

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

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

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

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

sudo make uninstall

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

make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50/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.50/src'
make[1]: Entering directory '/home/labex/project/pure-ftpd-1.0.50'
rm -f /usr/local/etc/pure-ftpd.conf
make[1]: Leaving directory '/home/labex/project/pure-ftpd-1.0.50'

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

which pure-ftpd

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

现在软件已卸载,最后一步是删除源代码目录本身。你不能在目录内部删除该目录,所以首先请返回到项目的根目录。

cd ~/project

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

rm -r pure-ftpd-1.0.50

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

ls -l

pure-ftpd-1.0.50 目录现在已经消失,只剩下原始的 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 命令删除了原始源代码目录,确保系统恢复到之前的状态。