2009年3月11日 星期三

Cygwin 習作 ---- 編譯 DrawTiming

你應該也有這種經驗, 想找某方面的軟體, 尋尋覓覓尋尋覓覓的結果, 卻發現怎麼就只有 Linux 版本 ..., 這時候你怎麼辦? 會想動手把它『移植』到 Windows 嗎?

例如: 有機會和 Evernote 或 OneNote 互補的 BasKet Note Pads, 讓我差點想把 andLinuxcoLinux 架起來....。而最近找到『畫時序圖的免費工具 DrawTiming, 就讓我安裝了第一次使用的 Cygwin 來編譯執行檔, 最後又換成 MSYS + MinGW ...

. 

Cygwin 與 MinGW 的不同

Cygwin 與 MinGW 有什麼不同? 我的看法是: 比較複雜, 或是使用到較多外部函式庫的程式, 適合使用 Cygwin; 而比較單純, 沒有使用到外部函式庫, 而且又希望很容易分享出去的程式, 則適合使用 MinGW

其他說明可以參考 :

Cygwin ... 透過 ... Cygwin1.dll ... 建立一個系統呼叫轉換層,將原先 unix 世界裡的 system call 呼叫,... 映對到微軟視窗作業系統的系統呼叫,... 在 Windows 底下模擬出一個 unix 平台來

MinGW ... 將 gnu 這個 open source, free 的開發工具移植到微軟視窗平台,他直接產生出來的PC視窗平台機器碼,

MinGW 是取 Minimalist GNU for Windows 計劃之意,其目標為提供一個可在 Win32 平台上開發 Win32 native code 的 GNU GCC tools ,而非提供 Unix 程式移植到 Win32 平台之用,此即為其 Minimalist 之意。... 在 MinGW 中,有提供一套最小化的 unix shell 擬似執行環境,稱為 MSYS (Minimal SYStem)
... 如果是打算將原本在unix 環境下的程式移植到win32 的使用者,也不建議用這套工具, Cygwin 更合適。

簡單的說,cygwin在windows上提供了一個像linux (Linux-like)的環境,可以讓使用者在windows上執行linux的程式。

嚴格地說, cygwin 是模擬了 GNU 的環境, 而不是 linux 的環境,藉著 cygwin 的函式庫(library), 在 Win32 API 環境上提供了像 linux 般的API 環境. 利用 Cygwin, 你可以:

  • 將 linux 上的程式移植到 Windows , 而不必做重大的修改,只需將原始碼拿來作 configure 與 make 就好了。
  • 使用常用的 linux 工具程式,如grep, sed, awk等。
  • 撰寫 Win32 native console 或是 GUI 應用程式。

.

下載與安裝 Cygwin

  1. 連至 www.cygwin.com 下載 setup.exe
  2. 執行 setup.exe , 選取Download from Internet
    1. 選取距離自己最近的下載點
    2. 選取所需套件 // 建議全選devel, lib等分類的所有套件
  3. 執行 setup.exe , 選取Install from Local directory安裝套件 //最好選取 All user
    1. 選取所有套件
  4. 執行桌面上的 Cygwin 的 icon 圖示即可執行此一 Cygwin 環境。// 視窗大小可由icon 圖示右點按 選取調整字型 及佈置

step by step 可參考 http://linux.tnc.edu.tw/techdoc/shell/x52.html

.

例如, DrawTiming 官網的 安裝說明 提到已經在 FreeBSD, Linux, 和 Cygwin 底下測試過, 另外在 編譯成 Cygwin 版本的注意事項 又說到需要這些函式庫: ImageMagick, libMagick-devel, libbz2-devel, gcc-g++, make, xorg-x11-devel, ghostscript-base, 所以我裝 Cygwin 的步驟就是 :

  • 先下載 572K 的 Cygwin setup.exe,
  • 執行 setup.exe, 選『下載但不安裝』 (Download Without Installing)
  • 指定下載檔案到本機的存放位置
  • ... 選下載點, 例如 ftp://ftp.???.???.edu.tw (台灣的幾個大學)
  • ... 選 下載的函式庫
    這是一個樹狀選單, 如果不清楚到哪一個類別節點去找函式庫, 可以在 本機存放位置的 ftp://ftp.???.???.edu.tw 子目錄底下找到 setup.ini 的內容, 例如下面的例子 :
  • 下載完成之後, 再執行一次, 這次選『從本機的存放位置安裝』(Install from Local Directory) ...

setup.ini 的內容

@ libMagick-devel
sdesc: "Image manipulation software suite (development)"
ldesc: "ImageMagick is a software suite to create, edit, and compose bitmap ..."
category: Graphics
requires: cygwin libbz2-devel
libfontconfig-devel libfpx-devel libfreetype2-devel libjasper-devel libjbig-devel libjpeg-devel liblcms-devel libpng12-devel libtiff-devel libwmf-devel libxml2-devel libX11-devel libXext-devel zlib

...

@ xorg-x11-devel
sdesc: "Obsolete package"
ldesc: "Obsolete package"
category: _obsolete
requires: libX11-devel xorg-x11-base

可以得知 libMagick-develGraphics 這個類別節點底下, 而且它同時需要 cygwin libbz2-devel, 這些相依的函式庫 (dependency), 會在點選 libMagick-devel 時被自動納入, 而 xorg-x11-devel 則是不存在 (_obsolete)

下面是我在 Cygwin 內定的部份之外, 配合 DrawTiming 再勾選的函式庫 :

類別節點 函式庫
Devel gcc-core
gcc-g++
make
Graphics ImageMagick
ghostscript
ghostscript-fonts-others
ghostscript-fonts-std
libMagick-devel
Libs libbz2-devel

_obsolete (不存在)

ghostscript-base
xorg-x11-devel

.

製作 Cygwin 版的 DrawTiming

假設 drawtiming-0.7.tar.gz 存放在 e:

  • 點選桌面的 Cygwin 圖示
  • cd cygdrive/e/
    ( cygwin 底下的 e: 會對應成 /cygdrive/e/, c: 會對應成 /cygdrive/c/ )
  • tar -xzf drawtiming-0.7.tar.gz
  • cd drawtiming-0.7
  • ./configure
  • 依照需求 make
    make           (編譯執行檔)
    make install  (編譯並自動安裝到)
    make check  (編譯並測試執行結果)
  • 回到 Windows, 檢查 *.gif 的結果是否正確

如果只需要在一台機上器上執行 DrawTiming, 到這邊就算完成了。

總計 Cygwin 版完整的 DrawTiming, 過程中除了120KB 的 DrawTiming 原始程式碼之外, 還要下載 Cygwin 將近 80MB 的安裝檔 (含 gcc, ImageMagick, ghostscript ... 等), 安裝之後則變成大約 300MB 的 Cygwin 的執行環境 ....。不過, 這一番辛苦之後可以正確輸出 GIF, JPG, PS, EPS。

.

『免安裝 Cygwin』的 DrawTiming

經過一番嘗試, 我發現可以抽取出一些 DLL, 變成『免安裝 Cygwin』在 Windows 命令列執行的 DrawTiming。而這個『免安裝版』因為字型相依性還沒全部解決, 所以只能輸出 PS, EPS 格式。雖然功能上打了折扣, 但是只需要複製大約 10MB 的檔案, 就 可以在另一台『沒有安裝 Cygwin 的電腦』執行 DrawTiming

把下面這些檔案, 連同在 Cygwin 底下編譯的 drawtiming.exe 複製到同一個目錄,
其中, type-ghostscript.xml 裡面的路徑設定 /usr/share/ghostscript/fonts/ 要去掉

例如 :

... metrics="/usr/share/ghostscript/fonts/a010013l.afm" glyphs="/usr/share/ghostscript/fonts/a010013l.pfb"

改成 :

... metrics="a010013l.afm" glyphs="a010013l.pfb"

cygbz2-1.dll
cygexpat-1.dll
cygfontconfig-1.dll
cygfreetype-6.dll
cygiconv-2.dll
cygjpeg-62.dll
cyglcms-1.dll
cygMagick++-1.dll
cygMagickCore-1.dll
cygMagickWand-1.dll
cygtiff-5.dll
cygwin1.dll
cygX11-6.dll
cygXau-6.dll
cygxcb-1.dll
cygxcb-xlib-0.dll
cygXdmcp-6.dll
cygXext-6.dll
cygz.dll

原本在 c:\cygwin\bin

懶得篩選, 也可以 *.dll 全部複製
n019*.* 原本在 c:\cygwin\usr\share\ghostscript\fonts

type.xml
type-ghostscript.xml
type-solaris.xml
type-windows.xml

原本在 c:\cygwin\lib\ImageMagick-6.4.0\config

.

2 意見:

發表您的回應
  1. 匿名 提到...
    網誌管理員已經移除這則留言。
  2. 匿名 提到...

    請問可以幫忙把上面的個人資料刪除嗎?不好意思打擾了

張貼留言