稍微整理了一下自由行列的原始碼

作者: Yong-Siang Shih / Tue 26 February 2013 / 分類: Projects

自由行列, 軟體開發, 輸入法

停擺多年

還記得數年前完成了「自由行列輸入法」的測試版本,雖然一開始還有斷斷續續修正一些 bugs,但到後來這個專案就完全停擺了。當然其中一個重要理由是突然發現 gcin 原本就有支援智慧選詞的行列輸入法,覺得花那麼多力氣重造輪子有點不值得。但其實也是沒有特別的新功能可以開發,而且程式本身寫的太亂不太好維護,加上課業繁忙,所以就沒有投注太多關心。

gcin 的版本雖然很好,但對 Dvorak 和「行列定符」的支援總是差了那麼一點,而且不知為何總是無法習慣使用 gcin,所以後來就沒有繼續使用。而隨著作業系統的更新,之前的自由行列輸入法也不知為何無法編譯了,於是我就重回注音輸入法的懷抱,和行列輸入法疏離了許久。

後來剛好又看到行列以及 dvorak 的討論串,加上最近剛好比較有空,就想把之前的程式碼翻修一下,看看能不能動,也順便把原始碼轉到現在比較習慣的 GitHub。雖然只花了幾天時間,不過其實遇到的問題也不少,甚至有些問題的根源還很難弄明白。

問題

首先遇到的問題是不知為何編譯時所連結的外部函式庫,包含 sqlite3, ibus, freearray 等等,都無法順利連結,使用到的函式都變成了 undefined reference。花了一段時間才發現似乎是一定要透過 libtool 才能順利連結,在 configure.ac 裡加上 AM_PROG_LIBTOOL 以後情況才有所改善。

但是很奇怪的是,原本我的編譯程序是先將一部分的 object 檔製成暫時的函式庫 libfaft.a,最後再連結在一起,但這個函式庫指向的外部連結也都變成是 undefined reference。除此之外,也遇到 libtool 在連結 c++, c 檔案時無法順利找到 libstdc++ 的問題。最後只有取消中繼函式庫,直接將所有 object 檔連在一起才能解決。

除此之外,automake 和 autoconf 等等的行為似乎跟以前比起來也有微妙的改變,因此我參考其他專案修改了 autogen.sh,新增 libtoolize 和 autoheader 等指令,讓編譯流程順利進行,雖然其實我也不太清楚這些微妙的改變實際上有什麼作用就是。

接下來則是 ibus 新版的 ibus_config_set_value, ibus_config_get_value, ibus_config_new 等等的行為已經有所不同,還有許多函式不知為何開始要求傳進去的參數要先經過 g_object_ref_sink 的處理。這些也透過觀察類似專案得到了解法,雖然還沒有時間深入研究。

最後則是 64bit 環境下 libchewing 的 TreeType 大小會有問題,暫時用強制的型別解決了。

結語

幾番修正後終於成功啟動了 ibus-freearray,說起來行列輸入法真是不錯,雖然那麼久沒用可是我卻還記得怎麼打字。抱著學習的心態,這次也順便嘗試製作了 .deb 檔案,雖然一開始遇到一些問題,不過也順利解決了。

雖說如此,這樣匆促的修復應該會隱藏著不少 bugs,而且目前實在也是沒有投入太多心力持續開發這個專案的打算,所以它還是會繼續以測試版的姿態存在下去吧。

有興趣測試的朋友,所有的檔案都可在 freearray download page 下載,若你是使用 64bit Ubuntu,可直接安裝 libfreearray0 和 ibus-freearray 等 .deb 檔。否則的話就參考從前的文件下載 .tar 檔編譯安裝。

原始碼已經搬移到 Github:

Yong-Siang Shih

作者

Yong-Siang Shih

軟體工程師,機器學習科學家,開放原始碼愛好者。曾在 Appier 從事機器學習系統開發,也曾在 Google, IBM, Microsoft 擔任軟體實習生。喜好探索學習新科技。

載入 Disqus 評論