/[gentoo]/xml/htdocs/proj/en/glep/glep-0055.txt
Gentoo

Diff of /xml/htdocs/proj/en/glep/glep-0055.txt

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.3 Revision 1.5
1GLEP: 55 1GLEP: 55
2Title: Use EAPI-suffixed ebuilds (.ebuild-EAPI) 2Title: Use EAPI-suffixed ebuilds (.ebuild-EAPI)
3Version: $Revision: 1.3 $ 3Version: $Revision: 1.5 $
4Last-Modified: $Date: 2009/05/17 15:50:27 $ 4Last-Modified: $Date: 2009/05/17 20:56:53 $
5Author: Piotr Jaroszyński <peper@gentoo.org> 5Author: Piotr Jaroszyński <peper@gentoo.org>
6Status: Draft 6Status: Draft
7Type: Standards Track 7Type: Standards Track
8Content-Type: text/x-rst 8Content-Type: text/x-rst
9Created: 17-Dec-2007 9Created: 17-Dec-2007
36 * Add new global scope functions in any sane way. 36 * Add new global scope functions in any sane way.
37 37
38 * Extend versioning rules in an EAPI - for example, addition of the scm 38 * Extend versioning rules in an EAPI - for example, addition of the scm
39 suffix - GLEP54 [#GLEP54]_ or allowing more sensible version formats like 39 suffix - GLEP54 [#GLEP54]_ or allowing more sensible version formats like
40 ``1-rc1``, ``1-alpha`` etc. to match upstream more closely. 40 ``1-rc1``, ``1-alpha`` etc. to match upstream more closely.
41
42 * Use newer bash features.
41 43
42 44
43Current behaviour 45Current behaviour
44================= 46=================
45 47
120 122
121 emerge: there are no ebuilds to satisfy "sys-apps/foo" 123 emerge: there are no ebuilds to satisfy "sys-apps/foo"
122 124
123Not the best error message, especially if there are lots of them. 125Not the best error message, especially if there are lots of them.
124 126
127Use newer bash features
128-----------------------
129
130``|&`` is a new type of redirection added in bash-4. It cannot be used even in
131local scope as bash still parses the whole ebuild.
132
133``sys-apps/foo-1.ebuild``::
134
135 EAPI="5"
136
137 foo() {
138 echo "foo" |& cat
139 }
140
141Result::
142
143 /var/lib/gentoo/repositories/peper/sys-apps/foo/foo-1.ebuild: line 8: syntax error near unexpected token `&'
144 /var/lib/gentoo/repositories/peper/sys-apps/foo/foo-1.ebuild: line 8: ` echo "foo" |& cat'
145 *
146 * ERROR: sys-apps/foo-1 failed.
147 * Call stack:
148 * ebuild.sh, line 1879: Called _source_ebuild
149 * ebuild.sh, line 1818: Called die
150 * The specific snippet of code:
151 * source "${EBUILD}" || die "error sourcing ebuild"
152 * The die message:
153 * error sourcing ebuild
154 *
155 * If you need support, post the topmost build error, and the call stack if relevant.
156 * This ebuild is from an overlay: '/var/lib/gentoo/repositories/peper/'
157 * ... done!
158
159 !!! All ebuilds that could satisfy "sys-apps/foo" have been masked.
160 !!! One of the following masked packages is required to complete your request:
161 - sys-apps/foo-1 (masked by: corruption)
162
163Again, not the best error.
164
125Abstract solution 165Abstract solution
126================= 166=================
127 167
128A solution to this problem has to lift those limitations and the only way to do 168A solution to this problem has to lift those limitations and the only way to do
129it is to make the EAPI of an ebuild available to the package managers in a way 169it is to make the EAPI of an ebuild available to the package managers in a way
175problems too. The first is the requirement to have strict EAPI ordering, the 215problems too. The first is the requirement to have strict EAPI ordering, the
176second is ensuring that all the ebuilds for a single category/package-version 216second is ensuring that all the ebuilds for a single category/package-version
177are equivalent, i.e. installing any of them has exactly the same effect on a 217are equivalent, i.e. installing any of them has exactly the same effect on a
178given system. 218given system.
179 219
220Also note that it is not a new restriction. It is already possible to illegally
221have multiple versions with different EAPIs as e.g. ``1.0 == 1.00 == 1.00-r0``
222and hence you could have ``foo-1.0.ebuild`` with EAPI X and ``foo-1.00.ebuild``
223with EAPI Y.
224
180Summary of ideas 225Summary of ideas
181================ 226================
182 227
183EAPI-suffixed ebuilds (proposed solution) 228EAPI-suffixed ebuilds (proposed solution)
184----------------------------------------- 229-----------------------------------------
216Performance decrease comes from the fact that with version format changes in the 261Performance decrease comes from the fact that with version format changes in the
217picture package managers need EAPI to parse the ebuild's version. That means that merely 262picture package managers need EAPI to parse the ebuild's version. That means that merely
218picking the best version of a package requires loading EAPI (from cache or the 263picking the best version of a package requires loading EAPI (from cache or the
219ebuild) for each available ebuild. 264ebuild) for each available ebuild.
220 265
266Here is more or less how the package manager figures out the best available
267version for a package with N versions available.
268
269 * EAPI in the filename
270
271 * Read the directory containing the package - readdir()
272 * For each ebuild, read its EAPI and using that parse its version - no I/O
273 * Sort the versions - no I/O
274 * Going down from the highest to the lowest version
275
276 * Get the metadata from cache - 2 x stat() + read()
277 * break if the version is visible
278
279 * EAPI in the ebuild
280
281 * Read the directory containing the package - readdir()
282 * For each ebuild load its metadata from cache to get its EAPI - N x (2 x stat() + read())
283 * Sort the versions - no I/O
284 * Going down from the highest to the lowest version
285
286 * (metadata is already loaded) - no I/O
287 * break if the version is visible - no I/O
288
289The difference is in for how many versions the package manager needs to hit
290cache. With EAPI in the ebuild it needs to do that for all versions, with EAPI
291in the filename it depends on versions visibility.
292For example, package foo has versions 1, 2, 3, 4, 5 and 6. 6 is masked, 5 is
293~arch and 1,2,3 and 4 are arch. Say, the user accepts only arch for this
294package. With EAPI in the filename it will read metadata only for versions
2956, 5 and 4. With EAPI in the ebuild it needs to load metadata for all versions.
296
297It's hard to say what's the avarage case, but surely the worst case scenario
298(when only the lowest version is visible) is uncommon.
221 299
222Easily fetchable EAPI inside the ebuild and one-time extension change 300Easily fetchable EAPI inside the ebuild and one-time extension change
223--------------------------------------------------------------------- 301---------------------------------------------------------------------
224 302
225Properties: 303Properties:

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.5

  ViewVC Help
Powered by ViewVC 1.1.20