星期四, 10月 26, 2006

CE 的Build Phase

一般的software , os run time image的 build 動作,不外乎是..

  1. config, generate heder and defines
  2. compile
  3. link
  4. relocate resource and exe files
  5. combine all to rom image
但是CE platform build卻看不出這幾個動作..

首先,這一篇(要用IE 或IE Tab來看,因為裡面的圖用了IE特殊的script )有說明build phase. 出乎意外的是:
  1. Compile
  2. Sysgen
  3. Release Copy
  4. Make run-time image
Compile在sysgen之前。

文章的圖對於各build tool 之間的關係說得很仔細:

所以blddemo.bat 是最大的batch program,做了所有的事。依據呼叫cebuild.bat, buildrel.bat 和makeimg.exe。

cebuild.bat 作 上面.. 1.Compile 和 2.sysgen 的動作。

所以sysgen 並沒有compile 囉?


blddemo.bat 可以有以下使用法:
blddemo [clean | noclean] [rel | norel] [-q | -qbsp] [Cebuild.bat parameters]
clean, noclean - clean 的目標是指%_PROJECTROOT%\Cesysgen 和 %_PLATFORMROOT%\Cesysgen。
當有修改 %_WINCEROOT%\Public\CEBASE\OAK\Misc\Cesysgen.bat 時,才需要clean。
含有environment variable 中,以SYSGEN 和BSP 開頭的變數有變更時,也需要clean。

rel, norel - norel 大概是指要不要自動將 compile完的file copy 到release folder,及之後的動作(makeimg)。

-q - 這是pass給cebuild.bat 的參數, -qbsp 是告訴cebuild 只要build plaform folder以下的source。 -q 是說 ? 有點conflict.. 好像說,所有source 和sysgen 變數都沒有改變。

cebuild.bat parameters - 是任何呼叫cebuild.bat 時傳遞的參數。


在command line 使用blddemo.bat 來build image的話,可以先設定好環境變數:
set BLDDEMO_MI_LOG=1
這樣blddemo.bat會在目前目錄下產生
  • Makeimg.out : makeimg.bat 的log
  • SysgenSettings.out : sysgen 在做完dependency check 後的setting.

Cebuild.bat
  1. 在%_WINCEROOT%\Public\ 中,所有env var : _DEPTREES 中所包含的 folder name,一一的到該目錄下執行 build.exe 來compile source code。
  2. 對每一個_DEPTREES 中包含的item XXX,執行 Sysgen.bat -p XXX 。
    Sysgen.bat 將會 還會依照cesysgen.bat 產生的module 需求,buid module。
    Sysgen.bat 還會build %PROJECTROOT%\Oak\Misc 下的module。
  3. 到%_PLATFORMROOT%\%_TGTPLAT% 作build.exe,compile hardware platform的module
猜測Build 作compile, sysgen 才作link。
為此,使用Cebuild.bat時,可以加上 " -q " 叫cebuild.bat不要呼叫build.exe將source code重新compile,直接叫sysgen 重新link就好。

Sysgen.bat

真的是作link的動作...

sysgen.bat 將Cesysgen.bat中指定的所有module,用nmake.exe將各個lib link起來。
  1. sysgen.bat 到%_PROJECTROOT%\Oak\Misc中參考Cesysgen.bat,設定好適當的envvar。
  2. 參考 %_WINCEROOT%\Public\Common\Cesysgen 下的makefile,如果有-p option時,則follow -p option 指定的 Project ,參考 %_WINCEROOT%\PBWorkspaces\<Project Name%gt;\Cestsgen 下的makefile。參考這些makefile,作以下..
    1. Create Target system directory
    2. 將Cesysgen.bat中指定的 .lib link 起來
    3. Call Res2res.exe, 將所有resource file 合併起來
    4. call Cefilter.exe 處理 CE header file 和其他source file,
      CE header file 中有些comment 被用來作condition statement : @CESYSGEN。
      利用這些condition statement,可以讓Cefilter變更處理的動作。
    5. Cefilter.exe處理%_COMMONPUBROOT%以下四個folder中的file,並且output到 %PROJECTROOT%\Cesysgen\的對應位置:
      1. \Sdk\Inc\*.* ==>\Sdk\Inc
      2. \Oak\Inc\*.* ==>\Oak\Inc
      3. \Ddk\Inc\*.* ==>\Ddk\Inc
      4. \Oak\Files\Common\*.* ==> \Oak\Files
    6. Copy modules 到target directory
  3. Sysgen.bat會將Error輸出log到%_WINCEROOT%\Build.log中
stsgen   [-c] [-p Tree] [NmakeTarget] [NmakeTarget] ...
-c : Run Nmake.exe時, 加上clean 參數
-p Tree : 對 Tree 作sysgen,當沒有指定時,對common project 作 (?)
NmakeTarget : 指定build Target module就好,當沒有指定時,sysgen 對所有Cesysgen.bat中列出的module作sysgen。
 sysgen -p wceshell
這個動作指示sysgen build/link wceshell module,並且copy 到 target folder

Cesysgen.bat
?

簡單的說:
  • build.exe 是compile,但是build.exe產生的是lib (也是就ar 起來的一堆obj)
  • sysgen 是link,依照cesysgen.bat 的內容將各 lib link成target : exe, dll
  • resource arrangement - 略
  • makeimge : 依照binary image script (*.bib) 將各exe, dll , res,... 合併成一個image。
以上整個動作可以由blddemo.bat完成。

1 則留言:

Kenneth醫達 提到...

想請教作者對於windows mobile 6.0的build phase有沒有研究?

關於Package Generation Process,章節所提到的MakePkg.exe以及CE.bib, CPM.csv, PKD.XML的說明。

網誌存檔