1
0
mirror of https://github.com/moparisthebest/pacman synced 2025-03-02 10:21:49 -05:00

Merge branch 'am/splitpkg'

* am/splitpkg:
  makepkg: implement creation of split packages
  makepkg: Optional argument for run_package and create_package
  makepkg: hack around tee in run_package function
  makepkg: add functions for backup and restore of package fields
  makepkg: add optional package function
  makepkg: Add PKGBUILD-split.proto
This commit is contained in:
Dan McGee 2009-01-16 19:45:02 -06:00
commit 3d49d88009
4 changed files with 205 additions and 14 deletions

View File

@ -12,7 +12,7 @@ EXTRA_DIST = HACKING
# Sample makepkg prototype files
pkgdatadir = ${datadir}/${PACKAGE}
dist_pkgdata_DATA = PKGBUILD.proto proto.install ChangeLog.proto
dist_pkgdata_DATA = PKGBUILD.proto PKGBUILD-split.proto proto.install ChangeLog.proto
# run the pactest test suite and vercmp tests
check-local: pactest src/pacman src/util

55
PKGBUILD-split.proto Normal file
View File

@ -0,0 +1,55 @@
# This is an example of a PKGBUILD for splitting packages. Use this as a
# start to creating your own, and remove these comments. For more information,
# see 'man PKGBUILD'. NOTE: Please fill out the license field for your package!
# If it is unknown, then please put 'unknown'.
# Contributor: Your Name <youremail@domain.com>
pkgname=('pkg1' 'pkg2')
pkgver=VERSION
pkgrel=1
pkgdesc=""
arch=()
url=""
license=('GPL')
groups=()
depends=()
makedepends=()
provides=()
conflicts=()
replaces=()
backup=()
options=()
install=
source=($pkgname-$pkgver.tar.gz)
noextract=()
md5sums=() #generate with 'makepkg -g'
build() {
cd "$srcdir/$pkgname-$pkgver"
./configure --prefix=/usr
make || return 1
}
package_pkg1() {
# options and directives that can be overridden
pkgdesc=""
license=()
groups=()
depends=()
optdepends=()
provides=()
conflicts=()
replaces=()
backup=()
options=()
install=
make DESTDIR="$pkgdir/" install-pkg1
}
package_pkg2() {
# options and directives overrides
pkgdesc=""
make DESTDIR="$pkgdir/" install-pkg2
}

View File

@ -256,6 +256,14 @@ If you create any variables of your own in the build function, it is
recommended to use the bash `local` keyword to scope the variable to inside
the build function.
package() Function
------------------
An optional package() function can be specified in addition to the build() function.
This function is run immediately after the build() function. When specified in
combination with the fakeroot BUILDENV option in linkman:makepkg.conf[5], fakeroot
usage will be limited to running the packaging stage. The build() function will be
run as the user calling makepkg.
Install/Upgrade/Remove Scripting
--------------------------------
Pacman has the ability to store and execute a package-specific script when it

View File

@ -42,9 +42,12 @@ BUILDSCRIPT='@BUILDSCRIPT@'
startdir="$PWD"
srcdir="$startdir/src"
pkgdir="$startdir/pkg"
packaging_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge')
other_options=('ccache' 'distcc' 'makeflags' 'force')
readonly -a packaging_options other_options
splitpkg_overrides=('pkgdesc' 'license' 'groups' 'depends' 'optdepends' 'provides' \
'conflicts' 'replaces' 'backup' 'options' 'install')
readonly -a packaging_options other_options splitpkg_overrides
# Options
ASROOT=0
@ -64,6 +67,7 @@ LOGGING=0
SOURCEONLY=0
IGNOREARCH=0
HOLDVER=0
SPLITPKG=0
# Forces the pkgver of the current PKGBUILD. Used by the fakeroot call
# when dealing with svn/cvs/etc PKGBUILDs.
@ -682,7 +686,7 @@ run_build() {
local ret=0
if [ "$LOGGING" = "1" ]; then
BUILDLOG="${startdir}/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.log"
BUILDLOG="${startdir}/${pkgname}-${pkgver}-${pkgrel}-${CARCH}-build.log"
if [ -f "$BUILDLOG" ]; then
local i=1
while true; do
@ -710,6 +714,63 @@ run_build() {
fi
}
run_package() {
if [ -z "$1" ]; then
pkgfunc="package"
nameofpkg="$pkgname"
else
pkgfunc="package_$1"
nameofpkg="$1"
fi
# clear user-specified makeflags if requested
if [ "$(check_option makeflags)" = "n" ]; then
MAKEFLAGS=""
fi
msg "$(gettext "Starting %s()...")" "$pkgfunc"
cd "$srcdir"
# ensure all necessary build variables are exported
export CFLAGS CXXFLAGS LDFLAGS MAKEFLAGS CHOST
local ret=0
if [ "$LOGGING" = "1" ]; then
BUILDLOG="${startdir}/${nameofpkg}-${pkgver}-${pkgrel}-${CARCH}-package.log"
if [ -f "$BUILDLOG" ]; then
local i=1
while true; do
if [ -f "$BUILDLOG.$i" ]; then
i=$(($i +1))
else
break
fi
done
mv "$BUILDLOG" "$BUILDLOG.$i"
fi
# ensure overridden package variables suvrive tee with split packages
logpipe=$(mktemp -u "$startdir/logpipe.XXXXXXXX")
mknod "$logpipe" p
exec 3>&1
tee "$BUILDLOG" < "$logpipe" &
exec 1>"$logpipe" 2>"$logpipe"
$pkgfunc 2>&1 || ret=$?
sync
exec 1>&3 2>&3 3>&-
rm "$logpipe"
else
$pkgfunc 2>&1 || ret=$?
fi
if [ $ret -gt 0 ]; then
error "$(gettext "Packaging Failed.")"
plain "$(gettext "Aborting...")"
remove_deps
exit 2 # $E_BUILD_FAILED
fi
}
tidy_install() {
cd "$pkgdir"
msg "$(gettext "Tidying install...")"
@ -793,6 +854,12 @@ tidy_install() {
}
create_package() {
if [ -z "$1" ]; then
nameofpkg="$pkgname"
else
nameofpkg="$1"
fi
if [ ! -d "$pkgdir" ]; then
error "$(gettext "Missing pkg/ directory.")"
plain "$(gettext "Aborting...")"
@ -817,7 +884,7 @@ create_package() {
echo "# using $(fakeroot -v)" >>.PKGINFO
fi
echo "# $(LC_ALL=C date -u)" >>.PKGINFO
echo "pkgname = $pkgname" >>.PKGINFO
echo "pkgname = $nameofpkg" >>.PKGINFO
echo "pkgver = $pkgver-$pkgrel" >>.PKGINFO
echo "pkgdesc = $pkgdesc" >>.PKGINFO
echo "url = $url" >>.PKGINFO
@ -901,7 +968,7 @@ create_package() {
"$PKGEXT" ;;
esac
local pkg_file="$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
local pkg_file="$PKGDEST/${nameofpkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
# when fileglobbing, we want * in an empty directory to expand to
# the null string rather than itself
@ -1139,6 +1206,24 @@ devel_update() {
fi
}
backup_package_variables() {
for var in ${splitpkg_overrides[@]}; do
indirect="${var}_backup"
eval "${indirect}=\"${!var}\""
done
}
restore_package_variables() {
for var in ${splitpkg_overrides[@]}; do
indirect="${var}_backup"
if [ -n "${!indirect}" ]; then
eval "${var}=\"${!indirect}\""
else
unset ${var}
fi
done
}
# getopt like parser
parse_options() {
local short_options=$1; shift;
@ -1481,6 +1566,10 @@ if [ "$GENINTEG" = "1" ]; then
exit 0 # $E_OK
fi
if [ "${#pkgname[@]}" -gt "1" ]; then
SPLITPKG=1
fi
# check for no-no's in the build script
if [ -z "$pkgname" ]; then
error "$(gettext "%s is not allowed to be empty.")" "pkgname"
@ -1569,13 +1658,29 @@ fi
# Run the bare minimum in fakeroot
if [ "$INFAKEROOT" = "1" ]; then
if [ "$REPKG" = "0" ]; then
run_build
tidy_install
if [ "$SPLITPKG" = "0" ]; then
if [ "$REPKG" = "0" ]; then
if [ "$(type -t package)" != "function" ]; then
run_build
else
run_package
fi
tidy_install
fi
create_package
else
for pkg in ${pkgname[@]}; do
pkgdir="$pkgdir/$pkg"
mkdir -p "$pkgdir"
backup_package_variables
run_package $pkg
tidy_install
create_package $pkg
restore_package_variables
pkgdir="${pkgdir%/*}"
done
fi
create_package
msg "$(gettext "Leaving fakeroot environment.")"
exit 0 # $E_OK
fi
@ -1659,14 +1764,37 @@ else
# if we are root or if fakeroot is not enabled, then we don't use it
if [ "$(check_buildenv fakeroot)" != "y" -o $EUID -eq 0 ]; then
if [ "$REPKG" = "0" ]; then
if [ "$SPLITPKG" = "0" ]; then
if [ "$REPKG" = "0" ]; then
devel_update
run_build
if [ "$(type -t package)" == "function" ]; then
run_package
fi
tidy_install
fi
create_package
else
devel_update
run_build
tidy_install
for pkg in ${pkgname[@]}; do
pkgdir="$pkgdir/$pkg"
mkdir -p "$pkgdir"
backup_package_variables
run_package $pkg
tidy_install
create_package $pkg
restore_package_variables
pkgdir="${pkgdir%/*}"
done
fi
else
if [ "$(type -t package)" == "function" -o "$SPLITPKG" = "1" ]; then
devel_update
run_build
cd "$startdir"
fi
create_package
else
msg "$(gettext "Entering fakeroot environment...")"
if [ "$newpkgver" != "" ]; then