I want to use a newer package version with my stable Ubuntu release. Asking for backport takes too long without visible result, so I thought that maybe I can build newer version myself.
Can anybody tell me what is the current best practices to build newer versions of packages that are already available on Ubuntu?
UPDATE: I found out that I need pbuilder to keep my system clean from build dependencies. So I've done:
sudo apt-get install pbuilder
sudo pbuilder create # create isolated environment for building packages
UPD2: I tried to check if I can build current version, so I fetched source code for the current <version> of my <package>:
mkdir delme
cd delme
apt-get source <package>
UPD3: Now I tried build package from source, but can not find the results:
sudo pbuilder build *.dsc
The log says:
...
0 packages upgraded, 94 newly installed, 0 to remove and 0 not upgraded.
Need to get 30.2 MB of archives. After unpacking 89.4 MB will be used.
The following packages have unmet dependencies:
pbuilder-satisfydepends-dummy : Depends: libjansson-dev which is a virtual package.
Depends: libudev-dev but it is not going to be installed.
Depends: ocl-icd-opencl-dev which is a virtual package. or
opencl-dev which is a virtual package.
Unable to resolve dependencies! Giving up...
The following NEW packages will be installed:
...
Need to get 30.2 MB of archives. After unpacking 89.4 MB will be used.
Abort.
E: pbuilder-satisfydepends failed.
I: Copying back the cached apt archive contents
...
UPD4: It appeared that these unmet dependencies are from universe package repository, so I had to enable it:
sudo pbuilder update --components "main universe" --override-config
Without --override-config pbuilder will complain that it is not set. Everything is built successfully:
ls -la /var/cache/pbuilder/result/
UP5: Found out which package versions are available and fetched the source for the needed one:
uscan --report --verbose
uscan --download-version <version>
UP6: Found uupdate utility and used that to create directory for new package and update debian/changelog, which is needed to produce new version:
cd <package>-<old-version>
uupdate ../<package>_<version>.orig.tar.gz
cd ../<package>-<version>
vim debian/changelog
UP7: To build source with pbuilder I need to generate .dsc file. It is usually done with debuild -S command, or with pdebuild -S in `pbuilder.
pdebuild -S
This errors out:
...
fakeroot debian/rules clean
dh clean --with autoreconf
dh: unable to load addon autoreconf: ..
BEGIN failed--compilation aborted at (eval 19) line 2.
make: *** [clean] Error 2
dpkg-buildpackage: error: fakeroot debian/rules clean gave error exit status 2
Looks like there is no autoreconf package, but pbiulder is supposed to fetch it automatically, and seems like it uses .dsc file to do so. catch22.
UPD8: The command to build .dsc file is dpkg-source.
cd ..
dpkg-source -b <package>-<version>
Now it is possible to run pbuilder over it.
sudo pbuilder build <package>_<version>.dsc
ls -la /var/cache/pbuilder/result/
UP9: Uploading to PPA is as simple as running:
dput ppa:techtonik/backports /var/cache/pbuilder/result/<package>_<version>.changes
But it doesn't work:
Checking signature on .changes
gpg: no valid OpenPGP data found.
gpg: the signature could not be verified.
...
No signature on /var/cache/pbuilder/result/<package>_<version>.changes
UP10: I don't remember how did I generated GPG key, but I have one. Found a way to sign the packages. Edited Maintaner: field in .dsc file and used debsign.
sudo vim /var/cache/pbuilder/result/<package>_<version>.dsc
sudo debsign /var/cache/pbuilder/result/<package>_<version>.changes
Attempt to upload failed:
Error: uploading files for distribution UNRELEASED to ppa not allowed.
UP11: Redone everything from step 6. How could I know that I need to edit debian/changes to replace UNRELEASED with saucy and set my email in Maintainer: field of debian/control?
vim <package>-<version>/debian/changelog
vim <package>-<version>/debian/control
dpkg-source -b <package>-<version>
sudo pbuilder build <package>_<version>.dsc
sudo debsign /var/cache/pbuilder/result/<package>_<version>.changes
sudo dput ppa:techtonik/backports /var/cache/pbuilder/result/<package>_<version>.changes
UPD12: I still can't upload to PPA. First it was Unable to find distroseries: unstable, because I specified unstable instead of saucy as UNRELEASED replacement. After repeated step 11 it complained with Already uploaded to ... which was healed with -f key to dput. Now there is a mail that upload is rejected, because Source/binary (i.e. mixed) uploads are not allowed.
Somewhere on the new it is said that I needed to build my package with debuild -S, but I don't know how to tell that to pbuilder.
UPD14: It appeared that the culprit is dh-autoreconf package, which is required for the cleaning source before the build, but both pbuilder and debuild miss this fact and unable to recover. Installing dh-autoreconf on the host system allowed to build source package, sign and upload it even without pbuilder build.
cd <package>-<version>
debuild -S
cd ..
dput ppa:techtonik/backports <package>_<version>_source.changes
Done.