diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | arch-nspawn.in | 28 | ||||
-rw-r--r-- | archbuild.in | 32 | ||||
-rw-r--r-- | makechrootpkg.in | 11 | ||||
-rw-r--r-- | pacman-staging-i686.conf | 99 | ||||
-rw-r--r-- | pacman-staging-with-build-support-i686.conf | 102 |
6 files changed, 261 insertions, 14 deletions
@@ -24,6 +24,8 @@ CONFIGFILES = \ pacman-extra.conf \ pacman-testing.conf \ pacman-staging.conf \ + pacman-staging-i686.conf \ + pacman-staging-with-build-support-i686.conf \ pacman-multilib.conf \ pacman-multilib-testing.conf \ pacman-multilib-staging.conf \ @@ -50,6 +52,7 @@ ARCHBUILD_LINKS = \ testing-i686-build \ testing-x86_64-build \ staging-i686-build \ + staging-with-build-support-i686-build \ staging-x86_64-build \ multilib-build \ multilib-testing-build \ diff --git a/arch-nspawn.in b/arch-nspawn.in index c55f498..a0b00af 100644 --- a/arch-nspawn.in +++ b/arch-nspawn.in @@ -58,9 +58,28 @@ else cache_dirs=("$cache_dir") fi +if [[ -n $makepkg_conf ]]; then + eval "$(grep '^CARCH=' "$makepkg_conf")" +else + eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")" +fi + +if [[ "$CARCH" = 'i'*'86' ]]; then + host_mirror="$( + sed -n ' + /^\s*Server\s*=/{ + s/^.*=\s*// + s/\s*\(#.*\)\?$// + p + q + }' \ + '/etc/pacman.d/mirrorlist32' + )" +else # shellcheck disable=2016 -host_mirror=$(pacman --cachedir /doesnt/exist -Sddp extra/devtools 2>/dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#') + host_mirror=$(pacman --cachedir /doesnt/exist -Sddp extra/devtools 2>/dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#;s#(.*/)[^/]+/extra/[^/]+#\1$arch/$repo#') # shellcheck disable=2016 +fi [[ $host_mirror == *file://* ]] && host_mirror_path=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') # {{{ functions @@ -80,7 +99,9 @@ build_mount_args() { copy_hostconf () { cp -a /etc/pacman.d/gnupg "$working_dir/etc/pacman.d" - echo "Server = $host_mirror" >"$working_dir/etc/pacman.d/mirrorlist" + echo "Server = $host_mirror" | \ + tee "$working_dir/etc/pacman.d/mirrorlist" > \ + "$working_dir/etc/pacman.d/mirrorlist32" [[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf" [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf" @@ -92,6 +113,7 @@ copy_hostconf () { done sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n "${cache_dirs[@]}")|g" -i "$working_dir/etc/pacman.conf" + sed -i '/^Architecture = /s| auto$| '"$CARCH|" "$working_dir/etc/pacman.conf" } # }}} @@ -107,8 +129,6 @@ fi build_mount_args copy_hostconf -eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")" - [[ -z $nosetarch ]] || unset CARCH exec ${CARCH:+setarch "$CARCH"} systemd-nspawn -q \ diff --git a/archbuild.in b/archbuild.in index 8339aef..7e1a964 100644 --- a/archbuild.in +++ b/archbuild.in @@ -11,11 +11,17 @@ cmd="${0##*/}" if [[ "${cmd%%-*}" == 'multilib' ]]; then repo="${cmd%-build}" arch='x86_64' + arch_ext='' base_packages+=(multilib-devel) else tag="${cmd%-build}" repo=${tag%-*} arch=${tag##*-} + if [ "${arch}" = 'x86_64' ]; then + arch_ext='' + else + arch_ext="-${arch}" + fi fi chroots='/var/lib/archbuild' clean_first=false @@ -41,6 +47,14 @@ done check_root +if [ "${arch}" = "x86_64" ]; then + cache_dir='' +else + mkdir -p '/var/cache/archbuild32' + cache_dir='-c/var/cache/archbuild32' + makechrootpkg_args+=('-d/var/cache/archbuild32:/var/cache/pacman/pkg') +fi + # Pass all arguments after -- right to makepkg makechrootpkg_args+=("${@:$OPTIND}") @@ -55,23 +69,35 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then subvolume_delete_recursive "${copy}" rm -rf --one-file-system "${copy}" + if [ -d "${copy}" ]; then + find "${copy}" \ + -xdev -mindepth 1 -type d \ + -exec 'mountpoint' '-q' '{}' ';' \ + -exec 'umount' '-l' '{}' ';' + rm -rf --one-file-system "${copy}" + mountpoint -q "${copy}" && \ + umount -l "${copy}" && \ + rmdir "${copy}" + fi done lock_close 9 rm -rf --one-file-system "${chroots}/${repo}-${arch}" mkdir -p "${chroots}/${repo}-${arch}" setarch "${arch}" mkarchroot \ - -C "@pkgdatadir@/pacman-${repo}.conf" \ + -C "@pkgdatadir@/pacman-${repo}${arch_ext}.conf" \ -M "@pkgdatadir@/makepkg-${arch}.conf" \ + ${cache_dir} \ "${chroots}/${repo}-${arch}/root" \ "${base_packages[@]}" || abort else lock 9 "${chroots}/${repo}-${arch}/root.lock" "Locking clean chroot" arch-nspawn \ - -C "@pkgdatadir@/pacman-${repo}.conf" \ + -C "@pkgdatadir@/pacman-${repo}${arch_ext}.conf" \ -M "@pkgdatadir@/makepkg-${arch}.conf" \ + ${cache_dir} \ "${chroots}/${repo}-${arch}/root" \ - pacman -Syu --noconfirm || abort + pacman --arch ${arch} -Syu --noconfirm || abort fi msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}" diff --git a/makechrootpkg.in b/makechrootpkg.in index 8724355..d9686e9 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -209,6 +209,7 @@ prepare_chroot() { [[ -r $USER_HOME/$x ]] || continue $install -m 644 "$USER_HOME/$x" "$copydir/build/$x" done + echo 'keyserver-options auto-key-retrieve' >> "$copydir/build/.gnupg/gpg.conf" sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf" for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \ @@ -273,17 +274,13 @@ download_sources() { local copydir=$1 local makepkg_user=$2 - local builddir - builddir="$(mktemp -d)" - chmod 1777 "$builddir" + setup_workdir + chown "$makepkg_user" "$WORKDIR" # Ensure sources are downloaded - sudo -u "$makepkg_user" env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \ + sudo -u "$makepkg_user" env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o || die "Could not download sources." - - # Clean up garbage from verifysource - rm -rf "$builddir" } # Usage: move_products $copydir $owner diff --git a/pacman-staging-i686.conf b/pacman-staging-i686.conf new file mode 100644 index 0000000..540c5f7 --- /dev/null +++ b/pacman-staging-i686.conf @@ -0,0 +1,99 @@ +# +# /etc/pacman.conf +# +# See the pacman.conf(5) manpage for option and repository directives + +# +# GENERAL OPTIONS +# +[options] +# The following paths are commented out with their default values listed. +# If you wish to use different paths, uncomment and update the paths. +#RootDir = / +#DBPath = /var/lib/pacman/ +#CacheDir = /var/cache/pacman/pkg/ +#LogFile = /var/log/pacman.log +#GPGDir = /etc/pacman.d/gnupg/ +#HookDir = /etc/pacman.d/hooks/ +HoldPkg = pacman glibc +#XferCommand = /usr/bin/curl -C - -f %u > %o +#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u +#CleanMethod = KeepInstalled +#UseDelta = 0.7 +Architecture = auto + +# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup +#IgnorePkg = +#IgnoreGroup = + +#NoUpgrade = +#NoExtract = + +# Misc options +#UseSyslog +#Color +#TotalDownload +# We cannot check disk space from within a chroot environment +#CheckSpace +#VerbosePkgLists + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +SigLevel = Required DatabaseOptional +LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required + +# NOTE: You must run `pacman-key --init` before first using pacman; the local +# keyring can then be populated with the keys of all official Arch Linux +# packagers with `pacman-key --populate archlinux`. + +# +# REPOSITORIES +# - can be defined here or included from another file +# - pacman will search repositories in the order defined here +# - local/custom mirrors can be added here or in separate files +# - repositories listed first will take precedence when packages +# have identical names, regardless of version number +# - URLs will have $repo replaced by the name of the current repo +# - URLs will have $arch replaced by the name of the architecture +# +# Repository entries are of the format: +# [repo-name] +# Server = ServerName +# Include = IncludePath +# +# The header [repo-name] is crucial - it must be present and +# uncommented to enable the repo. +# + +# The testing repositories are disabled by default. To enable, uncomment the +# repo name header and Include lines. You can add preferred servers immediately +# after the header, and they will be used before the default mirrors. + +[staging] +Include = /etc/pacman.d/mirrorlist32 + +[testing] +Include = /etc/pacman.d/mirrorlist32 + +[core] +Include = /etc/pacman.d/mirrorlist32 + +[extra] +Include = /etc/pacman.d/mirrorlist32 + +[community-staging] +Include = /etc/pacman.d/mirrorlist32 + +[community-testing] +Include = /etc/pacman.d/mirrorlist32 + +[community] +Include = /etc/pacman.d/mirrorlist32 + +# An example of a custom package repository. See the pacman manpage for +# tips on creating your own repositories. +#[custom] +#SigLevel = Optional TrustAll +#Server = file:///home/custompkgs + diff --git a/pacman-staging-with-build-support-i686.conf b/pacman-staging-with-build-support-i686.conf new file mode 100644 index 0000000..e6baf03 --- /dev/null +++ b/pacman-staging-with-build-support-i686.conf @@ -0,0 +1,102 @@ +# +# /etc/pacman.conf +# +# See the pacman.conf(5) manpage for option and repository directives + +# +# GENERAL OPTIONS +# +[options] +# The following paths are commented out with their default values listed. +# If you wish to use different paths, uncomment and update the paths. +#RootDir = / +#DBPath = /var/lib/pacman/ +#CacheDir = /var/cache/pacman/pkg/ +#LogFile = /var/log/pacman.log +#GPGDir = /etc/pacman.d/gnupg/ +#HookDir = /etc/pacman.d/hooks/ +HoldPkg = pacman glibc +#XferCommand = /usr/bin/curl -C - -f %u > %o +#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u +#CleanMethod = KeepInstalled +#UseDelta = 0.7 +Architecture = auto + +# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup +#IgnorePkg = +#IgnoreGroup = + +#NoUpgrade = +#NoExtract = + +# Misc options +#UseSyslog +#Color +#TotalDownload +# We cannot check disk space from within a chroot environment +#CheckSpace +#VerbosePkgLists + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +SigLevel = Required DatabaseOptional +LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required + +# NOTE: You must run `pacman-key --init` before first using pacman; the local +# keyring can then be populated with the keys of all official Arch Linux +# packagers with `pacman-key --populate archlinux`. + +# +# REPOSITORIES +# - can be defined here or included from another file +# - pacman will search repositories in the order defined here +# - local/custom mirrors can be added here or in separate files +# - repositories listed first will take precedence when packages +# have identical names, regardless of version number +# - URLs will have $repo replaced by the name of the current repo +# - URLs will have $arch replaced by the name of the architecture +# +# Repository entries are of the format: +# [repo-name] +# Server = ServerName +# Include = IncludePath +# +# The header [repo-name] is crucial - it must be present and +# uncommented to enable the repo. +# + +# The testing repositories are disabled by default. To enable, uncomment the +# repo name header and Include lines. You can add preferred servers immediately +# after the header, and they will be used before the default mirrors. + +[build-support] +Include = /etc/pacman.d/mirrorlist32 + +[staging] +Include = /etc/pacman.d/mirrorlist32 + +[testing] +Include = /etc/pacman.d/mirrorlist32 + +[core] +Include = /etc/pacman.d/mirrorlist32 + +[extra] +Include = /etc/pacman.d/mirrorlist32 + +[community-staging] +Include = /etc/pacman.d/mirrorlist32 + +[community-testing] +Include = /etc/pacman.d/mirrorlist32 + +[community] +Include = /etc/pacman.d/mirrorlist32 + +# An example of a custom package repository. See the pacman manpage for +# tips on creating your own repositories. +#[custom] +#SigLevel = Optional TrustAll +#Server = file:///home/custompkgs + |