On Mon, 19 Oct 2015 08:38:49 -0400
Rich Freeman <ri...@gentoo.org> wrote:

> On Mon, Oct 19, 2015 at 3:12 AM, Alexis Ballier <aball...@gentoo.org>
> wrote:
> > But there is something important we've overlooked: should eclasses
> > that export src_prepare call eapply_user ? I think yes, otherwise
> > they'd make packages inheriting them violate the 'at least once
> > rule'.  
> 
> This sort of thing has been discussed by the council, though we didn't
> make a specific recommendation on the eclass authoring side.  The
> exactly once language was specifically chosen to force eclass/ebuild
> authors to consider this problem, because bad things happen if you
> don't.
> 
> I'd argue that eclasses should fall into two categories:
> 1.  Utility eclasses.  These are things like git.eclass that export
> useful functions that ebuilds can call.  They shouldn't export phase
> functions, so ebuild authors can use as many of these as they want and
> they'll never conflict.
> 2.  Do-everything eclasses.  These are things like the kde eclasses
> which operate with the design that the packages themselves do almost
> nothing, and all the work is in the eclass.  It allows things like
> splitting up kde ebuilds without having a ton of duplicated code in
> hundreds of packages.  These should export phase functions, and you
> tend to run into all kinds of problems if you try to use more than one
> of them, so you shouldn't.
> 
> So, if you're writing a utility eclass you shouldn't be exporting
> src_prepare, and so you're fine.  By all means export a function
> designed to be called during src_prepare, but don't export the phase
> itself.

yes, exactly, but...

> If you're writing a do-everything eclass then do whatever makes the
> most sense.  Most likely you're co-maintianing every package that uses
> the eclass anyway.  Just document how you're doing it.
>
> The real problem is when people try to do something in-between, which
> happens with a lot of language-based eclasses it seems.  Then when you
> have some package that uses three different languages in its build
> system you get to deal with a mess of which eclass should be doing
> what.  We really need to get away from this.

vcs eclasses maybe ? some of them export src_prepare, though they could
probably drop it for eapi6

However, by somewhat throwing away the problem, you're just asking for
a complete mess :) some will invent variables to notify eclass has
called eapply user, some will just not call it by requiring consumers to
define its src_prepare (killing the point of EXPORT_FUNCTIONS), or what
else I can't imagine. I still remember eapi2 transition with numerous
packages calling econf twice :)


> I'd say the best approach for compatibility if you have an existing
> eclass and it already exports src_prepare is to not call eapply_user
> unless it firmly falls into the #2 category above.


Replace 'not call eapply_user' by 'not export src_prepare' and I'd
agree with you if going a bit further by ensuring there is no hidden
problem: Going through each eclass exporting src_prepare and defining
which should export it and which should not. I hope what you say is
sufficient, but it'd be a bad idea to set this in stone for realizing
in a few months that this forces people to write crappy code for having
some eclasses to co-exist nicely.

Some temptative list of which could be annoying (as in, do not seem to
be 'do everything' eclasses):

bzr.eclass 
  -> patches (now useless) and bootstrap script, dropping it might
  encounter some resistance
cuda.eclass
  -> appends cflags, could easily be moved to src_configure and not
  exported
java-pkg-opt-2.eclass
  -> sanity checks & autofixing, not sure how to handle
subversion.eclass
  -> patches (now useless) and bootstrap script, dropping it might
  encounter some resistance
vala.eclass
  -> sets up some kind of virtual env, could very well be src_configure

[...]

Reply via email to