[pacman-dev] Splitting packages in makepkg
Allan McRae
mcrae_allan at hotmail.com
Sun Jun 15 09:20:39 EDT 2008
Dan McGee wrote:
> <snip>
> 1. I've had this so-called fake_install() branch around for a while
> locally, and I've always thought it was a decent idea:
> http://code.toofishes.net/gitweb.cgi?p=pacman.git;a=commitdiff;h=5e955fc9bd5aa07263179a16b1cebeed9a43d25e
> The naming of the fake_install() function could change, but what this
> allows is for the build and install steps of packaging to be
> seperated, and only the install step gets run under fakeroot. This was
> the final step towards doing as little work in fakeroot as possible,
> but I got cold feet on merging it because it would add some possible
> complexity to PKGBUILDs. However, I think the idea is quite sound and
> having a build() function and an install() function in a PKGBUILD
> would not be too much clutter in my opinion.
>
This looks interesting. And it actually gives me some perspective on
which is the best way to implement package splitting. This would make
the standard non-split pkgbuild looked like:
build() {
}
package() {
}
So with a split package, the package part could be:
#1) KDEmod style
package_base() {
#do base install
}
package_gui() {
#override pkgname etc
# do gui install
}
#2) Modified KDEmod style
package() {
# do base install
}
package_gui() {
#override pkgname etc
# do gui install
}
#3) case statement way
package() {
case "$1" in
"base" )
# do install stuff
;;
"gui" )
# override pkgname etc
# do install stuff
;;
esac
}
Now think about how we keep backwards compatibility with old PKGBUILDs
that don't have a package function of any variety. Without split
packages, we have to test if the package() function is present to decide
whether or not the build() segment is run in fakeroot. This is
compatible with splitting methods #2 and #3 where there is a package
function but not with #1 which would require an additional check for the
definition of a "split" array. Option #2 also suffers from the problem
that there may not be a main part to package so it may not be obvious
what should be in the package() function. Thus, I think option #2 can
be excluded from here on.
Option #1 is essentially what the KDEmod team have done and would only
require an additional test for the "split" array to know what to use
fakeroot on. However, you end up with as many package functions as
there are sub-packages which itself makes the PKGBUILD less clear.
Option #3 is my personal favorite as you still only have two functions -
build and package. Admittedly the package function is slightly more
complex when building a split package but if you wanted it simple, you
would be using two PKGBUILDs instead of one. Still, I find it the
cleaner of the options but I may be fighting a losing campaign here
given option #1 is "in the wild"...
In the end, I think splitting packages is a nice feature but I doubt I
will use it frequently. So the decision should be weighted by those who
would. Now the KDEmod team chose option #1. My question is: Was that
because it was the best way or was it just because it worked? I think
it would be good to combine the whole split packages, multiple package
directories, minimal fake install ideas but I am still trying to decide
what the best way to do this is.
More information about the pacman-dev
mailing list