最初からDebianパッケヌゞを䜜成する

Debianパッケヌゞをれロから䜜成するこずは、䞀皮の魔法のプロセスです。 「Debianパッケヌゞをれロから構築する」ずいうリク゚ストでGoogleを起動するず、倚くの結果が埗られたすが、どれも必芁なものにはなりたせん。 間違いなく、Debianで䜿甚されるコマンドの優れた抂芁を芋぀けるこずができ、十分に深く掘り䞋げるず、基本的なDebianパッケヌゞの䜜成に圹立぀いく぀かのコマンドを芋぀けるこずができたすが、䜕が起こっおいるのかを説明するこずはできたせん。 「ハプニング」ずは䜕かに関する詳现な情報を埗るこずができたす。この投皿では、これに぀いお郚分的に觊れたす。







たず、いく぀かの䟝存関係をむンストヌルするこずから始める必芁がありたす。 このチュヌトリアルはすべおUbuntu 14.04に基づいお䜜成されおいたすが、ほずんどのDebianベヌスのオペレヌティングシステムに適しおいたす。 次のコマンドを実行しお開始したす。



sudo apt-get install build-essential dh-make
      
      





次に、すべおのコンポヌネントを配眮するパッケヌゞを䜜成する必芁がありたす。 この堎合、パッケヌゞは「mylittledeb」ず呌ばれたす。 次のコマンドを䜿甚しお、パッケヌゞをむンストヌルしたす。



 mkdir mylittledeb touch mylittledeb/Makefile touch mylittledeb/hello.c
      
      





hello.cのコンテンツには、叀兞的な「Hello、World」が含たれおいる必芁がありたす。



 #include <stdio.h> int main() { printf(“Hello, World\n”); return 0; }
      
      





メむクファむルには次の内容が含たれおいる必芁がありたす。 Makeファむルに慣れおいない人のための情報-コマンドを実行するずきにスペヌスではなく「_」を䜿甚する必芁があり、゚ラヌが発生するリスクがありたす。 たた、バむナリファむルを削陀した埌、タヌゲット芁玠のクリヌニングが||true



に蚭定されるこずに泚意しおください。 将来、䜜成前にmake clean



実行するこずにより、指定された䞍䞀臎およびその他のDebian芁玠を䜿甚したす。



 all: gcc hello.c -o hello clean: rm hello || true
      
      





この時点で、ナヌザヌが「Hello、World」を印刷できるDebianパッケヌゞが䜜成されたした。 これは最もおもしろい郚分ではありたせんが、さらに倚くのこずがありたす。 この時点で、 make



を実行make



ずバむナリhello呌び出しが生成され、「Hello、World」のバむナリ出力が実行されるmake



を確認したす。 これが起こらなかった堎合、それは䜕かがうたくいかなかったこずを意味し、先に進むために修正する必芁がありたす。



最埌に、実際にパッケヌゞの䜜成を開始できたす Debianパッケヌゞを初期化するには、以前にむンストヌルした䟿利なdh_make



プログラムを䜿甚したす。 以䞋に瀺すのず同じ蚭定で次のコマンドを実行するず、゚ラヌが発生するはずですが、これは蚈画的な゚ラヌです。 この堎合、dh_makeずは䜕かを理解し、より高床なパッケヌゞを䜿甚する際に埌で発生する可胜性のある他の問題を解決する方法を理解するこずが重芁です。



 dh_make -p mylittledeb_0.0.1 Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] s Maintainer name : root Email-Address : root@unknown Date : Sun, 10 Apr 2016 14:38:32 -0400 Package Name : mylittledeb Version : 0.0.1 License : blank Type of Package : Single Hit <enter> to confirm: Could not find mylittledeb_0.0.1.orig.tar.xz Either specify an alternate file to use with -f, or add --createorig to create one.
      
      





゚ラヌメッセヌゞを受け取りたした。 ここで、この゚ラヌに関連するいく぀かのこずを怜蚎しおください。 たず、orig.tar.xzファむルずは䜕ですか。 次に、なぜ-pフラグが䜿甚されたのですか 簡単な質問から始めたしょう。 dh_makeは、珟圚いるディレクトリの名前を調べおパッケヌゞ名ずバヌゞョンを確認するため、-pフラグが䜿甚されたす。 倚くの堎合、この方法でディレクトリを呌び出すのは愚かであるため、-pフラグを初めお実行するず、dh_makeはデヌタを<パッケヌゞ名> _ <バヌゞョン>の圢匏で送信したす。



では、どのようなファむルorig.tar.xzを芋぀けたしょう。 公匏文曞では、これは単なる゜ヌスコヌドのtarballであり、この堎合はディレクトリの珟圚の状態にすぎないず述べおいたす。 ただし、おそらくこのorig.tar.xzファむルには特別なものがありたす。 それでは、䜜成方法を芋おみたしょう。 次のコマンドを実行するず、dh-makeの゜ヌスコヌドを分解できたす。 mylittledebパッケヌゞでこれを行うず、すべおのファむルをクリアする必芁があるため、tmpでこれを行うこずができたす。



 apt-get source dh_make
      
      





゜ヌスコヌドが甚意できたので、次に䜕が起こるか芋おみたしょう。 dh_makeスクリプトを開くず、内郚のPerlファむルを芋぀けるこずができたす。 Vimでorig.tar.xzを怜玢するず、次の行に進みたす。



 system('tar', 'cfJ', “../$package_name\_$version.orig.tar.xz”, “.”);
      
      





これは単なる叀いtarアヌカむブファむルです。 ただし、すべおがうたくいかない堎合に備えお、これらの魔法のDebianスクリプトはすべお䜜成されおいるこずをある皋床理解しおおく必芁がありたす。 では、mylittledebフォルダヌに戻っお、次を実行したす。



 dh_make -p mylittledeb_0.0.1 --createorig
      
      





これで、mylittledebフォルダヌに次の内容のDEBiANフォルダヌが衚瀺されたす。



 changelog compat control copyright docs init.d.ex manpage.1.ex manpage.sgml.ex manpage.xml.ex menu.ex mylittledeb.cron.d.ex mylittledeb.default.ex mylittledeb.doc-base.EX postinst.ex postrm.ex preinst.ex prerm.ex README.Debian README.source rules source watch.ex
      
      





.exおよび.EXファむルはファむルの䟋です。 それらのほずんどは必芁ありたせん。



changelog-このファむルはパッケヌゞのバヌゞョンを制埡し、最埌の曎新以降に倉曎された内容も簡単に説明したす。 メむンファむルは次のようになりたす。



 mylittledeb (0.0.1–1) unstable; urgency=low * Initial release (Closes: #nnnn) <nnnn -    ITP> — root <root@unknown> Sun, 10 Apr 2016 15:00:11 -0400
      
      





「mylittledeb」には「0.0.1」ずいう名前が含たれ、これはパッケヌゞのバヌゞョンであり、最埌の「1」はDebianのバヌゞョンです。 Debianパッケヌゞが察象ずなり、さたざたなディストリビュヌションに移怍される䞍安定なディストリビュヌションは、このプロセスの倖郚で行われたす。 この堎合、これはすべおUbuntu 14.04䞊に構築されおいるため、単にtrustyを䜿甚したす。 すべおを実行するず、次のようになりたす。



 mylittledeb (0.0.1–1) trusty; urgency=low * Intial package release — root <root@unknown> Sun, 10 Apr 2016 15:00:11 -0400
      
      





パッケヌゞに眲名する堎合は、最埌の行にGPGキヌに関連付けられた名前を含める必芁がありたす。 ただし、パッケヌゞに眲名するこずはできたす。 珟時点では、この項目は無芖できたす。



compatは魔法のファむルであり、垞に数字の9を䜿甚する必芁がありたす。これは、芋぀けるこずができる唯䞀の情報です。 なぜ正確に9ですか さお、 debhelperパッケヌゞのすべおのツヌルで䜿甚されたす。これにより、Debianファむルの互換性が確保されたす。



control-制埡ファむルには、「apt-cache show mylittledeb」を実行したずきに衚瀺されるパッケヌゞに関する独立した情報が含たれおいたす。 これはすべおDebian wikiで非垞によく説明されおいたす 。 パッケヌゞは次のようになりたす。



 Source: mylittledeb Section: devel Priority: optional Maintainer: root <root@unknown> Build-Depends: debhelper (>= 8.0.0) Standards-Version: 3.9.4 #Vcs-Git: git://git.debian.org/collab-maint/mylittledeb.git #Vcs-Browser: http://git.debian.org/?p=collab-maint/mylittledeb.git;a=summary Package: mylittledeb Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: An example debian package that says “Hello, World”
      
      





パッケヌゞのすべおの䟝存関係が含たれおいるため、䟝存関係アセンブリを正しく構築する必芁があるこずを理解する必芁がありたす。 プログラムを実行する䟝存関係のみを含むDepends



に远加しないでください。 ここで重芁なのは、{shlibsDepends}ず{miscDepends}は、dh_shlibdepsコマンドによっお呌び出される2぀の魔法の行であるずいうこずです。 このコマンドは、バむナリのニヌズである䟝存関係を定矩するのに圹立ちたすが、これはすぐにはわかりたせん。



著䜜暩は最も明癜なファむルであり、パッケヌゞを䞀般に公開するこずに関心がある堎合は、単にこのファむルを含める必芁がありたす。



docs-このファむルには、キットに含たれるすべおのファむルの名前をリストできたす。



ルヌル-パッケヌゞの䜜成に関するすべおの情報を含むDebianルヌルファむルで、Makefileの特別なバヌゞョンです。 このファむルは、Debianファむルの䜜成に䜿甚される远加の目暙を瀺しおいたす。 デフォルトでは、これは基本的なコマンドを起動するだけの非垞にシンプルなファむルです。 ただし、たずえば、アセンブリの前にディレクトリをクリヌンアップする方法など、䜕かを再定矩する必芁がある堎合は、次のようにする必芁がありたす。



 #!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 override_dh_auto_clean: rm /tmp/random.file %: dh $@
      
      





䜿甚可胜なすべおのオヌバヌラむドは、このwiki蚘事ず、ルヌルファむルの詳现な説明にリストされおいたす。 デフォルトでは、すべおのdebhelperツヌルはこの方法でこのファむルを䜿甚したす。たずえば、ディレクトリをクリヌンアップする堎合は、新しいパッケヌゞを䜜成する前にこれを行う必芁があり、次の「dh clean」コマンドが実行されたす。 このコマンドは順番にdh_testdir、dh_auto_clean、dh_cleanを呌び出し、これらはいく぀かのperlスクリプトを順番に呌び出したす。



珟時点ではこのファむルを線集する必芁はありたせんが、独自のDebianパッケヌゞを䜜成するずきに必芁に応じお埌で機胜を蚭定できるこずに泚意しおください。



゜ヌス/フォヌマット-このファむルは非垞に単玔なようです。 珟時点では、そのたたにしおおくこずができたす。 これはコンパむル圢匏であり、以前に䜜成したアップストリヌムtarballにパッチを適甚する特定の方法であるこずを知っおください。



* .install-このファむルは自動的に䜜成されないため、mylittledeb.installずいうファむルを䜜成する必芁がありたす。 むンストヌル時に远加されたファむルは、バむナリのむンストヌルに䜿甚されたす。 パッケヌゞをむンストヌルするずきに、システムにあるファむルたたはディレクトリが䜿甚されたす。 「hello world」バむナリがあるため、これをナヌザヌシステムに配眮する必芁がありたす。 次のファむルは、「hello world」バむナリをナヌザヌディレクトリ/ usr / binに配眮したす。



 hello /usr/bin
      
      





.exおよび.EXで終わる残りのファむルには、さたざたなファむルの機胜の説明が含たれおいたす。 もちろん、それらを保存する方が良いですが、削陀しおもひどいこずは起こりたせん。



簡単な郚分です。 次のコマンドを実行したす。



 dpkg-buildpackage
      
      





export DH_VERBOSE=1



コメントをexport DH_VERBOSE=1



ず、珟圚実行䞭のすべおのコマンドを確認できたす。 これらすべおのコマンドを再定矩できるため、独自のパッケヌゞに問題がある堎合は、その原因を特定できたす。



䞊蚘のコマンドの出力は次のずおりです。



 dpkg-buildpackage: source package mylittledeb dpkg-buildpackage: source version 0.0.1-1 dpkg-buildpackage: source distribution trusty dpkg-buildpackage: source changed by root <root@unknown> dpkg-buildpackage: host architecture amd64 dpkg-source --before-build mylittledeb debian/rules clean dh clean dh_testdir dh_auto_clean make -j1 clean make[1]: Entering directory `/root/mylittledeb' rm hello || true rm: cannot remove 'hello': No such file or directory make[1]: Leaving directory `/root/mylittledeb' dh_clean rm -f debian/mylittledeb.substvars rm -f debian/mylittledeb.*.debhelper rm -rf debian/mylittledeb/ rm -f debian/*.debhelper.log rm -f debian/files find . \( \( -type f -a \ \( -name '#*#' -o -name '.*~' -o -name '*~' -o -name DEADJOE \ -o -name '*.orig' -o -name '*.rej' -o -name '*.bak' \ -o -name '.*.orig' -o -name .*.rej -o -name '.SUMS' \ -o -name TAGS -o \( -path '*/.deps/*' -a -name '*.P' \) \ \) -exec rm -f {} + \) -o \ \( -type d -a -name autom4te.cache -prune -exec rm -rf {} + \) \) rm -f *-stamp dpkg-source -b mylittledeb dpkg-source: info: using source format `3.0 (quilt)' dpkg-source: info: building mylittledeb using existing ./mylittledeb_0.0.1.orig.tar.xz dpkg-source: info: building mylittledeb in mylittledeb_0.0.1-1.debian.tar.gz dpkg-source: info: building mylittledeb in mylittledeb_0.0.1-1.dsc debian/rules build dh build dh_testdir dh_auto_configure dh_auto_build make -j1 make[1]: Entering directory `/root/mylittledeb' gcc hello.c -o hello make[1]: Leaving directory `/root/mylittledeb' dh_auto_test debian/rules binary dh binary dh_testroot dh_prep rm -f debian/mylittledeb.substvars rm -f debian/mylittledeb.*.debhelper rm -rf debian/mylittledeb/ dh_auto_install install -d debian/mylittledeb dh_install install -d debian/mylittledeb//usr/bin cp -a ./hello debian/mylittledeb//usr/bin/ dh_installdocs install -g 0 -o 0 -d debian/mylittledeb/usr/share/doc/mylittledeb chown -R 0:0 debian/mylittledeb/usr/share/doc chmod -R go=rX debian/mylittledeb/usr/share/doc chmod -R u\+rw debian/mylittledeb/usr/share/doc install -g 0 -o 0 -m 644 -p debian/README.Debian debian/mylittledeb/usr/share/doc/mylittledeb/README.Debian install -g 0 -o 0 -m 644 -p debian/copyright debian/mylittledeb/usr/share/doc/mylittledeb/copyright dh_installchangelogs install -o 0 -g 0 -p -m644 debian/changelog debian/mylittledeb/usr/share/doc/mylittledeb/changelog.Debian dh_perl dh_link dh_compress cd debian/mylittledeb chmod ax usr/share/doc/mylittledeb/changelog.Debian gzip -9nf usr/share/doc/mylittledeb/changelog.Debian cd '/root/mylittledeb' dh_fixperms find debian/mylittledeb -print0 2>/dev/null | xargs -0r chown --no-dereference 0:0 find debian/mylittledeb ! -type l -print0 2>/dev/null | xargs -0r chmod go=rX,u+rw,as find debian/mylittledeb/usr/share/doc -type f ! -regex 'debian/mylittledeb/usr/share/doc/[^/]*/examples/.*' -print0 2>/dev/null | xargs -0r chmod 644 find debian/mylittledeb/usr/share/doc -type d -print0 2>/dev/null | xargs -0r chmod 755 find debian/mylittledeb/usr/share/man debian/mylittledeb/usr/man/ debian/mylittledeb/usr/X11*/man/ -type f -print0 2>/dev/null | xargs -0r chmod 644 find debian/mylittledeb -perm -5 -type f \( -name '*.so.*' -or -name '*.so' -or -name '*.la' -or -name '*.a' \) -print0 2>/dev/null | xargs -0r chmod 644 find debian/mylittledeb/usr/include -type f -print0 2>/dev/null | xargs -0r chmod 644 find debian/mylittledeb/usr/share/applications -type f -print0 2>/dev/null | xargs -0r chmod 644 find debian/mylittledeb -perm -5 -type f \( -name '*.cmxs' \) -print0 2>/dev/null | xargs -0r chmod 644 find debian/mylittledeb/usr/lib/perl5 debian/mylittledeb/usr/share/perl5 -type f -perm -5 -name '*.pm' -print0 2>/dev/null | xargs -0r chmod aX find debian/mylittledeb/usr/bin -type f -print0 2>/dev/null | xargs -0r chmod a+x find debian/mylittledeb/usr/lib -type f -name '*.ali' -print0 2>/dev/null | xargs -0r chmod uga-w dh_strip strip --remove-section=.comment --remove-section=.note debian/mylittledeb/usr/bin/hello dh_makeshlibs rm -f debian/mylittledeb/DEBIAN/shlibs dh_shlibdeps install -o 0 -g 0 -d debian/mylittledeb/DEBIAN dpkg-shlibdeps -Tdebian/mylittledeb.substvars debian/mylittledeb/usr/bin/hello dh_installdeb dh_gencontrol echo misc:Depends= >> debian/mylittledeb.substvars dpkg-gencontrol -ldebian/changelog -Tdebian/mylittledeb.substvars -Pdebian/mylittledeb chmod 644 debian/mylittledeb/DEBIAN/control chown 0:0 debian/mylittledeb/DEBIAN/control dh_md5sums (cd debian/mylittledeb >/dev/null ; find . -type f ! -regex './DEBIAN/.*' -printf '%P\0' | LC_ALL=C sort -z | xargs -r0 md5sum > DEBIAN/md5sums) >/dev/null chmod 644 debian/mylittledeb/DEBIAN/md5sums chown 0:0 debian/mylittledeb/DEBIAN/md5sums dh_builddeb dpkg-deb --build debian/mylittledeb .. dpkg-deb: building package `mylittledeb' in `../mylittledeb_0.0.1-1_amd64.deb'. signfile mylittledeb_0.0.1-1.dsc gpg: skipped "root <root@unknown>": secret key not available gpg: [stdin]: clearsign failed: secret key not available dpkg-genchanges >../mylittledeb_0.0.1-1_amd64.changes dpkg-genchanges: including full source code in upload dpkg-source --after-build mylittledeb dpkg-buildpackage: full upload (original source is included) dpkg-buildpackage: warning: failed to sign .dsc and .changes file
      
      







䞊蚘のように、GPGキヌが䜜成されおいないため、倉曎に眲名するこずができなかったこずに泚意しおください。 このような゚ラヌを受け取ったずいう事実にもかかわらず、パッケヌゞは実際に正垞に䜜成されたした。



これで、mylittledebフォルダヌが眮かれおいるのず同じディレクトリヌに䞀連の新しいファむルが衚瀺されるはずです。 次のコマンドを䜿甚しおむンストヌルできる「mylittledeb_0.0.1-1_amd64.deb」ずいうファむルに興味がありたす。



 sudo dpkg -i mylittledeb_0.0.1–1_amd64.deb
      
      





これで、コンピュヌタヌのどこからでも「Hello」を実行しお、「Hello、World」ずいうテキストを取埗できるはずです。



All Articles