]>
Commit | Line | Data |
---|---|---|
9a230738 DK |
1 | Before we start with this topic: Note that MultiArch is not yet ready for |
2 | prime time and/or for the casual user. The implementation is so far widely | |
3 | untested and only useful for developers of packagemanagment tools which | |
4 | use APT and his friends and maintainers of (upcoming) MultiArch packages. | |
5 | This README is especially NOT written for the casual user and is NOT a | |
6 | usage guide - you have been warned. It is assumed that the reader has | |
7 | at least a bit of knowledge about APT internals, dependency relations | |
8 | and the MultiArch spec [0]. | |
9 | ||
10 | ||
11 | The implementation is focused on NOT breaking existing singleArch-only | |
12 | applications and/or systems as this is the current status-quo for all | |
13 | systems. Also, many systems don't need (or can't make use of) MultiArch, | |
14 | so APT will proceed in thinking SingleArch as long as it is not explicitly | |
15 | told to handle MultiArch: | |
16 | To activate MultiArch handling you need to specify architectures you | |
17 | want to be considered by APT with the config list APT::Architectures | |
18 | (Insert architectures in order of preference). | |
19 | APT will download Packages files for all these architectures in the | |
20 | update step. Exception: In the sourcelist is the optionfield used: | |
21 | deb [ arch=amd64,i386 ] http://example.org/ experimental main | |
22 | (This optionfield is a NOP in previous apt versions) | |
23 | ||
24 | Internally in APT a package is represented as a PkgIterator - | |
25 | before MultiArch this PkgIterator was architecture unaware, | |
26 | only VerIterators include the architecture they came from. | |
27 | This is/was a big problem as all versions in a package are | |
28 | considered for dependency resolution, so pinning will not work in all cases. | |
29 | ||
30 | The problem is solved by a conceptional change: | |
31 | A PkgIterator is now architecture aware, so the packages | |
32 | of foobar for amd64 and for i386 are now for apt internal totally | |
33 | different packages. That is a good thing for e.g. pinning, but | |
34 | sometimes you need the information that such packages are belonging together: | |
35 | All these foobar packages therefore form a Group accessible with GrpIterators. | |
36 | Note that the GrpIterator has the same name as all the packages in this group, | |
37 | so e.g. apt-cache pkgnames iterates over GrpIterator to get the package names: | |
38 | This is compatible to SingleArch as a Group consists only of a single package | |
39 | and also to MultiArch as a Group consists of possible many packages which | |
40 | all have the same name and are therefore out of interest for pkgnames. | |
41 | ||
42 | ||
43 | Caused by the paragraph "Dependencies involving Architecture: all packages" | |
44 | in the MultiArch spec we have a second major conceptional change | |
45 | which could even break existing applications, but we hope for the best… | |
46 | An Architecture: all package is internally split into pseudo packages | |
47 | for all MultiArch Architectures and additional a package with the | |
48 | architecture "all" with no dependencies which is a dependency of all | |
49 | these architecture depending packages. While the architecture depending | |
50 | packages are mainly used for dependency resolution (a package of arch A which | |
51 | depends on an arch all package assumes that the dependencies of this package | |
52 | are also from arch A. Packages also sometimes change from any to all or v.v.) | |
53 | the arch "all" package is used for scheduling download/installation of the | |
54 | underlying "real" package. Note that the architecture depending packages can | |
55 | be detected with Pseudo() while the "all" package reports exactly this arch | |
56 | as package architecture and as pseudo architecture of the versions of this pkg. | |
57 | Beware: All versions of a "real" architecture all package will be report "all" | |
58 | as their architecture if asked with Arch() regardless if they are the "all" or | |
59 | the architecture depending packages. If you want to know the architecture this | |
60 | pseudo package was created for call Arch(true). Also, while the spec say that | |
61 | arch:all packages are not allowed to have a MultiArch flag APT assigns a | |
62 | special value to them: MultiArch: all. | |
63 | ||
64 | ||
65 | As you might guess this arch:all handling has a few problems (but we think so | |
66 | far that the problems are minor compared to the problems we would have with | |
67 | other implementations.) | |
68 | APT doesn't know which pseudo packages of such an arch all package are | |
69 | "installed" (to satisfy dependencies), so APT will generate a Cache in which | |
70 | all these pseudo packages are installed (e.g. apt-cache policy will display | |
71 | them all as installed). Later in the DepCache step it will "remove" | |
72 | all pseudo packages whose dependencies are not satisfied. | |
73 | The expense is that if the package state is broken APT could come to the | |
74 | conclusion to "remove" too many pseudo packages, but in a stable environment | |
75 | APT should never end up in a broken system state… | |
76 | ||
77 | ||
78 | Given all these internal changes it is quite interesting that the actual | |
79 | implementation of MultiArch is trivial: Some implicit dependencies and a few | |
80 | more provides are all changes needed to get it working. Especially noteworthy | |
81 | is that it wasn't needed to change the resolver in any way and other parts only | |
82 | need to be told about ignoring pseudo packages or using GrpIterator instead of | |
83 | PkgIterator, so chances are good that libapt-applications will proceed to work | |
84 | without or at least only require minor changes, but your mileage may vary… | |
85 | ||
86 | ||
87 | Known Issues and/or noteworthy stuff: | |
88 | * The implementation is mostly untested, so it is very likely that APT will | |
89 | eat your kids if you aren't as lucky as the author of these patches. | |
90 | * the (install)size of a pseudo package is always NULL - if you want to know | |
91 | the (install)size you need to get the info from the arch "all" package. | |
92 | * It is maybe confusing, but the arch "all" package does have the same versions | |
93 | and in general roughly the same information with one subtil difference: | |
94 | It doesn't have any dependency, regardless of the type. The pseudo packages | |
95 | depend on this package. | |
96 | * apt-cache policy foobar on installed architecture all package foobar will | |
97 | report all architecture depending packages as installed. Displaying here the | |
98 | correct information would require to build the complete DepCache… | |
99 | * [BUG] An installed package which changes the architecture from any to all | |
100 | (and v.v.) shows up in the NEW packages section instead of UPGRADE. | |
101 | * [TODO] Investigate the DepCache pseudo-package killer heuristic: | |
102 | e.g. add more safety guards… | |
103 | * [FIXME] a few corner cases/missing features marked as FIXME in the code | |
104 | ||
105 | ||
106 | [0] https://wiki.ubuntu.com/MultiarchSpec |