工作中发现Git客户端在处理中文目录时有Bug,利用业余时间定位Bug原因,接触到msysgit,tcl/tk,tortoisegit等开源项目,尝试编译了这些项目,并看了其中一部分代码,现总结如下。
msysgit是Git for windows的项目名称,项目地址是 https://github.com/msysgit 。 它有好几个子项目。
msysgit子项目仓库有一个git子模块指向git仓库,msysgit子项目下有一个msys.bat,双击该脚本会打开一个命令行窗口,进入git目录,然后就可使用make命令进行编译了。
开源项目一般都有很好的文档,下面的网址讲解了如何看源码,如何编译,如何调试Git:
https://github.com/msysgit/msysgit/wiki/How-To-Use-Eclipse-For-Coding-MsysGit
开源项目也会有很完善的测试用例,git源码目录下有一个t目录,保存了很多测试脚本,按照一定的规则组织,做回归测试时便可以跑测试脚本来验证新版本是否引入了Bug。
msys和MinGW的区别:
MinGW项目的目标是提供一种方案,使用GNU C编译器编译生成Windows上运行的不带POSIX调用的可执行程序。但是至少Bash程序需要POSIX调用,因为Bash需要调用fork去创建新进程,但是windows上没有fork调用。因此MSys(Minimal)参与进来,给出了最小的系统,这个系统可在Windows上为Bash提供创建进程等功能。因此Msys带了一个POSIX层(基于老版本的Cygwin),这个POSIX层只给Bash和Perl使用,不能给通过msys编出来的任何程序使用。
故此msys实际上为bash提供了posix层,因此可在这个bash里执行MinGW提供的编译工具链,于是能用MinGW编译工具链编译代码,生成在windows上运行的程序。但是需要注意用mingw工具链编译的代码,不能使用linux专有的系统调用(例如fork),否则会提示链接出错。
所以可以考虑使用msys+MinGW的方式做跨平台开发,这样同一份源代码既可生成在Linux下运行的程序,也可在msys+MinGW环境下编译生成在Window下执行的程序,只是写代码时需要将不同平台专有的代码用宏进行控制,只编译该平台专有的代码,而不编译其他平台专有代码。
Cygwin编译环境和msys+mingw编译环境的区别,Cygwin用dll模拟Linux环境”欺骗”应用程序,而mingw在编译时提供Linux到Windows目标代码的转换,用的还是windows运行库。故此Cygwin环境下编译出来的程序必须在Cygwin终端环境下运行,并且依赖于Cygwin.dll,不可脱离Cygwin.dll单独运行。而msys+mingw编译出来的程序可单独运行,它只依赖于windows自带的库,并且运行速度也比Cygwin编译出来的程序快,因为不用加载Cygwin.dll。故此推荐使用msys+mingw的编译环境做跨平台开发。
tcl项目可生成运行tcl脚本的终端程序,项目地址:
https://github.com/tcltk/tcl
tk项目可生成执行tcl脚本的图形终端程序,项目地址:
https://github.com/tcltk/tk
tcl/win/makefile.vc文档里说明了如何编译tcl,以及如何安装
我用来编译,安装并测试tcl的命令:
"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat" nmake -f makefile.vc release nmake -f makefile.vc install INSTALLDIR=E:\tcl nmake -f makefile.vc test TESTFLAGS="-file encoding_bb.test"
tcl/tests/README详细介绍了如何跑测试用例
tcl/win目录有一个VC6的工程tcl.dsw,可用Visual studio打开,然后可在Visulal studio里编译该工程并调试代码,非常方便。
项目地址:
https://code.google.com/p/tortoisegit/
tortoisegit/build.txt详细的说明了如何编译安装,还说明了如何生成安装包。