在 XP 下编译支持 python 的 gvim (原创)
不知道还有多少像我这样坚守 XP 的,python 能支持 XP 的最后版本是 3.4.4,可是从网上下载的支持 python 的gvim 一般都是支持 python 3.6,要想在 XP 下让 vim 支持 python 3.4 ,只能自己编译了。
为了自己编译 vim,真的是费了好多事,不过也学到了很多。
编译起来最简单的是使用 VS 2015,直接按 INSTALLpc.txt 中的说明,一次成功(后来发现 VS2015 编译的版本在输入 :help 时,不能正确显示 program files\vim 下的帮助文件)。不过 VS 2015 也不能安装在 XP 上,只能另找一台机器,安装起来也很费时间。于是又想,能不能使用 WinGW 来编译呢?经过多半天的折腾,终于成功了。
1、下载 WinGW
按 INSTALLpc.txt 中的说明,要使用 64 位的 WinGW 来编译,以前没用过 WinGW,下载时很迷茫,不知道下载哪个,最后搞明白了,只要下载
i686-8.1.0-release-win32-dwarf-rt_v6-rev0.7z
这个文件就行了,下载地址是
http://sourceforge.mirrorservice.org/m/mi/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-win32/dwarf/
不过这是在 XP 平台上编译用的,在64位的windows上不知道好用不。
附:关于版本的选择,见下面的说明:
1.选择 gcc 版本
说明:Version 指的是 gcc 的版本,如果没有特殊的需求,一般选择最高的版本号即可。
操作:在这个版本中,最高版本是 6.2.0 ,选中它即可。
2.选择电脑系统架构
说明:Architecture 是指电脑系统是 32位 还是 64位,根据你的电脑系统做出对应选择。
操作:我的电脑系统是 64位 的,所以我选择了 x86_64,如果你是 32位 系统,则选择 i686 即可。
3.选择操作系统接口协议
说明:这个世界上只有两种操作系统,符合 posix 协议的,和 Windows 。如这个笑话所说的,如果你想要开发 Windows 程序,需要选择 win32 ,而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。
操作:我只开发在 Windows 下运行的程序,所以选择了 win32 。
4.选择异常处理模型(64位)
说明:异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,seh 是新发明的,而 sjlj 则是古老的。seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。
操作:我这里选择了 seh 。
5.选择异常处理模型(32位)
说明:选择了 32位 后,则可以用 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,可是它不支持 64位 。
操作:建议选择 dwarf 。
2、安装 WinGW
安装很简单,只要把下载的文件解压到 c:\mingw32,然后把 c:\mingw32\bin 加入 PATH 中就安装成功了!
分别输入 gcc --version 、 mingw32-make --version,如果都能看到版本信息,就说明已经正确安装了。
3、下载源代码
源代码的下载有两种方式:
a. 源代码下载:
ftp://ftp.vim.org/pub/vim/pc/
代码补丁下载:
ftp://ftp.vim.org/pub/vim/patches/8.2/
这种方法必须使用 linux 的 patch 工具,对源代码打补丁,比较麻烦。
b. 直接在 GitHub 上下载,这种方式下载下来的就是最新的代码,所有的补丁都已经包含在内了。以下编译步骤都是基于 GitHub 上下载的 vim-master 代码。
4、编译
在源代码的 src 目录中写入一个 build.bat,内容如下:
mingw32-make -f Make_ming.mak GUI=no OLE=yes ARCH=i686 STATIC_STDCPLUS=yes PYTHON3="C:/Python34" DYNAMIC_PYTHON3=yes PYTHON3_VER=34 DEBUG=no USERNAME=zhanghui USERDOMAIN=jingwaysoft
其中
ARCH=i686 STATIC_STDCPLUS=yes STATIC_WINPTHREAD=yes
这三个变量很重要,如果没有设置ARCH,编译时会认为在cygwin环境下,搜索不到 sed 程序将报错;如果没有设置 STATIC_STDPLUS,将使用默认的动态链接方式编译,运行 VIM 时需要 libgcc_s_dw2-1.dll 支持;如果未设置 STATIC_WINPTHREAD,编译结果运行时将依赖 libwinpthread-1.dll ,设置 yes 后为静态链接,运行时不再需要 libwinpthread-1.dll。
补充说明:经实验,即使设置了STATIC_WINPTHREAD,运行时还是需要 libwinpthread-1.dll ,后来懒得研究怎样静态链接了,干脆把这个DLL加到安装包里吧。
另外在 Make_cyg_ming.mak 中还有一个 WINVER的 0501 值,是对应 XP 平台的。经验证,不加这个参数编译出来的结果也可以正常在 XP 平台运行。其他变量可以参考 Make_cyg_ming.mak 中的注释。
像上面直接提供编译参数的方法就比较方便,无需到 Make_cyg_ming.mak 中修改代码,命令行参数会优先覆盖掉 Make_cyg_ming.mak 中的配置。
运行 build.bat 编译后,将其中的 GUI 改成 yes,再次编译,一共编译出 5 个 exe 文件:vim.exe gvim.exe vimrun.exe install.exe uninstall.exe
5、运行
在 ftp://ftp.vim.org/pub/vim/pc 下载运行支持文件 vim82rt.zip(需要注意的是,vim82rt.zip中包含的文件比较全,但是其中的 vim 脚本不如 vim-master\runtime 中的新,所以下面编译安装包的过程是基于 vim-master\runtime 进行),解压后将上面的5个exe放进去,就可以正常运行了。如果想自己打包安装文件,可以参考源文件中 nsis 文件夹中的说明。
6、安装包编译
1. 将 src\nsis\icons.zip 直接解压到当前文件夹(压缩包中包含 icons 文件夹),保证 nsis 文件夹下包含 icons 文件夹。
2. 在 vim-master 下创建文件夹 vimtools,从其它安装包中提取 diff.exe, winpty32.dll, winpty-agent.exe 复制到 vimtools 文件夹中。
3. 按照 nsis\README.txt 的说明,从网上下载 gettext0.20.1-iconv1.16-shared-32.zip、gettext0.20.1-iconv1.16-shared-64.zip 两个文件,在 vimtools 文件夹中创建 gettext32、gettext64 两个子文件夹,将32位的 libintl-8.dll、libiconv-2.dll、libgcc_s_sjlj-1.dll 复制到 gettext32 文件夹,将64位的 libintl-8.dll、libiconv-2.dll 复制到 gettext64 文件夹中。
4. 原 runtime\lang 文件夹中包含的诸多 *.vim 语言文件是用于 gvim 的 GUI 菜单翻译文件,并不包含 vim.exe 中的提示信息本地化翻译。为了本地化 vim 中的信息,需要在 vimtools 文件夹中创建 lng 文件夹,从发布的安装包中提取 lang\ {af} .. {zh_TW.UTF-8} 诸多文件夹,复制到 lng 文件夹中(规范的位置应该复制到 runtime\lang 文件夹中,之所以这么做是把 vim-master 中未包含的文件统一放在 vimtools 文件夹中,想要编译新版本的代码时,只要简单地把 vimtools 文件夹复制到新版本 vim-master 下即可)。
5. 从 MinGW32 中提取 libwinpthread-1.dll ,复制到 vimtools 文件夹中。
6. 修改 nsis\gvim.nsi:
017行,定义运行包位置:!define VIMRT ".." ==> !define VIMRT "..\runtime"
022行,定义vimtools文件夹位置:!define VIMTOOLS ..\.. ==> !define VIMTOOLS "..\vimtools"
029行,定义gettext文件夹位置: !define GETTEXT ${VIMRT} ==> !define GETTEXT ${VIMTOOLS}
147行,定义LIC文件:#!insertmacro MUI_PAGE_LICENSE "${VIMRT}\doc\uganda.nsis.txt" ==> "\doc\uganda.txt"
204行,ReserveFile ${VIMSRC}\installw32.exe,直接改成 install.exe ,省去重命名的步骤。后面还有两处 installw32.exe,也直接改成 install.exe。
340行,File /oname=gvim.exe ${VIMSRC}\gvim_ole.exe ==> 直接改成 gvim.exe,省去重命名的步骤。
345行,File /oname=uninstall.exe ${VIMSRC}\uninstallw32.exe ==> 直接改成 uninstall.exe,省去重命名的步骤。
347行,File /oname=tee.exe ${VIMSRC}\teew32.exe ==> 直接改成 ${VIMSRC}\tee\tee.exe,省去重命名的步骤。
348行,File /oname=xxd.exe ${VIMSRC}\xxdw32.exe ==> 直接改成 ${VIMSRC}\xxd\xxd.exe,省去重命名的步骤。
414行,File /oname=vim.exe ${VIMSRC}\vimw32.exe ==> 直接改成 vim.exe,省去重命名的步骤。
446-457行,释放gvimext64.dll,因为没有编译出64位的dll,所以直接将这段代码注释掉了。
548行,File /r ${VIMRT}\lang\*.*,在此行下加上一行 File /r ${VIMTOOLS}\lng\*.*,用于包含后加入的 vim.exe 语言文件。
345行,插入 File /oname=libwinpthread-1.dll ${VIMTOOLS}\libwinpthread-1.dll

浙公网安备 33010602011771号