DRAFT: Fixing the architecture query options of dpkg.
[ note that this is CC to debian-devel, because it originated there. follow
up's to debian-policy(?) ]
DRAFT: Fixing the architecture query options of dpkg, Version 0.1
Abstract: I hope that we can make it easier and clearer how different
architectures can be supported in one rules file, even beyond Linux.
Furthermore, we gain the possibilty for cross compilation support in rules
files almost "for free".
Terms (skip them if you are lazy, and come back for special terms):
Debian Installation Architecture (short: Debian Arch)
Is used to organize the ftp archive and sepereates the individual
ports. Can be one of i386,alpha,sparc,...,hurd-i386.
GNU System Type
Is used to determine the exact specifications of a machine for
software compiling. It consists of two (in general three) parts, the
cpu, (an optional vendor tag) and a operating system specification,
seperated by hyphens. For example, i386-linux would describe the Debian
Arch i386, i386-gnu the Debian port hurd-i386.
The cpu part of a GNU System Type.
Valid are i386,alpha,sparc,...
The OS part of a GNU System Type.
Valid are linux and gnu.
Build System, Host System
The machine a package is build on (is a GNU System Type or a Debian Arch,
depending on context).
The machine a package will be installed and run on (is a GNU System Type
or a Debian Arch, depending on context).
If the Target System and the Build System are different, we are doing
Returns the Debian Arch of the host system, that means the machine dpkg is
running on. A package can be installed on the host system if the Debian
Arch of the package matches this string.
As I was told, this is the Debian Arch of the target machine.
Returns the GNU Arch of the host system.
We see that there is neither a clear seperation of OS type (gnu or linux),
nor a clear seperation between target and build system type. My experiences
in the hurd-i386 port verify that a lot of changes are necessary to allow
cross compilation of a package, including removing/replacing hard coded
GNU OS strings like "-linux", and using the Debian Arch as GNU Arch.
This proposal aims at a clearer distinction between the different cases
and the necessary infrastructure in dpkg.
Furthermore, the --print-architecture option is troublesome. First, it does
not tell what it does from the name, so the name was choosen unlucky.
Furthermore, and this is the real problem, it returns a Debian Arch and not
a GNU System arch. Up until now, this was not a real issue, because you
could always get the GNU System by adding "-linux" to the Debian Arch. This
is not true anymore since Debian GNU/Hurd popped up into existence.
Hardcoding these mappings in the individual packages is also bad design, but
was necessary until now because dpkg lacks options.
I therefore propose the use of the following set of options:
Stays the same. (Later, we can make it returning a _list_ of installable
Debian Archs. This is for systems which support multiple Debian ports, like
sparc64 (supporting sparc) and pentium (supporting i386), or even hurd-i386
(supporting i386 with Linux binary compatibility)
Returns the target Debian Arch for package building. Normally, this would
be the same as "--print-installation-architecture" (default), but for
cross compilation, you could change dpkg (for example by diversion) to
return a different Debian Arch.
Returns the GNU Arch of the host=build system.
Returns the GNU OS of the host=build system.
Returns the GNU Arch of the target system we build for. Per default, this
is the same as --print-gnu-build-architecture, but can be changed for cross
Returns the GNU OS of the target system we build for. Per default, it is
the same as --print-gnu-build-os, but can be changed for cross compilation.
Note that, if ARCH is the output of --print-gnu-build-architecture and OS
the output of --print-gnu-build-os, you get a valid GNU System Type by
cat'ing them together with a hyphen, eg $(ARCH)-$(OS), which can be passed
directly to configure. Hence, a good alternative would be to provide just
two options, --print-gnu-build-system and --print-gnu-target-system, which
returns the complete string directly. A single --print-gnu-build-architecture
could be provided for backward compatibility, too.
For backward compatibility:
Should do whatever it does now. Maybe an alias for
Rationals, consequences etc
The changes that are needed would be minimal. Adding the options to dpkg,
and changing the building scripts in dpkg-dev to use
--print-target-installation-architecture instead --print-architecture
would suffice. No further changes are _required_.
Package rules files would be changed to support cross compilation over time,
the existing scripts will continue to work in the same way they do now, and
can only improve. I don't think this should be enforced (as not every
packager knows about cross compiling facilities, and some packages really
can't be cross compiled easily), but porters should submit patches and the
maintainers should consider the patches and incorporate them into the rules
files (the idea is that we have lots of time to make the transition).
Backward compatibilty: All old options continue to output what they output
now. If maintainers are concerned about using the new options in their
packaging scripts, they can catch dpkg's exit code and fall back to a
sensible default value.
If dpkg doesn't understand... use instead...
This way, no existing functionality is lost, and new rules files will
continue to work with old versions of dpkg and friends!
My proposal offers a clean seperation of Debian and GNU naming convention
and of build and target architectures. I would volunteer to write the
necessary changes for dpkg and friends, and I will also send in patches for
maintainers of packages to support the new features.
Common cases of current incompatibilities which would be resolved:
* Using $(ARCH)-linux in their packaging script.
* Using ARCH = --print-gnu-build-target and then using the very same string
as Debian Arch name (which breakes if the OS is not linux, but hurd)
Special things were I would appreciate input
What exactly was the original meaning of "--print-architecture", and how
does it fit in my new scheme? In my new scheme, it is obsolete, mainly
because I don't know for certain what it does (I know it is used by package
building scripts to determine the Debian Arch,but it is also used randomly
in other places).
Should we go the way of seperate gnu-*-architecture and gnu-*-os query options, or
should we use gnu-*-system options which combine both? The individual
components are seldom needed, and can easily be extracted from the
gnu-*-system string. This would make the proposal a bit easier, as we only
would have three new options, and not four (and two obsolete options for
backward compatibilty, instead one).
If you want an example, I could for example rewrite the bash rules files to
follow my new setup, and you can look at the difference. Just let me know if
my words were not descriptive enough for you (one example says more than
thousands words, but this mail is really long enough, so I will wait for
your suggestions and requests).
I hope you realize that I don't want unnecessary complication of the
packaging tools. I think my proposal will make it easier to write rules
files that support all architectures, and, this issue has to be resolved in
one way or another. The alternative would be to hard code the translation of
hurd-i386 -> i386-gnu in each rules file, which would be very ugly!
If no one has serious concerns, I will make this an official proposal, soon.
For now, I just want to gather some more information. For the official
proposal, I will have to dig out the relevant sections in our policy and
provide replacement text.
"Rhubarb is no Egyptian god." Debian GNU/Linux finger brinkmd@
Marcus Brinkmann http://www.debian.org master.debian.org
Marcus.Brinkmann@ruhr-uni-bochum.de for public PGP Key
http://homepage.ruhr-uni-bochum.de/Marcus.Brinkmann/ PGP Key ID 36E7CD09