2015年10月29日 星期四

開發 ubiquity - 環境架設


首先先確定系統中有裝 ubiquity (程式核心) 和 ubiquity-slideshow-ubuntu-gnome (gnome 桌面環境下播放的 ubiquity slides),如果沒裝,要先裝
sudo apt-get install ubiquity ubiquity-slideshow-ubuntu-gnome ubiquity-frontend-gtk
因為 Ubuntu 桌面環境預設使用由 gnome 開發,所以這邊選擇安裝 -ubuntu-gnome。如果你想開發的桌面環境是其他種類,例如 kubuntu 或是 lubuntu,請分別選擇不同的 suffix,例如 ubiquity-slideshow-kubuntu 。

frontend 的部份也是一樣的意思,如果使用 kde ,請裝 ubiquity-frontedn-kde 。

因為我想開發 oem 安裝模式下的 ubiquity 行為,所以我的系統還要先有安裝 oem-config
sudo apt-get install oem-config
接著創建一個用來放開發用程式碼的資料夾
mkdir -p src/ubiquity
進到這個資料夾中[1],
然後取得架設環境用的 script (你可能要事先安裝 bzr),
sudo apt-get install bzr 
bzr branch lp:~taihsiangho/+junk/ubiquity-scripts scripts
或是從這裡也可以取得(我是從這 copy 的,免得原作者有天把來源拿掉)
bzr branch lp:~agateau/+junk/ubiquity-scripts scripts
取得 ubiquity 中播放的 slides
bzr branch lp:ubiquity-slideshow-ubuntu slideshow
取得 ubiquity 原始碼(到時要開發這一份)
bzr branch lp:ubiquity code
整個環境架設的核心概念是把下載下來的部份原始碼,使用 symbolic link 去代替在系統中的程式碼(這種作法可以生效是因為 ubiquity 核心本身是 python 這個直譯式語言寫成的關係),所以開發時直接改 code 就會好像直接改系統中的 ubiquity 程式一樣。

上面的步驟可以整合為
sudo apt-get install ubiquity ubiquity-slideshow-ubuntu-gnome ubiquity-frontend-gtk oem-config && mkdir -p src/ubiquity && cd src/ubiquity && sudo apt-get install bzr && bzr branch lp:~taihsiangho/+junk/ubiquity-scripts scripts && bzr branch lp:ubiquity-slideshow-ubuntu slideshow && bzr branch lp:ubiquity code
使用這個指令去準備開發環境[2]
./scripts/setup setup
done!! 至此為止所有東西都準備好了。所以我們切換到開發狀態
./scripts/setup dev
修改好程式後,接著啟動 ubiquity 。我在這裡想開發的是 oem 模式下的行為,所以啟動方式是
sudo oem-config
而不是標準的 ubiquity
sudo ubiquity



本篇主要參考
http://agateau.com/2013/hacking-on-ubiquity-the-setup/
我已經將虛擬機器的部份拿掉,著重在最核心的概念:使用原始碼替換系統中的程式碼。讀者可依照自己的需求,將此環境設置方式自行搭配必要的虛擬環境,免得把自己的主系統弄髒。

[1] 注意不要漏掉這一步,不然後面的 ./scripts/setup 不會正確工作。
[2] 如果系統沒有安裝 qt 相關的 ubiquity 的話;setup 這個 script 中 qt 相關的動作要被移除,來保證 script 執行沒有中斷。免得行為不符合預期。


Trouble Shooting

sudo oem-config 啟動後沒反應

遠端啟動時,是否有指定環境變數 DISPLAY

/usr/sbin/oem-config 會先檢查是否有 DISPLAY 環境變數,如果有才 import Gtk module。所以不指定的話就會有如下錯誤:

Jan  3 18:41:12 201606-22347 ubiquity[23735]: Ubiquity 2.21.63.3 (oem-config)
Jan  3 18:41:13 201606-22347 ubiquity[23735]: Exception in GTK frontend (invoking crash handler):
Jan  3 18:41:13 201606-22347 ubiquity[23735]: Traceback (most recent call last):
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 649, in <module>
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     main(oem_config)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 635, in main
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     install(query=options.query)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 264, in install
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     wizard = ui.Wizard(distro)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/lib/ubiquity/ubiquity/frontend/gtk_ui.py", line 228, in __init__
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     self.builder = Gtk.Builder()
Jan  3 18:41:13 201606-22347 ubiquity[23735]: NameError: name 'Gtk' is not defined

例如可以這樣指定

export DISPLAY=:0 ; sudo oem-config

檢查 /var/log/syslog

合併 tail -f /var/log/syslog 的監控技巧,執行 oem-config。目前發現在 Xenial proposed stack 上有點問題;這應該是因為最新的 ubiquity source 和 Xenial 的環境有不相容之處。可以切回 ./scripts/setup distro 使用系統原本的試試是否可以起來。

Jan  3 18:41:30 201606-22347 ubiquity[23742]: Ubiquity 2.21.63.3 (oem-config)
Jan  3 18:41:30 201606-22347 ubiquity[23742]: Exception in GTK frontend (invoking crash handler):
Jan  3 18:41:30 201606-22347 ubiquity[23742]: Traceback (most recent call last):
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 649, in <module>
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     main(oem_config)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 635, in main
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     install(query=options.query)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 264, in install
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     wizard = ui.Wizard(distro)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/lib/ubiquity/ubiquity/frontend/gtk_ui.py", line 278, in __init__
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     ''')
Jan  3 18:41:30 201606-22347 ubiquity[23742]: GLib.GError: gtk-css-provider-error-quark: <data>:8:24'min-height' is not a valid property name (3)

沒有留言:

張貼留言