From acf439224760c5c9ca54e4e9f6d80592bbe5a0d2 Mon Sep 17 00:00:00 2001 From: udeved Date: Mon, 27 Mar 2017 18:07:26 +0200 Subject: [PATCH] util-pkg: split out chroot part --- Makefile | 3 +- bin/buildpkg.in | 1 + bin/find-libdeps.in | 17 +--- lib/util-pkg-chroot.sh | 226 +++++++++++++++++++++++++++++++++++++++++ lib/util-pkg.sh | 224 +++------------------------------------- 5 files changed, 242 insertions(+), 229 deletions(-) create mode 100644 lib/util-pkg-chroot.sh diff --git a/Makefile b/Makefile index 2654f8b..0de9948 100644 --- a/Makefile +++ b/Makefile @@ -42,8 +42,7 @@ BIN_PKG = \ bin/buildtree LIBS_PKG = \ - lib/util-pkg.sh \ - lib/util-pkgtree.sh + $(wildcard lib/util-pkg*.sh) SHARED_PKG = \ data/makepkg.conf \ diff --git a/bin/buildpkg.in b/bin/buildpkg.in index 13fd3cd..10e99ba 100644 --- a/bin/buildpkg.in +++ b/bin/buildpkg.in @@ -21,6 +21,7 @@ SYSCONFDIR='@sysconfdir@' import ${LIBDIR}/util.sh import ${LIBDIR}/util-pkg.sh +import ${LIBDIR}/util-pkg-chroot.sh show_pkg(){ check_build "$1" diff --git a/bin/find-libdeps.in b/bin/find-libdeps.in index 7c48daf..1f61d3b 100644 --- a/bin/find-libdeps.in +++ b/bin/find-libdeps.in @@ -15,22 +15,7 @@ LIBDIR='@libdir@' [[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh -# $1: sofile -# $2: soarch -process_sofile() { - # extract the library name: libfoo.so - local soname="${1%.so?(+(.+([0-9])))}".so - # extract the major version: 1 - soversion="${1##*\.so\.}" - if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then - continue - fi - if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then - # libfoo.so=1-64 - msg "${soname}=${soversion}-$2" - soobjects+=("${soname}=${soversion}-$2") - fi -} +import ${LIBDIR}/util-pkg.sh set -e shopt -s extglob diff --git a/lib/util-pkg-chroot.sh b/lib/util-pkg-chroot.sh new file mode 100644 index 0000000..6779e2b --- /dev/null +++ b/lib/util-pkg-chroot.sh @@ -0,0 +1,226 @@ +#!/bin/bash +# +# This program 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; version 2 of the License. +# +# This program 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. + +load_compiler_settings(){ + local tarch="$1" conf + conf=${make_conf_dir}/$tarch.conf + + [[ -f $conf ]] || return 1 + + info "Loading compiler settings: %s" "$tarch" + source $conf + + return 0 +} + +get_makepkg_conf(){ + local conf="${tmp_dir}/makepkg-$1.conf" + + cp "${DATADIR}/makepkg.conf" "$conf" + + load_compiler_settings "$1" + + sed -i "$conf" \ + -e "s|@CARCH[@]|$carch|g" \ + -e "s|@CHOST[@]|$chost|g" \ + -e "s|@CFLAGS[@]|$cflags|g" + + echo "$conf" +} + +# $1: target_arch +prepare_conf(){ + if ! is_valid_arch_pkg "$1";then + die "%s is not a valid arch!" "$1" + fi + + local pac_arch='default' + + if [[ "$1" == 'multilib' ]];then + pac_arch='multilib' + is_multilib=true + fi + + pacman_conf="${DATADIR}/pacman-$pac_arch.conf" + + work_dir="${chroots_pkg}/${target_branch}/$1" + pkg_dir="${cache_dir_pkg}/${target_branch}/$1" + + makepkg_conf=$(get_makepkg_conf "$1") + + [[ "$pac_arch" == 'multilib' ]] && target_arch='x86_64' +} + +check_build(){ + find_pkg $1 + [[ ! -f $1/PKGBUILD ]] && die "Directory must contain a PKGBUILD!" +} + +find_pkg(){ + local result=$(find . -type d -name "$1") + [[ -z $result ]] && die "%s is not a valid package or build list!" "$1" +} + +load_group(){ + local _multi \ + _space="s| ||g" \ + _clean=':a;N;$!ba;s/\n/ /g' \ + _com_rm="s|#.*||g" \ + devel_group='' \ + file=${DATADIR}/base-devel-udev + + info "Loading custom group: %s" "$file" + + if ${is_multilib}; then + _multi="s|>multilib||g" + else + _multi="s|>multilib.*||g" + fi + + devel_group=$(sed "$_com_rm" "$file" \ + | sed "$_space" \ + | sed "$_multi" \ + | sed "$_clean") + + echo ${devel_group} +} + +init_base_devel(){ + if ${udev_root};then + base_packages=( "$(load_group)" ) + else + if ${is_multilib};then + base_packages=('base-devel' 'multilib-devel') + else + base_packages=('base-devel') + fi + fi +} + +chroot_create(){ + msg "Creating chroot for [%s] (%s)..." "${target_branch}" "${target_arch}" + mkdir -p "${work_dir}" + mkchroot_args+=(-L) + setarch "${target_arch}" \ + mkchroot ${mkchroot_args[*]} \ + "${work_dir}/root" \ + ${base_packages[*]} || abort +} + +chroot_clean(){ + msg "Cleaning chroot for [%s] (%s)..." "${target_branch}" "${target_arch}" + for copy in "${work_dir}"/*; do + [[ -d ${copy} ]] || continue + msg2 "Deleting chroot copy %s ..." "$(basename "${copy}")" + + lock 9 "${copy}.lock" "Locking chroot copy '${copy}'" + + subvolume_delete_recursive "${copy}" + rm -rf --one-file-system "${copy}" + done + exec 9>&- + + rm -rf --one-file-system "${work_dir}" +} + +chroot_update(){ + msg "Updating chroot for [%s] (%s)..." "${target_branch}" "${target_arch}" + chroot-run ${mkchroot_args[*]} \ + "${work_dir}/${OWNER}" \ + pacman -Syu --noconfirm || abort + +} + +clean_up(){ + msg "Cleaning up ..." + msg2 "Cleaning [%s]" "${pkg_dir}" + find ${pkg_dir} -maxdepth 1 -name "*.*" -delete #&> /dev/null + if [[ -z $SRCDEST ]];then + msg2 "Cleaning [source files]" + find $PWD -maxdepth 1 -name '*.?z?' -delete #&> /dev/null + fi +} + +sign_pkg(){ + su ${OWNER} -c "signfile ${pkg_dir}/$1" +} + +move_to_cache(){ + local src="$1" + [[ -n $PKGDEST ]] && src="$PKGDEST/$1" + [[ ! -f $src ]] && die + msg2 "Moving [%s] -> [%s]" "${src##*/}" "${pkg_dir}" + mv $src ${pkg_dir}/ + ${sign} && sign_pkg "${src##*/}" + [[ -n $PKGDEST ]] && rm "$1" + user_own "${pkg_dir}" "-R" +} + +archive_logs(){ + local archive name="$1" ext=log.tar.xz ver src=${tmp_dir}/archives.list target='.' + ver=$(get_full_version "$name") + archive="${name}-${ver}-${target_arch}" + if [[ -n $LOGDEST ]];then + target=$LOGDEST + find $target -maxdepth 1 -name "$archive*.log" -printf "%f\n" > $src + else + find $target -maxdepth 1 -name "$archive*.log" > $src + fi + msg2 "Archiving log files [%s] ..." "$archive.$ext" + tar -cJf ${log_dir}/$archive.$ext -C "$target" -T $src + msg2 "Cleaning log files ..." + + find $target -maxdepth 1 -name "$archive*.log" -delete +} + +post_build(){ + source PKGBUILD + local ext='pkg.tar.xz' tarch ver src + for pkg in ${pkgname[@]};do + case $arch in + any) tarch='any' ;; + *) tarch=${target_arch} + esac + local ver=$(get_full_version "$pkg") src + src=$pkg-$ver-$tarch.$ext + move_to_cache "$src" + done + local name=${pkgbase:-$pkgname} + archive_logs "$name" +} + +chroot_init(){ + local timer=$(get_timer) + if ${clean_first} || [[ ! -d "${work_dir}" ]]; then + chroot_clean + chroot_create + else + chroot_update + fi + show_elapsed_time "${FUNCNAME}" "${timer}" +} + +build_pkg(){ + setarch "${target_arch}" \ + mkchrootpkg ${mkchrootpkg_args[*]} + post_build +} + +make_pkg(){ + check_build "$1" + msg "Start building [%s]" "$1" + cd $1 + build_pkg + cd .. + msg "Finished building [%s]" "$1" + show_elapsed_time "${FUNCNAME}" "${timer_start}" +} + diff --git a/lib/util-pkg.sh b/lib/util-pkg.sh index 9a6d409..39b5ff4 100644 --- a/lib/util-pkg.sh +++ b/lib/util-pkg.sh @@ -9,54 +9,21 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -load_compiler_settings(){ - local tarch="$1" conf - conf=${make_conf_dir}/$tarch.conf - - [[ -f $conf ]] || return 1 - - info "Loading compiler settings: %s" "$tarch" - source $conf - - return 0 -} - -get_makepkg_conf(){ - local conf="${tmp_dir}/makepkg-$1.conf" - - cp "${DATADIR}/makepkg.conf" "$conf" - - load_compiler_settings "$1" - - sed -i "$conf" \ - -e "s|@CARCH[@]|$carch|g" \ - -e "s|@CHOST[@]|$chost|g" \ - -e "s|@CFLAGS[@]|$cflags|g" - - echo "$conf" -} - -# $1: target_arch -prepare_conf(){ - if ! is_valid_arch_pkg "$1";then - die "%s is not a valid arch!" "$1" +# $1: sofile +# $2: soarch +process_sofile() { + # extract the library name: libfoo.so + local soname="${1%.so?(+(.+([0-9])))}".so + # extract the major version: 1 + soversion="${1##*\.so\.}" + if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then + continue fi - - local pac_arch='default' - - if [[ "$1" == 'multilib' ]];then - pac_arch='multilib' - is_multilib=true + if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then + # libfoo.so=1-64 + msg "${soname}=${soversion}-$2" + soobjects+=("${soname}=${soversion}-$2") fi - - pacman_conf="${DATADIR}/pacman-$pac_arch.conf" - - work_dir="${chroots_pkg}/${target_branch}/$1" - pkg_dir="${cache_dir_pkg}/${target_branch}/$1" - - makepkg_conf=$(get_makepkg_conf "$1") - - [[ "$pac_arch" == 'multilib' ]] && target_arch='x86_64' } pkgver_equal() { @@ -144,168 +111,3 @@ find_cached_package() { ;; esac } - -check_build(){ - find_pkg $1 - [[ ! -f $1/PKGBUILD ]] && die "Directory must contain a PKGBUILD!" -} - -find_pkg(){ - local result=$(find . -type d -name "$1") - [[ -z $result ]] && die "%s is not a valid package or build list!" "$1" -} - -load_group(){ - local _multi \ - _space="s| ||g" \ - _clean=':a;N;$!ba;s/\n/ /g' \ - _com_rm="s|#.*||g" \ - devel_group='' \ - file=${DATADIR}/base-devel-udev - - info "Loading custom group: %s" "$file" - - if ${is_multilib}; then - _multi="s|>multilib||g" - else - _multi="s|>multilib.*||g" - fi - - devel_group=$(sed "$_com_rm" "$file" \ - | sed "$_space" \ - | sed "$_multi" \ - | sed "$_clean") - - echo ${devel_group} -} - -init_base_devel(){ - if ${udev_root};then - base_packages=( "$(load_group)" ) - else - if ${is_multilib};then - base_packages=('base-devel' 'multilib-devel') - else - base_packages=('base-devel') - fi - fi -} - -chroot_create(){ - msg "Creating chroot for [%s] (%s)..." "${target_branch}" "${target_arch}" - mkdir -p "${work_dir}" - mkchroot_args+=(-L) - setarch "${target_arch}" \ - mkchroot ${mkchroot_args[*]} \ - "${work_dir}/root" \ - ${base_packages[*]} || abort -} - -chroot_clean(){ - msg "Cleaning chroot for [%s] (%s)..." "${target_branch}" "${target_arch}" - for copy in "${work_dir}"/*; do - [[ -d ${copy} ]] || continue - msg2 "Deleting chroot copy %s ..." "$(basename "${copy}")" - - lock 9 "${copy}.lock" "Locking chroot copy '${copy}'" - - subvolume_delete_recursive "${copy}" - rm -rf --one-file-system "${copy}" - done - exec 9>&- - - rm -rf --one-file-system "${work_dir}" -} - -chroot_update(){ - msg "Updating chroot for [%s] (%s)..." "${target_branch}" "${target_arch}" - chroot-run ${mkchroot_args[*]} \ - "${work_dir}/${OWNER}" \ - pacman -Syu --noconfirm || abort - -} - -clean_up(){ - msg "Cleaning up ..." - msg2 "Cleaning [%s]" "${pkg_dir}" - find ${pkg_dir} -maxdepth 1 -name "*.*" -delete #&> /dev/null - if [[ -z $SRCDEST ]];then - msg2 "Cleaning [source files]" - find $PWD -maxdepth 1 -name '*.?z?' -delete #&> /dev/null - fi -} - -sign_pkg(){ - su ${OWNER} -c "signfile ${pkg_dir}/$1" -} - -move_to_cache(){ - local src="$1" - [[ -n $PKGDEST ]] && src="$PKGDEST/$1" - [[ ! -f $src ]] && die - msg2 "Moving [%s] -> [%s]" "${src##*/}" "${pkg_dir}" - mv $src ${pkg_dir}/ - ${sign} && sign_pkg "${src##*/}" - [[ -n $PKGDEST ]] && rm "$1" - user_own "${pkg_dir}" "-R" -} - -archive_logs(){ - local archive name="$1" ext=log.tar.xz ver src=${tmp_dir}/archives.list target='.' - ver=$(get_full_version "$name") - archive="${name}-${ver}-${target_arch}" - if [[ -n $LOGDEST ]];then - target=$LOGDEST - find $target -maxdepth 1 -name "$archive*.log" -printf "%f\n" > $src - else - find $target -maxdepth 1 -name "$archive*.log" > $src - fi - msg2 "Archiving log files [%s] ..." "$archive.$ext" - tar -cJf ${log_dir}/$archive.$ext -C "$target" -T $src - msg2 "Cleaning log files ..." - - find $target -maxdepth 1 -name "$archive*.log" -delete -} - -post_build(){ - source PKGBUILD - local ext='pkg.tar.xz' tarch ver src - for pkg in ${pkgname[@]};do - case $arch in - any) tarch='any' ;; - *) tarch=${target_arch} - esac - local ver=$(get_full_version "$pkg") src - src=$pkg-$ver-$tarch.$ext - move_to_cache "$src" - done - local name=${pkgbase:-$pkgname} - archive_logs "$name" -} - -chroot_init(){ - local timer=$(get_timer) - if ${clean_first} || [[ ! -d "${work_dir}" ]]; then - chroot_clean - chroot_create - else - chroot_update - fi - show_elapsed_time "${FUNCNAME}" "${timer}" -} - -build_pkg(){ - setarch "${target_arch}" \ - mkchrootpkg ${mkchrootpkg_args[*]} - post_build -} - -make_pkg(){ - check_build "$1" - msg "Start building [%s]" "$1" - cd $1 - build_pkg - cd .. - msg "Finished building [%s]" "$1" - show_elapsed_time "${FUNCNAME}" "${timer_start}" -}