既然已经有了那么多的软件包管理工具,为什么还要学习源代码编译安装呢?是的,软件包管理工具安装速度快,会省心很多,运行起来也一般没什么问题,但是要知道从一个软件包源代码发布到

制成二进制包再加上测试,这中间会需要很多时间的,也就是说用软件包管理工具去安装软件并不能使用最新的,而且软件包管理工具会把一个软件大多的功能都装上(比如主包),但问题是很多功能你并不定需要。但是源码编译的时候你可以自由选择你所需要的功能以及安装路径,再加上由于是二进制包,因此ABI不一定兼容性很好,那么这个时候就需要API兼容性较好的源码安装了,也就是说源码编译安装的软件能最适合你自己的硬件平台。如果你并没有“强迫症”,那么软件包管理工具可能更适合你,但即使如此,使用源代码编译的好处也是值得学习它的。

                那么编译是什么,其实通俗一点来说就是把源代码变成机器能识别的二进制代码,当然其中的过程不会是这么简单啦,如果有兴趣可以自行研究。而安装就是讲这些编译好了的二进制代码展开到你的机器上。

                那么编译需要什么条件呢?当然是编译环境啊,比如现在软件大多是使用动态分享库,那么就需要你的机器提供这种库,还有所需要的各种头文件,以及这个软件所依赖的程序,比如编译gcc的时候

需要gcc(哈哈,有兴趣的可以去研究一下),最后就是编译工具了,一个编译器(一般是gcc),但是如果一个软件里的文件很多,让你一个一个用gcc去编译的话你会不会崩溃?那么这个时候就需要make这个工具了,他会依赖一个叫Makefile(makefile,GNUmakefile)的文件来自动编译成最适合你的机器的二进制程序,why?因为Makefile中写了编译的规则,比如编译一个目标需要依赖于什么,然后通过什么方式来生成这个目标,而Makefile是由configure生成的。那么configure怎么来的?很有趣是吧?但由于这里不是讲make工具的,如果你由兴趣可以去研究研究。

                 那么怎样取得源码包呢?发行版和官网是个不错的选择,但是个人偏好GitHub(虽然最初是为了linux内核管理设计的但是现在上面的各种软件也是发展的很好),当然你也可以去Sourceforge或者

google的源码托管网站或者其他的你认为可靠的。

                好了现在万事具备只差你“大显身手”了,如果你得到的是一个压缩包请解压(废话),然后进入解压缩的目录下,十分非常建议先看看目录下的README和INSTALL,那么一般编译安装就没上面问题。

然后就进行众所周知的三部曲./configure,make,makeinstall。其中最关键的是./configure(请注意一定养成带上./的习惯),因为它会检查你的机器环境,而且你还可以自己制定各种文件的安装路径,以及

选择各种功能,还能自行指定依赖软件的位置或者强行不依赖编译。你可以自己./configure --help去看看它的选项,也是很多哦。

                 ./configure的选项:

                    安装路径选项:

                        --prefix=路径名:指定软件的安装路径,默认一般会将所有文件装在/usr/local下,如果仅仅指定了安装路径那么就只会将所有文件都装在指定的路径下面,如果你不想请看下面(但是记得区分,这里代表的是只有这个选项的时候所有文件会装在指定路径下,而下面的恰恰是分割这些文件的安装路径)。

                        --bindir=路径名:显而易见bin代表用户可执行文件,dir是路径的意思,那么bindir就是用户可执行文件的安装路径,指定了的话就会安装在指定的路径下的bin下面。

                        --sbindir=路径名:有了上面的解释这个就不用了把,就是只有超级用户才能执行的可执行文件的安装路径啦,指定的话就会安装再指定路径下的sbin下面。

                        --libexecdir=路径名:指定程序的可执行文件的安装路径,但是这里的可执行程序一般不是由用户直接执行,而是其他程序执行时候会调用的。

                        --sysconfigdir=路径名:指定配置文件的安装路径

                        --sharestatedir=路径名:指定可写的体系无关数据的安装路径

                        --localstatedir=路径名:指定可写的单一与体系无关数据的安装路径

                        --libdir=路径名:指定库文件的安装路径

                        --includedir=路径名:指定C头文件的安装路径

                        --oldincludedir=路径名:指定非gcc的头文件安装路径

                        --datarootdir=路径名:指定可读的与机器架构无关的数据的安装路径

                        --datadir=路径名:指定可读的与体系无关的数据的安装的安装路径

                        --infodir=路径名:指定信息说明文档的安装路径

                        --localedir=路径名:指定本地相关文档的安装路径

                        --mandir=路径名:指定man文档的安装路径

                        --docdir=路径名:指定文档安装路径

                        --htmldir=路径名:指定html格式的文档的安装路径

                        --dvifir=路径名:指定dvi格式的文档的安装路径

                        --pdfdir=路径名:指定pdf格式的文档的安装路径

                        --psdir=路径名:指定ps格式文档的安装路径

                    安装时候的特性选项(就是自定义需要或者不需要的功能):

                        --disable-功能:表示安装的时候不启用这个功能

                        --enable-功能:表示安装的时候启用这个功能

                    安装的时候包之间的选项(一般是有依赖关系的包)

                        --with-包:使用这个指定的包(可以指定这个包的路径)

                        --without-包:不使用这个指定包

                    体系结构的选项

                        --build=BUILD:指定工具链当前的运行环境,一把每个源代码目录会有config.guess这个脚本,可以运行一下看看。

                        --target=TARGET:指定编译成适合哪种目标机器上的二进制文件。

                        --host=HOST:指定编译成的二进制文件在那个主机上运行

                    一些通用的环境变量:

                        CC:C编辑器命令,是为了防止有的各人使用的C编辑器不相同(不是所有人都是用gcc哦),这样的话只要使用CC这个变量就可以了。

                        CFLAGS:C编辑器命令行参数。

                        LDFLAGS:连接器命令行参数,比如你的主机库文件在一个不是常见的位置。

                        CPPFLAGS:C/C++预处理命令参数

                        CPP:C预处理命令

                        这些变量可以在可以通过export预先声明,也可以在./configure命令之前直接赋值

                 make选项:

                        -f  FILE:从指定的文件来读取规则,而不一定是Makefile

                        -I  目录:从指定的目录下查找Makefile

                        -e 环境变量:覆盖Makefile中的环境变量

                make参数:

                          make [TARGET]:接目标TARGET的时候就会编译成这个目标,不指定的话默认是Makefile中的第一个目标(TARGET)

                           make [check|test]:测试

                           make clean:其实就包含在第一个里面,clean是一个伪目标而已,表示清理一些编译产生的文件,一般指的是生成的*.o的目标文件。

                            make install:一样也是第一个里面的一个伪目标,其实就是把编译成的二进制文件复制到各个目标下,用的就是install这个命令。

                     下面是我简单演示一下编译安装vim的过程,由于编译如风一样 一吹而过,所以省了很多。

                            

         ./configure
         checking whether make sets $(MAKE)... yes
         checking for gcc... gcc
         checking whether the C compiler works... yes
         checking for C compiler default output file name... a.out
         checking for suffix of executables... 
         checking whether we are cross compiling... no
         checking for suffix of object files... o
         checking whether we are using the GNU C compiler... yes
         checking whether gcc accepts -g... yes
         .........各种检查信息还有省略的其他各种信息
         no terminal library found
         checking for tgetent()... configure: error: NOT FOUND!
         You need to install a terminal library; for example ncurses.
         Or specify the name of the library with --with-tlib.
         这里显示没有找到终端库文件,需要装一个,比如ncurses这个,或者自己指定一个,我选择了下载一个
         ncurses自己编译安装
     yao@yao-Rev-1-0:~$ sudo tar -xf ncurses-6.0.tar.gz 
     yao@yao-Rev-1-0:~$ cd ncurses-6.0/
          看一下README和INSTALL文档
     yao@yao-Rev-1-0:~$sudo  ./configure     
            .............
    yao@yao-Rev-1-0:~$ sudo make   虽然建议尽量使用用户权限,但是有的是必须的用root权限的
            ........
   yao@yao-Rev-1-0:~$ sudo make install
           .......可以执行make clean清理一下,或者直接删除源文件了接下来是vim了
          看一下README和INSTALL没什么特别的信息
    yao@yao-Rev-1-0:~$ ./configure 
            ........发现没有报错并已经创建了Makefile
    yao@yao-Rev-1-0:~$ make
           ............也没报错
    yao@yao-Rev-1-0:~$ sudo make install
       ............... 安装完成  可以清理或者删除源文件了
  yao@yao-Rev-1-0:~$ vim /etc/passwd
  root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:104:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:105:systemd Network Management,,,:/run/systemd/netif:/bin/false
"/etc/passwd" [只读] 41 行,2285 characters                                                             
由于刚装完还没有配置vim所以只有这个丑陋的界面啦。
 yao@yao-Rev-1-0:~$ cd /usr/local
yao@yao-Rev-1-0:/usr/local$ ls
bin  etc  games  include  lib  man  sbin  share  src
yao@yao-Rev-1-0:/usr/local$ cd bin
yao@yao-Rev-1-0:/usr/local/bin$ ls
ex  rview  rvim  view  vim  vimdiff  vimtutor  xxd
yao@yao-Rev-1-0:/usr/local/bin$ 
看见没,由于是默认编译安装的所以都在这里面
yao@yao-Rev-1-0:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
而/usr/localbin再PATH环境变量中,所以可以用vim直接打开啊,如果你装在了PATH变量路径之外
的地方就需要将其加到PATH中或者创建一个软链接
还有库文件,man文档,配置文件,这里我就不一一列举了,
 当然这两个软件你都可以自己制定自己想要的,让我偷个懒把。三部曲带走!!如果你有特殊需求可以
 自己参考上面的选项自己制定,我溜了,得去配置vim去了。