私のソフトウェア(C言語)をファイルにパッケージしたいのですが、.deb
いくつかの問題があります。誰かが私を助けることができれば良いでしょう。
ソースコードを次のおもちゃの例として見てみましょう。
#include <stdio.h>
#include <stdlib.h>
#include <lbfgs.h>
int main(void)
{
printf("liblbfgs will be used here!\n");
return 0;
}
上記のCプログラムでは、ライブラリファイル図書館が利用される予定です。 liblbfgs はリポジトリで使用できます。私は次のような単純なMakefileを書きました。
CXX=gcc
CFLAGS=-Wall -g
LIBS=-lm -llbfgs
OUTPUT=toypackage
$(OUTPUT): $(OUTPUT).o
$(CXX) -o $(OUTPUT) $(LIBS) $(OUTPUT).o
.PHONY: clean
clean:
rm -f *~ *.o
synaptic
apt-get
利用可能なソースを手動でコンパイルし、上記のコードをビルドしてライブラリをインストールすると、すべてがうまくいきます。しかし、liblbfgs
当初はインストールを避けたいと思います。このため、私はソフトウェアを依存関係として.deb
定義する必要があるファイルにパッケージ化したいと思いますliblbfgs
。
toypackage_1.0/
たとえば、ソースコードとMakefileを保存するフォルダを作成します。その後、そのディレクトリを次に圧縮しました。
tar czvf toypackage_1.0.orig.tar.gz toypackage-1.0/
dh_make
次に、次のように実行します。
$ cd toypackage-1.0/
$ dh_make
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch?
[s/i/m/l/k/n] s
Maintainer name : geppetto
Email-Address : geppetto@phi
Date : Fri, 06 Jun 2014 16:25:22 +0300
Package Name : toypackage
Version : 1.0
License : blank
Type of Package : Single
Hit <enter> to confirm:
Skipping creating ../toypackage_1.0.orig.tar.gz because it already exists
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the toypackage Makefiles install into $DESTDIR and not in / .
$ debuild
dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: source package toypackage
dpkg-buildpackage: source version 1.0-1
dpkg-buildpackage: source distribution unstable
dpkg-buildpackage: source changed by geppetto <geppetto@phi>
dpkg-source --before-build toypackage-1.0
dpkg-buildpackage: host architecture amd64
fakeroot debian/rules clean
dh clean
dh_testdir
dh_auto_clean
make[1]: Entering directory '/home/geppetto/LAB/Debian_Packaging/ToyPackage/toypackage-1.0'
rm -f *~ *.o
make[1]: Leaving directory '/home/geppetto/LAB/Debian_Packaging/ToyPackage/toypackage-1.0'
dh_clean
dpkg-source -b toypackage-1.0
dpkg-source: info: using source format `3.0 (quilt)'
dpkg-source: info: building toypackage using existing ./toypackage_1.0.orig.tar.gz
dpkg-source: info: building toypackage in toypackage_1.0-1.debian.tar.xz
dpkg-source: info: building toypackage in toypackage_1.0-1.dsc
debian/rules build
dh build
dh_testdir
dh_auto_configure
dh_auto_build
make[1]: Entering directory '/home/geppetto/LAB/Debian_Packaging/ToyPackage/toypackage-1.0'
cc -Wall -g -D_FORTIFY_SOURCE=2 -c -o toypackage.o toypackage.c
gcc -o toypackage -lm -llbfgs toypackage.o
make[1]: Leaving directory '/home/geppetto/LAB/Debian_Packaging/ToyPackage/toypackage-1.0'
dh_auto_test
fakeroot debian/rules binary
dh binary
dh_testroot
dh_prep
dh_auto_install
dh_installdocs
dh_installchangelogs
dh_perl
dh_link
dh_compress
dh_fixperms
dh_strip
dh_makeshlibs
dh_shlibdeps
dh_installdeb
dh_gencontrol
dpkg-gencontrol: warning: Depends field of package toypackage: unknown substitution variable ${shlibs:Depends}
dh_md5sums
dh_builddeb
dpkg-deb: building package `toypackage' in `../toypackage_1.0-1_amd64.deb'.
dpkg-genchanges >../toypackage_1.0-1_amd64.changes
dpkg-genchanges: including full source code in upload
dpkg-source --after-build toypackage-1.0
dpkg-buildpackage: full upload (original source is included)
Now running lintian...
E: toypackage changes: changed-by-address-malformed geppetto <geppetto@phi>
W: toypackage source: dh-make-template-in-source debian/init.d.ex
W: toypackage source: dh-make-template-in-source debian/manpage.1.ex
W: toypackage source: dh-make-template-in-source debian/manpage.sgml.ex
W: toypackage source: dh-make-template-in-source debian/manpage.xml.ex
W: toypackage source: dh-make-template-in-source debian/menu.ex
W: toypackage source: dh-make-template-in-source debian/postinst.ex
W: toypackage source: dh-make-template-in-source debian/postrm.ex
W: toypackage source: dh-make-template-in-source debian/preinst.ex
W: toypackage source: dh-make-template-in-source debian/prerm.ex
W: toypackage source: dh-make-template-in-source debian/toypackage.cron.d.ex
W: toypackage source: dh-make-template-in-source debian/toypackage.default.ex
W: toypackage source: dh-make-template-in-source debian/toypackage.doc-base.EX
W: toypackage source: dh-make-template-in-source debian/watch.ex
W: toypackage source: package-needs-versioned-debhelper-build-depends 9
E: toypackage source: maintainer-address-malformed geppetto <geppetto@phi>
W: toypackage source: superfluous-clutter-in-homepage <insert the upstream URL, if relevant>
W: toypackage source: bad-homepage <insert the upstream URL, if relevant>
W: toypackage source: out-of-date-standards-version 3.9.4 (current is 3.9.5)
W: toypackage: wrong-bug-number-in-closes l3:#nnnn
E: toypackage: debian-changelog-file-contains-invalid-email-address geppetto@phi
W: toypackage: new-package-should-close-itp-bug
E: toypackage: changelog-is-dh_make-template
E: toypackage: helper-templates-in-copyright
W: toypackage: copyright-has-url-from-dh_make-boilerplate
E: toypackage: copyright-contains-dh_make-todo-boilerplate
W: toypackage: readme-debian-contains-debmake-template
E: toypackage: description-is-dh_make-template
E: toypackage: maintainer-address-malformed geppetto <geppetto@phi>
E: toypackage: section-is-dh_make-template
W: toypackage: superfluous-clutter-in-homepage <insert the upstream URL, if relevant>
W: toypackage: bad-homepage <insert the upstream URL, if relevant>
Finished running lintian.
Now signing changes and any dsc files...
signfile toypackage_1.0-1.dsc geppetto <geppetto@phi>
gpg: skipped "geppetto <geppetto@phi>": secret key not available
gpg: /tmp/debsign.wQjBHrJP/toypackage_1.0-1.dsc: clearsign failed: secret key not available
debsign: gpg error occurred! Aborting....
debuild: fatal error at line 1283:
running debsign failed
これは少し間違っているようですが、もし私が
$ cd ..
$ sudo dpkg -i toypackage_1.0-1_amd64.deb
[sudo] password for geppetto:
Selecting previously unselected package toypackage.
(Reading database ... 426247 files and directories currently installed.)
Preparing to unpack toypackage_1.0-1_amd64.deb ...
Unpacking toypackage (1.0-1) ...
Setting up toypackage (1.0-1) ...
$ cd ./toypackage-1.0/
$ cd ./toypackage
liblbfgs will be used here!
それliblbfgs
からapt-get
。
私の質問は次のとおりです。
- 以前にインストールしていない場合はどうなりますか
liblbfgs
?コードを正しく設定するにはどうすればよいですか? - 私の目的に適したMakefileは何ですか?
$DESTDIR$
バイナリをに保存するように変更する方法を提案しますか/usr/bin/
?
答え1
- 以前にliblbfgsをインストールしていなかった場合はどうなりますか?コードを正しく設定するにはどうすればよいですか?
ビルドツールがこの依存関係を認識するには、次の手順を実行する必要がありますBuild-Depends
。debian/control
文書。
- 私の目的に適したMakefileは何ですか? $DESTDIR$を使用してバイナリを/usr/bin/に保存するように変更する方法を提案できますか?
Makefile
目標があり、install
その目標を尊重する必要があります $DESTDIR
($PREFIX
FreeBSDのようなものをサポートしたい場合)。良いinstall
目標は次のとおりです。
PREFIX?=/usr
DESTDIR?=/
install:
install -m 755 $(OUTPUT) $(DESTDIR)/$(PREFIX)/bin/$(OUTPUT)