This is report three for the "Bootstrappable Debian" project [1][2] mentored by Wookey and co-mentored by Jonathan Austin.
Copies of this report are sent to the debian-bootstrap [3] and debian-embedded lists. [1]: http://wiki.debian.org/SummerOfCode2012/Projects#Bootstrappable_Debian [2]: http://wiki.debian.org/SummerOfCode2012/StudentApplications/PJMcDermott [3]: http://lists.mister-muffin.de/cgi-bin/mailman/listinfo/debian-bootstrap Work Done ========= Staged Build Support in dpkg-dev -------------------------------- Working to support "Build-Depends-StageN" fields for any value of "N" in dpkg-dev, I added %FIELDS_RE, field_exists(), and field_get() to Dpkg::Control::Fields and started changing the module's subroutines to use the new additions [5]. Then I realized that the field names are used in other modules and in scripts, e.g. to match fields in dpkg-gencontrol. I took some notes [6] on these uses of %FIELDS but didn't get farther than dpkg-gencontrol. [5]: http://bootstrap.pehjota.net/dpkg/dpkg-fields-re.patch [6]: http://bootstrap.pehjota.net/dpkg/dpkg-fields-usage.txt Perl Cross Building Support --------------------------- I've been investigating what needs done to refresh the src:perl cross building patch that Steve McIntyre proposed in bug #633884 [7] so that it applies to the newer versions of src:perl in sid and experimental. I looked at the differences [8] between the 5.12.4-1 package, the 5.14.2-11 package, the 5.16.0-1 package, and the patch that Steve posted. I found that refreshing the Debian packaging part of the patch will be trivial. Refreshing the upstream build system part, however, will be much more involved. Between versions of Perl there are several hundreds of lines of changes to the build system (which is generated using the "metaconfig" tool in the long-unmaintained "dist" package [9], then changed/fixed by hand because "metaconfig is hard to change" [10]). [7]: http://bugs.debian.org/633884 [8]: http://bootstrap.pehjota.net/cross/pkgs/perl/diff-notes.txt [9]: http://anonscm.debian.org/gitweb/?p=users/srivasta/debian/dist.git [10]: http://perl5.git.perl.org/perl.git/blob/c3143508:/Porting/pumpkin.pod#l311 New Domain and Package Archive ------------------------------ In an effort to better organize my published work on this project, I set up a new domain, bootstrap.pehjota.net, and copied many of my files into the new document root [11]. Old hyperlinks will continue to work, but I am no longer pushing files into my personal home directory on my server. I also set up a package archive [12] using reprepro to serve all the source and binary packages that I produce throughout this project. Currently there are two components in this archive: * main: This component provides support packages for things like cross building. (See below for more information.) * cross: This component provides base build system and loop-breaking packages that have been cross built. In cases where a package has to be modified to successfully cross build, a source package is provided. (See below for more information.) [11]: http://bootstrap.pehjota.net/ [12]: http://bootstrap.pehjota.net/archive/ Support Packages for Cross Building ----------------------------------- I noticed [13] that sbuild (>= 0.63.0) installs packages necessary for cross building through a package named "crossbuild-essential-<target>". However, this package does not yet exist in the Debian archive. So, I forked src:build-essential into a new source package named "cross-build-essential" [14][15] that builds arch:all packages named "crossbuild-essential-<target>". Once Thibaut Girka's multiarch cross toolchains move into the Debian archive, src:build-essential and src:cross-build-essential can be merged back together [16] and the Debian archive can provide packages that list and depend upon packages that are necessary for cross building. I also noticed that the sbuild source code lists pkg-config-<triplet> (also not in Debian) as an essential package for cross building. Wookey explained that this package is supposed to simply provide a link at /usr/bin/<triplet>-pkg-config to /usr/share/pkg-config-crosswrapper. After finishing src:cross-build-essential, I made from scratch a src:pkg-config-cross package [17][18] that builds arch:all packages named "pkg-config-<triplet>". Finally, I realized that we'll need gcc-<triplet>, cpp-<triplet>, g++-<triplet>, etc. binary packages that depend on and provide symbolic links to default versions of cross tools built from GCC sources. These packages would be similar to the gcc, cpp, g++, etc. packages built from src:gcc-defaults. Working around the lack of such packages is easy enough, so I just noted [19] this as an item to be done eventually. The discussion continued between the debian-bootstrap and debian-embedded [20] lists with update-alternatives offered as an alternative to default version metapackages. [13]: http://lists.mister-muffin.de/pipermail/debian-bootstrap/2012-June/000224.html [14]: http://bootstrap.pehjota.net/build-essential/ [15]: http://bootstrap.pehjota.net/archive/pool/main/c/cross-build-essential/ [16]: http://lists.mister-muffin.de/pipermail/debian-bootstrap/2012-June/000231.html [17]: http://bootstrap.pehjota.net/pkg-config/ [18]: http://bootstrap.pehjota.net/archive/pool/main/p/pkg-config-cross/ [19]: http://lists.mister-muffin.de/pipermail/debian-bootstrap/2012-July/000248.html [20]: https://lists.debian.org/debian-embedded/2012/07/msg00000.html sbuild Chroot for Cross Building -------------------------------- On my wheezy amd64 system I set up a sid i386 chroot with sbuild/schroot and installed in it Thibaut's multiarch cross toolchain packages and my cross building support packages. I experienced a couple of rather significant setbacks in this vain. First, when I tried to install a C cross compiler, APT in its default configuration tried to remove the build-essential, cpp, g++, and gcc metapackages, all of which are necessary for building anything with sbuild. I traced the problem to libc6-dev:armhf and its Recommends relationship with gcc. Configuring APT to not install recommended packages solved this issue. Second, Thibaut's g++-4.7-<target> packages can't be installed until bug #678623 [21] against libstdc++6-4.7-dev is resolved; in the meantime, I used equivs to generate a fake g++-4.7-arm-linux-gnueabihf package [22] to satisfy the dependency of my crossbuild-essential-armhf package. I documented [23][24] the whole setup procedure for my own reference and in case it is of interest to anyone else. Eventually, this information should be added to the Debian Wiki. [21]: http://bugs.debian.org/678623 [22]: http://bootstrap.pehjota.net/cross/g++-4.7-arm-linux-gnueabihf.ctl [23]: http://bootstrap.pehjota.net/cross/sbuild-setup.txt [24]: http://bootstrap.pehjota.net/cross/sbuild-setup.html Base Build System Cross Building -------------------------------- With cross building support packages built and a cross-building chroot setup, I've finally begun to attempt to cross build the packages that comprise a base system that is capable of natively building other packages. I started with a fairly simple arch:any package: src:base-files. This package cross built successfully [25][26] as it was. Then I moved on to a simple package that used a compiler: src:dash. This package initially failed [27] to cross build because it executed "strip" instead of "<triplet>-strip" when cross building. So I patched [28] the source package and built binaries [29][30] for armhf. Finally, I found a report of this problem [31] submitted by Marcin Juszkiewicz, followed up on it, and categorized it with the cross build usertag [32]. See also the armhf Packages file [33] in my archive that describes my cross-built packages. Overall, src:base-files and src:dash have been good proof-of-concept packages to test my cross building chroot and to help me adjust to the cross building, patching, and bug reporting workflow. Finally, I've begun development of a (not yet published) shell script in an attempt to partially automate and speed up my workflow of: * Downloading a Debian source package, * Editing it if necessary, * Building it with sbuild, and * Pushing my work to my server. I don't except the script to be very useful beyond this project and my own cross building workflow, as it's not designed for an automated bootstrap (rather it's designed for one in which many packages need to be fixed manually). But its use can be scripted, so it may be of interest someday for at least semi-automated cross building. [25]: http://bootstrap.pehjota.net/cross/builds/base-files/base-files_6.11_armhf-20120701-1535.build [26]: http://bootstrap.pehjota.net/archive/pool/cross/b/base-files/ [27]: http://bootstrap.pehjota.net/cross/builds/dash/dash_0.5.7-3_armhf-20120701-2018.build [28]: http://bootstrap.pehjota.net/cross/pkgs/dash/dash-cross.debdiff [29]: http://bootstrap.pehjota.net/cross/builds/dash/dash_0.5.7-3.1_armhf-20120701-2131.build [30]: http://bootstrap.pehjota.net/archive/pool/cross/d/dash/ [31]: http://bugs.debian.org/665971 [32]: http://bugs.debian.org/cgi-bin/[email protected]&tag=cross [33]: http://bootstrap.pehjota.net/archive/dists/sid/cross/binary-armhf/Packages Next Steps ========== Perl Cross Building Support --------------------------- I will continue to investigate Perl's build system in my efforts to refresh the existing cross building patch to apply to the newer versions of src:perl. Base Build System Cross Building -------------------------------- I will attempt to cross build the rest of the base build system packages and try to fix packages that don't yet cross build. This is the first major component of a full architecture bootstrap. Also, I plan to spend another day or two finishing the aforementioned workflow automation script. It should make my cross building work a little more efficient and deterministic. I should have it published sometime within the next few days; mostly I just need to figure out where I want to put it – e.g. in a Git repository accessible through odin1.pehjota.net and/or on Gitorious. -- P. J. McDermott (_/@\_) ,--. http://www.pehjota.net/ o < o o > / oo \ http://www.pehjota.net/contact.html o \ `-/ | <> |. o o o "~v /_\--/_/ -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

