1 |
On Fri, Sep 02, 2005 at 10:53:05AM +0200, Paul de Vrieze wrote: |
2 |
> On Friday 02 September 2005 08:04, Brian Harring wrote: |
3 |
> > |
4 |
> > Like I've said, EAPI is ebuild specific. Ebuild is a format; eapi |
5 |
> > defines revisions of it, in my mind a minor revision of the ebuild 1 |
6 |
> > format. Any form of loss of backwards compatability *should* be a |
7 |
> > different format, .ebuild2 for all I care. |
8 |
> |
9 |
> The new proposed format loses backwards compatibility. If there is |
10 |
> backwards compatibility no new format or api version is needed. EAPI |
11 |
> should work on the python level, not only on the ebuild.sh level. |
12 |
|
13 |
The two are utterly intertwined. |
14 |
|
15 |
Doesn't matter if portage thinks it's eapi 1 or 2, what matters is if the |
16 |
ebuild*sh env *creates* an eapi 1 or 2 env for execution. Python side |
17 |
just behaves a bit differently, ebuild*sh is where all of the actual |
18 |
execution occurs (and varies dependant on eapi). |
19 |
|
20 |
> > Trying to use EAPI to allow for N different formats into one format is |
21 |
> > wrong from where I sit; you would need a container format for it, |
22 |
> > which ebuild wasn't designed for (nor is it easily extensible to be |
23 |
> > made so I posit). |
24 |
> |
25 |
> No it would state that the eclass is 100% compatible with both by the |
26 |
> formats overlapping and the ebuild not threading outside the overlapped |
27 |
> area. |
28 |
|
29 |
And how is this going to work when it's more then just a split of a |
30 |
func? |
31 |
|
32 |
I'm not saying it can't be done, I'm saying it *shouldn't* be done. |
33 |
It's begging for screwups; relying on portage to pick and choose |
34 |
between eapi levels for an ebuild's execution env dependant on an |
35 |
eclass *requires* the ebuild to be fully compatible to those |
36 |
eapis, same for the eclass author. That's not so easy to do, and will |
37 |
lead to a buttload of case tests of EAPI, which isn't going to improve |
38 |
the code (imo). |
39 |
|
40 |
People aren't going to do it, is my opinion. It's unnecessarily |
41 |
complex with minimal gain; the gain being decreased due to the |
42 |
inherent complexity of |
43 |
A) pulling this off in portage |
44 |
B) comprehending *exactly* what portage will do in each case |
45 |
C) the ebuild/eclass author not only managing to get usage of *one* |
46 |
eapi correct, getting potentially N eapi's correct. |
47 |
D) eclasses that inherit eclasses requiring the same eapi |
48 |
compatability checks |
49 |
E) within two bodies of code, devs keeping seperated in their mind the |
50 |
differences between each eapi, and *never* blurring them. |
51 |
|
52 |
Note I'm not pulling the "everyone else is ignorant" crap that popped |
53 |
up on -dev ml; I'm stating that writing to an api is manual work, and |
54 |
people will screw up on it, just the same as in writing the |
55 |
implementation of that api, *we* will screw up on it. |
56 |
|
57 |
Bugs per line, it's unavoidable. Not advocating that we dumb |
58 |
everything down, advocating we don't add something that (assuming we |
59 |
get it right in implementation) is one hell of a pandora's box from |
60 |
the standpoint of complex ebuilds combined with complex eclasses. |
61 |
|
62 |
That's also not even getting into the fact that what you're proposing, |
63 |
effectively greping EAPI from the file is |
64 |
|
65 |
A) helluva lot slower on regen |
66 |
B) trying to turn ebuilds into a container format. They're not a |
67 |
container format, nor should they be (kitchen sink shouldn't be |
68 |
included). |
69 |
C) core's more then capable of supporting seperated formats; the |
70 |
'container' should be the repository, not jammed within the package |
71 |
data. |
72 |
D) It's a helluva lot easier, and less chance for screwup to just |
73 |
define a new format, use a new extension, and have the repository |
74 |
implementation use a different pkg format for that file. |
75 |
E) New, non eapi=1 style change with a different extension wouldn't |
76 |
even be *seen* by the noncompliant repositories. Helluva lot |
77 |
simpler. |
78 |
|
79 |
Not advocating we define a new format every day; I'm advocating that |
80 |
we define a format (v1), we do tweaks to it, and define a new |
81 |
*seperate* format when we need stuff that is beyond the keen of the |
82 |
existing format. Shifting away from declarative syntax, moving away |
83 |
from bash syntax, etc. If it isn't akin to our existing |
84 |
definition of an ebuild, it's not an ebuild and should *not* be jammed |
85 |
into the ebuild format. |
86 |
|
87 |
It's a new beast, and should be seperated. |
88 |
|
89 |
That's also ignoring the additional interaction of elibs thrown into |
90 |
the mix. If what you're suggesting is implemented, eclasses *and* |
91 |
ebuilds would be litered with |
92 |
|
93 |
if [ "$EAPI" == 2 ]; then |
94 |
eapi2 specific stuff |
95 |
elif [ "$EAPI" == 1]; then |
96 |
eapi1 specific stuff |
97 |
else |
98 |
general, all eapi stuff |
99 |
fi |
100 |
|
101 |
Note that the code above also has a nice hidden bug in it that's not |
102 |
obvious till you think about it; there is no way to predict at the |
103 |
time of the ebuilds writing that EAPI3 will work for the else block, |
104 |
yet logic structures of that sort *will* exist if you open up the N |
105 |
EAPI compatibility for an ebuild/eclass. Any bumping of the potential |
106 |
eapi's for an ebuild/eclass will expose it. |
107 |
|
108 |
That and I'd hope if it were ever implemented, devs would be using |
109 |
functions within the logic block; even with, any non-trivial bit of |
110 |
code is going to get nasty as it's littered with a hundred and one |
111 |
checks of eapi tweaking the flow ever so slightly. |
112 |
|
113 |
It's needlessly complex, and a recipe for disaster. |
114 |
|
115 |
|
116 |
> Take for an example many simple kde applications. Those use the kde |
117 |
> eclass to do all the work and only contain a skeleton of variables |
118 |
> themselves. These ebuilds are compatible with both the current as the |
119 |
> proposed new API. When marked so, they could be used as EAPI=1 as soon as |
120 |
> the kde eclass is ported to EAPI=1. Similarly many eclasses do not |
121 |
> provide src_compile, and as such are compatible with both EAPI versions. |
122 |
|
123 |
Lacking src_compile, they're compatible. They're also quite likely an |
124 |
elib, which is a different beast designed to address the fact that |
125 |
library code of eclasses (true library), should exist outside of the |
126 |
eclass. Eclasses are purely templates for ebuilds, a derived |
127 |
template/class from the base template, that an ebuild uses to avoid |
128 |
defining common chunks of code. |
129 |
|
130 |
Common code blocks, say what eutils/toolchain does are elibs (yes I |
131 |
know about the patch dep on eutils, ignore it for the sake of |
132 |
arguement). |
133 |
|
134 |
> > EAPI's original specification was for handling addition of new funcs, |
135 |
> > different hooks in the ebuild; I prefer it remain as this. The core |
136 |
> > rewrite is format agnostic, if a new format is defined (whether a |
137 |
> > massively managled version of ebuild or flat out new), it's a seperate |
138 |
> > format and should be handled via the core, not via ebuild specific |
139 |
> > package handling. |
140 |
> |
141 |
> EAPI now is going to be used for the above. It can however with very |
142 |
> little effort be made such that future ebuild format revisions are |
143 |
> possible. Also don't be mistaken that splitting out configure and make |
144 |
> stages do need support from the python part. |
145 |
|
146 |
Well aware of the complexities involved in keeping the python and bash |
147 |
side in sync; it's part of the reason I oppose what you're proposing. |
148 |
|
149 |
Change in terminology here btw; eapi (imo) has never been defined as a |
150 |
format revision, it's a change in the portage exported bash api, and |
151 |
how it potentially calls into the ebuild.sh api (addition of |
152 |
src_configure). |
153 |
|
154 |
People split off a new format (seperate extension fex) when they no |
155 |
longer can make changes to the api, where grand changes are required. |
156 |
EAPI isn't designed to address that; it's designed to address |
157 |
ebuilds/eclasses requiring new ebuild*sh functionality, addition of a |
158 |
new do* or change to # of phases called. |
159 |
|
160 |
eapi0 -> eapi1 is probably going to be the nastiest change over from |
161 |
where I sit; it's the transition from a totally unversioned ebuild*sh |
162 |
env to one that has saner handling. |
163 |
|
164 |
Total change over of ebuild format, as you're hinting at is not eapi's |
165 |
intention; that's covered by the core being format agnostic, and |
166 |
repository abstractions. |
167 |
|
168 |
|
169 |
> > There's no reason a repository can't hold multiple formats internally; |
170 |
> > the capability is there, use that rather then trying to jam too much |
171 |
> > into EAPI, imo at least. |
172 |
> |
173 |
> How would you suggest to do this then. The ebuilds/eclasses are completely |
174 |
> the same except for their EAPI definition. They also have the same |
175 |
> (file)name. And that is not counting the fact that two files containing |
176 |
> the same is bad design as there will allways be an issue of one file |
177 |
> being updated and the other not. |
178 |
|
179 |
I'm saying we stick with what already occurs in the tree; eclass |
180 |
functionality is either prototyped outside of the tree, and |
181 |
introduced, or an ebuild has the eclass functionality prototyped |
182 |
within it, and that code migrated to the eclass. |
183 |
|
184 |
For example- I've got kde eclass that's eapi0, and want to migrate to |
185 |
eapi1. I break the kde eclass up so it's eapi1 compatible (at the |
186 |
func level), but with the exported src_compile eapi0 so I don't break |
187 |
the existance ebuilds. |
188 |
|
189 |
I then add a shim eclass that *is* eapi1 (calling the chunked kde |
190 |
internals), and migrate pkgs gradually over to it. Once it's fully in |
191 |
use, convert the underlying kde eclass to eapi1 (move the shim code |
192 |
in), leave the shim as indirection, and remove the shim from the |
193 |
testing ebuilds. |
194 |
|
195 |
Or. |
196 |
|
197 |
I want to migrate my kde eclass to eapi1. Like any eclass change, I |
198 |
find what would be affected. I break the kde eclass into eapi1 |
199 |
compatible chunks (seperated configure and compile), with a eapi0 |
200 |
src_compile that calls both. |
201 |
|
202 |
I then go and clean up the ebuilds that override src_compile, and |
203 |
convert them over to the new funcs in the eclass (bumping the ebuild's |
204 |
eapi in the process). Once they're addressed, all that remains is the |
205 |
ebuilds that use the eclasses exported src_compile; remove the eapi0 |
206 |
src_compile shim in the eclass, and set EAPI=1 within the eclass. All |
207 |
ebuilds that rely on the eclass to define eapi and the majority of |
208 |
their code (those that didn't required modification), are now eapi1, |
209 |
as is the eclass. |
210 |
|
211 |
Heading off the "make the eclass eapi 0 and 1 compliant with portage |
212 |
choosing between them", what I'm stating is that the eclass and ebuilds |
213 |
authors do it, they be explicit and manage the conversion themselves |
214 |
(if they see the need to bump to eapiN). |
215 |
They can manage the code and keep it sane, rather then trying to ifdef |
216 |
N different eapis and hoping portage doesn't screw up (it will screw |
217 |
up invariably, as will they in both my solution and yours). |
218 |
|
219 |
Mine just is simpler, from where I sit, less chance of screwups beyond |
220 |
usual bonehead mistakes people always make. |
221 |
|
222 |
Either solution expects ebuild/eclass devs to get it right; having |
223 |
portage somehow swivel the eclass so that it's exported api/env is of |
224 |
a certain eapi expects the devs to have that code working properly, |
225 |
and for a *perfect* implementation that can do this without screwup. |
226 |
|
227 |
It's not realistic, frankly. |
228 |
~harring |