在VS2008环境下使用Scons编译NSIS
花了一个晚上的时间好不容易把NSIS的源代码编译过了,设置环境真是不容易啊。
首先解释一下为什么要编译NSIS的源代码,因为有时要修改NSIS的设置,比如让NSIS支持LOGGING啊,加大字符串长度,虽然这两个在网站上有下载编译好的,但是如果有别的设置要更改呢?如果要自己写个插件扫描器呢?都要把NSIS的源代码重新编译一遍。很不可理解。不过目前也只能这样。
根据文档上的要求,编译NSIS要有Python和Scons。下吧。Python的最新版是3.0.1,Scons的最新版是1.2.0。都下来最新版,安装好了,按文档上的要求,在源代码所在目录下输入“scons”,结果CMD不认为这是个命令。估计是环境变量没有自动设置好。好不容易找到这个scons,不太敢相信,原来就是一个bat,在bat里调用了python的代码。
把Python和Python"scipts都加到环境变量PATH里,OK。Scons认识了,还是不过,报语法错误,是python解释器报的一个py文件的语法错误。心想有可能是自己的Python太新了,Python 3和Python 2的语法还是有一定差别的。不过这年头Python 3.1都快发布了,scons还要用2.x的版本?到scons的网站上看看,的确也说了“SCons will work with any version of Python from 1.5.2 or later.”那3.0.1应该是可以的吧。不过还是报着一线希望,又安装Python 2.6.1。实践证明scons1.2.0的确还不支持Python 3。
现在不报py的语法错误了,改报NSIS源代码的编译错误了,说XXXX.lib或是说xxx.h报不到。
估计又是哪个环境变量没有设置,这个环境变量也不是自己能YY的,就上网找。在WinAmp的论坛上找到了有人有相同的问题,从后面的讨论可以看出的确是环境变量的问题,而且已经有人作为BUG报给了scons,说文件应该自动找到的呀,scons也很高效,马上就在Bug Trace的网站上回复了临时解决办法——改改scons的源代码就行了。汗颜……好在scons是用解释型语言编写的,改完了不要重新编译。解决方法如下:
Index: src/engine/SCons/Tool/msvc.py
===================================================================
--- src/engine/SCons/Tool/msvc.py (revision 3756)
+++ src/engine/SCons/Tool/msvc.py (working copy)
@@ -554,7 +554,9 @@
# base installation from the registry and deduce the default
# directories.
version_num, suite = SCons.Tool.msvs.msvs_parse_version(version)
- if version_num >= 8.0:
+ if version_num >= 9.0:
+ return (os.environ['INCLUDE'], os.environ['LIB'], os.environ['PATH'])
+ elif version_num >= 8.0:
suite = SCons.Tool.msvs.get_default_visualstudio8_suite(env)
defpaths = _get_msvc8_default_paths(env, version, suite, use_mfc_dirs)
elif version_num >= 7.0:
其实说白了就是scons还不支持VS2008,只支持VS2005。开发者也表示会在1.3版中提供VS2008的支持——天知道1.3什么时候发布,看样子是要在VS2010之后了。如果不是很明白上面的文件DIFF的结果可以去网站上看,其实一样的。
从解决方案中可以看到,还要设置两个环境变量“INCLUDE”和“LIB”,分别设置为Program Files"Microsoft Visual Studio 9.0"VC里的include和lib。
这样头文件应该也找到了,库文件应该也找到了,为了防止意外,这次不直接用CMD了。用Windows SDK的CMD SHELL,它会自动地加入一些变量。让各种文件更容易被找到。
这一次终于Build过了90%,还有10%还是过不了,就是NSIS Menu,其实文档上也说了要build NSIS menu要安装wxWidgets。其实目的已经基本完成了,NSIS的主体和插件都已经可以编译了,这个NSIS MENU是可有可无的,不过为了看上去舒服一些,还是让它过吧。同样安装了wxWidgets的最新版2.8.10,同样的要设置环境变量。根据文档上的提示,要先运行一下NSIS源代码目录下的Contrib"NSIS Menu"wx"wxbuild.bat(同样要在CMD SHELL里运行)以生成一些必要的库。然后再在NSIS源代码的根目录下运行scons。
如果出现什么问题,可以参考下面二个论坛上的主题。
Problem building the NSIS source
Nsis 2.25 - compilation problem
至此,NSIS编译成功。用VS2008编译出来的文件的大小,和官方下载的大小还是有一定差别的,可能是因为官方打包用的是VS2005的原因吧。理论上自己编译出来的这个应该更好一些的吧。