原文地址:http://guruce.com/blogpost/whattobuildwhen
http://www.armce.com/bbs/thread-804-1-1.html
这是一篇很好的文章,很多开发者其实并没有搞清楚这个问题:在何时该用什么方式编译WinCE
导致走了很多弯路,也包括我自己
感谢作者写了这篇文章
这么好的文章,我想应该翻译过来给大家
在何时该用什么方式编译WinCE
在新闻组里,大家总是会问这样一个问题,“我做了改动,为什么没合到我的镜像里面”或者“我在platform.reg里面改动了注册表,但是最后发现改动没有体现在设备中”。
其实这些问题的根源都是与编译相关的。我们必须理解整个编译系统,从而准确的了解什么时候该如何编译。发表这篇博文的目的就是为了让你搞清楚”什么时候该如何编译”这个问题!
首先第一步,也是最重要的一步就是,从你的Platform Builder的菜单中删除两个选项:”Build and Sysgen”和”Rebuild and Clean Sysgen”。这两个命令会编译整个系统,包括在”PUBLIC”和“PRIVATE”目录下的所有源代码。对于一般的系统开发者,这两个命令根本用不着。不是微软的CE开发组成员的话,你是没有全部源代码的。整个系统重新编译也许可以通过,但是这样会覆盖掉你装过的所有QFE。这些QFE通常包含了更新的二进制文件,有时候也会有更新的源代码。在重新编译整个系统之后,你迟早会碰到一些奇怪的bug,并且这些bug非常难解决或者到最后成为不可能解决的bug。一旦你执行了”(Re)Build and (Clean) Sysgen”之后,想再恢复到未执行前的状态就不可能了。唯一的办法就是把WinCE全部卸载然后重装。装的时候别忘了把QFE也重装一遍。
现在大家知道为什么我总是在新闻组里呼吁“千万别做BUILD AND SYSGEN”
原始的” Advanced Build Commands ”菜单
步骤1
在工具栏上点击鼠标右键,然后选择” Customize...”
步骤2
点击菜单” Build”,进入子菜单”Advanced Build Commands”,然后右击”Build and Sysgen”,选择” Delete”
步骤3
同理删除” Rebuild and Clean Sysgen”
步骤4
关闭” Customize”窗口,”Advanced Build Commands”下面现在应该只有4个选项了: [Sysgen], [Clean Sysgen], [Build Current BSP and Subprojects] 以及 [Rebuild Current BSP and Subprojects]
如果你仍然在使用Platform Builder for Windows CE 5.0,那么步骤也是差不多的。只不过不是” Build”菜单下,而是在” Build OS”菜单下,而且选项没有子菜单了,全部列在” Build OS”下面。
我知道有些开发者会改动PUBLIC和PRIVATE目录下的代码,这时候就需要使用”Build and sysgen”,来把你对内核的改动编译进去。但是,这样做的最终结果仍然会如前面一样:把你的CE搞乱。所以如果你需要改动PUBLIC或者PRIVATE目录下的代码,正确的做法是Clone这些代码。Clone代码在大多数情况下指的并不是简单的Copy。首选需要拷贝你要修改的源代码到你的BSP目录下,修改sources文件以编译出dll文件而不是lib文件,这样就搞定了。我知道这听起来很容易,但实际上是有许多步骤要做的。
先把这个问题放到一边,让我们来看看在什么情况下我们该用什么编译命令:
• 创建一个新的OS Design或者添加了一套新的编译配置到现有的OS Design:Sysgen (Build Solution)
新的OS Design或者一套新的编译配置在建立的时候输出文件夹都是空的,所以你需要完整的sysgen整个系统。整个编译过程比较漫长,但是幸运的是我们不需要经常这样做。
• 更改平台选项: Make image
如果你更改了平台选项配置,如IMGNOKITL, IMGNODEBUGGER, IMGPROFILER
你只需要执行Make Image即可
• 在BSP中修改驱动的源代码:Build 驱动,然后 Make Image
如果你修改了驱动的源代码,只需要编译驱动(WINCEREL必须要设置为1,不过1是默认值,除非你手动修改过,否则没必要关注)并且执行一下makeimg就可以了。如果你仅仅想调试一下编译好的驱动,你只要把这个驱动的dll添加到Release Directory Modules列表下(在Tools菜单中)并且重新启动设备(或者在设备端重新加载这个驱动)而不用执行makeimg或者把系统下载到设备上。(译者注:这里说的这种调试方法一般情况下我们是用PC通过KITL连接设备,然后启动过程中,Release Directory Modules下列出的文件会自动传输到设备上,替换设备上原有的文件,同时支持断点调试等。就是我们说的KITL调试。)编译驱动的方法非常简单,在IDE(集成开发环境)中右击驱动,选择Build 命令,或者在命令行模式下,进入到这个驱动的目录,执行命令"build"。
• 在BSP中修改了多个源代码文件: Build BSP,然后 Make Image
这是防止你遗漏了什么没有编译的安全做法。编译这个BSP的方法是:在IDE中右击PLATFORM\BSP文件夹,然后选择Build,或者在命令行模式下,进入BSP的根目录,执行命令"build"。
• 修改了platform.reg, bib, dat或者db文件: Sysgen BSP, Copy Files to Release Directory, Build All Projects 然后 Make Image
看起来步骤很多,其实用不了你几分钟的时间。如果你修改了platform.*系列的文件,我们需要确认这些修改过的文件都被拷贝到了FLATRELEASEDIR目录(就是工程的Release目录)。最后一个步骤就是清除所有项目的二进制文件。所以我们需要编译所有的项目(Build All Projects),以确认这些二进制文件和配置被拷贝到了FLATRELEASEDIR目录。最后我们执行Make Image就可以了。现在你的注册表修改已经被合入到你的系统镜像文件了(你可以检查reginit.ini文件进行确认,注册表文件中后面出现的项会覆盖前面出现的相同项)。(译者注:这里所说的项目应该是指你在整个工程文件下面建立的子项目)
• 在BSP中修改了一些源代码,并且修改了platform.*系列的文件: Build and Sysgen BSP, Copy Files to Release Directory, Build All Projects 然后Make Image
与上面唯一的区别就是你需要先编译一下BSP源代码以合入你对BSP的修改。
• 修改了workspace的配置,如增加或者删除某个系统组件: Sysgen (Build solution)
对于大多数系统组件,简单的一个Sysgen就可以了。有些系统组件(比如把系统的注册表组件从RAM based registry 修改到 Hive based Registry),就需要执行Clean Sysgen了。这确实需要不少时间去编译。Sysgen操作可以在IDE中右击当前workspace,选择Advanced Build Commands->Sysgen,或者在命令行方式下执行命令"blddemo -q"。
很多时候使用命令行编译会更简单一些。如果你不确定该输入什么命令,你可以在IDE中先执行命令,然后观察编译结果输出窗口的第三行,以"Starting Build:"开始的地方。冒号后面的就是那个操作的命令行语句。比如执行Sysgen,对应的输出是:"Starting Build: SysgenPlatform %_TARGETPLATROOT% preproc&&SysgenPlatform %_TARGETPLATROOT% postproc"。这里可以看出,你需要在命令行方式中输入的命令是:"SysgenPlatform %_TARGETPLATROOT% preproc"然后再输入命令"SysgenPlatform %_TARGETPLATROOT% postproc"。
如果你使用命令行方式编译,千万记住在执行"blddemo" 命令的时候,别忘记带上"-q"的参数。因为如果不带这个参数,就等于执行了Build and Sysgen!
我希望这篇博文可以帮助你加速自己的编译过程,在使用编译系统的过程中少走弯路!
Good luck!