1 |
On Mon, Sep 24, 2012 at 12:09:49AM +0200, Micha?? G??rny wrote: |
2 |
> Hello, |
3 |
> |
4 |
> Since my previous idea of DYNAMIC_SLOTS proved too complex to design |
5 |
> and implement, I would like to offer an another idea, based partially |
6 |
> on what Ciaran mentioned. Before I start getting into details, I'd like |
7 |
> to know your opinions, and what possible problems am I missing. To keep |
8 |
> it clean, I will focus on Python ABIs but other languages and multilib |
9 |
> could be handled in a similar manner. |
10 |
> |
11 |
> |
12 |
> The problem |
13 |
> =========== |
14 |
> |
15 |
> Right now, building packages for multiple Python ABIs is done using |
16 |
> USE_EXPAND-based useflags. This is a working solution but it requires |
17 |
> rebuilding the package for all ABIs whenever the chosen ABI list |
18 |
> changes. |
19 |
> |
20 |
> While it may be not that important for most of the Python packages, it |
21 |
> becomes such when it comes to things like boost or -- if we'd extend |
22 |
> that to multilib -- say, llvm. In that case, whenever a newly-installed |
23 |
> package requests a specific ABI, user has to spend twice as much time |
24 |
> to rebuild the same version. |
25 |
> |
26 |
> |
27 |
> The general idea |
28 |
> ================ |
29 |
> |
30 |
> While not getting too deep into ebuild syntax, the core part |
31 |
> of the idea is to mark some of the USE_EXPAND variables 'special'. |
32 |
> In this particular example, such a special flag group would be |
33 |
> 'PYTHON_TARGETS'. |
34 |
> |
35 |
> Now, let's consider user installs a new package with one |
36 |
> python_targets_python2_7 enabled. The package is built and installed |
37 |
> like usual but aside to regular vdb files an additional file |
38 |
> is introduced, listing all the installed files as 'belonging' |
39 |
> to python_targets_python2_7. |
40 |
> |
41 |
> If user enables python_targets_python3_2 on the same package, the PM |
42 |
> doesn't trigger a full rebuild. Instead, it builds the package with |
43 |
> the new flag being the only flag in PYTHON_TARGETS. The new files are |
44 |
> installed over the installed package (and added to CONTENTS in vdb), |
45 |
> and the files in install image are listed in vdb as 'belonging' |
46 |
> to python_targets_python3_2. |
47 |
|
48 |
What you're proposing would liter the ebuild/eclass with has_version |
49 |
checks; in brain dead simple cases, you can replace parts of the pkg |
50 |
as you're proposing there. |
51 |
|
52 |
However if it installs scripts, things start getting more complex; |
53 |
needs to vary how it installs if it's overlaying part of itself. |
54 |
|
55 |
This proposal also doesn't work in the phase of := slot deps either, |
56 |
not unless you've got a way to ensure, potentially weeks/months after |
57 |
the first build, that the node locks to the same slotting. |
58 |
|
59 |
|
60 |
> Whenever files from two ABIs collide, package manager either replaces |
61 |
> the installed files if the 'new' ABI is considered 'better' than |
62 |
> the old one or preserves it. This follows the current behavior when |
63 |
> multiple ABIs are built, and later builds overwrite files from earlier |
64 |
> ones. |
65 |
|
66 |
This is handwavey and kind of crackadled; the PM has no way of knowing |
67 |
which USE_EXPAND target is considered 'best', so in the case of |
68 |
multilib (say 64b and 32b subversion) there isn't any way to which svn |
69 |
binary should be there- 64b or 32b. Best I can tell, your proposal |
70 |
winds up just being "last one to merge wins" which isn't acceptable. |
71 |
|
72 |
|
73 |
> At the point, the additional file contains something like |
74 |
> (ugly pseudo-syntax): |
75 |
> |
76 |
> /usr/lib64/python2.7/foo.py python_targets_python2_7 |
77 |
> /usr/lib64/python3.2/foo.py python_targets_python3_2 |
78 |
> /usr/share/doc/foo-1.2.3/README.bz2 python_targets_python2_7 \ |
79 |
> python_targets_python3_2 |
80 |
> |
81 |
> Now, if user requests disabling python_targets_python2_7 |
82 |
> on the package, the package manager may not rebuild it as well. |
83 |
> Instead, it removes python_targets_python2_7 from the above list, |
84 |
> and unmerges the files which don't belong into any other ABI. |
85 |
|
86 |
If we're going to do sub-packaging... which is what you're attempting |
87 |
here... the VDB backend for it minimally cannot be a one off |
88 |
USE_EXPAND hack. That'll just back us into a corner- which the vdb |
89 |
already does quite heavily. |
90 |
|
91 |
Any subpackaging content tracking needs to be generic and usable. |
92 |
Really is that simple. |
93 |
|
94 |
|
95 |
> Sadly, this will not 'downgrade' common files to another ABI |
96 |
> but I believe that it is not really a killer-feature. |
97 |
> |
98 |
> |
99 |
> Installing new packages and upgrading existing |
100 |
> ============================================== |
101 |
> |
102 |
> Whenever a new package is to be built and multiple ABIs are requested, |
103 |
> the package manager should split the build process between particular |
104 |
> ABIs. Preferably, it should build all of them one-by-one, recording |
105 |
> the 'belongs' entries from the image and then install them as a single |
106 |
> package. |
107 |
|
108 |
And how does the package know that it's being targetted at multiple |
109 |
ABIs? |
110 |
|
111 |
Your proposal is built on the assumption ebuilds will happy overlay |
112 |
themselves in differing configurations w/out ever fucking up. |
113 |
|
114 |
That's not the case frankly, and worse... for the cases where it |
115 |
doesn't fly, your proposal basically requires the PM to hide the |
116 |
"we're building/installing your ass multiple times" information from |
117 |
the ebuild, further compounding the issue. |
118 |
|
119 |
|
120 |
> Whenever a package is to be upgraded, all ABIs have to rebuilt. |
121 |
> The package manager can handle it as a regular package upgrade, not |
122 |
> considering 'belongs' entries more than in a fresh package install. |
123 |
> |
124 |
> Whenever a package is removed completely, the 'belongs' entries need |
125 |
> not to be considered at all. |
126 |
> |
127 |
> |
128 |
> Backwards compatibility |
129 |
> ======================= |
130 |
> |
131 |
> The solution aims to be fully compatible with package managers |
132 |
> not supporting it. They should see it as a regular package with |
133 |
> selected useflags, and an additional opaque vdb file. |
134 |
> |
135 |
> When such a package manager attempts to rebuild or upgrade such |
136 |
> package, the vdb file should be removed, thus not introducing any |
137 |
> ambiguity for PMs supporting it. The package removal is unaffected |
138 |
> at all. |
139 |
|
140 |
*cough* you forgot about the saved environment. |
141 |
|
142 |
To run the pkg_postinst of an install pkg, you need to run it within |
143 |
that saved environment. That's hard law when it comes to ebuilds. |
144 |
|
145 |
You're proposing generating multiple environments, not addressing |
146 |
which is used. A rather *fatal* flaw there is the assumption that the |
147 |
ebuild/eclasses in the tree at the time of ABI #2 are going to be the |
148 |
same/compatible as what's in the tree at the time of ABI #1. That |
149 |
potential alone makes env handling fucktons worse. |
150 |
|
151 |
Just heading it off also, you cannot sanely slap together multiple env |
152 |
dumps and hope it works; minimally, the USE metadata, vars calculated |
153 |
from the run, etc, will collide and the last one to merge will be |
154 |
what's seen; whether that's right or wrong. |
155 |
|
156 |
|
157 |
Bluntly; this feels like an attempt to duct tape multilib on; |
158 |
Literally, I've spent ~5m reading this proposal, then inlining the |
159 |
faults I see and there are multiple semi-fatal issues in it. |
160 |
|
161 |
If you want to do multilib, aim for something that isn't a hack of |
162 |
existing PM behaviour; whatever we do has to work well, no insne edge |
163 |
cases, etc. |
164 |
|
165 |
Keep in mind were this to land, it's not a one off feature; it lands, |
166 |
it stays as a core part of the pm/format from that point forward |
167 |
meaning fuckups in it bite us in the ass long term. |
168 |
|
169 |
~harring |