萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> pbuilder編譯構建工具使用詳細介紹

pbuilder編譯構建工具使用詳細介紹

   1. 簡介

  pbuilder(personal Debian package builder)是ubuntu環境下維護debian包的專業工具,能夠為每個deb包創建純淨的編譯構建環境,自動解析和安裝依賴包,並且不污染宿主系統。

  2. 使用pbuilder的流程

  (1) 使用pbuild create創建純淨的編譯構建環境,可以通過參數指定所要模擬的debian環境版本

  (2) 使用apt-get source下載目標deb包的src包

  (3) 使用pbuilder build編譯目標源碼包,參數為src包的dsc文件

  (4) 回到第(2)步繼續編譯更多的包

  3. pbuilder的主要功能(摘自manual page)

  (1) --create

  創建指定debian發行版的編譯構建環境,最終會打包為base.tgz。

  (2) --update

  更新base.tgz。

  (3) --build

  編譯指定的源碼包,通過傳入dsc-file指定源碼包。

  (4) --clean

  清空BUILDPLACE和APTCACHE中的內容。

  (5) --login

  chroot(即login)到構建編譯環境。需要注意的是,exit後會自動clean,期間用戶所有的操作都不會被保存,因此此命令只用於調試目的。

  (6) --excute

  首先login到編譯構建環境,然後執行指定的program。需要在參數中指定目標program的路徑,該program會被復制到編譯構建環境中執行。

  (7) --debuild

  在Debian source directory(即解壓好的debian源碼包)中編譯源碼包,當前目錄中需要存在debian/目錄。pbuilder --debuild等價於pdebuild。

  4. pbuilder的原理

  (1) 相關文件

  pbuilder相關的腳本有/usr/sbin/pbuilder,/usr/lib/pbuilder/*,/usr/bin/pdebuild。

  相關的臨時目錄是/var/cache/pbuilder。

  pbuilder運行時所需的各種變量如BUILDPLACE, MIRRORSITE,BUILDRESULT, DISTRIBUTION等都定義在配置文件中,這些文件有/etc/pbuilder/*, /usr/share/pbuilder/pbuilderrc,/etc/pbuilderrc, ~/. pbuilderrc。通過pbuilder-loadconfig腳本可知,這些文件的優先級依次升高:/usr/share/pbuilder/pbuilderrc< /etc/pbuilderrc < ~/. pbuilderrc,即前者的配置可以被後者覆蓋,最後,所有的參數又都可以通過命令行參數覆蓋。

  (2) pbuilder create命令的實體是pbuilder-createbuildenv。

  它創建一個根目錄環境,模擬指定的debian發行版。根目錄被打包在BUILDPLACE/base.tar.gz中,之後編譯deb包時可以重復使用。

  (2.1) 該腳本首先創建debian系統的基礎根目錄並安裝基本的deb包,這些實際上是借助debootstrap完成的。根目錄環境放在BUILDPLACE中。

  可以通過參數定制debootstrap所創建的debian系統,如--arch=ARCH可指定目標體系架構,--include=PACKAGES指定需要額外下載安裝的package,--variant=minbase|buildd|fakechroot|scratchbox可指定所使用的bootstrap腳本,不同的腳本創建的debian環境不同,主要區別是安裝的deb包不同,默認是minbase,如果要創建編譯構建環境,一般選用 buildd。debootstrap目前所支持的debian系統發行版見http://neuro.debian.net/pkgs/debootstrap.html

  (2.2) 將一些重要的配置文件(hosts, hostname, resolv.conf)復制到目標環境,創建並配置/etc/apt,添加apt keyring到目標環境中。

  (2.3) chroot到目標環境,掛載運行時所需的目錄,如/proc, /dev/, /dev/pts, /selinux及用戶指定的需要bind mount的目錄。

  (2.4) 在目標環境中,執行apt-get update,並安裝build-essential,dpkg-dev以及其它的packages。

  (2.5) 卸載之前掛載的運行時目錄。

  (2.6) 將BUILDPLACE打包為base.tgz。

  以上各步出現錯誤時,都會清空BUILDPLACE,避免污染宿主系統。

  (3) pbuilder build的實體是pbuilder-buildpackage。

  它基於已有的base.tgz,創建臨時編譯構建環境,並在此環境中編譯源碼包。

  (3.1) 該腳本首先解壓base.tgz到臨時目錄BUILDPLACE中,將宿主系統中的重要配置文件復制進去,如果用戶指定要覆蓋默認的apt源,則重新配置臨時環境中的/etc/apt,之後掛載/proc等運行時目錄。

  (3.2) 創建編譯時所需的臨時目錄和文件,如BUILDRESULT,PBUILDER_BUILD_LOGFILE等。

  (3.3) chroot檢查並安裝編譯源碼包所需的依賴包,用戶指定的額外包。

  檢查並安裝依賴包的工作,通過pbuilder-satisfydepends腳本完成。該腳本通過解析dsc文件中的Build-Depends, Build-Depends-Indep, Build-Conflicts,Build-Conflicts-Indep等區域,得到編譯目標源碼包所需的依賴包和沖突包,利用這些信息,創建了一個空的deb包pbuilder-satisfydepends-dummy,再利用aptitude install安裝這個dunmmy包,從而解決了依賴包和沖突包的問題。

  (3.4) 根據參數中的dsc-file,將源碼文件復制到臨時環境中(即BUILDPLACE/tmp/buildd),並修改文件權限,同時如果用戶指定了INPUTFILE,則一並復制進去。最後chroot到臨時環境,解壓源碼包。

  (3.5) 以chroot的方式調用dpkg-buildpackage編譯源碼包。

  (3.6) 卸載運行時目錄。

  (3.7) 將編譯得到的deb包從BUILDPLACE/tmp/buildd復制到BUILDRESULT,默認是/var/cache/pbuilder/result/。

  (3.8) 清除BUILDPLACE。

  5. pbuilder使用實例

  (1) 安裝pbuilder

  sudo apt-get installpbuilder debootstrap devscripts

  (2) 配置pbuilder使用的源

  echo “MIRRORSITE=http://192.168.0.123 /ubuntu”>> /etc/ pbuilderrc

  (3) 創建編譯環境

  最簡單的方式是:

  sudo pbuilder create

  此時pbuilder會使用pbuilderrc中默認的參數創建編譯環境。

  也可以通過命令行參數定制:

  sudo pbuilder create--distribution raring --debootstrapopts --arch=amd64 --debootstrapopts--variant=buildd

  此時會創建amd64架構的ubuntu raring編譯環境。

  (4) 下載並編譯源碼包

  以編譯bc為例,最簡單的方式是:

  apt-get source -d bc

  sudo pbuilder buildbc_1.06.95-4ubuntu1.dsc

  也可以手動將源碼包解壓,進入源碼目錄編譯:

  apt-get source -d bc

  dpkg-source -xbc_1.06.95-4ubuntu1.dsc

  cd bc-1.06.95

  sudo pdebuild

copyright © 萬盛學電腦網 all rights reserved