UNIX®系统具有数百个实用程序应用程序或命令。 一些命令操纵文件系统,而另一些命令查询和控制操作系统本身。 数量众多的命令可提供连通性,甚至更多的命令集可生成,置换,修改,过滤和分析数据。 鉴于UNIX悠久而丰富的历史,您的系统很可能拥有处理当前任务的正确工具。
而且,当一个实用程序不够用时,您可以通过多种方式组合任意数量的UNIX实用程序来创建自己的工具。 如您先前所见,您可以利用管道,重定向和条件在命令行上立即构建即兴工具,而Shell脚本将一种易于学习的小型编程语言的功能与UNIX命令结合在一起进行构建您可以反复使用的工具。
当然,有时候命令行和Shell脚本都不足够。 例如,如果必须部署新的守护程序以提供新的网络服务,则可以切换到丰富的语言(例如C或Python)来自己编写应用程序。 而且,由于Internet上有许多应用程序是免费提供的( 自由表示无成本,自由条款许可或两者兼有),因此您也可以下载,构建和安装合适的可行解决方案来满足您的要求。
UNIX(和Linux®)的许多版本都提供了一种称为软件包管理器的特殊工具,用于添加,删除和维护系统上的软件。 程序包管理器通常维护本地安装的所有软件的清单,以及一个或多个远程存储库中可用的所有软件的目录。 您可以使用程序包管理器在存储库中搜索所需的软件。 如果存储库包含您要查找的内容,则只需一个命令或单击几下鼠标即可在系统上安装新软件包。
包管理器是无价的。 使用它,您可以删除整个程序包,更新现有程序包,并自动检测并满足任何程序包的所有先决条件。 例如,如果您选择操作图像的软件(例如坚固的ImageMagick),但是系统缺少用于处理JPEG图像的库,则程序包管理器会在安装程序包之前检测并安装缺少的内容。
但是,在某些情况下,您所需的软件可用,但尚未(尚未)在任何存储库中。 鉴于软件包管理的优势,大多数软件都捆绑在一起,您可以使用软件包管理器下载和安装该软件。 但是,由于可以使用任意数量的UNIX版本和版本,因此很难为每种特定版本提供每种程序包管理器格式的每个应用程序。 如果您的UNIX安装是主流,并且受到了广泛的欢迎,那么您最好可以预编译并准备使用该软件。 否则,该抽空准备自己准备该软件了。
是的,年轻的绝地,现在是时候使用源代码了。
就像从沼泽中举起X-wing战斗机一样,乍一看从源代码构建软件似乎令人生畏,尤其是如果您不是软件开发人员时。 实际上,在大多数情况下,整个过程只需要少量的命令,其余的则是自动化的。
可以肯定的是,某些程序的构建很复杂(或需要数小时才能构建),并且在此过程中需要人工干预。 但是,即使这些程序也通常是由易于构建的较小片段构成的。 依赖的数量和构造的顺序使构建过程变得复杂。 有些程序还具有您可能想要或不想要的功能。 例如,您可以构建PHP以与新的Internet协议版本6(IPv6)Internet寻址方案进行互操作。 如果您的网络尚未采用IPv6,则无需包含该功能。 审核过多的选项会增加构建过程的工作量。
本月,研究如何构建典型的UNIX软件应用程序。 在继续之前,请确保您的系统具有C编译器(例如GNU Compiler Collection)和通用UNIX软件开发工具套件,包括make , m4 , pkg-config和awk 。 另外,确保所有开发工具都在PATH环境变量中。
作为说明性和代表性的示例,让我们配置,构建和安装SQLite,这是一个实现结构化查询语言(SQL)数据库引擎的小型库。 SQLite不需要使用任何配置,并且可以完全嵌入到任何应用程序中,并且数据库包含在一个文件中。 许多编程语言都可以调用SQLite来保留数据。 SQLite还包括一个名为sqlite3的命令行实用程序,用于管理SQLite数据库。
首先,下载SQLite(请参阅参考资料 )。 选择最新的源代码包,然后将其下载到您的计算机上。 (在撰写本文时,SQLite的最新版本是2007年4月25日发布的3.3.17版。)本示例使用存储为http://www.sqlite.org/sqlite-3.3.17.tar的文件。 gz。
有了文件后,将其解压缩。 .tar.gz扩展名反映了归档文件的构造方式。 在这种情况下,它是一个压缩的tar存档。 后一个扩展名.gz代表gzip(压缩); 前一个扩展名.tar代表tar(存档格式)。 要提取档案的内容,只需以相反的顺序处理文件-首先将其提取,然后打开档案:
$ gunzip sqlite-3.3.17.tar.gz $ tar xvf sqlite-3.3.17.tar这两个命令在名为sqlite-3.3.17的新目录中创建原始源代码的副本。 顺便说一句,.tar.gz文件格式很常见(称为tarball ),您可以直接使用tar命令解压缩tarball:
$ tar xzvf sqlite-3.3.17.tar.gz此单个命令等效于前两个命令。
接下来,将目录更改为sqlite-3.3.17,并使用ls列出内容。 您应该看到清单1所示的清单 :
SQLite的源代码和补充文件井井有条,并为大多数软件项目分发源代码的方式建模:
README文件描述了项目,通常说明了如何构建软件。 (README文件还详细说明了适用的使用条款或许可证。根据GNU公共许可证版本2(即所谓的“ copyleft”许可证)的条款,有大量项目许可证代码。如果您有任何疑问,许可与您打算如何使用软件之间发生冲突,最好咨询主管律师。) src目录包含代码。 测试目录包含一组测试,以验证软件的正确运行。 在初始构建后或进行任何修改后运行测试可增强对软件的信心。 contrib目录包含核心SQLite开发团队未提供的其他软件。 对于SQLite之类的库,contrib可能包含针对流行语言(如C ,Perl,PHP和Python)的编程接口。 它还可能包括图形用户界面(GUI)包装器等。 在其他文件中,Makefile.in,configure,configure.ac和aclocal.m4用于生成脚本和规则,以根据UNIX风格构建SQLite软件。 如果软件足够简单,则构建代码可能只需要快速编译命令。 但是由于存在UNIX的多种变体(包括Mac OS X,Solaris,Linux,IBM®AIX®和HP / UX等),因此有必要研究主机以确定其功能和实现。 例如,邮件阅读器应用程序可能会尝试确定本地系统如何存储邮箱并包括对格式的支持。下一步是探查系统并配置软件以使其正确构建。 (您可以将此步骤视为定制西服:服装基本上是正确的尺寸,但需要进行一些改动以使其更时尚。)您可以使用./configure本地脚本进行自定义并准备构建。 在命令行提示符下,键入:
$ ./configureconfigure脚本进行了一些测试以使您的系统合格。 例如,在Apple MacBook计算机(运行FreeBSD®UNIX的变体)上运行./configure会产生以下内容(请参见清单2 ):
在这里, ./configure确定了构建和主机系统的类型(如果进行交叉编译,它们可能会有所不同),确认已安装了GNU C编译器(GCC),并在构建过程的其余部分中可能找到实用程序的路径要求。 您可以浏览输出的其余部分,但是会看到一长串的诊断信息,这些诊断信息在成功构建SQLite所需的程度上描述了系统的特征。
注意: ./configure命令可能会失败,尤其是在找不到先决条件(例如,系统库或关键系统实用程序)的情况下。
扫描./configure的输出,以查找可能不适用于构建常规应用程序(例如SQLite)的异常(例如命令的专用或本地版本)。 例如,如果您的系统管理员安装了GCC的Alpha版本,并且configure工具更喜欢使用它,则您可以选择手动覆盖该选择。 要查看可以覆盖的选项列表(通常很长),请键入./configure --help ,如清单3所示:
./configure --help的输出包括与配置系统一起使用的常规选项,以及仅与您正在构建的软件有关的特定选项。 要查看后一个(简短的)列表,请键入./configure --help=short (请参见清单4 ):
返回./configure --help ,最顶部的输出指示可执行文件的默认安装目录为/ usr / local / bin,库的默认安装目录为/ usr / local / lib,依此类推。 许多系统使用备用层次结构来存储非核心软件。
例如,许多系统管理员选择使用/ opt代替/ usr / local作为本地添加或本地修改的软件的所在地。 如果要将SQLite安装在默认目录以外的目录中,请使用--prefix=选项指定目录。 一种可能的用法(如果您是唯一使用软件包的人,或者如果您没有root权限来全局安装软件,则是一种常见用法)是在主目录中的自己的层次结构中安装软件:
$ ./configure --prefix=$HOME/sw使用此命令,构建的安装部分将在$ HOME / sw中重新创建软件的层次结构,例如在$ HOME / sw / bin,$ HOME / sw / lib,$ HOME / sw / etc,$ HOME / sw中/ man,以及其他需要的人。 为简单起见,此示例将其代码安装在默认目标中。
./configure的结果是与您的UNIX版本兼容的Makefile。 名为make的开发实用程序使用Makefile执行编译并将代码链接到可执行文件所需的步骤。 您可以打开Makefile进行检查,但不要对其进行编辑,因为如果再次运行./configure ,则会列出您所做的任何修改。
Makefile包含要构建的源文件的列表,还包含用于启用或禁用并选择SQLite程序包中某些代码段的常量。 例如,如果configure工具在系统中检测到合适的芯片,则可能启用特定于64位处理器的代码。 Makefile还表示源文件之间的依赖关系,因此,对所有重要头文件(.h)的更改都可能导致重新编译所有C源代码。
下一步是运行make来构建软件(请参见清单5 ):
注:在上面的输出,空行已添加到更好地突出每一步, make发起。
make实用程序检查文件(头文件,源代码,数据文件和目标文件)的修改日期,并构建适当的C源文件。 最初, make重建所有内容,因为不存在目标文件或构建目标。 如您所见,构建目标的规则也包括中间步骤,这些中间步骤使用诸如sed和awk类的工具来生成头文件,这些头文件将在以后的步骤中使用。
make命令的结果是完成的库和sqlite3实用程序。
尽管不是强制性的,也不是每个软件包都提供的,但是最好测试一下您刚刚构建的软件。 即使您的软件构建成功,也不一定表示该软件可以正常运行。
要测试您的软件,请再次使用test选项运行make (请参见清单6 ):
成功! 该软件可以正常运行。 如果一个或多个测试用例确实失败了,则底部的摘要(此处为空白)将报告哪些测试需要进行调查。
如果您的软件可以正常工作,那么最后一步就是将其安装在系统上。 再次使用make并指定install目标。 将软件添加到/ usr / local通常需要sudo提供的超级用户(root)特权(请参见清单7 ):
生成make install过程将创建必要的目录(如果每个目录都不存在),将文件复制到目标位置,然后运行ranlib以准备供应用程序使用的库。 它还将sqlite3实用程序复制到/ usr / local / bin,复制开发人员针对SQLite库构建软件所需的头文件,并将文档复制到层次结构中的适当位置。
假设/ usr / local / bin在您的PATH变量中,您现在可以运行sqlite3 (请参见清单8 ):
相当多的软件包都可以像SQLite一样轻松构建。 实际上,您通常可以使用一个命令来配置,构建和安装软件:
$ ./configure && make && sudo make install&&运算符仅在前一个命令没有错误的情况下运行后一个命令。 因此,上面的命令说:“运行./configure ,如果可以运行,请运行make ,如果可以运行,请运行sudo make install 。” 此命令将建立一个无人值守的软件包。 刚开始它,先去咖啡,三明治,或定价套餐餐,取决于包你正在建设的规模和复杂性。
以下是从源代码构建软件的其他一些有用的技巧:
如果您要构建的软件包比典型的./configure && make && sudo make install所需的软件包更多,请保留构建代码的步骤日志。 如果必须重新构建相同的代码或构建新版本的代码,则可以参考日记刷新内存。 将日志存储在与程序包的README文件相同的目录中。 您甚至可以为日记的文件名采用约定,这使您可以轻松识别以前创建的文件。 更好的是,如果构建软件所需的步骤是无需人工干预即可重复的,则可以在Shell脚本中捕获该过程。 以后,如果必须重建相同的代码,只需运行shell脚本。 如果有较新版本的代码可用,则可以根据需要修改脚本以添加,更改或删除步骤。 安装软件后,可以使用make clean回收磁盘空间。 该规则通常会删除目标文件和所有中间文件,并且会完整保留重新启动进程所需的文件。 另一个规则make distclean删除Makefile和其他生成的文件。 将同一代码的不同版本的源代码分开。 此方案允许您将一个发行版与另一个发行版进行比较,但也可以恢复该软件的特定版本。 根据您的使用范围(个人或全局)和本地约定,将源代码组织到本地存储库中,例如$ HOME / src或/ usr / local / src。 此外,您可能选择通过将源代码全局设置为只读来防止意外删除或覆盖。 转到要保护的源代码目录,然后运行chmod -R aw *命令(以递归方式运行chmod ,关闭所有写入权限)。最后,在某些情况下,源代码根本无法在您的系统上构建。 如上所述,遇到的最常见障碍是缺少先决条件。 仔细阅读错误消息或错误消息-可能很明显出了问题。
如果您无法推断出原因,请键入确切的错误消息以及您要在Google中构建的程序包的名称。 别人遇到并解决相同问题的机会非常好。 (实际上,在Internet上搜索错误消息可能非常有启发性-尽管您可能必须花点时间才能找到一颗宝石。)
如果您感到困惑,请检查软件主页上的资源链接,例如IRC频道,新闻组,邮件列表或FAQ。 您的本地系统管理员也是一种宝贵的经验。
如果您的系统缺少所需的工具,则可以在命令行上任意使用一种工具,可以编写Shell脚本,可以编写自己的程序,还可以借鉴在线提供的大量代码。 像我一样,您在练习绝地思维技巧时会很顺利。
“这是我读过的最好的文章。”
翻译自: https://www.ibm.com/developerworks/aix/library/au-speakingunix12/index.html
相关资源:软件测试项目