Convert any single (or multiple) executable file(s) to deb-package.
I.e. this is a script to convert AppImage|ELF|executable script to .deb
.
The script will place the binary file(s) in /usr/bin/
.
You want to set DEBEMAIL
and DEBFULLNAME
for the deb tools to work properly:
$ cat >>~/.bashrc <<EOF
DEBEMAIL="email@example.org"
DEBFULLNAME="John Doe"
export DEBEMAIL DEBFULLNAME
EOF
$ . ~/.bashrc
Then it's as simple as downloading elf2deb.pyz
from releases or download it from PyPi: pip3 install elf2deb
and elf2deb --help
.
In this example I'm first downloading the skaffold binary and packing it as a .deb
file:
# Download ./skaffold binary to empty folder:
$ curl -Lo ./skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
# Run the tool:
$ ./elf2deb.pyz --license apache-2.0 --license_year 2018 --license_holder "The Skaffold Authors" \
> --package_name skaffold --package_version 0.28.0 --homepage "https://skaffold.dev/" ./skaffold
# Fix description and use debuild:
$ cd skaffold-0.28.0/
$ vim debian/control # add description
$ debuild -us -uc
[... lots of debuild output ...]
$ cd ../
# Finally the .deb file is ready to be uploaded, or installed:
$ sudo dpkg -i skaffold_0.28.0_amd64.deb
usage: elf2deb [-h] [--version]
--package_name PACKAGE_NAME
--package_version PACKAGE_VERSION
[--homepage HOMEPAGE]
[--dependencies DEPENDENCIES]
[--license {MIT,LGPL-3.0,MPL-2.0,AGPL-3.0,unlicense,apache-2.0,GPL-3.0} | --license_file LICENSE_FILE]
[--license_year LICENSE_YEAR]
[--license_holder LICENSE_HOLDER]
binary_files [binary_files ...]
positional arguments:
binary_files The binaries you want to package.
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
package info:
--package_name PACKAGE_NAME
The name of the deb package
--package_version PACKAGE_VERSION
The version of the package
--homepage HOMEPAGE The webpage of the package
--dependencies DEPENDENCIES
Dependencies specified in the deb package
license info:
--license {MIT,LGPL-3.0,MPL-2.0,AGPL-3.0,unlicense,apache-2.0,GPL-3.0}
Select a standard license.
--license_file LICENSE_FILE
... or use a LICENSE text file.
--license_year LICENSE_YEAR
If using a standard license: year
--license_holder LICENSE_HOLDER
If using a standard license: owner
If you are running Ubuntu, you might get E: bad-distribution-in-changes-file unstable
.
In this case edit debian/changelog
and change unstable
to your distributions codename (find it by running lsb_release -c
).
Then run debuild -us -uc
from source directory, to recompile the .deb
.
If you are missing the dch
-tool, then run: sudo apt install --no-install-recommends devscripts libdistro-info-perl
.
You can safely ignore the following warnings from lintian:
-
source-is-missing
-
binary-without-manpage
(you will probably get a longer list of errors and warnings, no worries)
If you want to distribute your software in more formats -- or your source isn't a list of binaries -- then consider using a tool like "Effing package management". FPM is a much more mature tool that allows for advanced packaging.
The advantages of ELF2deb is;
-
can be installed using
pip install elf2deb
or used a as a standalone executable./elf2deb.pyz
-
simple, small size (< 10 kB), and few dependencies:
>= python3.5
(+requests
if need to download a license file).debhelper
anddevscripts
(apt install --no-install-recommends debhelper devscripts
).
In version 1.2.0 a interactive menu was added to ELF2deb:
$ git clone https://github.com/NicolaiSoeborg/ELF2deb.git && cd ELF2deb/
$ make # to make 'elf2deb.pyz' (or use pip to install globally, or carry/copy elf2deb.pyz around)
$ ./elf2deb.pyz elf2deb.pyz # package 'elf2deb.pyz' using elf2deb (very meta!)
Package info:
author_mail: git@xn--sb-lka.org
author_name: Nicolai Søborg
binary_files: ['elf2deb.pyz']
dependencies:
homepage: None
license: None
license_file: <_io.TextIOWrapper name='/.../ELF2deb/LICENSE' mode='r' encoding='UTF-8'>
license_holder: None
license_year: None
package_name: ELF2deb
package_version: 0.0.1
==> Does this look correct? (y/n/q): n
Properties:
[1] author_mail
[2] author_name
[3] binary_files
[4] dependencies
[5] homepage
[6] license
[7] license_file
[8] license_holder
[9] license_year
[10] package_name
[11] package_version
==> Which property to change? (1..11): 4
==> Which value should dependencies be changed to? python3, python3-requests
Package info:
author_mail: git@xn--sb-lka.org
author_name: Nicolai Søborg
binary_files: ['elf2deb.pyz']
dependencies: python3, python3-requests
homepage: None
license: None
license_file: <_io.TextIOWrapper name='/home/nsq/pakker/test/ELF2deb/LICENSE' mode='r' encoding='UTF-8'>
license_holder: None
license_year: None
package_name: ELF2deb
package_version: 0.0.1
==> Does this look correct? (y/n/q): n
[...]
==> Which value should package_version be changed to? 1.2.0
[...]
==> Does this look correct? (y/n/q): y
Copying templates... done!
Copying files... done!
Run:
* cd elf2deb-1.2.0
* vim debian/control # change description, dont add empty lines
* debuild -us -uc # remove -us -uc if you want to sign the deb file
$ cd elf2deb-1.2.0
$ vim debian/control
$ debuild -us -uc
[...]
dpkg-deb: building package 'elf2deb' in '../elf2deb_1.2.0_amd64.deb'.
$ dpkg-deb --info ../elf2deb_1.2.0_amd64.deb
new Debian package, version 2.0.
size 5100 bytes: control archive=624 bytes.
383 bytes, 12 lines control
189 bytes, 3 lines md5sums
Package: elf2deb
Version: 1.2.0
Architecture: amd64
Maintainer: Nicolai Søborg <git@xn--sb-lka.org>
Installed-Size: 20
Depends: python3, python3-requests
Section: misc
Priority: optional
Multi-Arch: foreign
Description: tool to easily package any binary to a deb file
ELF2deb makes it easy to package simple binaries to a deb file
to help deploy files across debian environments.