summaryrefslogtreecommitdiff
path: root/fullpkg
diff options
context:
space:
mode:
authorJoshua Ismael Haase Hernández <hahj87@gmail.com>2011-06-28 21:23:49 -0500
committerJoshua Ismael Haase Hernández <hahj87@gmail.com>2011-06-28 21:23:49 -0500
commit207a930a564e8157e24c3e7f5fbe987494b73d7b (patch)
tree29850fa85c7ea9525dbc4ae9469a268115d8e73e /fullpkg
parent6633c1d07a2b408dd74ad909326a54f94b2fdfdf (diff)
* Cleanup code + arch specific separated
Diffstat (limited to 'fullpkg')
-rwxr-xr-xfullpkg366
1 files changed, 186 insertions, 180 deletions
diff --git a/fullpkg b/fullpkg
index cae91da..be26956 100755
--- a/fullpkg
+++ b/fullpkg
@@ -1,25 +1,23 @@
#!/bin/bash
-# TO TEST: (on find_deps)
-# * Detect pkgnames by provides, replaces, etc. instead of dir tree
source /etc/makepkg.conf
source /etc/abs.conf
source /etc/libretools.conf
+source /etc/libretools.d/prtools.conf
-# Avoid /libretools dir doesn't exist errors
-if [ -z $XDG_CONFIG_HOME ]; then
- error "There's no XDG_CONFIG_HOME var set"
- exit 1
-fi
-# set ban_file
-[ -e $XDG_CONFIG_HOME/libretools/libretools.conf ] && \
- source $XDG_CONFIG_HOME/libretools/libretools.conf
-ban_file=$XDG_CONFIG_HOME/libretools/ban
+if [ -z $XDG_CONFIG_HOME ]; then # Avoid /libretools dir doesn't exist errors
+
+ error "There's no XDG_CONFIG_HOME var set"; exit 1
+
+elif [ -e $XDG_CONFIG_HOME/libretools/libretools.conf ]; then
+
+ source $XDG_CONFIG_HOME/libretools/libretools.conf
+fi
-##### START FUNCTIONS #####
function usage {
+
echo "cd to a dir containing a PKGBUILD and run:"
echo "$0 [options]"
printf "This script will check dependencies, build them if possible "
@@ -30,131 +28,144 @@ function usage {
echo " -a absdir : set absdir as ABSROOT."
echo " -b build_dir : use a fullpkg build_dir and only build."
echo " -c : check deps only, do not build."
+ echo " -C : cleanup the build_dir."
echo " -d build_dir : use this dir to build. Defaults to mktemp."
echo " -n : don't update pacman db."
echo " -m max_level : check deps until this level"
echo " -r \"command\" : use this instead of \"$FULLBUILDCMD\""
echo
exit 1
-}
-## Build order management ##
+}
-# Removes a package from the buildorder
+function remove_buildorder { # Removes a package from the buildorder
# $1 package name
# $2 buildorder file
-remove_buildorder() {
+
grep -Evw "${1}" ${2} > ${2}2
mv -f ${2}2 ${2}
+
}
-# Guesses the repo name according to the parent dir of the current package
-# assuming the form repo/package/PKGBUILD
-guess_repo() {
- basename $(dirname $(pwd))
+function guess_repo { # Get repo name. Asumes ${ABSROOT}/repo/package/PKGBUILD
+
+ basename $(dirname $(pwd)) # Variable in prfullpkg
+
}
-##
-# usage : get_full_version( $epoch, $pkgver, $pkgrel )
-# return : full version spec, including epoch (if necessary), pkgver, pkgrel
-##
-get_full_version() {
+function get_fullver { # return : full version spec, including epoch (if necessary), pkgver, pkgrel
+
+# usage : get_fullver( ${epoch:-0}, $pkgver, $pkgrel )
+
if [[ $1 -eq 0 ]]; then
# zero epoch case, don't include it in version
echo $2-$3
else
echo $1:$2-$3
fi
+
}
-# Usage: cleanup [ $(basename $PWD) ] from PKGBUILD dir
-# cleans the build_dir
-function cleanup {
-# Do nothing OR
-# Already cleaned
- [[ "${do_cleanup}" = "n" || ! -d ${build_dir} ]] && return 0
+function cleanup { # Cleans the build_dir.
+
+ [[ "${do_cleanup}" = "n" || ! -d ${build_dir} ]] && return 0 # Do nothing or already cleaned.
-# Only do cleanup on level 0
msg "Cleaning up..."
- [ $level -eq 0 ] && rm -rf $build_dir/*
+ [ $level -eq 0 ] && rm -rf $build_dir/* # Only do cleanup on level 0.
+
}
-# Check PKGBUILD and find non built or outdated deps
-# on ABSROOT which should be abslibre-misp64el
-function find_deps {
- ## Check this level.
- source PKGBUILD
+function find_deps { # Checks ABSROOT and look for target pkg deps. Adds them if not built or outdated.
+
+ source PKGBUILD ## Check this level.
+
local repo=${repo:-$(guess_repo)}
local pkgbase=${pkgbase:-${pkgname[0]}}
local epoch=${epoch:-0}
- local fullver=$(get_full_version ${epoch} ${pkgver} ${pkgrel})
+ local fullver=$(get_fullver ${epoch} ${pkgver} ${pkgrel})
-# If package and correct ${fullver} is built exit
if is_built "${pkgbase}>=${fullver}"; then
- exit 0
+ exit 0 # pkg is built and updated
fi
-# Tell which packages are deeper in deps (even if they are on build_dir)
-# so we can build them first.
- echo "${level}:${pkgbase}" >> "${build_dir}/BUILDORDER"
+ echo "${level}:${pkgbase}" >> "${build_dir}/BUILDORDER" # greater levels are built first
+
+ if [ -d "${build_dir}/${pkgbase}" ]; then # PKGBUILD is already there
-# if pkgbuild directory is on build_dir, do not copy and exit
- if [ -d "${build_dir}/${pkgbase}" ]; then
exit 0
- else
-# Copy dir to build_dir
+
+ else # Copy dir to build_dir
+## variable block for prfullpkg
+
cp -r ../${pkgbase}/ ${build_dir}/
-# Info to eval later
- echo "repo=$repo" > "${build_dir}/${pkgbase}/.INFO"
+
+ echo "repo=$repo" > "${build_dir}/${pkgbase}/.INFO" # to identify repo later
fi
-# Inform the current package plus a space for every level for indent
- msg2 "%${level}s${pkgbase}-${fullver}"
+ msg2 "%${level}s${pkgbase}-${fullver}" # current package plus a space for every level
+
+ declare -i next_level=$level+1 ## Check next levels
-## Check next levels
-# Clean version checking
deps=$(echo "${depends[@]} ${makedepends[@]}" | \
sed "s/[=<>]\+[^ ]\+//g" | \
tr ' ' "\n" | \
- sort -u)
-
-# Increase build level
- declare -i next_level=$level+1
+ sort -u) # All deps in separate line, only once, without version.
for _dep in ${deps[@]}; do
- for _repo in ${REPOS[@]}; do
- # try to find $_dep on each repo from dirname
- if [ -e "${ABSROOT}/${_repo}/${_dep}/PKGBUILD" ]; then
- pushd "${ABSROOT}/${_repo}/${_dep}" > /dev/null
- $0 -c -d ${build_dir} -l ${next_level}
+ local found=false
+
+ for _repo in ${REPOS[@]}; do
- # Circular deps must fail
- [ $? -eq 20 ] && return 20
+ if [ -e "${ABSROOT}/${_repo}/${_dep}/PKGBUILD" ]; then # ABSROOT/repo/package
+
+ pushd "${ABSROOT}/${_repo}/${_dep}" > /dev/null
+ $0 -c -d ${build_dir} -l ${next_level} # run this cmd on dep's PKGBUILD dir
+ [ $? -eq 20 ] && return 20 # probable circular deps
popd > /dev/null
- break 1 # found, go to next dep
- fi
- done
-# if search pkgname in repo doesn't work
-# this should find pkgsplits
- for _repo in ${REPOS[@]}; do
- if _dir=($(find "$ABSROOT/${_repo}" -type f -name PKGBUILD -print0 2>/dev/null | \
- "xargs" -0 -e grep -HEw "pkgname=|pkgbase=|provides=" | grep -w "$_dep" 2>&1));
- then
- _dir=$(dirname $(echo $_dir | cut -d: -f1))
- plain "guess for $_dep -> $_dir"
- pushd $_dir > /dev/null
- $0 -c -d ${build_dir} -l ${next_level}
-# Circular deps must fail
- [ $? -eq 20 ] && return 20
- popd > /dev/null
- break 1 # found, go to next dep
- else
- echo "dep_not_found:$_dep:$_repo" >> $build_dir/log
+ local found=true
+ break 1 # found, end cycle
fi
+
done
+
+ if ( ${found} ); then
+
+ continue 1 # go to next dep
+
+ else # pkgsplit, needs guess
+
+ for _repo in ${REPOS[@]}; do
+ if _dir=($(find "$ABSROOT/${_repo}" -type f \
+ -name PKGBUILD -print0 2>/dev/null | \
+ "xargs" -0 -e grep -HEw "pkgname=|pkgbase=|provides=" | \
+ grep -w "$_dep" 2>&1));
+
+ then
+
+ _dir=$(dirname $(echo $_dir | cut -d: -f1))
+ plain "guess for $_dep -> $_dir"
+
+ pushd "$_dir" > /dev/null
+ $0 -c -d ${build_dir} -l ${next_level} # run this cmd on dep's PKGBUILD dir
+ [ $? -eq 20 ] && return 20 # probable circular deps
+ popd > /dev/null
+ local found=true
+ break 1 # found, end cycle
+ fi
+
+ done
+
+ if ( ${found} ); then
+ continue 1 # go to next dep
+ else
+ echo "dep_not_found:$_dep" >> $build_dir/log
+ fi
+
done
+## End variable block
+
unset next_level dir
# unset PKGBUILD variables
unset pkgname pkgver pkgrel epoch pkgdesc arch url license groups depends \
@@ -162,67 +173,64 @@ function find_deps {
options install changelog source noextract md5sums build check package
}
-function _pkg_build () {
+function __build () {
pushd ${build_dir} > /dev/null
- # packages to build are on $buildorder
- # greater levels must be built first
- build_packages=($(sort -gr $buildorder | cut -d: -f2))
+
+ build_packages=($(sort -gr $buildorder | cut -d: -f2)) # greater levels must be built first
while [ ${#build_packages[@]} -ge 1 ]; do
pushd $build_dir/${build_packages[0]} > /dev/null
- source PKGBUILD
+ source PKGBUILD
msg2 "${pkgbase:-${pkgname[0]}} $pkgver-$pkgrel"
msg2 "Checking for non free deps"
pkgbuild-check-nonfree || {
if [ $? -eq 15 ]; then # this error means nonfree others means fail.
-# log they have nonfree deps and so didn't build
+
echo "nonfree:$(basename $PWD)" >> $build_dir/log
-# take out package from $buildorder
- remove_buildorder "$(basename $PWD)" $buildorder
-# continue building next package
- continue
+
+ remove_buildorder "$(basename $PWD)" $buildorder # take out package from $buildorder
+
+ continue # build next package
fi
}
msg2 "Building $(basename $PWD)"
-# this buildcmd is on libretools.conf
- $FULLBUILDCMD; r=$?
+
+ $FULLBUILDCMD; r=$? # this buildcmd is on libretools.conf
+
case $r in
-###### Succesfull Build ######
- 0)
+
+ 0) ## Succesfull build
+
plain "The build was succesful."
- source .INFO && [ -n $repo ] && {
+ if source .INFO && [ -n $repo ]; then
-# Calls a local release script if it's used
- [ -z $HOOKLOCALRELEASE ] || \
- find -name "*.pkg.tar.?z" -print0 | \
- xargs -0 $HOOKLOCALRELEASE $repo
+ # Calls a local release script if it's used
+ if [ ! -z $HOOKLOCALRELEASE ]; then
+ find -name "*.pkg.tar.?z" -print0 | xargs -0 $HOOKLOCALRELEASE $repo
+ fi
-# Stage for releasing
- librestage $repo || {
- echo "unstaged:$(basename $PWD)" >> $build_dir/log
- }
+ librestage $repo || echo "unstaged:$(basename $PWD)" >> $build_dir/log
msg "Updating pacman db and packages"
sudo pacman -Sy || true
- }
+
+ fi
echo "built:$(basename $PWD)" >> $build_dir/log
;;
-###### Failed Build ######
- *)
- error "There were errors while trying to build the package."
+
+ *) ## Build failed
+ error "There were errors while trying to build the package."
echo "failed:$(basename $PWD)" >> $build_dir/log
;;
esac
-# Package was built or failed: take it out of $buildorder
remove_buildorder "${build_packages[0]}" $buildorder || true
-# Set build_packages before next cycle run
- build_packages=($(sort -gr $buildorder | cut -d: -f2))
+ build_packages=($(sort -gr $buildorder | cut -d: -f2)) # which is next package?
popd > /dev/null
done
@@ -249,8 +257,7 @@ function _pkg_build () {
popd > /dev/null
}
-# End inmediately but print a useful message
-trap_exit() {
+function trap_exit { # End inmediately but print a useful message
error "$@"
warning "Leftover files left on $build_dir"
@@ -258,16 +265,14 @@ trap_exit() {
exit 1
}
-## END FUNCTIONS ##
-
-## Trap signals
-# From makepkg
+# Trap signals from makepkg
set -E
trap 'cleanup' 0
-trap 'trap_exit "TERM signal caught. Exiting..."' TERM HUP QUIT
-trap 'trap_exit "Aborted by user! Exiting..."' INT
-trap 'trap_exit "An unknown error has occurred. Exiting..."' ERR
+trap 'trap_exit "(prfullpkg:${level}) TERM signal caught. Exiting..."' TERM HUP QUIT
+trap 'trap_exit "(prfullpkg:${level}) Aborted by user! Exiting..."' INT
+trap 'trap_exit "(prfullpkg:${level}) An unknown error has occurred. Exiting..."' ERR
+ban_file=$XDG_CONFIG_HOME/libretools/ban
force_build=""
level=0
noupdate='n'
@@ -275,26 +280,24 @@ build_only='n'
check_deps_only='n'
do_cleanup='n'
max_level=21
-OFFLINE=false
+
while getopts 'ha:b:cCd:l:nm:r:' arg; do
case $arg in
h) usage ;;
a) ABSROOT="$OPTARG" ;;
- b) build_only='y'
+ b) build_only='y'
build_dir="$OPTARG"
- [ -z ${build_dir} ] && {
+ if [ -z ${build_dir} ]; then
usage
- }
- [ ! -r ${build_dir}/BUILDORDER ] && {
+ fi
+ if [ ! -r ${build_dir}/BUILDORDER ] ; then
error "${build_dir}/BUILDORDER doesn't exist."
exit 1
- };;
+ fi;;
c) check_deps_only='y' ;;
C) do_cleanup='y';;
d) build_dir="$OPTARG" ;;
-# hidden option to know what to build first.
-# if $level > 0 it will not build
- l) level=$OPTARG ;;
+ l) level=$OPTARG ;; # hidden option to know dep level.
n) noupdate='y';;
m) max_level=$OPTARG ;;
r) FULLBUILDCMD="$OPTARG" ;;
@@ -303,92 +306,95 @@ done
if [ ${build_only} == 'n' ]; then
-# Check if we are actually on a build directory
-# Do this early
-
- [ ! -r PKGBUILD ] && {
+ [ ! -r PKGBUILD ] && { # Check if we are actually on a build directory. Do this early.
error "This isn't a build directory"
usage
}
-# Add mips64el if missing from arch=() and it isn't an 'any' package
- if ! grep mips64el PKGBUILD >/dev/null; then
- warning "Adding mips64el arch"
- sed -i "s/^\(arch=([^)anym]\+\))/\1 'mips64el')/" "PKGBUILD"
+ if [ ! -z "$HOOKPKGBUILDMOD" ]; then
+ "$HOOKPKGBUILDMOD"
fi
fi
-# Only on level 0
if [ $level -eq 0 ]; then
-# if build_dir exist use it, else make a build_dir
- build_dir=${build_dir:-$(mktemp -d /tmp/fullpkg.XXXXXX)}
- mkdir -p ${build_dir} # in case of -d option
-# make files for log and buildorder
- touch ${build_dir}/{log,BUILDORDER}
+ build_dir=${build_dir:-$(mktemp -d /tmp/fullpkg.XXXXXX)} # use -d option or else mktemp
+
+ if [ ! -d ${build_dir} ]; then # in case of custom -d option
+ mkdir -p ${build_dir}
+ else
+ cleanup # files already there can screw find_deps
+ fi
+
+ touch ${build_dir}/{log,BUILDORDER} ${ban_file} # make files for log and buildorder
buildorder=${build_dir}/BUILDORDER
- [ ${noupdate} = 'n' ] && {
+ if [ ${noupdate} = 'n' ]; then
+
msg "Updating pacman db and packages"
sudo pacman -Syu --noconfirm || true
- }
-# Build only
- [ ${build_only} == 'y' ] && {
+ fi
+
+ if [ ${build_only} == 'y' ]; then
+
msg "Build Packages"
- _pkg_build
+
+ __build
+
exit 0
- }
+
+ fi
msg "Checking dependencies"
fi
-## if $level = 20 it's highly likely there are circular deps
-[ $level -ge $max_level ] && exit 20
+[ $level -ge $max_level ] && exit 20 # Probable circular deps
-# Tries to find deps and build order
-find_deps || {
- # if find_deps finds circular deps
- # it should exit with status 20
- [ $? -eq 20 ] && {
- # only show message on level 0
- [ $level -eq 0 ] && error "Check for circular deps on $build_dir/BUILDORDER";
- }
- exit 20
+find_deps || {
+
+ if [ $? -eq 20 ]; then # Probable circular deps
+
+ if [ $level -eq 0 ]; then # Show error only on level 0
+ error "Check for circular deps on $build_dir/BUILDORDER";
+ fi
+
+ fi
+ exit 20 # Pass message 20
}
-# levels greater than 0 must only check deps
-[ $check_deps_only = 'y' -o $level -gt 0 ] && exit 0
+[ $check_deps_only = 'y' -o $level -gt 0 ] && exit 0 # only build on level 0
+
+if [ $level -eq 0 -a -d $build_dir ]; then # Sanity check
+
+ if [ ! -w $ban_file -o ! -r $ban_file ]; then # Check ban_file permisions
-# check BUILDORDER to not include banned deps and
-[ $level -eq 0 -a -d $build_dir ] && {
-# Check for banned deps
- if [ -w $ban_file -a -r $ban_file ]; then
- chmod o+rw $ban_file || error "Ban file is not readable/writable ($ban_file)"
+ chmod a+rw $ban_file || error "Ban file is not readable/writable ($ban_file)"
else
+
rsync -e ssh -aq $PARABOLAHOST:mips64el/ban >/dev/null 2>&1 || {
- warning "Failed to get ban list" && [ -r ${ban_file} ] && {
-# Use local copy of ban file if it is avaliable and continue.
+ warning "Failed to get ban list" && [ -r ${ban_file} ] && { # use local copy if it exist
+
search=$(cat ${ban_file} | tr "\n" "|")
-# Keep track of banned files
- egrep -w "$search" ${buildorder} >> ${build_dir}/banned
-# Take banned packages out from buildorder
- egrep -vw "$search" ${buildorder} > ${buildorder}2
+
+ egrep -w "$search" ${buildorder} >> ${build_dir}/banned # Keep track of banned files
+
+ egrep -vw "$search" ${buildorder} > ${buildorder}2 # Take banned packages out of buildorder
+
mv -f ${buildorder}2 ${buildorder}
+
unset search
}
}
fi
-}
+fi
-## START Building
msg "Building packages:"
-# Build the package
-_pkg_build
+__build # Build the packages
echo
msg2 "Check if your system works fine and librerelease if it does"