runsisi's

technical notes

CentOS 6.x 编译打包 vim7.4

2018-12-24 runsisi#devops

现在公司内部使用的 RPM 系发行版应该多数还停留在 Centos6.x 或 RHEL6.x 版本,6.x 系列的版本带的 vim 好像都是 7.2 版本的,像我这种装了 spf13 提供的 vim 插件包的 TX 就比较郁闷了,这个插件包只支持 7.3 及以上的版本,vim 官方好像是没有提供 rpm 包下载的,我每次都是自己下来源代码进行编译,其实挺不方便的,本来只需要进行一次的工作,每次硬是要重新编译打包。 让我想起了在学校维护系里的网站时,需要添加一个生成本科毕业设计选题统计 word 文档的功能,大概花了我两天的时间才把这个功能给实现了,每次老师们想要生成这 个文档,就在页面上点击一下按钮,然后稍等一小会,网站后台会实时生成一个 word 文档提供下载,好久之后我才突然开窍,其实只需要我自己生成一份然后挂到网站上就行了的,反正毕设选题每年只有一次,哪用 SB 似的每次都去查数据库给生成一份:)

google 被 GFW 给屏蔽了,因此 vim 的代码也取不下来了,只好从 Centos7 的 yum 源里取了一份,路径如下:

http://vault.centos.org/7.0.1406/os/Source/SPackages/

我取的是:vim-7.4.160-1.el7.src.rpm

然后像编译打包其他 rpm源代码包一样,执行 rpm -i vim-7.4.160-1.el7.src.rpm 进行安装,如果没有在 ~/.rpmmacros 中自定义过 %_topdir 宏的路径,则默认会安装在 ~/rpmbuild 目录下,(如果执行过 rpmdev-setuptree,则该脚本生成的 ~/.rpmmacros 默认会定义 %_topdir 为 ~/rpmbuild),然后执行 rpmbuild -ba ~/rpmbuild/SPECS/vim.spec 进行编译打包即可。

直接执行 rpmbuild -ba ~/rpmbuild/SPECS/vim.spec 会出现如下的错误:

src/term.c:3655: undefined reference to `PC'
src/term.c:3656: undefined reference to `ospeed'
src/term.c:3653: undefined reference to `BC'
src/term.c:3654: undefined reference to `UP'
objects/term.o: In function `out_str':
src/term.c:2639: undefined reference to `tputs'
objects/term.o: In function `scroll_region_reset':
src/term.c:3617: undefined reference to `tgoto'
src/term.c:3620: undefined reference to `tgoto'

修改 vim.spec 文件,找到 --with-tlib=ncurses,替换成 --with-tlib=tinfo,或者将该选项去掉,configure 脚本会自动选择 tinfo,注意该 spec 文件会打包多个功能 版本的 rpm 包,因此 --with-tlib 选项定义了多处,在 spec 文件中去掉不需要的版本,或者将所有出现 --with-tlib 的地方都替换掉就可以了。

libncurses.so 和 libtinfo.so 都是 ncurses-devel 开发包提供的动态库,只是不知为何 libncurses.so 没有定义这些符号,而改由 libtinfo.so 定义了。我在 github 上传了一份 x86_64 位版本的 rpm 包,如有有需要的 TX,可以直接去上面下载,路径如下:

https://github.com/runsisi/vim7.4-rpms-for-centos6.x