首页 > 其他分享 >[翻译]写给初学者的源代码安装指南Beginner's Guide to Installing from Source

[翻译]写给初学者的源代码安装指南Beginner's Guide to Installing from Source

时间:2022-12-20 23:11:38浏览次数:39  
标签:文件 Beginner tar make Installing 应用程序 源代码 安装

写给初学者的源代码安装指南

引入

本文档面向希望直接从原始作者处安装软件的开源操作系统用户,而不是仅依赖其操作系统提供的软件(和版本)。它是为那些不熟悉以源代码形式下载软件的概念的人编写的,提供有关相关命令和一般过程的背景信息。

讲解概念

  • 开发和发行:独立软件开发人员、多操作系统支持、发布(归档)文件、版本控制
  • 发行版,二进制包和包管理器
  • 下载:HTTP、FTP、wget、校验和和签名
  • 存档文件:tar、zip、gzip
  • 通用文件:README和INSTALL;必需的依赖项
  • 使用sed/awk/patch进行修补
  • 构建和安装:configure、make、cmake、perl和python
  • 构建并安装文档
  • 编译器设置与剥离,处理错误
  • 安装后工作

开发和发行

一个典型的操作系统由数百个不同的应用程序组成。在专有操作系统中,该操作系统的生产者/销售者通常拥有并管理所有软件的开发。然而,开源系统通常是通过获取和集成由许多独立团体——甚至是单个独立开发人员——发明和维护的应用程序来创建的。此外,开源软件项目通常用于各种不同的操作系统,例如基于Linux、基于BSD、Hurd,有时甚至集成到专有操作系统中,如Solaris、Mac甚至Windows(如果许可证允许)。

最初的软件开发人员有时被分发维护人员和最终用户称为上游源或简单地称为上游。同样,开发人员通常将使用其代码的发行版或最终用户称为下游。

大多数开源项目将源代码存储在一个版本控制系统中,该系统可以通过互联网访问(匿名用户只读)。对于此类项目,可以下载最新的“进行中”文件,或下载带有某个版本id(版本号)的“标记”文件集。然而,这样做往往效率不高;项目通常通过创建包含所有相关文件的归档文件并使其可供下载来定期发布。对于没有公共版本控制系统的项目,这种定期发布的归档文件是直接获取源代码的唯一方法。

发行版,二进制包和包管理器

有许多操作系统发行版可以查找、下载和调整所有最常用的软件包。部分还对其进行编译,并使二进制形式的结果可用。它有很多好处,包括更快的安装,在固定位置可以找到相关的软件,特别是提供相关的安全补丁:分发维护人员可以监视安全更新,并使最终用户易于注意和安装。

然而,这些发行版通常不包括最新版本的软件;如果您需要比发行版提供的版本更新的版本,那么可能需要自己构建。软件在编译安装时通常是高度可定制的,特别是能够省略不需要的功能。因为发行版需要让广大用户满意,所以他们倾向于在他们发行的编译应用程序中包含所有功能;作为最终用户,您可以通过自己编译应用程序来更好地调整应用程序。

发行版通常包括一个包管理器,它维护一个已安装软件的数据库。在软件包管理器的“背后”更改机器上的软件不是一个好主意;之后可能会出现各种奇怪的行为。如果您的发行版有软件包管理器,请阅读本文档以了解详细信息,然后查阅发行版的文档以了解如何安装软件而不会混淆您的软件包管理。通常,这包括编写描述软件的软件包规范,然后使用本地软件包管理器来编译和安装软件。这适用于所有具有包管理器的发行版,无论应用程序是以二进制(预编译)还是源代码形式发行。

下载与安全

下载归档文件的通常方法是使用web浏览器,单击“下载”按钮,单击链接,或右键单击链接并选择“另存为”。这将使用“HTTP”协议下载文件。有些网站通过旧的“FTP”协议提供文件。许多web浏览器也支持这一点,即单击链接也可以在这里工作。另外,还有FTP客户端应用程序用于处理这些工作。

“wget”或“curl”命令行应用程序也可以在类UNIX操作系统下使用,当已知正确的URL时,通过HTTP或FTP获取文件。

发布经常下载的软件的网站通常会设置“镜像”网站,即帮助人们在世界各地保存文件副本。原始站点通常有可用镜像的列表,您应该选择离您最近的镜像。这有助于降低原始发布者的网络带宽成本,通常还可以让您更快地下载。

“HTTP”和“FTP”网络协议都可以被犯罪分子或其他不受欢迎的各方拦截,然后他们可以在下载数据时修改数据。数据在传输过程中也可能因意外而损坏(尽管这并不常见)。使用镜像站点时,可能有人修改了那里的文件(即镜像上的文件与原始发布者的文件不同)。因此,验证您下载的内容是否符合原始出版商的意图是一个好主意。

许多站点为每个归档文件提供一个md5sum文件,其中包含文件内容的校验和;有时,一个md5sums文件保存许多其他文件的校验和。您应该始终从原始站点获取md5sums文件,而不是镜像。如果可能,您应该通过安全的HTTPS协议下载它。然后可以使用UNIX md5sum命令行工具计算大存档文件的校验和,并将其与预期值进行比较,以确保内容符合预期。

要计算单个文件的总和,请执行以下操作:

md5sum file-to-check

并“手动”验证此应用程序的输出是否符合预期值。如果校验值在网页中,您可以打开该页面上的“查找”对话框,复制并粘贴md5sum程序输出的值。只有当值相同时,“查找”才会匹配。

如果软件提供商提供的md5sums文件包含(文件名、校验和)对列表,则可以运行:

md5sum -c md5sums-file

它将在本地系统中查找md5sums文件中列出的每个文件,计算其校验和,如果不是预期值,则报告错误。

一些软件提供商签署存档文件,而不是(或)提供md5校验和。在这种情况下,您应该:

  • 从其网站下载提供商的公钥(可能时使用HTTPS)
  • 下载存档文件的“签名文件”;这将是一个小文件,其基本名称与下载的文件相同,后缀为“.sig”或“.asc”
  • 执行以下步骤
# 每个密钥只需要一次
gpg --import {public-key}

gpg --verify {signature-file-name}

验证步骤解密签名文件,显示校验和;然后,它对真实文件运行校验和算法,并检查它们是否相同。显然,“gpg”应用程序需要在本地安装。

归档文件

归档文件是一个包含多个其他文件的单个文件。创建此类文件有几种不同的工具,但在所有情况下,过程都是将所有单独的文件附加在一起,然后添加一个“索引”,其中包含原始文件的偏移量、长度、名称和其他属性,以便可以再次提取这些文件。

注意:英文中的“archive(归档)”一词可能意味着“旧”、不再使用或“备份”副本。虽然存档文件可用于存储备份或很少使用的数据,但它们也便于在网络中传递数据。

“tar”应用程序将多个文件打包成一个“tar格式”归档文件,这是开源中最常用的格式。Tar最初的意思是“磁带存档”,但这种格式在磁盘上也很适用。Tar存档不仅可以记住文件的原始名称,还可以记住它们的原始Unix“所有者id”和文件权限。所有者id很少有用(除非tar存档是在解压缩的同一台机器上创建的),但文件权限是有用的。按照惯例,tar格式的文件通常以“.tar”结尾。包含源代码的Tar格式文件有时被称为“tarball”。

tar应用程序不压缩文件内容。然而,源代码文件压缩率通常很高,网络带宽总是太慢、太昂贵,所以tar文件通常在创建后使用通用压缩应用程序进行压缩。最常用的压缩类型是“gzip”,生成的文件通常以“.tar.gz”或“.tgz”为后缀。使用bzip2压缩也很常见,这样的文件通常使用后缀“.tar.bz2”。偶尔会使用“xz”压缩;文件通常使用后缀“.tar.xz”。

tar应用程序的原始版本是很久以前创建的,已经多次重新实现。遗憾的是,这意味着可用的命令行选项会因您使用的应用程序版本的不同而有很大差异。功能也因版本而异;特别是一些版本可以自动检测何时使用了压缩,并自动解压缩,而另一些版本则需要传递正确的命令行参数来处理压缩文件,而其他版本则需要先解压缩文件。下面是一些从tar存档中提取文件的示例命令:

   # 现代GNU tar选项。这适用于压缩的文件
   # 包括 gzip 和 bzip
   tar --extract --file filename

   # 和上面类似
   tar -xf filename

   # 和上面意思相同
   tar xf filename

   # 显式解压缩gzip2压缩文件,然后将未压缩的结果直接传递到tar
   gzip -cd filename.tgz | tar xf -

   # 同上,但适用于bzip2压缩文件
   bunzip2 -cd filename.tar.bz2 | tar xf -

注意,如果省略了“f”,tar只会显示为挂起(等待用户输入)。

警告:解压缩tar文件可能会覆盖本地文件。默认情况下,文件被解压缩到当前目录的子目录中,只要当前目录是合适的,那么该子目录应该是安全的。但是,不要相信使用以下选项的任何说明;他们可能试图欺骗您修改重要的本地文件:

  -C or --directory
  -P or --absolute-names
  --transform or --xform

大多数tar文件都是这样创建的,即打开它们会在当前目录中创建一个子目录,而所有其他文件都放在该目录中;例如,打开名为“foo-1.2.tar.gz”的文件将创建一个名为“foo-1.2”的子目录,其中包含该目录中的文件。遗憾的是,并非所有打包源代码供下载的人都遵循这一惯例;有时tar文件会将其内容直接扩展到当前目录中,如果该目录中已经有文件,这会造成一个大混乱。因此,最好在解压缩之前使用以下命令检查tar文件的内容:

   # 现代的 GNU tar
   tar --list --file filename

   # 和上面意思相同
   tar -tf filename

   # 和上面相同
   tar tf filename

   gzip -cd filename | tar tf -
   bunzip -cd filename | tar tf -

有时,归档文件以“zip格式”分发。Zip存档在DOS和Windows世界中最常见,或者与Java相关,但在其他地方偶尔会遇到。Zip格式的工作方式类似于tar和gzip的组合(它使用与gzip相同的压缩,但有自己的内部“索引”)。Zipfile不保留原始的unix所有者或文件权限。这种文件的内容可以通过解压缩命令提取(假设它安装在本地)。

如果可以,应当以普通用户的身份进行解压。这是一项额外的安全措施,以防止任何意外的文件覆盖。然而,tar文件中记录的文件所有者设置仅在解压缩归档文件的用户是root用户时才会保留。如果你认为这很重要,则必须以“root”身份解压缩存档。

通用文件

解压缩的源代码存档通常在顶层目录中包含一个名为README或INSTALL(或两者都有)的文件。您应该首先阅读这些文档,因为它们提供了有关如何编译、安装和配置下载存档中其余源代码的重要信息。

通常在README或INSTALL中找到的一条重要信息是必须首先安装的其他软件的列表。您下载的任何程序都需要一些本地头文件、库文件和/或帮助工具来构建或运行。如果你没有得到正确的先决条件,那么应用程序可能无法编译,或者可能编译但无法运行,或者可能在没有你想要的某些可选功能的情况下构建。

另一个重要的信息是可以传递给构建过程的参数集;见下文。

补丁

有时,下载的软件在您的环境中不起作用,而且有人已经知道如何调整它来解决问题。解决问题的人可能会以sed或awk命令、包含多个sed/awk命令的shell脚本或补丁文件的形式发布他们的“调整”。显然,您需要对此类更改保持谨慎,只有在您信任源代码或有能力重新检查更改时才能应用这些更改。

sed工具将正则表达式应用于文本文件中的每一行,并用其他内容替换匹配的文本。这是一个相当有限的工具,但易于使用且广泛可用。

awk做了类似的事情,但能够执行更复杂的文本文件转换。

通过使用“diff”工具比较同一文件的两个版本并输出差异,可以创建补丁文件。补丁工具可以获取“diff”的输出,并将其应用于其中一个文件,以将其“转换”为另一个版本。补丁文件(即diff的输出)的好处在于它非常易于阅读,即很容易看到将要进行的更改。

构建系统:配置、制造、cmake之类

创建您刚刚下载的软件的软件开发人员显然需要某种方式来编译并在自己的计算机上安装该软件。无论他们使用的工具需要什么配置文件,几乎都包含在归档文件中。由于开源开发人员希望尽可能多的人使用他们的软件,他们也会努力使在一系列不同的系统上构建和安装软件变得容易。然而,它们不能支持世界上所有可能的配置。

最后,安装过程的重点是将原始源代码转换为本地计算机可以执行的格式,然后将所有必要的文件放入$PATH变量中列出的所有用户的目录中(以便他们可以执行这些文件)。为解释语言安装模块略有不同;这些文件安装在解释器(如python或perl)可以找到的地方,而不是直接在$PATH中。

Configure 和Make

用于管理源代码编译和安装的最广泛的工具是make。Make是一个应用程序,它采用一个配置文件(称为makefile),其中包含一系列规则,大多数形式为:

  • 当TARGET-FILE比SOURCE-FILE旧时,请执行某些操作

目标文件是最终产品或某个中间阶段。源文件是手工编写的源代码或一些中间工件。该操作通常是调用编译器、链接器或类似工具来重新创建目标文件。本文件篇幅太短,无法详细介绍非常复杂和强大的make命令;幸运的是,通常不需要理解makefile来编译软件,除非出了问题。有关makefile语法和行为的简要说明,请参见附录A。

不幸的是,尽管makefile语法非常强大,但它仍然不足以处理所有可能的计算机配置方式,以及安装软件的人可能希望编译应用程序的所有可能方式。因此,许多软件包都带有名为“configure”的shell脚本和名为“makefile.in”的模板makefile。configure脚本在命令行上获取配置选项列表,并将模板makefile转换为为本地计算机和安装程序的愿望定制的真实makefile。因此,安装顺序通常如下:

# 解压并阅读文档
tar xf filename
cd {directory created by above step}
less README
less INSTALL

# 生成定制的makefile
./configure {some options ...}

# 在本目录下进行编译
make

# 更新到全局目录(安装)
sudo make install

顺便说一句:“configure”脚本是由名为autotools的软件自动生成的,但这对使用它的人来说并不重要。

Configure通常被调用为“./configure”以避免两个可能的问题:

  • 有些用户的$PATH变量中没有“.”。特别是,出于安全原因,root用户没有此选项
  • 一些用户的$PATH中没有“.”作为第一个条目,这意味着可能会运行错误的配置脚本

通常,最好以正常系统用户(而不是root用户)的身份执行除make install以外的所有步骤。这避免了错误和可能的一些攻击(尽管安装步骤是以root身份完成的,这并没有太大的保护)。然而,将软件安装到全局/bin/usr目录通常需要管理权限(除非您使用的是“基于用户的软件包管理器”或类似的罕见设置)。

有些项目提供makefile,但没有“配置”脚本;在这种情况下,可以省略上面的“配置”步骤。要么应用程序简单到不需要它,要么软件开发人员在手工编写的makefile中构建了更多的逻辑。

并非所有系统都设置为启用了sudo。在这种情况下,请改用以下方法:

su  # 通常在之后要输入root密码
make install
exit

对于大多数软件,configure和make命令可以在与源代码相同的目录中运行,如上所示。结果是编译过程中生成的新文件与原始文件混合在一起,这有些混乱,但稍后可以使用make clean命令来整理这些文件。然而,对于某些软件,需要创建一个临时目录,将当前工作目录更改为该目录,然后在那里执行构建步骤;项目文档应说明这是否必要。有些人认为最好总是从临时目录构建。使用原始源代码旁边的单独目录进行构建的示例,这是一个常见的约定:

# 解压 {packagename} 到目录
tar xf filename

# 创建一个分离的build目录
mkdir {packagename}-build

# 在分离的build目录中进行编译
cd {packagename}-build
../{packagename}/configure {some options}
make

# 安装
sudo make install

其他构建工具

一些项目使用cmake作为构建工具。cmake的工作方式有点像configure(见上文);它生成一个makefile,其内容取决于传递给cmake命令的选项以及本地系统的特性。构建基于cmake的包所需的步骤与上面的“configure/make”示例相同,只是configure步骤被替换为:

cmake . -DCMAKE_BUILD_TYPE=Release {some options ...}

与往常一样,检查项目文档以获取有关如何构建的说明。

有些项目使用基于python或perl的构建工具,而不是make。这些原则仍然相当相似。

不需要编译的软件通常具有相当简单和快速的安装过程。特别是,用Perl或Python解释语言编写的应用程序只需将文件复制到相关位置即可安装。然而,这些项目在存档文件中包含执行此任务的程序或脚本,而不需要安装程序手动执行此任务。

环境变量

配置应用程序编译和安装的选项通常作为命令行参数传递给configure脚本或make程序。然而,有时配置选项通过环境变量传递。这些可以通过将定义放在命令开头来指定,例如

NAME=tom ENABLE_FOO=no ./configure

也可以在运行命令之前定义环境变量:

export NAME=tom
export ENABLE_FOO=no
./configure

哪些选项可用通常在存档的READMEINSTALL文件或项目网站上描述。有时可以通过运行./configure-help查看可用选项。

构建并安装文档

有些项目提供了可以“安装”的文档,因此可以通过正常的系统文档查看器(如“man”或“info”)访问。有些提供HTML格式的文档,通常安装在/usr/share/doc下。有时此文档包含在“标准”归档文件中,有时是单独的(可选)下载。有时文档是作为标准make install命令的一部分安装的,有时如果您希望安装,则必须使用单独的命令。有时文档是以“即用”的形式交付的,但有时它是以一种“原始形式”交付的,必须在安装之前进行处理,而不是像源代码需要编译一样。

现在应该清楚的是,交付文档的各种方法非常广泛,因此这里无法提供真正有用的建议。请参阅下载的归档文件中的READMEINSTALL文件以及项目网站以获取指导。

其他构建文件

除了编译所有程序(make)和安装先前编译的程序(make install)或文档的命令外,还有一些其他常见的可能性。

make clean 通常会删除所有生成的文件,即在文件从归档文件中解压缩后保留目录。

调用编译器

如上所述,makecmake执行的最常见步骤是调用编译器。本地系统必须安装适当的编译器。

这也是最可能失败的步骤(连同链接)。

如果编译步骤失败,并显示无法找到头文件或无法找到库文件的错误消息,那么您可能没有安装所有的先决条件-重新阅读READMEINSTALL文件。在某些情况下,缺少的先决条件是可选的,在这种情况下,将有一个可以传递给配置的参数或一个可以设置为允许在没有该先决条件的情况下安装软件的环境变量。仔细检查您指定的参数,如果它们看起来正确,那么项目文档就是解决此类问题的最佳资源。

编译器有一系列可能提高性能的选项。然而,只有当你有足够的经验时,你才应该处理这些问题。如果您需要此文档,那么只需将编译器选项保留为默认值即可!

编译和链接的输出(您实际需要的“可执行文件”)通常包含大量数据,这些数据对调试程序很有用,但对“正常的最终用户”不有用。通过在可执行文件上运行strip{filename},可以从可执行文件中删除此信息。较小的程序将节省磁盘空间,加载速度也会稍快。除非您打算调试程序,否则使用strip是一个好主意。

安装后设置

一些应用程序可以通过在应用程序启动时读取的配置文件自定义其行为。应用程序通常在/usr//etc/目录下的某个位置安装配置文件的默认版本。检查make install命令的输出,以查看已安装了哪些配置文件。配置选项也应记录在程序的READMEINSTALL或其网站上。

标签:文件,Beginner,tar,make,Installing,应用程序,源代码,安装
From: https://www.cnblogs.com/chai-yuan/p/16994449.html

相关文章

  • AtCoder Beginner Contest 282
    https://atcoder.jp/contests/abc282A-GeneralizedABC原题链接题意给出一个数\(k\),输出A~Z中的前\(k\)个字母。分析从\(0\)到\(k\)枚举,将A加上\(i\)输......
  • vue web 大文件上传源代码
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多......
  • AtCoder Beginner Contest 282
    《MakeBipartite2》思维,二分图  这个简单图可以有两种情况:1.全部点都通过边连起来,即连通分量只有一个,其自己2.还有有些点没有全部连起来,即有多个连通分......
  • (AtCoder Beginner Contest 282) D - Make Bipartite 2(二分图)
    题目大意:给定一个n个点m条边的图,请你在其中加一条边使得整个图G是二分图,问有多少种可能。(已有的边不能加)解题思路:首先我们要知道,二分图内是没有长度为奇数的回路的所......
  • AtCoder Beginner Contest 282
    A-GeneralizedABC(abc282a)题目大意给定\(n\),输出一个字符串,从'A','B','C'...拼接得到的长度为\(n\)。解题思路模拟即可。神奇的代码#include<bits/stdc++.h......
  • AtCoder Beginner Contest 281 (A-D)
    A题意:输入一个整数,输出(n+1)行,从n一直输出到0.解法/思路:一个循环完事儿。代码:#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; for(in......
  • AtCoder Beginner Contest 280 (A-D)
    本人第一次写博客,若有不足还望指出(•̀ω•́)✧A题意:输入一个H行W列的字符矩阵,统计'#'的个数。解法/思路:挺简单的,直接贴代码吧。代码:#include<iostream>#incl......
  • HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282)
    前言好久没有打AtCoder了。有点手生。只拿到了\(\operatorname{rk}1510\),应该上不了多少分。只切了\(\texttt{A,B,C,D}\)四题。A-GeneralizedABC简要题意给出......
  • Dubbo源代码注册中心由zookeeper更改为nacos
    下载了dubbo源代码,本地进行demo测试,本地电脑只有nacos,所以将dubbo默认的zookeeper调整为nacos。//本人用的dubbo-demo-annotation,其他demo同理//服务提供方publiccla......
  • 直播平台源代码,顶部标签栏及内容列表的设计与实现
    直播平台源代码,顶部标签栏及内容列表的设计与实现1、主页面添加ViewPager控件activity_main.xml <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/......