What have you found for these years?

2008-03-20

rake, erubis, cmake, make

專案管理實在是個很麻煩的事,尤其要 cross-platform 又更麻煩。
以往使用 windows 時,大抵上就是使用 Code::Blocks 的 project,
設定用 GUI, 編譯用 GUI, 什麼都靠 GUI...

雖然說 Code::Blocks 已經算是個不差的 IDE 了,再加上使用 wxWidgets,
所以只要跑得動的話,能編譯 wxWidgets 的平台基本上應該是都能用才對。

不過什麼都靠 GUI 的話,很多自動化的工作就會變得難以執行。
難不成要寫滑鼠游標機器人?這太麻煩了,而且會碰到更多的平台問題。
所以基本上自動化操作都應該寫成 command line 才對。

雖然 xcode 是非灌不可的,但我也一點都不想用 xcode IDE,
其實要習慣一套 IDE 是一件挺麻煩的事... 如果可以的話,還是盡量用自己
習慣的開發環境才是。依賴 xcode 我覺得會是件不太明智的選擇。

於是我找上了 gnu make, 可能也是最普及的 make utility 吧。
不過看沒兩下就發現,一來裡面有太多神奇的符號看不懂,二來
操作起來有點原始,如果要寫複雜的動作,make 寫起來可辛苦了。

於是有了 autotools 的誕生,包含 autoconf, automake, libtool, etc.
不過其實我比較熟悉的只有 autoconf, 因為不少專案確實是用 autoconf.
編譯的動作就會是:
> autoconf # 吃 configure.ac 吐出 configure
> ./configure
> make
最常見的動作大概是這樣吧。
由於有時候編譯會碰到點問題,所以我也修修改改過 configure.ac,
當然,都只是機械性的修改而已,我並沒看懂裡面在寫什麼過。

所以我本來是想找 autoconf 來試試,畢竟用的人很多。不過稍微翻翻
configure.ac, 唔,我記得我看過上萬行的 configure.ac, 剛剛看了一下
ruby trunk 的 configure.in, 大概是一千八百行。難道不會覺得,連寫個
編譯程序都要花到一千八百行甚至上萬行,很不值得嗎...? 更何況時有耳聞
寫 configure.ac 是一件很痛苦的事。

而且生出來的 configure 常常都是上萬行。ruby trunk 的剛剛看是兩萬多行。
有必要產生這麼臃腫肥胖的 script 出來嗎...? 而且編譯時也很醜,都是直接印指令。
除此之外,好像還需要 Makefile.in 的樣子,不是很清楚。

於是我找到了 cmake. 第一次使用他是由於想安裝 QtRuby, 看他的安裝手冊,
還要安裝 cmake 讓我很困惑,為什麼這麼多 make system, 還每個專案都用不同的?
好在 port install cmake 就可以安裝了,所以我也沒抱怨什麼,反正灌了就能用,
灌完再移掉也不會怎麼樣。

第一印象就是,怎麼那麼華麗啊 XD
花花綠綠的顏色,還有進度報告,沒有一堆看不懂的訊息。

後來正式想開始試 cmake 後,才知道其實他的地位是等同於 autoconf,
而不是 gnu make. 在我的系統上,底層還是用 gmake 在跑。
然而寫了寫後開始發覺,他還是不太符合我的需求,至少我就找不到要怎麼
尋找所有的 .cpp 將之加入編譯目標裡。文件很少。想買 Mastering CMake
一書,天王龍居然也沒進!囧

於是我乾脆引進 ruby preprocessing 算了!Dir.glob('**/*.cpp') 就解決了,
多快啊,省得還要去查 cmake 到底怎麼寫。用 rake 包裝這些動作也很方便。

問題不只是這樣。因為 mac 上的編譯環境還是不太一樣,他的 gcc 有
-framework AppKit -framework Foundation -framework OpenGL 等需求。
如果直接用 cmake 的 LINK_LIBRARIES, 他會用 gcc 慣用的 -l ...
為此,我也是查閱半天,有看到類似的東西,但還是試不出來解決方法...

最後我就乾脆直接寫死 cxx flag 和 link flag, 甚至是 link command...
consistency 不是很高,有些東西是這個有那個沒有的,感覺有點凌亂。
但撇過這些不說的話,cmake 用起來感覺還是很不錯。應該這樣說吧,
小問題有點多,但大問題沒有。



所以我最後的整個專案,就變成用一堆東西去包裝...
一般來說,要編譯就是:
> rake build
這底下的動作大概是:
> rake prepare
> cmake .
> make
而 prepare, 則是:
> rake preprocess
> rm CMakeLists.txt
> rake CMakeLists.txt

原本的 prepare 其實只是 preprocess, 但是由於我的 CMakeLists.txt.eruby
會去搜尋有哪些 .cpp, 而很多 .cpp 卻又是從 .cpp.eruby 生出來的,也就是說,
如果先處理 CMakeLists.txt 的話,會有好多個 .cpp 沒有加入 CMakeLists.txt 裡...
然而 CMakeLists.txt 卻是第一個被處理的(因為他在 top level... glob 先找到),
這使得所有需要 preprocess 後才會產生的 .cpp 不會被加入編譯目標裡。

所以只好在 preprocess 之後刪除 CMakeLists.txt 然後叫他重生一次。
本來我是用 touch 啦,不過 touch 時間差太短,或是 rake 本身有 cache,
因此不刪除好像沒有用。

至於 windows 呢?最後一個動作可能就不能用 make, 但 cmake 的部份
是沒有問題的。在 windows 下,cmake 「照理說」會產生某個 project 檔,
然後再用那份 project 檔去編譯就行了。詳細因為我沒試過,所以不知道...
但原則上 cmake 本身是跨平台,而我也沒寫平台相依的程式,應該能跑才對。
(上面的 rm 其實是 ruby code: File.delete)

cmake 產生的 makefile 的執行片段:

[ 92%] Building CXX object CMakeFiles/shooting-cubes.dir/src/view/SpriteText.o
Linking CXX shared library bin/libshooting-cubes.dylib
[ 92%] Built target shooting-cubes
Scanning dependencies of target bin/shooting-cubes
[ 95%] Building CXX object CMakeFiles/bin/shooting-cubes.dir/main.o

所以要從 source compile 的話,至少要安裝:
1. cmake
2. ruby
3. rake
4. gem erubis
5. gem ludy
6. 自己平台的 make utility (gmake, visual studio? code::blocks?)
7. boost
8. c++ tr1

實在是很多 = =b

btw, cmake 編譯出來的 .o 也不會跟 source 放在一起,我看很多 autoconf
跑完的 makefile 都把一堆中間檔(intermediate code)跟 source 混在一起。

結論:反正都要一堆工具...

10 retries:

jserv said...

FYI: http://blog.linux.org.tw/~jserv/archives/001991.html

看兄臺的文章,覺得應一併提及 Mac OS X 的部份。

山邊美溪 said...

GF,請幫我看看教育部網站或教育部字典上不上得去。

我這裡已經連續幾天連不上去了。

山邊美溪 said...

MD,哪裡買得到光碟版國語字典啊?受夠這種動不動就要看教育部臉色的工具書了。

godfat 真常 said...

> jserv

噢,其實那場我有去耶。只是在我還在猶豫要不要打招呼的時候,時機似乎就已經去了

用到 cmake 的專案在這,有興趣的話歡迎瞧瞧,只是目前完全沒有文件就是了:
http://shooting-cubes.googlecode.com

> 山邊美溪

我一直都連得上,你試試這個:
http://140.111.34.46/newDict/dict

光碟版我不知道...
一直都連不上的話,可能要試試跳板,或許被擋 IP 了...

山邊美溪 said...

代理伺服?GF有甚麼好建議嗎?

godfat 真常 said...

我不知道,沒研究過...
隨便 google 個 proxy 試試?

山邊美溪 said...

試了五十多個了,沒一個有用的。

godfat 真常 said...

那可能要找台灣的比較容易連吧 -_-b

jserv said...

@godfat

Thanks! shooting-cubes 看起來很有趣,只是 dependency 有點嚇人。

godfat 真常 said...

是有點嚇人沒錯 XD
而且其實有些是非必要的 dependency.
未來如果會繼續維護的話,時間多了就可以把一些細節處理好,
現階段很趕,所以很多東西只能大略帶過...
(或許也可以另外做一份比較少 dependency 的版本)

等遊戲畫面差不多時就放幾張 screenshot :p

Post a Comment

All texts are licensed under CC Attribution 3.0