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软件开发工具套件,包括makem4pkg-configawk 。 另外,确保所有开发工具都在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所示的清单 :

清单1. SQLite包的清单
$ ls
Makefile.in             contrib                 publish.sh
Makefile.linux-gcc      doc                     spec.template
README                  ext                     sqlite.pc.in
VERSION                 install-sh              sqlite3.1
aclocal.m4              ltmain.sh               sqlite3.pc.in
addopcodes.awk          main.mk                 src
art                     mkdll.sh                tclinstaller.tcl
config.guess            mkopcodec.awk           test
config.sub              mkopcodeh.awk           tool
configure               mkso.sh                 www
configure.ac            notes

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本地脚本进行自定义并准备构建。 在命令行提示符下,键入:

$ ./configure

configure脚本进行了一些测试以使您的系统合格。 例如,在Apple MacBook计算机(运行FreeBSD®UNIX的变体)上运行./configure会产生以下内容(请参见清单2 ):

清单2.在Mac OS X上运行./configure的结果
checking build system type... i386-apple-darwin8.9.1
checking host system type... i386-apple-darwin8.9.1
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ld used by gcc... /usr/bin/ld
...

在这里, ./configure确定了构建和主机系统的类型(如果进行交叉编译,它们可能会有所不同),确认已安装了GNU C编译器(GCC),并在构建过程的其余部分中可能找到实用程序的路径要求。 您可以浏览输出的其余部分,但是会看到一长串的诊断信息,这些诊断信息在成功构建SQLite所需的程度上描述了系统的特征。

注意: ./configure命令可能会失败,尤其是在找不到先决条件(例如,系统库或关键系统实用程序)的情况下。

扫描./configure的输出,以查找可能不适用于构建常规应用程序(例如SQLite)的异常(例如命令的专用或本地版本)。 例如,如果您的系统管理员安装了GCC的Alpha版本,并且configure工具更喜欢使用它,则您可以选择手动覆盖该选择。 要查看可以覆盖的选项列表(通常很长),请键入./configure --help ,如清单3所示:

清单3. ./configure脚本的常规选项
$ ./configure --help
...
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.For better control, use the options below.Fine tuning of the installation directories:--bindir=DIR           user executables [EPREFIX/bin]--sbindir=DIR          system admin executables [EPREFIX/sbin]--libexecdir=DIR       program executables [EPREFIX/libexec]
...

./configure --help的输出包括与配置系统一起使用的常规选项,以及仅与您正在构建的软件有关的特定选项。 要查看后一个(简短的)列表,请键入./configure --help=short (请参见清单4 ):

清单4.用于构建软件的特定于软件包的选项
$ ./configure --help=short
Optional Features:--disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)--enable-FEATURE[=ARG]  include FEATURE [ARG=yes]--enable-shared[=PKGS]  build shared libraries [default=yes]--enable-static[=PKGS]  build static libraries [default=yes]--enable-fast-install[=PKGS]optimize for fast installation [default=yes]--disable-libtool-lock  avoid locking (might break parallel builds)--enable-threadsafe     Support threadsafe operation--enable-cross-thread-connectionsAllow connection sharing across threads--enable-threads-override-locksThreads can override each others locks--enable-releasemode    Support libtool link to release mode--enable-tempstore      Use an in-ram database for temporary tables(never,no,yes,always)--disable-tcl           do not build TCL extension--disable-readline      disable readline support [default=detect]--enable-debug          enable debugging & verbose explain

返回./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 ):

清单5.运行make
$ make
sed -e s/--VERS--/3.3.17/ ./src/sqlite.h.in | \sed -e s/--VERSION-NUMBER--/3003017/ >sqlite3.hgcc -g -O2 -o lemon ./tool/lemon.ccp ./tool/lempar.c .cp ./src/parse.y ../lemon  parse.ymv parse.h parse.h.tempawk -f ./addopcodes.awk parse.h.temp >parse.hcat parse.h ./src/vdbe.c | awk -f ./mkopcodeh.awk >opcodes.h./libtool --mode=compile --tag=CC gcc -g -O2 -I. -I./src \-DNDEBUG  -I/System/Lib rary/Frameworks/Tcl.framework/Versions/8.4/Headers \-DTHREADSAFE=0 -DSQLITE_THREA D_OVERRIDE_LOCK=-1 \-DSQLITE_OMIT_LOAD_EXTENSION=1 -c ./src/alter.cmkdir .libsgcc -g -O2 -I. -I./src -DNDEBUG \-I/System/Library/Frameworks/Tcl.framework/Vers ions/8.4/Headers \-DTHREADSAFE=0 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 \-DSQLITE_OMIT_L OAD_EXTENSION=1 -c ./src/alter.c  -fno-common \-DPIC -o .libs/alter.o
...
ranlib .libs/libtclsqlite3.a
creating libtclsqlite3.la

注:在上面的输出,空行已添加到更好地突出每一步, make发起。

make实用程序检查文件(头文件,源代码,数据文件和目标文件)的修改日期,并构建适当的C源文件。 最初, make重建所有内容,因为不存在目标文件或构建目标。 如您所见,构建目标的规则也包括中间步骤,这些中间步骤使用诸如sedawk类的工具来生成头文件,这些头文件将在以后的步骤中使用。

make命令的结果是完成的库和sqlite3实用程序。

尽管不是强制性的,也不是每个软件包都提供的,但是最好测试一下您刚刚构建的软件。 即使您的软件构建成功,也不一定表示该软件可以正常运行。

要测试您的软件,请再次使用test选项运行make (请参见清单6 ):

清单6.测试软件
$ make test
...
alter-1.1... Ok
alter-1.2... Ok
alter-1.3... Ok
alter-1.3.1... Ok
alter-1.4... Ok
...
Thread-specific data deallocated properly
0 errors out of 28093 tests
Failures on these tests:

成功! 该软件可以正常运行。 如果一个或多个测试用例确实失败了,则底部的摘要(此处为空白)将报告哪些测试需要进行调查。

成品

如果您的软件可以正常工作,那么最后一步就是将其安装在系统上。 再次使用make并指定install目标。 将软件添加到/ usr / local通常需要sudo提供的超级用户(root)特权(请参见清单7 ):

清单7.在本地系统上安装软件
$ sudo make install
tclsh ./tclinstaller.tcl 3.3
/usr/bin/install -c -d /usr/local/lib
./libtool --mode=install /usr/bin/install -c libsqlite3.la /usr/local/lib /usr/bin/install -c .libs/libsqlite3.0.8.6.dylib /usr/local/lib/libsqlite3.0.8.6 .dylib
...
/usr/bin/install -c .libs/libsqlite3.lai /usr/local/lib/libsqlite3.la
/usr/bin/install -c .libs/libsqlite3.a /usr/local/lib/libsqlite3.a
chmod 644 /usr/local/lib/libsqlite3.a
ranlib /usr/local/lib/libsqlite3.a
...
/usr/bin/install -c -d /usr/local/bin
./libtool --mode=install /usr/bin/install -c sqlite3 /usr/local/bin
/usr/bin/install -c .libs/sqlite3 /usr/local/bin/sqlite3
/usr/bin/install -c -d /usr/local/include
/usr/bin/install -c -m 0644 sqlite3.h /usr/local/include
/usr/bin/install -c -m 0644 ./src/sqlite3ext.h /usr/local/include
/usr/bin/install -c -d /usr/local/lib/pkgconfig;
/usr/bin/install -c -m 0644 sqlite3.pc /usr/local/lib/pkgconfig;

生成make install过程将创建必要的目录(如果每个目录都不存在),将文件复制到目标位置,然后运行ranlib以准备供应用程序使用的库。 它还将sqlite3实用程序复制到/ usr / local / bin,复制开发人员针对SQLite库构建软件所需的头文件,并将文档复制到层次结构中的适当位置。

假设/ usr / local / bin在您的PATH变量中,您现在可以运行sqlite3 (请参见清单8 ):

清单8.准备使用SQLite
$ which sqlite3
/usr/local/bin/sqlite3
$ sqlite3
SQLite version 3.3.17
Enter ".help" for instructions
sqlite>

给学徒的建议?

相当多的软件包都可以像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

自己动手实现软件测试项目_自己动手的项目相关推荐

  1. 品达物流TMS项目_第12章 项目总结

    品达物流TMS项目_第12章 项目总结 文章目录 品达物流TMS项目_第12章 项目总结 第12章 项目总结 1. 微服务架构 2. 软件架构体系 3. 系统架构 4. 技术架构 5. 业务流程 6. ...

  2. swift 项目_如何对iOS项目进行静态分析

    随着项目的扩大,依靠人工codereview来保证项目的质量,越来越不现实,这时就有必要借助于一种自动化的代码审查工具:程序静态分析. 程序静态分析(Program Static Analysis)是 ...

  3. 将已有项目转为se项目_如何将 Java 项目转换成 Maven 项目

    本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明确的是,用 Maven 管理 Java 项目的确 ...

  4. java图片处理开源项目_如何处理离开开源项目

    java图片处理开源项目 2015年初,我决定离开我的工作,这是我刚刚工作两年多的时候. 我的家人和朋友中没有一个人对我担任其他职位感到惊讶. 采取这一举措是一件很平常的事情,特别是在我们倾向于频繁更 ...

  5. tomcat启动成功 未加载项目_智云CRM项目启动大会在深圳成功召开

    自2018年12月29日与桂林智神信息技术有限公司正式签署CRM项目合同之后,鼎资软件便迅速成立智云CRM项目组,开始了紧张的实施前准备工作,包括项目组成员甄选.确定项目目标和实施范围,制定项目实施计 ...

  6. 自己动手写java虚拟机_自己动手写操作系统(要了解的知识点)

    自己动手写操作系统(开篇) 自己动手写操作系统(字符显示) 说明:Intel 8086 或者不同的处理器,开机寄存器数据可能不一样,但是大致原理差不多 了解过计算机启动的同学肯定知道,当计算机启动的时 ...

  7. 自己动手写cpu 光盘_自己动手写CPU配套源码

    自己动手写CPU的源代码,一共15章,可以完整实现MIPS的指令 文件:n459.com/file/25127180-476886294 以下内容无关: ----------------------- ...

  8. typescript项目_如何设置TypeScript项目

    typescript项目 by David Piepgrass 由David Piepgrass 如何设置TypeScript项目 (How to set up a TypeScript projec ...

  9. IntelliJ IDEA for Mac 如何创建Java Web项目_创建Java EE项目_创建项目_新建项目

    Java EE 项目创建好后如下图所示: 如果你的项目含有多个模块,那么上图的项目结构布局是不合理的,你必须将默认的模块删除掉(默认模块的 .iml 文件也要删除). 选择模块,点按鼠标右键,选择[R ...

最新文章

  1. 20210709未来智能实验室收录资料
  2. JAVA听力源码,英语听力练习
  3. 监测ASP.NET MVC 网站
  4. java 方法 示例_Java语言环境getVariant()方法与示例
  5. 用脚本判断用户传参的参数是否有对应的进程在运行并把结果显示给用户
  6. Unity3D 游戏开发构架篇 ——输入控制
  7. tomcat启动后连接数据库连接慢的问题
  8. 《程序员代码面试指南》总结
  9. Linux文件系统详解
  10. C语言课设----个人信息管理系统(包含学生成绩和消费记录)
  11. laravel 自定义分页样式
  12. ios云信不能全屏_ios集成网易云信IM功能遇到的坑
  13. TDIfw在windows 10 1903的测试
  14. 开源中国 Android 文件夹管理
  15. uniapp获取当前页面路由及参数 _@jie
  16. ubuntu conda 更新、下载模块包权限问题 'Permission denied'
  17. ARM学习(12)基于arm架构的嵌入式操作系统理解
  18. Harris Corner
  19. LeetCode:974. Subarray Sums Divisible by K - Python
  20. java第三方包_java客户端引入第三方包方法

热门文章

  1. 演化博弈的Python实现:基础篇1 基于复制动态的演化博弈
  2. 制作一台计算机需要多少知识,如何制造一台计算机,编程多年后我开始思考这个问题...
  3. Python2 的 unicode (u‘\xxxx‘) 转为对人友好、可读的 utf8
  4. scrapy框架中实现登录人人网(一)(最新登录方式)
  5. 金山快盘 android,随时随地的存储 金山快盘Android版评测
  6. mac系统清理软件MacClean支持文件类型分享
  7. exe执行文件变白色无图标解决方法
  8. javascript编程题_JavaScript仍然是编程语言的王者
  9. Linux项目实战C++轻量级Web服务器源码分析TinyWebServer
  10. 地磁感应器逆时针90度