Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

tarball方式编译安装及升级-make、patch

$
0
0

1、概念:
原码进行编译成二进制机构可执行程序,先要make与侦测程序一般是config一起生成编译连接文件makefile,再由makefile编译成可执行文件。
Tarball其实是原码的tar打包与压缩的包。
rpm是指linux商家帮你编译好了,省去了长时间编译而发布的包,但不同类型的系统就不能用。
函数库即提供外部调用的,有点像dll。

2、gcc,是C语句的编译器,一般是先编译成目标文件,再连结成一个可执行文件。

3、make可以方便进行编译,因为它把要编译的命令及顺序都写到makefile这个文件里了。

4、makefile文件放在程序的原码里的一级目录,它的语法:
[root@www ~]# vi makefile
LIBS = -lm  #这是变量
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
 gcc -o $@ ${OBJS} ${LIBS}   <==那个 $@ 就是 main !$@ 代表目前的标的(target)
clean:
 rm -f main ${OBJS}

#标的:有相关性原代码文件
  #第二行开头要tab一下,这一行就是执行的命令,如脚本命令

5、具体目录规则如下:
    a、最好将 tarball 的原始资料解压缩到 /usr/local/src 当中;
    b、安装时,最好安装到 /usr/local 这个预设路径下;
    c、考虑未来的反安装步骤,最好可以将每个软体单独的安装在 /usr/local 底下;
    d、为安装到单独目录的软体之 man page 加入 man path 搜寻:如果你安装的软体放置到 /usr/local/software/ ,那么 man page 搜寻的设定中,可能就得要在 /etc/man.config 内的 40~50 行左右处,写入如下的一行:
    MANPATH /usr/local/software/man
    这样才可以使用 man 来查询该软体的线上文件啰!

6、侦测配置程序./configure --help ,可以查看支持参数及说明
一般有的参数是安装到哪个目录的参数:--prefix=/path

7、一般的步骤(以ntp为例):
cd /usr/local/src
tar -zxvf /root/ntp-4.2.4p7.tar.gz
cd ntp-4.2.4p7/
cat INSTALL
./configure --help | more
./configure --prefix=/usr/local/ntp
make clean; make
make check #此步如果不检测也行
make install

8、原码进行更新升级:
    a、cat ~/main_0.1_to_0.2.patch  #查看第一行它的相对目录是什么样的
    b、用patch -p数字 < patch_file进行更新,这里的数字表示旧的目录要去掉几个/,如果不去则用patch -p1 < patch_file,要根据a步来判断。如main-0.1/xxx 与 main-0.2/xxx 进行对比,而你现在就在main-0.1目录下,那么可以这样patch -p1 < ../main_0.1_to_0.2.patch
    c、一般会发布更新包,以.patch为后缀,且会标明从什么版本到什么版本,不能跨多版本升级的,要顺序升级,如跨了多个更新包,则要把之前的更新包一个个更新
    d、make clean; make
    make check #此步如果不检测也行
    make install
    如果报错,可能就需要执行一下./configure,patch只是更新了有变化的原代码而已。
    e、如果 patch 错误呢?我们的 patch 是可以还原的啊!透过patch -R < ../main_0.1_to_0.2.patch 即可。(main_0.1_to_0.2.patch只是个例子)

作者:wang7dao 发表于2013-3-8 3:44:42 原文链接
阅读:67 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>