Gentoo Archives: gentoo-dev

From: Brian Harring <ferringb@×××××.com>
To: gentoo-dev@l.g.o
Subject: Re: [gentoo-dev] [RFC] Multiple ABI support through package appending/partial removal
Date: Tue, 25 Sep 2012 20:14:08
Message-Id: 20120925201256.GB26094@localhost
In Reply to: [gentoo-dev] [RFC] Multiple ABI support through package appending/partial removal by "Michał Górny"
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

Replies