diff options
author | Aaron Ball <nullspoon@oper.io> | 2017-06-29 23:53:09 -0600 |
---|---|---|
committer | Aaron Ball <nullspoon@oper.io> | 2017-06-29 23:53:09 -0600 |
commit | f53ea89e1c5a0b03e9acf1d070c84a8c05028108 (patch) | |
tree | 4e6b4c2067a8a34bf443b3b9201df501cccd77d5 | |
parent | 9f9f56299cc2d39c8d328d96018c489e6703744d (diff) | |
parent | 28d9586478fd9dba9c29881f7f22733deecf718a (diff) | |
download | portimg-f53ea89e1c5a0b03e9acf1d070c84a8c05028108.tar.gz portimg-f53ea89e1c5a0b03e9acf1d070c84a8c05028108.tar.xz |
* pkgimg-refactor:
Refactored pkgimg.sh
-rwxr-xr-x | bin/pkgimg.sh | 134 |
1 files changed, 100 insertions, 34 deletions
diff --git a/bin/pkgimg.sh b/bin/pkgimg.sh index 7d0df70..3c290e3 100755 --- a/bin/pkgimg.sh +++ b/bin/pkgimg.sh @@ -16,10 +16,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # -set -u +set -eu export BASEDIR="$(cd $(dirname ${0})/../ && pwd)" export LIBDIR="${BASEDIR}/lib" +export BINDIR="${BASEDIR}/bin" source ${LIBDIR}/log.sh source ${LIBDIR}/pkg.sh @@ -28,10 +29,52 @@ source ${LIBDIR}/common.sh export PORTSDIR=${PORTSDIR:-${BASEDIR}/ports} export KEEP_BUILD=${KEEP_BUILD:-0} -function main { - local manifest=${1:-} - local _installbase # Path to the temporary image working directory +usage() { + printf " +Pkgimg is a wrapper script for a simple ports system build process. The ports +system provides build instructions for individual packages/ports. The pkgimg +script will build multiple ports into the same working directory, creating a +composite port package image. + +Usage: + pkgimg.sh [-c addtional_configs] <ports.manifest> + +Arguments: + -h,--help Print this help text + -c,--config Import additional configs file (shell syntax) +" +} + +img_mkpkg() { + local _imgname=${1:-} + local _imgversion=${2:-} + local _imgrelease=${3:-} + local _imgsrc=${4:-} + + local _imgbuildname + + _imgbuildname="${_imgname}#${_imgversion}_${_imgrelease}" + + linfo "Generating footprint file for ${_imgname}" + footprint_dir ${_imgsrc} > ${BASEDIR}/${_imgbuildname}.footprint + + linfo "Creating deployment tarball from ${_imgsrc}" + tar -cf ${BASEDIR}/${_imgbuildname}.tar -C ${_imgsrc} . + + linfo "Compressing ${_imgname}.tar" + xz -v ${BASEDIR}/${_imgbuildname}.tar + + # linfo "Build dir: ${_dest}" + # linfo "Deployment tarball: ${BASEDIR}/${_imgbuildname}.tar.xz" + # linfo "Tarball footprint: ${BASEDIR}/${_imgbuildname}.footprint" +} + + +build_manifest() { + local _manifest=${1:-} + local _installbase=${2:-} + local _porttmp # Path to the temporary package working directory # Port image variables @@ -41,16 +84,16 @@ function main { local _imgrelease # Release number of the image local _imgbuildname # Name of the built image file - if [[ -z "${manifest}" ]]; then + if [[ -z "${_manifest}" ]]; then lerror "Please specify a port manifest." return 1 fi - if [[ ! -f "${manifest}" ]]; then + if [[ ! -f "${_manifest}" ]]; then lerror "Path '${manifest}' does not exist or is not a manifest" return 2 fi - source ${manifest} + source ${_manifest} # Set all these variables as the same variables will be set later by port # files _imgname=${name} && unset 'name' @@ -58,47 +101,70 @@ function main { _imgversion=${version} && unset 'version' _imgrelease=${release} && unset 'release' _imgbuildname="${_imgname}#${_imgversion}_${_imgrelease}" + _installbase="$(mktemp -d /tmp/pkgimg-${_imgbuildname}.XXXX)" - # Convert portsdir to absolute path - PORTSDIR="$(cd ${PORTSDIR} && pwd)" - - _installbase=$(mktemp -d /tmp/pkgimg-${_imgbuildname}.XXXX) # Loop over each port in the manifest for port in ${_imgdepends[@]}; do - # Call pkgmk to build the port - pkgmk ${port} '_porttmp' + # Build the package + ${BINDIR}/pkgmk.sh ${port} [ $? -gt 0 ] && return 1 - # Move the package contents to the install base - linfo "Synchronizing ${port} build to install base ${_installbase}" - rsync -a ${_porttmp}/pkg/ ${_installbase}/ + # Install the package to the image install base + ${BINDIR}/pkgadd.sh "${port}" "${_installbase}" + [ $? -gt 0 ] && return 1 + done - # Cleanup - if [ "${KEEP_BUILD}" = 0 ]; then - rm -rf ${_porttmp} + # Assemble the package composite + img_mkpkg "${_imgname}" "${_imgversion}" "${_imgrelease}" "${_installbase}" +} + +function main { + local argv=(${@}) + + local i=0 + local _configs=() # List of config files to load + local _config # Single config file to include + local _installbase # Path to the temporary image working directory + local _manifest # Manifest file to compile + + for (( i=0; i < ${#argv[@]}; i++ )); do + if [ ${argv[$i]} == '-c' ] || [ ${argv[$i]} == '--config' ]; then + i=$(( i + 1 )) + _configs+=(${argv[$i]}) + elif [ -f ${argv[$i]} ]; then + # If no switch was detected at this argument index, test to see if a + # manifest file exists at argument path. If so, assume it is a manifest + # file + _manifest="${argv[$i]}" + elif [ ${argv[$i]} == '-h' ] || [ ${argv[$i]} == '--help' ]; then + usage + return 0 else - linfo "KEEP_BUILD is set. Skipping cleanup of ${port}." + printf "No arguments specified (for help, run with -h,--help).\n" + return 1 fi done - linfo "Generating footprint file for ${_installbase}" - footprint_dir ${_installbase} > ${_installbase}.footprint - - linfo "Creating deployment tarball from ${_installbase}" - tar -cf ${_installbase}.tar -C ${_installbase} ./* - - linfo "Compressing ${_installbase}.tar" - xz -v ${_installbase}.tar + # Ensure a manifest file was specified + if [ -z "${_manifest:-}" ]; then + printf "No manifest file specified.\n" + return 1 + fi - # Move the package and footprint to current directory - mv ${_installbase}.tar.xz ${BASEDIR}/${_imgbuildname}.tar.xz - mv ${_installbase}.footprint ${BASEDIR}/${_imgbuildname}.footprint + for _config in ${_configs[@]}; do + if [ -f ${_config} ]; then + source ${_config} + continue + fi + printf "Could not find or access config '%s'\n" "${_config}" + return 2 + done - linfo "Build dir: ${_installbase}" - linfo "Deployment tarball: ${BASEDIR}/${_imgbuildname}.tar.xz" - linfo "Tarball footprint: ${BASEDIR}/${_imgbuildname}.footprint" + # Convert portsdir to absolute path + PORTSDIR="$(cd ${PORTSDIR} && pwd)" + build_manifest "${_manifest}" } main ${@} |