summaryrefslogtreecommitdiff
path: root/src/chroot-tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/chroot-tools')
-rwxr-xr-xsrc/chroot-tools/chcleanup2
-rw-r--r--src/chroot-tools/chroot.conf2
-rwxr-xr-xsrc/chroot-tools/librechroot208
-rwxr-xr-xsrc/chroot-tools/libremakepkg181
-rwxr-xr-xsrc/chroot-tools/libremkchroot68
5 files changed, 288 insertions, 173 deletions
diff --git a/src/chroot-tools/chcleanup b/src/chroot-tools/chcleanup
index 821c572..40db3c0 100755
--- a/src/chroot-tools/chcleanup
+++ b/src/chroot-tools/chcleanup
@@ -33,7 +33,7 @@ cleanup_log="${TEMPDIR}"/libretools-cleanup.log
# Get the full list of packages needed by dependencies, including the base system
pacman -b "${TEMPDIR}" \
-Sp --print-format "%n" \
- base base-devel sudo "${CHROOTEXTRAPKG[@]}" \
+ base-devel "${CHROOTEXTRAPKG[@]}" \
>"${cleanup_log}"
# Diff installed packages against a clean chroot then remove leftovers
diff --git a/src/chroot-tools/chroot.conf b/src/chroot-tools/chroot.conf
index d84e8b4..a161a61 100644
--- a/src/chroot-tools/chroot.conf
+++ b/src/chroot-tools/chroot.conf
@@ -9,5 +9,5 @@ CHROOTDIR=/var/lib/archbuild
CHROOT=default
# Extra packages to have installed on the chroot.
-# This is in addition to CHROOTPKG=(base base-devel sudo)
+# This is in addition to CHROOTPKG=(base-devel)
CHROOTEXTRAPKG=(distcc ccache tsocks libretools)
diff --git a/src/chroot-tools/librechroot b/src/chroot-tools/librechroot
index 7f113f5..368ecc1 100755
--- a/src/chroot-tools/librechroot
+++ b/src/chroot-tools/librechroot
@@ -3,7 +3,7 @@
# Copyright 2010 Nicolás Reynolds
# Copyright 2011 Joshua Haase
-# Copyright 2012 Luke Shumaker
+# Copyright 2012-2013 Luke Shumaker
#
# This file is part of Parabola.
#
@@ -23,20 +23,41 @@
. /usr/share/libretools/conf.sh
load_conf_libretools_chroot
-. "$(which libremessages)"
+. libremessages
. /usr/share/devtools/makechrootpkg.sh
-cleanup=(':');
-cleanup() {
- for cmd in "${cleanup[@]}"; do
- $cmd
- done
-}
+# Because the makechrootpkg.sh library functions don't work with -euE
+normshell() (
+ set +euE
+ "$@"
+)
cmd=${0##*/}
usage() {
- echo "Usage: $cmd [OPTIONS] "
- echo 'Interacts with a chroot.'
+ echo "Usage: $cmd [OPTIONS] COMMAND [ARGS...]"
+ echo 'Interacts with an archroot (arch chroot).'
+ echo ''
+ echo 'There may be multiple chroots; they are stored in $CHROOTDIR.'
+ echo ''
+ echo 'Each chroot is named; the default is configured with $CHROOT.'
+ echo ''
+ echo "Each named chroot has a master clean copy (named 'root'), and any"
+ echo 'number of other named copies; the copy used by default is the'
+ echo "current username (or \$SUDO_USER, or 'copy' if root)."
+ echo ''
+ echo 'The full path to the chroot copy is "$CHROOTDIR/$CHROOT/$COPY",'
+ echo 'Unless the copy name is manually specified as an absolute path,'
+ echo 'in which case, that path is used.'
+ echo ''
+ echo 'The current settings for the above varibles are:'
+ echo " CHROOTDIR : $CHROOTDIR"
+ echo " CHROOT : $CHROOT"
+ echo " COPY : $COPY"
+ echo " root path : $rootdir"
+ echo " copy path : $copydir"
+ echo ''
+ echo 'If the chroot, or copy does not exist, it will be created'
+ echo 'automatically.'
echo ''
echo 'This command will make the following configuration changes in'
echo 'the chroot:'
@@ -44,81 +65,104 @@ usage() {
echo " - overwrite \`/etc/pacman.d/mirrorlist'"
echo " - set \`CacheDir' in \`/etc/pacman.conf'"
echo ''
+ echo 'Creating a copy, deleting a copy, or syncing a copy can be fairly'
+ echo 'slow; but are very fast if $CHROOTDIR is on a btrfs partition.'
+ echo ''
echo 'Options:'
- echo ' Settings:'
- echo " -n <CHROOT> Use this chroot instead of \`$CHROOT'"
- echo " -l <COPY> Use this chroot copy instead \`$CHROOTCOPY'"
+ echo ' -n <CHROOT> Name of the chroot to use'
+ echo ' -l <COPY> Name of, or absolute path to, the copy to use'
echo ' -N Disable networking in the chroot'
+ echo ' -C <file> Location of pacman config file'
+ echo ' -M <file> Location of makepkg config file'
echo ''
- echo ' Modes: (the last mode given will be used)'
- echo ' -C Clean /repo in the chroot'
- echo ' -c Clean the packages installed in the chroot'
- echo ' -I <FILE> Install the package FILE into the chroot'
- echo ' -i <PKG> Install the package PKG from repos into the chroot'
- echo ' -m Make sure the chroot exists; do nothing else'
- echo ' -r <CMD> Run CMD in the chroot'
- echo " -s Sync the copy with the \`root' copy"
- echo ' -u Update the chroot'
- echo ' -h Show this message'
+ echo 'Commands:'
+ echo ' Create/copy/delete:'
+ echo ' noop|make Do not do anything, but still creates the'
+ echo ' chroot copy if it does not exist'
+ echo " sync Sync the copy with the clean ('root') copy"
+ echo " delete delete the chroot copy"
+ echo ' Dealing with packages:'
+ echo ' install-file FILES... Like `pacman -U FILES...`'
+ echo ' install-name NAMES... Like `pacman -S NAMES...`'
+ echo ' update Like `pacman -Syu`'
+ echo ' clean-pkgs Remove all "exta" packages from the chroot copy'
+ echo ' Other:'
+ echo ' run CMD... Run CMD in the chroot copy'
+ echo ' enter Enter an interactive shell in the chroot copy'
+ echo ' clean-repo Clean /repo in the chroot copy'
+ echo ' help Show this message' # usage
}
+# Globals: $CHROOTDIR, $CHROOT, $COPY, $rootdir and $copydir
main() {
- CHROOTCOPY=$LIBREUSER
- [[ $CHROOTCOPY != root ]] || CHROOTCOPY=copy
+ COPY=$LIBREUSER
+ [[ $COPY != root ]] || COPY=copy
+
+ # defaults
+ rootdir="${CHROOTDIR}/${CHROOT}/root"
+ copydir="${CHROOTDIR}/${CHROOT}/${COPY}"
local mode=enter
- local archroot_args=(-f)
- local ARG=''
- while getopts 'n:l:NCcI:i:mr:suh' arg; do
+ local archroot_args=() # not local
+ while getopts 'n:l:NC:M:' arg; do
case $arg in
n) CHROOT=$OPTARG;;
- l) CHROOTCOPY=$OPTARG;;
- N) archroot_args+=(-N);;
-
- C) mode=clean_repo;;
- c) mode=clean_pacman;;
- I) mode=install_file; ARG=$OPTARG;;
- i) mode=install_pkg; ARG=$OPTARG;;
- m) mode=noop;;
- r) mode=run; ARG=$OPTARG;;
- s) mode=sync;;
- u) mode=update;;
-
- h) usage; exit 0;;
- *) usage; exit 1;;
+ l) COPY=$OPTARG;;
+ N)
+ # We do this so that it carries through to
+ # chroot_* functions
+ archroot() {
+ $(which archroot) -N "$@"
+ }
+ ;;
+ C|M) archroot_args+=(-$arg "$OPTARG");;
+ *) usage; return 1;;
esac
done
shift $(($OPTIND - 1))
- if [[ $# > 0 ]]; then
+ if [[ $# < 1 ]]; then
+ error "Must specify a command"
usage
- exit 1
+ return 1
fi
+ mode=$1
+ shift
- # not local
rootdir="${CHROOTDIR}/${CHROOT}/root"
- copydir="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}"
+ if [[ ${COPY:0:1} = / ]]; then
+ copydir=$COPY
+ else
+ copydir="${CHROOTDIR}/${CHROOT}/${COPY}"
+ fi
########################################################################
+ if [[ $mode == help ]]; then
+ usage
+ return 0
+ fi
+
if (( EUID )); then
- error "This script must be run as root."
- exit 1
+ error "This program must be run as root."
+ return 1
fi
+ umask 0022
+
# Keep this lock as long as we are running
# Note that '9' is the same FD number as in (mk)archroot
lock_open_write 9 "$copydir" \
"Waiting for existing lock on \`$copydir' to be released"
if [[ ! -d $rootdir ]]; then
- libremkchroot "$CHROOT"
+ archroot "${archroot_args[@]}" -m "$rootdir"
fi
- if [[ ! -d $copydir ]] && [[ $mode != sync ]]; then
- chroot_sync
+ if [[ ! -d $copydir ]] || [[ $mode == sync ]]; then
+ normshell chroot_sync "$CHROOTDIR/$CHROOT" "$COPY"
fi
- mkdir -p $copydir/etc/libretools.d
+ mkdir -p "$copydir/etc/libretools.d"
{
if [[ -n ${CHROOTEXTRAPKG[@]:-} ]]; then
printf 'CHROOTEXTRAPKG=('
@@ -127,37 +171,53 @@ main() {
else
printf 'CHROOTEXTRAPKG=()\n'
fi
- } > $copydir/etc/libretools.d/chroot.conf
+ } > "$copydir"/etc/libretools.d/chroot.conf
+
+ if [[ $mode != delete ]]; then
+ # "touch" the chroot first
+ # this will
+ # - overwrite \`/etc/pacman.d/mirrorlist'"
+ # - set \`CacheDir' in \`/etc/pacman.conf'"
+ # - apply -C or -M flags
+ archroot "${archroot_args[@]}" -r "$copydir" true
+ fi
########################################################################
- trap cleanup EXIT
case "$mode" in
- clean_repo)
+ # Creat/copy/delete
+ noop|make|sync) :;;
+ delete)
+ if [[ -d $copydir ]]; then
+ normshell chroot_delete "$copydir"
+ fi
+ ;;
+
+ # Dealing with packages
+ install-file) normshell chroot_install_pkgs "$copydir" "$@";;
+ install-name) archroot -r "$copydir" pacman -Sy "$@";;
+ clean-pkgs)
+ trap "rm -f '$copydir'/clean '$copydir'/chrootexec" EXIT
+ cp -a "$(which chcleanup)" "$copydir/clean"
+ echo '#!/bin/bash' > "$copydir/chrootexec"
+ echo 'mkdir /build' >> "$copydir/chrootexec"
+ echo 'cd /build; /clean' >> "$copydir/chrootexec"
+ chmod 755 "$copydir/chrootexec"
+ archroot -r "$copydir" /chrootexec
+ ;;
+
+ # Other
+ run) archroot -r "$copydir" "$@";;
+ enter) archroot -r "$copydir" bash;;
+ clean-repo)
rm -rf "${copydir}/repo/*"
bsdtar -czf "${copydir}/repo/repo.db.tar.gz" -T /dev/null
ln -s "repo.db.tar.gz" "${copydir}/repo/repo.db"
;;
- clean_pacman)
- cleanup+=("rm -f $copydir/clean $copydir/chrootexec")
- cp -a "$(which chcleanup)" "${copydir}/clean"
- echo '#!/bin/bash' > "${copydir}/chrootexec"
- echo 'mkdir /build' >> "${copydir}/chrootexec"
- echo 'cd /build; /clean' >> "${copydir}/chrootexec"
- chmod 755 "${copydir}/chrootexec"
- archroot "${archroot_args[@]}" "${copydir}" -r /chrootexec
- ;;
- install_file)
- cleanup+=("rm $copydir/${ARG##*/}")
- cp "$ARG" "$copydir/${ARG##*/}"
- archroot "${archroot_args[@]}" "${copydir}" -r "pacman -U /${ARG##*/} --noconfirm"
+ *)
+ error "Unrecognized command: \`$mode'"
+ return 1
;;
- install_pkg) archroot "${archroot_args[@]}" "${copydir}" -i $ARG ;;
- noop) :;;
- run) archroot "${archroot_args[@]}" "${copydir}" -r "$ARG" ;;
- sync) chroot_sync;;
- update) archroot "${archroot_args[@]}" "${copydir}" -u ;;
- enter) archroot "${archroot_args[@]}" "${copydir}" -r bash ;;
esac
}
diff --git a/src/chroot-tools/libremakepkg b/src/chroot-tools/libremakepkg
index a9e1fb7..25f23c6 100755
--- a/src/chroot-tools/libremakepkg
+++ b/src/chroot-tools/libremakepkg
@@ -3,7 +3,7 @@
# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández
-# Copyright 2012 Luke Shumaker
+# Copyright 2012-2013 Luke Shumaker
#
# This file is part of Parabola.
#
@@ -23,22 +23,131 @@
. /usr/share/libretools/conf.sh
load_conf_libretools_chroot
-. "$(which libremessages)"
-. /usr/share/devtools/makechrootpkg.sh
+. libremessages
shopt -s nullglob
+umask 0022
-# Boring functions #############################################################
+# Boring/mundane functions #####################################################
-##
# End inmediately but print a useful message
-##
trap_exit() {
- copy_logs
error "$*"
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ chroot_copy_out_logs "$@"
exit 1
}
+# Usage run [-N] $copydir "$cmd"
+# Runs cmd properly, whether in a chroot already or not.
+#
+# Note that $cmd is a quoted string, not a list of arguments.
+# $copydir=/ if INCHROOT=true
+#
+# Environment
+# - $INCHROOT is set
+run() {
+ local HASNET=true
+ [[ $1 == -N ]] && { HASNET=false; shift; }
+ local cmd="$*"
+
+ cat >"$copydir/chrootexec" <<EOF
+#!/bin/bash
+. /etc/profile
+${INCHROOT} || export HOME=/build
+${INCHROOT} || cd /build
+
+${cmd}
+EOF
+ chmod 755 "$copydir/chrootexec"
+
+ local flags=''
+ if $INCHROOT; then
+ $HASNET || flags='-n'
+ unshare $flags -- /chrootexec
+ else
+ $HASNET || flags='-N'
+ librechroot $flags -l "$copydir" run /chrootexec
+ fi
+}
+
+# Usage: add_to_local_repo $copydir
+add_to_local_repo() (
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ chroot_add_to_local_repo "$@"
+)
+
+# Usage: chroot_copy_in $copydir
+# Environment:
+# - In the dirctory of a PKGBUILD
+# - $SRCDEST is set
+chroot_copy_in() (
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ chroot_copy_in "$@"
+)
+
+# Usage: chroot_copy_out $copydir $owner
+# Environment:
+# - $SRCDEST is set
+# - $PKGDEST is set
+chroot_copy_out() (
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ chroot_copy_out_pkgs "$@"
+ chroot_copy_out_logs "$@"
+ chroot_copy_out_srcs "$@"
+)
+
+# Usage: chroot_let_nobody_use_pacman $copydir
+chroot_let_nobody_use_pacman() (
+ set +euE
+ . /usr/share/devtools/makechrootpkg.real.sh
+ chroot_let_nobody_use_pacman "$@"
+}
+
+# Usage: chroot_init $copydir $repack
+# Environment
+# - $LIBREHOME is set
+chroot_init() {
+ local $copydir=$1
+ local $repack=$2
+
+ librechroot -l "$copydir" make # make sure the chroot exists
+ mkdir -p "$copydir"/{build,pkgdest,srcdest}
+
+ # Remove anything in there UNLESS -R (repack) was passed
+ $repack || rm -rf "$copydir"/build/*
+
+ if [[ -r "$LIBREHOME/.gnupg/pubring.gpg" ]]; then
+ install -D "$LIBREHOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
+ fi
+ rm -f "$copydir/build/.makepkg.conf"
+
+ MAKEPKG_CONF="$copydir/etc/makepkg.conf" set_conf_makepkg PKGDEST /pkgdest
+ MAKEPKG_CONF="$copydir/etc/makepkg.conf" set_conf_makepkg SRCDEST /srcdest
+
+ if grep -q '^\[repo\]' "$copydir/etc/pacman.conf"; then
+ cat >> "$copydir/etc/makepkg.conf" <<EOF
+[repo]
+SigLevel = Optional TrustAll
+Server = file:///repo
+EOF
+ fi
+
+ chroot_let_nobody_use_pacman
+}
+
+# Core functions ###############################################################
+
+# Usage: extract
+# Extracts the sources (`makepkg -o`)
+# Environment:
+# - $INCHROOT is set
+# - $copydir is set
+# - $LIBREUSER is set
extract() {
local user=$LIBREUSER
$INCHROOT || user=nobody
@@ -51,14 +160,21 @@ extract() {
clean=/clean
fi
- chroot_exec "${clean} && sudo -u ${user} ${MAKEPKG} ${makepkg_args} -o"
+ run "$copydir" "${clean} && sudo -u ${user} makepkg ${makepkg_args} -o"
+ rm -f "$copydir"/clean
}
+# Usage: build
+# Builds the package (`makepkg -e`)
+# Environment:
+# - $INCHROOT is set
+# - $copydir is set
+# - $LIBREUSER is set
build() {
local user=$LIBREUSER
$INCHROOT || user=nobody
- chroot_exec -N "sudo -u ${user} ${MAKEPKG} ${makepkg_args} -e"
+ run -N "$copydir" "sudo -u ${user} makepkg ${makepkg_args} -e"
}
# Functions that check for issues with the build ###############################
@@ -99,34 +215,39 @@ usage() {
echo "SRCDEST in the chroot's \`/etc/makepkg.conf', as well as making"
echo "whataver alterations to the chroot \`librechroot' makes."
echo ''
+ echo "The \`-n' and \`-l' options behave identically to librechroot,"
+ echo 'see the documentation there.'
+ echo ''
echo 'Options:'
- echo " -n <CHROOT> Use this chroot instead of \`$CHROOT'"
- echo " -l <COPY> Use this chroot copy instead \`$CHROOTCOPY'"
- echo " -m <MAKEPKG> Use the command MAKEPKG instead of \'makepkg'"
+ echo ' -n <CHROOT> Name of the chroot to use'
+ echo ' -l <COPY> Name of, or absolute path to, the copy to use'
+ echo ' -R Repackage contents of the package without rebuilding'
echo ' -h Show this message'
}
+# Globals: $CHROOTDIR, $CHROOT, $COPY and $copydir
+# Globals: $makepkg_args, $INCHROOT
main() {
# Parse command line ###################################################
- CHROOTCOPY=$LIBREUSER
- [[ $CHROOTCOPY != root ]] || CHROOTCOPY=copy
+ COPY=$LIBREUSER
+ [[ $COPY != root ]] || COPY=copy
makepkg_args='-s --noconfirm -L '
- MAKEPKG=makepkg
+ local repack=false
INCHROOT=false
if [[ -f /.arch-chroot ]]; then
INCHROOT=true
fi
- while getopts 'n:l:m:Rh' arg ; do
+ while getopts 'n:l:Rh' arg ; do
case "${arg}" in
n) CHROOT=$OPTARG;;
- l) CHROOTCOPY=$OPTARG;;
- m) MAKEPKG=$OPTARG;;
- h) usage; exit 0;;
- *) usage; exit 1;;
+ l) COPY=$OPTARG;;
+ R) repack=true; makepkg_args+=" -R";;
+ h) usage; return 0;;
+ *) usage; return 1;;
esac
done
shift $(($OPTIND - 1))
@@ -134,9 +255,11 @@ main() {
makepkg_args+=" $*"
if $INCHROOT; then
- copydir=''
+ copydir='/'
+ elif [[ ${COPY:0:1} = / ]]; then
+ copydir=$COPY
else
- copydir="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}"
+ copydir="${CHROOTDIR}/${CHROOT}/${COPY}"
fi
# Init #################################################################
@@ -148,14 +271,14 @@ main() {
if [[ ! -f PKGBUILD ]]; then
# This is the message used by makepkg
- error "PKGBUILD does not exist"
+ error "PKGBUILD does not exist."
exit 1
fi
# Trap signals from makepkg
trap 'trap_exit "(libremakepkg): TERM signal caught. Exiting..."' TERM HUP QUIT
trap 'trap_exit "(libremakepkg): Aborted by user! Exiting..."' INT
- trap 'trap_exit "(libremakepkg): An unknown error has occurred. Exiting..."' ERR
+ trap 'trap_exit "(libremakepkg): An error has occurred. Exiting..."' ERR
SRCDEST="$(get_conf_makepkg SRCDEST .)"
PKGDEST="$(get_conf_makepkg PKGDEST .)"
@@ -163,7 +286,7 @@ main() {
# OK, we're starting now ###############################################
lock_open_write 9 "$copydir" \
- "Waiting for existing lock on \`$copydir' to be released"
+ "Waiting for existing lock on chroot copy to be released: [$COPY]"
# Set target CARCH as it might be used within the PKGBUILD to select
# correct sources
@@ -171,17 +294,17 @@ main() {
export CARCH="$(get_conf_makepkg CARCH)"
unset MAKEPKG_CONF
- $INCHROOT || chroot_init
+ $INCHROOT || chroot_init "$copydir" "$repack"
check_pkgbuild
- $INCHROOT || chroot_copy_in
+ $INCHROOT || chroot_copy_in "$copydir"
extract
check_src
build
check_pkg
- add_to_local_repo
- $INCHROOT || chroot_copy_out
+ add_to_local_repo "$copydir"
+ $INCHROOT || chroot_copy_out "$copydir" "$LIBREUSER"
}
main "$@"
diff --git a/src/chroot-tools/libremkchroot b/src/chroot-tools/libremkchroot
deleted file mode 100755
index 6a13792..0000000
--- a/src/chroot-tools/libremkchroot
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/bin/bash -euE
-# libremkchroot
-
-# Copyright 2011, 2012 Luke Shumaker
-#
-# This file is part of Parabola.
-#
-# Parabola is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Parabola is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Parabola. If not, see <http://www.gnu.org/licenses/>.
-
-. /usr/share/libretools/conf.sh
-load_conf_libretools_chroot
-
-. "$(which libremessages)"
-
-cmd=${0##*/}
-
-usage() {
- echo "Usage: $cmd [OPTIONS] [CHROOT]"
- echo 'This script will create a chroot to build packages in.'
- echo "Use \`librechroot' to interact with the chroot after it is created."
- echo ''
- echo "The default CHROOT is \`${CHROOT}'."
- echo ''
- echo 'Options:'
- echo ' -h Show this message'
- echo ''
- echo ' -C <file> Location of pacman config file.'
- echo ' -M <file> Location of makepkg config file.'
-}
-
-main() {
- archroot_args=(-f);
- while getopts 'hC:M:' arg; do
- case "$arg" in
- C|M) archroot_args+=("-$arg" "$OPTARG");;
-
- h) usage; exit 0;;
- *) usage; exit 1;;
- esac
- done
- shift $(($OPTIND - 1))
- case $# in
- 0) :;;
- 1) CHROOT="$1";;
- *) usage; exit 1;;
- esac
-
- if (( EUID )); then
- error "This script must be run as root"
- exit 1
- fi
-
- mkdir -p "${CHROOTDIR}/${CHROOT}"
- archroot "${archroot_args[@]}" "${CHROOTDIR}/${CHROOT}/root" -i base base-devel sudo "${CHROOTEXTRAPKG[@]}"
-}
-
-main "$@"