
2 changed files with 108 additions and 1 deletions
@ -0,0 +1,106 @@ |
|||
Before we start with this topic: Note that MultiArch is not yet ready for |
|||
prime time and/or for the casual user. The implementation is so far widely |
|||
untested and only useful for developers of packagemanagment tools which |
|||
use APT and his friends and maintainers of (upcoming) MultiArch packages. |
|||
This README is especially NOT written for the casual user and is NOT a |
|||
usage guide - you have been warned. It is assumed that the reader has |
|||
at least a bit of knowledge about APT internals, dependency relations |
|||
and the MultiArch spec [0]. |
|||
|
|||
|
|||
The implementation is focused on NOT breaking existing singleArch-only |
|||
applications and/or systems as this is the current status-quo for all |
|||
systems. Also, many systems don't need (or can't make use of) MultiArch, |
|||
so APT will proceed in thinking SingleArch as long as it is not explicitly |
|||
told to handle MultiArch: |
|||
To activate MultiArch handling you need to specify architectures you |
|||
want to be considered by APT with the config list APT::Architectures |
|||
(Insert architectures in order of preference). |
|||
APT will download Packages files for all these architectures in the |
|||
update step. Exception: In the sourcelist is the optionfield used: |
|||
deb [ arch=amd64,i386 ] http://example.org/ experimental main |
|||
(This optionfield is a NOP in previous apt versions) |
|||
|
|||
Internally in APT a package is represented as a PkgIterator - |
|||
before MultiArch this PkgIterator was architecture unaware, |
|||
only VerIterators include the architecture they came from. |
|||
This is/was a big problem as all versions in a package are |
|||
considered for dependency resolution, so pinning will not work in all cases. |
|||
|
|||
The problem is solved by a conceptional change: |
|||
A PkgIterator is now architecture aware, so the packages |
|||
of foobar for amd64 and for i386 are now for apt internal totally |
|||
different packages. That is a good thing for e.g. pinning, but |
|||
sometimes you need the information that such packages are belonging together: |
|||
All these foobar packages therefore form a Group accessible with GrpIterators. |
|||
Note that the GrpIterator has the same name as all the packages in this group, |
|||
so e.g. apt-cache pkgnames iterates over GrpIterator to get the package names: |
|||
This is compatible to SingleArch as a Group consists only of a single package |
|||
and also to MultiArch as a Group consists of possible many packages which |
|||
all have the same name and are therefore out of interest for pkgnames. |
|||
|
|||
|
|||
Caused by the paragraph "Dependencies involving Architecture: all packages" |
|||
in the MultiArch spec we have a second major conceptional change |
|||
which could even break existing applications, but we hope for the best… |
|||
An Architecture: all package is internally split into pseudo packages |
|||
for all MultiArch Architectures and additional a package with the |
|||
architecture "all" with no dependencies which is a dependency of all |
|||
these architecture depending packages. While the architecture depending |
|||
packages are mainly used for dependency resolution (a package of arch A which |
|||
depends on an arch all package assumes that the dependencies of this package |
|||
are also from arch A. Packages also sometimes change from any to all or v.v.) |
|||
the arch "all" package is used for scheduling download/installation of the |
|||
underlying "real" package. Note that the architecture depending packages can |
|||
be detected with Pseudo() while the "all" package reports exactly this arch |
|||
as package architecture and as pseudo architecture of the versions of this pkg. |
|||
Beware: All versions of a "real" architecture all package will be report "all" |
|||
as their architecture if asked with Arch() regardless if they are the "all" or |
|||
the architecture depending packages. If you want to know the architecture this |
|||
pseudo package was created for call Arch(true). Also, while the spec say that |
|||
arch:all packages are not allowed to have a MultiArch flag APT assigns a |
|||
special value to them: MultiArch: all. |
|||
|
|||
|
|||
As you might guess this arch:all handling has a few problems (but we think so |
|||
far that the problems are minor compared to the problems we would have with |
|||
other implementations.) |
|||
APT doesn't know which pseudo packages of such an arch all package are |
|||
"installed" (to satisfy dependencies), so APT will generate a Cache in which |
|||
all these pseudo packages are installed (e.g. apt-cache policy will display |
|||
them all as installed). Later in the DepCache step it will "remove" |
|||
all pseudo packages whose dependencies are not satisfied. |
|||
The expense is that if the package state is broken APT could come to the |
|||
conclusion to "remove" too many pseudo packages, but in a stable environment |
|||
APT should never end up in a broken system state… |
|||
|
|||
|
|||
Given all these internal changes it is quite interesting that the actual |
|||
implementation of MultiArch is trivial: Some implicit dependencies and a few |
|||
more provides are all changes needed to get it working. Especially noteworthy |
|||
is that it wasn't needed to change the resolver in any way and other parts only |
|||
need to be told about ignoring pseudo packages or using GrpIterator instead of |
|||
PkgIterator, so chances are good that libapt-applications will proceed to work |
|||
without or at least only require minor changes, but your mileage may vary… |
|||
|
|||
|
|||
Known Issues and/or noteworthy stuff: |
|||
* The implementation is mostly untested, so it is very likely that APT will |
|||
eat your kids if you aren't as lucky as the author of these patches. |
|||
* the (install)size of a pseudo package is always NULL - if you want to know |
|||
the (install)size you need to get the info from the arch "all" package. |
|||
* It is maybe confusing, but the arch "all" package does have the same versions |
|||
and in general roughly the same information with one subtil difference: |
|||
It doesn't have any dependency, regardless of the type. The pseudo packages |
|||
depend on this package. |
|||
* apt-cache policy foobar on installed architecture all package foobar will |
|||
report all architecture depending packages as installed. Displaying here the |
|||
correct information would require to build the complete DepCache… |
|||
* [BUG] An installed package which changes the architecture from any to all |
|||
(and v.v.) shows up in the NEW packages section instead of UPGRADE. |
|||
* [TODO] Investigate the DepCache pseudo-package killer heuristic: |
|||
e.g. add more safety guards… |
|||
* [FIXME] a few corner cases/missing features marked as FIXME in the code |
|||
|
|||
|
|||
[0] https://wiki.ubuntu.com/MultiarchSpec |
@ -1 +1,2 @@ |
|||
README.progress-reporting |
|||
README.progress-reporting |
|||
README.MultiArch |
|||
|
Loading…
Reference in new issue