首先先確定系統中有裝 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 setupdone!! 至此為止所有東西都準備好了。所以我們切換到開發狀態
./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
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)