一、自由软件的结构
一个自由软件的发行版本,总是有相同的文件结构,它通常包含下面几个文件:
INSTALL: 说明安装程序。
README: 关于这个程序的一般性信息(简介,作者,下载文件的地址,相关文件及连结等),如果没有INSTALL文件,通常会把简单的安装程序放在这个文件。
COPYING:其中包括了使用执照或是描述软件发地版本,有时LICENCE文件取代。
CONTRIB或CREDITS :与这个软件相关人士的列表(积极参与者,中肯的评论,辅助软件)
CHANGE :有时这个文件会叫做NEWS,纪录最近改版及除错的状况
Makefile :有这个文件才能编译软件,但是通常在配置的过程中才会产生这个文件。
你会经常看到一个configure或Imakefile文件,可以让我们由这个文件产生Makefile文件。
一个存放原始码的目录:也是编译完成后存放二进制文件的地方,通常命名为src。
一个存放与软件相关文件的目录(通常是Texinfo或man的格式):,通常命名为doc。
有时会有一个目录存放软件的特定资料,用来放配置文件,产生资料的范例,或是资源文件。
二、 还原安装文件(解压缩)
在Linux的世界里,最常见的压缩格式,就是gzip格式,这是由GNU计画所开发,也是一种常用的压缩工具。
Gzip常和一个叫tar的公用程序同时使用,tar是一个历史悠久的程序,以前用来将资料储存在磁带上。现在软盘和光盘已经取代磁带,但是tar还是用来产生压缩程序,它可以将所有的文件及目录结合为一个文件,这个文件可以简单的用gzip压缩。这就是为何很多tar的压文件用gzip来压缩,所以这些压缩文件的后缀名为.tar.gz(
或者tgz)。
2.1 GNU Tar的使用
要解开以.tar.gz为后缀的压缩文件,先用gzip解压缩再用tar还原目录结构就可以解开了。但是GNU版本的tar会自己去直接调用gzip,所以在解压缩的时候也不用拆成两个步骤,当然也不会浪费多余的硬盘空间。
Tar的命令格式如下:
tar <文件选项> [文件名称]
[文件名称]:这个参数是可以省略的,如果省略了,会直接将整个压缩文件解开。对以tar.gz为后缀的压缩文件,该参数不是必要的。
例如:
$ tar xvfz guile-1.3.tar.gz
-rw-r--r-- 442/1002 10555 1998-10-20 07:31 guile-1.3/Makefile.in
-rw-rw-rw- 442/1002 6668 1998-10-20 06:59 guile-1.3/README
-rw-rw-rw- 442/1002 2283 1998-02-01 22:05 guile-1.3/AUTHORS
-rw-rw-rw- 442/1002 17989 1997-05-27 00:36 guile-1.3/COPYING
-rw-rw-rw- 442/1002 28545 1998-10-20 07:05 guile-1.3/ChangeLog
-rw-rw-rw- 442/1002 9364 1997-10-25 08:34 guile-1.3/INSTALL
-rw-rw-rw- 442/1002 1223 1998-10-20 06:34 guile-1.3/Makefile.am
-rw-rw-rw- 442/1002 98432 1998-10-20 07:30 guile-1.3/NEWS
-rw-rw-rw- 442/1002 1388 1998-10-20 06:19 guile-1.3/THANKS
-rw-rw-rw- 442/1002 1151 1998-08-16 21:45 guile-1.3/TODO
...
tar的选项说明如下:
v: 让tar进入监视状态,在解压缩过程中,会将所有压缩文件中的文件名显示出来,如果没有这个选项,在解压缩过程当中,将不会显示这些信息。
f:必要选项,代表要打开指定的压缩文件。否则,tar会去寻找磁带而不是文件来解压缩。
z:允许你处理gzip文件(后缀为.gz),如果没有这个选项,tar会产生错误信息,反过来说,如果压缩文件没有经过gzip处理过,请不要加这个参数。
tar允许对压缩文件进行解压缩、读取、压缩、新增文件等动作,执行这些动作的选项如下:
x: 从压缩文件中解出文件
t: 列出压缩文件中的内容
c: 产生压缩文件,可以利用这个指令备份个人资料。
r: 在压缩文件中增加新文件,但是新加的文件不能为压缩文件。
2.2 bzip2与gzip
bzip2是最近兴起的压缩格式,有逐渐取代gzip地位的趋势。Bzip压出的文件比gzip要小,但尚未成为标准,附属文件名.tar.bz2,是最近才出现的。
两个压缩程序有近似的语法:
Gzip [选项] [文件名称]
如果没有给文件名称,gzip及bzip2都会等着由标准输入取得资料并将结果送到标准输出,因此可以在这两个程序使用管道,两个程序也有一些相同的选项:
1.-1,....,-9: 设定压缩比,数字越大,压缩比越高但同时也就越慢,天下没有白吃的午餐。
2.-d: 解压缩文件案,等于使用gunzip或bunzip2。
3.-c: 将压缩或解压缩文件的结果打印到标准输出。
请注意!如果没有使用-c选项,gzip及bzip2在压缩完成后会删除源文件,在bzip2可以使用-k选项防止,但gzip就没办法啦!
接下来以几个例子作为说明,首先将所有现行目录中,扩展名为txt的文件用bzip2压缩:
$ bzip2 -9 *.txt
若想与某人分享文件的备份,但他只有gzip,所以要将最后的文件转换成为.gz格式,有些麻烦吧:(。没关系,下面这条命令无须将文件解压缩再重新压缩,只要解压缩到标准输出,利用管道,由标准输出压缩转向输出成新的备份文件:
Bzip2 -dc images.tar.bz2 | gzip -9 >images.tar.gz
通过tar使用Bzip2的用法与gzip完全相同,唯一要做的是将选项z换成y,例如:
$ tar xvfy foo.tar.bz2
有一些发行版本会以I代替:
$ tar xvfI foo.tar.bz2
另外还有一种方式,看起来可移植性比较高, 可是却要多打不少字!?
$ tar --use-compress-program=bzip2 -xvf foo.tar.bz2
使用tar来处理.bz2格式压缩文件前,要确定bzip2已经被安装,而且PATH的环境变量中。
2.3 Just Do It!
2.3.1 最简单的方法
现在可以开始解压缩文件了,在这之前别忘了以系统管理者的身份来做这件事,因为以一般用户的身份,
是不被允许执行一部份程序的,即使可以,以系统管理者的身份来做,还是会简单很多。
第一步就是做备份,最好保持有一份原始压缩文件,当你安装好的程序毁了的时候,还可以重新安装,如果硬盘空间不够,可以将他备份在软盘上,再把硬盘上的压缩文件杀掉,当然如果确认当需要的时候,可由网络找到,可以不备份。
解压tar压缩文件后,通常会产生一个新目录(可以在解压缩前检查),进入这个目录,现在可以进行下一个步骤了。
2.4.2 最安全的方法
Linux系统有着较为完善的安全措施,一般用户无法执行危害到系统的操作(例如格式化硬盘),或改变其它用户的文件,同时也可以防止系统被病毒感染。
另一方面,超级用户root 可以做每一件事,甚至执行毁灭性的程序,拥有原始码可以检查这些不怀好意的程序代码(例如病毒或特洛依木马),对于这点最好小心一点。
有一个好方法,用addusr指令新增一个用户,让这个用户担任管理工作,它必须在下列目录具有写入的权限:
/usr/local/src, /usr/local/bin 及/usr/local/lib ,还有/usr/man下的所有子目录(或许还需要拷贝文件到其它地方),建议让这个用户或组拥有前述必要目录的写入权。做完这些预防措施后,就可以依照上面介绍的方法来做。
三、配置(configure)
在编译软件前,要对软件的运行环境进行设置。系统中,通常有好几个配置软件,你必须使用软件作者指定的,有时还要同时用到多个配置软件,如果如果在发行版本的主要目录中有configure这个文件存在通常使用Autoconf ;如果在发行版本的主要目录中有Imakefile这个文件就使用Imake。
3.1 Autoconf
Autoconf 是一个配置软件,产生的配置文件供编译程序(例如Makefile)使用,有时会直接修改原始码(例如在文件中使用config.h)。它的功能如下:
软件的程序设计师将编译软件所需做的测试(例如可以使用那个版本的函数库),依照规定的语法写在configure.in这个文件里。 程序设计师执行Autoconf,Autoconf读取configure.in的内容产生一个设定的命令槁,这个命令执行系统设定时,所应做的测试。最终用户执行这个命令,然后Autoconf 就做所有编译过程中所需的测试。
Autoconf使用范例:
$ ./configure
loading cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for main in -lX11... yes
checking for main in -lXpm... yes
checking for main in -lguile... yes
checking for main in -lm... yes
checking for main in -lncurses... yes
checking how to run the C preprocessor... gcc -E
checking for X... libraries /usr/X11R6/lib, headers /usr/X11R6/include
checking for ANSI C header files... yes
checking for unistd.h... yes
checking for working const... yes
updating cache ./config.cache
creating ./config.status
creating lib/Makefile
creating src/Makefile
creating Makefile
在configure 后加上环境变量,可对configure的产出好更好的的控制。例如:
$ ./configure --with-gcc --prefix=/opt/GNU
或 (在bash下)
$ export CC=`which gcc`
$ export CFLAGS=-O2
$ ./configure --with-gcc
或:
$ CC=gcc CFLAGS=-O2 ./configure
3.3 错误信息
configure命令的错误信息:configure: error: Cannot find library guile ,意思是说configure命令找不到一个函数库(在这个例子里是guile),当configure编译程序时,如果找不到这个函数库,将无法继续编译,所以发出该错误提示信息。
在config.log文件中可以找到发生错误的原因,这个文件记录了配置的所有步骤,错误信息非常清楚,它对解决问题很有帮助。
检查错误信息所提及的函数库是否安装,如果没有就安装(由原始码或已编译的二进制文件)该函数库,然后再执行configure一次。最有效的方法是直接寻找这个函数库,函数库的名字通常为lib<名字>.so,例如:
$ find / -name libguile*
或:
$ locate libguile
确认编译器可以访问这个函数库,在环境变量LD_LIBRARY_PATH 中列出的函数库目录如 /usr/lib, /lib, /usr/X11R6/lib 等,找出这个文件,请输入file libguile.so。
检查configure的响应是函数库确实不存在或确认函数库存在但没有响应,例如:你的系统中没有curses函数库,那可能是LD_LIBRARY_PATH变量可能错了。
3.4 Imake
依照简单的规则产生Makefile文件,Imake可以协助我们设定自由软件,这些规则决定产生二进制文件时所需的文件,Imake依此产生对应的Makefile文件,这些规则放在Imakefile文件中。
有趣的是,Imake使用与结构相关(architecture-dependent)的信息,对使用X窗口系统的应用程序非常方便,但Imake仍被许多其它类型的应用程序使用。使用Imake最简单的方法是到文件解压缩产生的主要目录,执行xmkmf命令,调用imake 程序:
$ xmkmf -a
imake -DuseInstalled -I/usr/X11R6/lib/X11/config
make Makefiles
如果无法正确的安装,重新编译并安装X11R6!
3.5 各个系统shell脚本命令
详读INSTALL或README文件以获得更多的信息,通常要执行install.sh或configure.sh,然后安装命令不是直接自己执行就是主动询问系统信息(例如路径),如果搞不清楚必须执行哪些文件,键入./(在Bash下),按两次TAB 键,Bash会在目录中自动执行可能的可执行文件(一个可能的设定命令),如果有好几个文件都是可执行
文件,会被列出来,只要选择正确的文件就可以了。
一个特别的例子是安装Perl模块,安装过程要执行一个Perl写的设定命令,执行的命令通常是:
$perl Makefile.PL
3.6 其它方式
部分自由软件的发行版本整理的很差,特别是在开发的第一阶段(但所有的用户都被警告过了),需要手动去更改一些设定,通常要改的文件是 Makefile 和config.h文档。
如非用户真正了解所做的更动,建议不要做这些手动的设定动作,因为需要知识及毅力才能做好,不过练习可以越做越好。
3.7 编译
现在软件已经正确地配置好了,剩下的工作就是编译了,这个阶段通常很简单,不会产生严重的问题。
3.7.1 make
在自由软件社群中,最受欢迎的程序代码编译工具,就是make,它可以有效率的管理程序预定的编译,开发者可以节省大量的时间。对于软件的最终用户,即使他们不具备足够多的相关知识也能够以几行简单的命令编译及安装软件。
所有编译原始码过程过程被纪录在Makefile或GNUMakefile文件中,maked 在执行时从当前工作目录读取这些文件,如果不在现行目录,就需要以make的 -f 选项来指定文件位置。
3.7.2 规则
由于编译出一个二进制文件,要经过好几个步骤,make会依照系统的相依性,按照顺序执行。例如假设要产生glloq二进制文件,要编译及连结main.o及init.o两个目的文件(编译的中间文件),所以这两个目的文件就是原始文件的相依文件。
前面的文字仅是简单介绍make,了解其繁复功能的轮廓,如果想要在多知道一点,建议到APRIL的网站,那里有很多的make相关文件(http://www.april.org/groupes/doc/),至于参考书,可以看看OReilly书局出版,Andrew Oram及Steve Talbott合着的Managing Projects with Make的第二版。
3.7.3 开始make
make的使用遵循一些惯例,例如:
make 后面如果没有参数,仅执行程序的编译,而不进行安装
make install 编译程序(但不是每次),并提供安装过程所需文件的正确位置,部分文件很少正确地被安装(例如:man, info),必须用户自己手动安装。有时make install必须在特定的子目录安装,通常是因为使用到其它厂商开发的模块。
make clean 清除所有编译过程产生的临时文件,很多情况下也会执行文件。
第一阶段编译程序,请键入以下命令(假设的例子):
$ make
gcc -c glloq.c -o glloq.o
gcc -c init.c -o init.o
gcc -c main.c -o main.o
gcc -lgtk -lgdk -lglib -lXext -lX11 -lm glloq.o init.o main.o -o glloq
太棒了!二进制文件正确的编译出来,我们现在可以进行下一步骤,安装软件的发行版本(二进制文件及资料文件)。
四、 安装
4.1 用make安装
现在已经完成编译的工作,你必须将编译好的文件复制到适当的地方(通常是在/usr/local的子目录之一)。
make常用来安装,安装是make的功能之一,以make install进行安装。
在INSTALL或README文件中,通常会说明安装的过程,但有时程序开发者会忘了写,就得自己安装每一个东西。拷贝后:
可执行文件放在/usr/local/