本文的前身〈純手工安裝msys〉內容過時且凌亂無章,這裡重新以 mingw-get 為基礎重寫。

對於只是單純想要有個 Win32 版 GCC 的使用者,使用官網或TDM的圖形界面安裝程式即可。官網的圖形界面安裝程式也能順便安裝 MSYS,但使用命令列界面有比較大的彈性,我使用mingw-get的原因是:

  • 我不喜歡預設的目錄架構,我的電腦同時存在多個不同版本的 MinGW,還有其他和 GCC 相容的 toolchain,我希望在MSYS下使用他們,把MSYS當成獨立軟體看起來比較自然。(我知道這個理由很蠢)
  • 有一些預設安裝的 Package 版本有問題,我希望能夠中途抽換成舊版本。(例如 mingwrt-3.18)

還不清楚這些東西的網友最好先讀一下這裡。MinGW 是 GCC 編譯器的 Win32 精簡移植版,理論上 MinGW 可以將標準的 C/C++/Fortran/... 原始碼編譯成 Win32 原生程式,但實務上光移植編譯器仍然有所不足,因為很多現存的軟體只有針對 Unix-like 環境撰寫 Makefile 或 autotools 配置檔,因此有必要將建置軟體過程最常用到的 Linux 功能也一併模擬,這就是 MSYS 的由來。

MSYS 純粹就只是為了編譯程式開一條方便之門,僅提供了少許的 Linux 工具,並且模擬 Linux 的命令解釋器和目錄架構。這和 MinGW 之前的 Cygwin 有很大的不同,Cygwin 的目標是在 Windows 上盡可能完整地模擬 Linux。事實上 Cygwin 在很多場合被視為既非 Windows 亦非 Linux 的獨立 target 平台。


1. 下載 mingw-get

首先下載 mingw-get 並解壓至 [安裝路徑]/mingw 資料夾,解壓後 [安裝路徑]/mingw 底下有三個資料夾,分別是 bin、lib 和 var。

這時候可以看一下 [安裝路徑]/mingw/var/lib/mingw-get/data/defaults.xml 內容,找到以下這兩項。

<sysroot subsystem="mingw32" path="%R" />
<sysroot subsystem="MSYS" path="%R/msys/1.0" />

這是預設安裝目錄架構的描述,其中 %R 是 mingw-get 的根目錄,在這裡即 [安裝路徑]/mingw。如果你對預設的安裝目錄架構沒有意見就不管他,我的習慣是

<sysroot subsystem="mingw32" path="%R" />
<sysroot subsystem="MSYS" path="%R/../msys" />

也就是使 [安裝路徑]/mingw 和 [安裝路徑]/msys 平行。對於目錄的配置並沒有太多限制,只要能讓 MSYS 找到 MinGW 即可,唯一的規則是不要把 MinGW 和 MSYS 目錄下的東西混合!

無可避免的,MinGW 有很多套件和 MSYS 相同,但意義截然不同,讓兩者交互運作可能會產生不可預期的後果。在概念上 MSYS 是一個虛擬的環境,假想 MinGW 是掛在底下的一個 cross-compiler,注意,不是 native compiler!所以 MSYS 底下又有一套自己專屬的 gcc、binutils 專門編譯東西給 MSYS 自己用,如果想程式編譯給 Windows 應該要用 MinGW 這個 cross-compiler才對。MSYS 的程式就只能在 MSYS 底下跑,而 MinGW 的程式都是可以獨立執行的 Win32 程式。舉個具體的例子,MSYS 的 make 認得標準的 Linux 目錄架構,而 MinGW 的 make 對此毫無概念,作為行為良好 Win32 程式,MinGW make 對 MSYS 的存在其實一無所知。

2. 瀏覽 package list (這步並非必要,如果你不是好奇寶寶請跳過。)

回到 [安裝路徑]/mingw/bin,如果你想在安裝前先看一下 package list,可以執行

mingw-get list
mingw-get list [Package名稱]

另外,執行 mingw-get list/install/update 後,所有 package 的清單會自動下載暫存在 [安裝路徑]/mingw/var/lib/mingw-get/data 底下,其中 package-list.xml、mingw32-package-list.xml、msys-package-list.xml 是了解各個 package 的好起點,之前的〈純手工安裝msys〉一文即是以此方式搭配對 linux 的理解所寫成的。

3. 安裝 MinGW 編譯器

因篇幅有限,本文只示範懶人包方式安裝,需要細微調整套件的網友請自行探索。執行 mingw32-base 懶人包:

mingw-get install mingw32-base
mingw-get install g++

接下來可以繼續安裝 fortran、ada、java、objc 等等,如果純粹只是要安裝 mingw 編譯器,到這裡就可以結束。(如果是這種情形我強烈建議使用圖形安裝介面即可.....)

如果有需要的話可以順便裝一下 MinGW 程式庫,像是 GMP、zlib、bzip2 等等。請注意安裝的套件名稱:

mingw-get install zlib  # 只會安裝 runtime dll
mingw-get install libz  # 會安裝開發套件包含 header、lib 和 runtime dll

mingw-get install bzip2     # 會安裝開發套件包含 header、lib 和 runtime dl
mingw-get install libbz2    # 只會安裝 runtime dlll

建議安裝前先看一下套件專屬的 .xml 或用 mingw-get list 查一下。

4. 安裝 mingw-autotools 和 MSYS

mingw-autotools 和 MSYS 已經有懶人包了

mingw-get install mingw-developer-toolkit

另外可安裝替代的 console 界面 mintty 或 rxvt,強烈建議安裝 mintty

mingw-get install msys-mintty
mingw-get install msys-rxvt

該裝的檔案裝完後,可以把 [安裝路徑]/mingw/var/cache/mingw-get/packages 底下的暫存檔清一清,大約可以清出120mb。對了,假如你不知道什麼是 vim,可以用 mingw-get remove msys-vim 把它移除掉。

5. 設定 MSYS

5.1. 設定 mount

第一步是設定 mount。建立一個純文字檔 [msys路徑]/etc/fstab,在裡面 mount mingw 的資料夾,可以參考 [msys路徑]/etc/fstab.sample 怎麼寫。請注意一定要用unix換行字元。另外你也可以把常用到的的資料夾 mount 進來,甚至你也可以把D:磁碟機整個 mount 成 home(這是個很糟的主意.....)。例如

c:/gcc/mingw4.5    /mingw
d:/code            /home/code

5.2. 設定 profile

和一般 unix-like 環境下的設定差不多。開啟 msys/etc/profile,在末端加入一些常用的命令像是

alias ls="ls --color=tty --show-control-chars" 
alias ll="ls -al" 

另外我也不太喜歡內建的命令列提示,順便更改 PS1 變數

export PS1='\[\033[1;32m\]\u\[\033[1;33m\]@\h \[\033[1;37m\][\t] \[\033[0;36m\]\w \[\033[00m\]\n\$ '

5.3. 設定 msys.bat

回到 MSYS 目錄,編輯 msys.bat。MSYS 啟動時會自動抓 Windows 的 PATH 環境變數加到自己的 PATH 下,如果 PATH 包含像「Program Files」這類帶空格的路徑會導致 sh 解析路徑出錯。我想最簡單的解決法就是在 msys.bat 開頭用乾淨不包含空格的 PATH 覆寫 Windows PATH 環境變數,如此 sh 就會抓到我們指定的乾淨 PATH。

然後建立 msys.bat 的捷徑,放在你可以隨手點選的地方,例如桌面和快速啟動列。通常我會建立兩個分別指向

[MSYS路徑]/msys.bat
[MSYS路徑]/msys.bat -mintty

後者會以 mintty 模式啟用 msys,採用 rxvt 也可以如法炮製。雖然 mintty 很好用,但是其採用的 pipe 機制和 Windows 現行的 console 不是很合得來,有時候還是得回到原始的 console 下執行。

5.4. 在 MSYS 下整合外部工具

MSYS 就只是為了方便編譯程式而移植過來的幾個 Linux 工具,不相干的東西大多付之闕如,其他的功能必須靠外部程式。

在MSYS下使用 GnuWin32 軟體看起來是個很自然的選擇,GnuWin32 和 MSYS 有很多看起來相同的套件,但如同前述的 MinGW 問題,GnuWin32 和 MSYS 屬於不同的軟體體系,混用的結果不可預期,因此將 GnuWin32 的程式安置於獨立目錄可能比較好。但每次使用這些軟體時都必須先打一大串 GnuWin32 的路徑,說實在話非常彆扭,因為這些東西在 Linux 上都是可以直接在 bin 或 local/bin 下找到的。

同樣的鳥事也發生在 python、cmake、graphviz、doxygen 等等使用者安裝軟體身上。可能的解決方法如下:

  • 將軟體所在的目錄 mount 成 MSYS 可以自動尋找的路徑下,例如/usr/local/bin。這會引出一個問題,路徑查找順序可能會導致同名覆蓋。
  • 另一個作法是將軟體所在的目錄加到 PATH 系統變數中,可以在 msys.bat 或者 profile 中進行。
  • 以上兩種作法比較適用於一整群軟體,對於單一執行檔可以考慮使用 alias 或 function。

novus 發表在 痞客邦 PIXNET 留言(3) 人氣()


留言列表 (3)

發表留言
  • 小斌
  • 在 rxvt 中顯示與輸入中文

    感謝提供 MinGW 跟 MSYS 的教學。我在 rxvt 裡面發現無法輸入與顯示中文。經過一些搜尋,還是找不到方法好讓 rxvt 能夠顯示與輸入中文。請問您是否知道如何讓 rxvt 能顯示與輸入中文方法?謝謝您。
  • 不知道你的MSYS版本是?建議全部砍掉換成最新版吧。
    我這邊在Win7和XP上顯示中文都沒有問題,不論最新版 mintty、rxvt 或者是一年前的版本。

    不然你換 mintty 試試看好了,mintty 在標題按右鍵可以切換文字編碼方式。

    至於輸入中文字,一般網路教學改.inputrc 招數在我這邊都可以用。
    在~/.inputrc 尋找下列項目並改成
    set meta-flag on
    set input-meta on
    set output-meta on
    set convert-meta off

    novus 於 2011/06/07 02:50 回覆

  • novus
  • 不過以上只適用於本來就能正常處理MBCS的 Windows 程式。

    無法正確顯示中文不完全是 terminal 的錯,有可能原本的應用程式本身就有問題,改terminal也沒用,很多來自linux的程式採用utf-8處理文字,大概就拿他沒辦法了

  • chen
  • 寫好多廢話......
  • 其實我也有同感,但壞習慣好像這些年也改不了。

    無論如何歡迎指教,具體的批評可以幫助我改進,空泛的指稱我就不知道該怎麼回應了。

    novus 於 2016/06/10 00:02 回覆