2008年3月11日 星期二

使用 openSUSE Build Service (以 LilyTerm 為例)

openSUSE Build Service (OBS) 可以讓您不用真的有機器就可以真的編譯打包套件
不過您得先註冊一個帳戶
先到 http://lilyterm.luna.com.tw/ 下載最新版的 lilyterm-0.7.6.tar.gz
您應該先解開看看裏面的說明
在 INSTALL 中可以看到此套件需要 libgtk2.0-dev 和 libvte-dev
(他們在 SUSE/openSUSE 中相對應的套件則是 gtk2-devel 和 vte-devel,
您可以用套件管理程式查一下就會知道)
安裝方法是直接進入 src/ 中 make 然後 make install
(沒有 configure 檔)

現在登入進入您的 Home Project

在 Build Repositories 旁的 + 按一下,選您要在哪個環境打包套件
包含了 SuSE 10.0 到 openSUSE Factory
Debian Etch
Fedora 6, 7, 8 ,CentOS 5
Mandriva 2006, 2007, 2008
xUbuntu 6.10, 7.04, 7.10

當然要 build deb 就不是像我下面所說的了
請參考 http://en.opensuse.org/Build_Service/Deb_builds
在 Packages 旁邊的 + 上按一下新增套件
填寫名稱和描述,核取下方建立 RPM SPEC 檔的模板

儲存後會自動進入此套件的頁面

把上游的 URL 填一下,然後在 lilyterm.spec 旁的 [Edit] 點一下進行修改

上面就是預設的樣板
將 Name: 改成 lilyterm
Version: 改成 0.7.6
Release: 維持 1
(OBS 會自己加上 release 的數字,如果 build 越多次(不管成功與否)數字就越大)
License: 改成 2-clause BSD-like license, see COPYING
BuildRequires: gtk2-devel vte-devel
加上一行
Source0: %{name}-%{version}.tar.gz
表示原始檔的名稱為 lilyterm-0.7.6.tar.gz (以後我們改 Version: 的地方就可以了)
Group: System/Terminals
Summary: 寫短一點
%description
可以寫長一點
在 %prep 下面加上
%setup 這樣會幫您解壓縮並切換到 %{name}-%{version} (也就是 lilyterm-0.7.6)的目錄下
%build 下面通常是加上 ./configure
不過因為 lilyterm 還沒提供 configure 所以依照 INSTALL 中所述
加上
cd src
make
%install 底下我通常填上 DESTDIR=$RPM_BUILD_ROOT make install
不過 lilyterm 的 Makefile 裏面沒有 DESTDIR 這個變數
而是指定安裝在 libdir 和 datadir 中
bindir = /usr/bin, datadir = /usr/share
而且 Makefile 不是放在 lilyterm-0.7.6 底下
所以要先切到 src 然後在 make 時指定 bindir 和 datadir 到 buildroot 下
還要先建立目錄
所以要改成
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps
cd src
make bindir=$RPM_BUILD_ROOT/usr/bin datadir=$RPM_BUILD_ROOT/usr/share install
在 %files 和 %defattr(-,root,root) 底下加上
%doc AUTHORS COPYING ChangeLog NEWS TODO README
雖然有些還是空白,以後總是會補上,所以還是列入文件中
INSTALL 是使用原始碼安裝的說明,對 rpm 安裝就沒用了
依照 Makefile 看來
install: 只會安裝 /usr/bin/lilyterm 和 /usr/share/pixmaps/lilyterm.png
所以在最下面加上
%_bindir/lilyterm
%_datadir/pixmaps/lilyterm.png
有時在這裡不知道有哪些檔案時,就先留白
rpm 會檢查哪些被安裝的檔案沒有被包進來
我們再從 Log 中找出來
最後可以順利 build 的 lilyterm.spec:
Name:           lilyterm
Version: 0.7.6
Release: 1
License: 2-clause BSD-like license, see COPYING
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: gtk2-devel vte-devel
Source0: %{name}-%{version}.tar.gz
Group: System/Terminals
Summary: Ligth-weighted X terminal emulator

%description
A light and easy to use libvte based X Terminal Emulator

%prep
%setup
%build
cd src
make
%install
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps
cd src
make bindir=$RPM_BUILD_ROOT/usr/bin datadir=$RPM_BUILD_ROOT/usr/share install

%clean
rm -rf "$RPM_BUILD_ROOT"

%files
%defattr(-,root,root)
%doc AUTHORS COPYING ChangeLog NEWS TODO README
%_bindir/lilyterm
%_datadir/pixmaps/lilyterm.png


儲存後會回到 lilyterm 專案的頁面
然後按一下 [Add File]
上傳 lilyterm-0.7.6.tar.gz

上傳完後不用任何動作
OBS 偵測到變化會就會自行啟動

您可以到 [Build Log] 中看它運作
正如我們在自己的電腦上編譯一樣

您最好保佑能成功,因為每重作一次
OBS 就會重新建立一個虛擬機器(Xen)
加上常常排不到機器
所以...(這就是所謂的用時間換取(磁碟)空間嗎?)
上面的 lilyterm.spec 可以在 openSUSE 10.3 上 build
(這時差不多已經 build 10次了,前面有注意事項的都是代表一次失敗)
(怪自己太肉腳)
但是 10.2, 10.1 ... 其他都不行
+ /bin/mkdir -p /var/tmp
+ /bin/mkdir /var/tmp/lilyterm-0.7.6-build
+ cd lilyterm-0.7.6
+ cd src
+ make -I/opt/gnome/include
gcc -c menu.c `pkg-config --cflags gtk+-2.0`
In file included from menu.c:26:
menu.h:30:21: error: vte/vte.h: No such file or directory
make: *** [all] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.76634 (%build)

因為10.2 之前的版本 vte/vte.h 在 /opt/gnome/include/
不知怎麼傳參數進去
只好改 Makefile 了(亂改一下試試看)
$ cd lilyterm-*/src
$ cp Makefile Makefile-orig

然後修改 Makefile

`pkg-config --cflags gtk+-2.0`

改成
$(CFLAGS) `pkg-config --cflags gtk+-2.0`

增加一個 CFLAGS 的變數
再將 install: 中的敘述依照上面所說修改
增加一個 DESTDIR 的變數
在 lilyterm-* 目錄下建立 diff 檔案
$ diff -uN src/Makefile-orig src/Makefile > Makefile.diff


Makefile.diff
--- src/Makefile-orig    2008-03-07 23:05:25.000000000 +0800
+++ src/Makefile 2008-03-11 09:26:41.000000000 +0800
@@ -4,11 +4,11 @@

.PHONY: all
all: main.h main.c notebook.h notebook.c config.h config.c menu.h menu.c
- gcc -c menu.c `pkg-config --cflags gtk+-2.0`
- gcc -c config.c `pkg-config --cflags gtk+-2.0`
- gcc -DIM_PATCH -c notebook.c `pkg-config --cflags gtk+-2.0`
- gcc $(INCLUDES) -c main.c `pkg-config --cflags gtk+-2.0`
- gcc -o lilyterm main.o notebook.o config.o menu.o `pkg-config --cflags --libs gtk+-2.0 vte`
+ gcc -c menu.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc -c config.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc -DIM_PATCH -c notebook.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc $(INCLUDES) -c main.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc -o lilyterm main.o notebook.o config.o menu.o $(CFLAGS) `pkg-config --cflags --libs gtk+-2.0 vte`
strip lilyterm

.PHONY: no-im-patch
@@ -28,8 +28,10 @@

.PHONY: install
install:
- install lilyterm $(bindir)
- install ../data/lilyterm.png $(datadir)/pixmaps
+ mkdir -p $(DESTDIR)$(bindir)
+ mkdir -p $(DESTDIR)$(datadir)/pixmaps
+ install lilyterm $(DESTDIR)$(bindir)
+ install ../data/lilyterm.png $(DESTDIR)$(datadir)/pixmaps

.PHONY: uninstall
uninstall:


接下來順便修改 lilyterm.desktop 的內容
讓所有的終端機都放在同一個選單目錄中
lilyterm.desktop.diff
--- data/lilyterm.desktop-orig    2008-03-04 15:43:17.000000000 +0800
+++ data/lilyterm.desktop 2008-03-10 17:11:35.000000000 +0800
@@ -9,4 +9,4 @@
Icon=lilyterm
Type=Application
Terminal=false
-Categories=GTK;Utility;TerminalEmulator;
+Categories=System;TerminalEmulator;

將這個兩個檔案傳到 OBS 上,

修改 lilyterm.spec
加上 Patch0: Makefile.diff
Patch1: lilyterm.desktop.diff
在 %setup 下加上 %patch0 和 %patch1
在 %build 部份 make 加上 CFLAGS='-I/opt/gnome/include'
並修改 %install
安裝 lilyterm.desktop
在 %files 中加入 lilyterm.desktop
Name:           lilyterm
Version: 0.7.6
Release: 1
License: 2-clause BSD-like license, see COPYING
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: gtk2-devel vte-devel
Source0: %{name}-%{version}.tar.gz
Patch0: Makefile.diff
Patch1: lilyterm.desktop.diff
Group: System/Terminals
Summary: Ligth-weighted X terminal emulator

%description
A light and easy to use libvte based X Terminal Emulator

%prep
%setup
%patch0
%patch1
%build
cd src
make CFLAGS='-I/opt/gnome/include'
%install
mkdir -p $RPM_BUILD_ROOT/usr/share/applications
install data/lilyterm.desktop $RPM_BUILD_ROOT/usr/share/applications
cd src
make DESTDIR=$RPM_BUILD_ROOT install

%clean
rm -rf "$RPM_BUILD_ROOT"

%files
%defattr(-,root,root)
%doc AUTHORS COPYING ChangeLog NEWS TODO README
%_bindir/lilyterm
%_datadir/pixmaps/lilyterm.png
%_datadir/applications/lilyterm.desktop

如此便可以順利在 10.2 和 10.3 編譯
至於 10.1 和之前版本,則出現下面錯誤
+ cd src
+ make CFLAGS=-I/opt/gnome/include
gcc -c menu.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
gcc -c config.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
gcc -DIM_PATCH -c notebook.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
notebook.c: In function 'edit_page_label_dialog':
notebook.c:213: warning: passing argument 1 of 'gtk_entry_set_text' from incompatible pointer type
gcc -DICONDIR=\"/usr/share/pixmaps\" -c main.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
gcc -o lilyterm main.o notebook.o config.o menu.o -I/opt/gnome/include `pkg-config --cflags --libs gtk+-2.0 vte`
notebook.o: In function `add_page':
notebook.c:(.text+0x25c): undefined reference to `gtk_notebook_set_tab_reorderable'
notebook.c:(.text+0x28d): undefined reference to `gtk_notebook_set_tab_detachable'
collect2: ld returned 1 exit status
make: *** [all] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.7184 (%build)

看起來不是加上編譯參數就能解決的了

沒有留言: