Compare commits

..

9 Commits

Author SHA1 Message Date
Martchus 6e4ac88443 Set TERM within the systemd-nspawn container in makechrootpkg
This is required by WINE to prevent
```
unknown: I need something more specific
```
2020-05-20 16:35:37 +02:00
Martchus 342d07e271 Adjust systemd-nspawn flags
* Remove --keep-unit since it causes sometimes errors and does not seem
  to be required
* Increase maximum number of open files (the default of 1000 is too less
  for some packages)
* Use /etc/resolv.conf from host (otherwise systemd-nspawn uses a config
  which does not work on my host setup)
2020-05-20 16:35:27 +02:00
Kevin Mihelich af391deb11 makechrootpkg: don't delete MAKEFLAGS and PACKAGER 2020-05-20 16:34:39 +02:00
Kevin Mihelich c974b39667 archbuild: no setarch 2020-05-20 16:34:39 +02:00
Kevin Mihelich 773fec5dab makechrootpkg: no default logging 2020-05-20 16:34:39 +02:00
Kevin Mihelich eb3f3e32b5 arch-nspawn: arm fix 2020-05-20 16:34:39 +02:00
Kevin Mihelich 091f17998b makechrootpkg: distcc 2020-05-20 16:34:39 +02:00
Kevin Mihelich 03424d6b86 arch-nspawn: keep mirrorlist 2020-05-20 16:34:39 +02:00
Kevin Mihelich 1b8f057508 makechrootpkg: cache dir 2020-05-20 16:34:39 +02:00
11 changed files with 46 additions and 139 deletions

1
.gitignore vendored
View File

@ -19,4 +19,3 @@ crossrepomove
arch-nspawn arch-nspawn
sogrep sogrep
doc/*.1 doc/*.1
doc/*.7

View File

@ -1,4 +1,4 @@
V=20210202 V=20200407
PREFIX = /usr/local PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man MANDIR = $(PREFIX)/share/man
@ -75,8 +75,7 @@ MANS = \
doc/makerepropkg.1 \ doc/makerepropkg.1 \
doc/mkarchroot.1 \ doc/mkarchroot.1 \
doc/find-libdeps.1 \ doc/find-libdeps.1 \
doc/find-libprovides.1 \ doc/find-libprovides.1
doc/devtools.7
all: $(BINPROGS) bash_completion zsh_completion man all: $(BINPROGS) bash_completion zsh_completion man

View File

@ -97,7 +97,7 @@ copy_hostconf () {
unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1 unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1
pacman-key --gpgdir "$working_dir"/etc/pacman.d/gnupg/ --import-trustdb "$(pacman-conf GpgDir)" >/dev/null 2>&1 pacman-key --gpgdir "$working_dir"/etc/pacman.d/gnupg/ --import-trustdb "$(pacman-conf GpgDir)" >/dev/null 2>&1
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" #printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf" [[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf" [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
@ -127,9 +127,12 @@ eval "$(grep -a '^CARCH=' "$working_dir/etc/makepkg.conf")"
[[ -z $nosetarch ]] || unset CARCH [[ -z $nosetarch ]] || unset CARCH
exec ${CARCH:+setarch "$CARCH"} systemd-nspawn -q \ exec systemd-nspawn -q \
-D "$working_dir" \ -D "$working_dir" \
-E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \ -E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \
--register=no --keep-unit --as-pid2 \ --register=no \
--as-pid2 \
--rlimit=NOFILE=10000 \
--resolv-conf=copy-host \
"${mount_args[@]}" \ "${mount_args[@]}" \
"$@" "$@"

View File

@ -69,7 +69,7 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
rm -rf --one-file-system "${chroots}/${repo}-${arch}" rm -rf --one-file-system "${chroots}/${repo}-${arch}"
(umask 0022; mkdir -p "${chroots}/${repo}-${arch}") (umask 0022; mkdir -p "${chroots}/${repo}-${arch}")
setarch "${arch}" mkarchroot \ mkarchroot \
-C "${pacman_config}" \ -C "${pacman_config}" \
-M "${makepkg_config}" \ -M "${makepkg_config}" \
"${chroots}/${repo}-${arch}/root" \ "${chroots}/${repo}-${arch}/root" \

View File

@ -1,46 +0,0 @@
devtools(7)
===========
Name
----
devtools - Developer tools for the Arch Linux distribution
Description
-----------
Devtools contains tools for package maintenance in Arch Linux. The toolset
varies from tools for building packages in a clean chroot ('mkarchroot',...),
packaging related tools for sonames ('sogrep', 'lddd') and tools for
repository management such as ('archco', 'extra2community')
Programs
--------
The list below gives a short overview; see the respective documentation
for details.
linkman:checkpkg[1]
Compare the current build pakcage with the repository version
linkman:find-libdeps[1]
Find soname dependencies for a package
linkman:find-libprovides[1]
Find soname's which are provided by a package
linkman:lddd[1]
Find broken library links on your system
linkman:makerepropkg[1]
Rebuild a package to see if it is reproducible
linkman:mkarchroot[1]
Creates an arch chroot in a specified location with a specified set of
packages
linkman:offload-build[1]
Build a PKGBUILD on a remote server using makechrootpkg
linkman:sogrep[1]
Find packages using a linked to a given shared library
include::footer.asciidoc[]

View File

@ -7,7 +7,7 @@ makerepropkg - Rebuild a package to see if it is reproducible
Synopsis Synopsis
-------- --------
makerepropkg [OPTIONS] [<package_file|pkgname>...] makerepropkg [OPTIONS] <package_file>...
Description Description
----------- -----------
@ -24,15 +24,6 @@ When given multiple packages, additional package files are assumed to be split
packages and will be treated as additional artifacts to compare during the packages and will be treated as additional artifacts to compare during the
verification step. verification step.
A valid target(s) for pacman -S can be specified instead, and makerepropkg will
download it to the cache if needed. This is mostly useful to specify which
repository to retrieve from. If no positional arguments are specified, the
targets will be sourced from the PKGBUILD.
In either case, the package name will be converted to a filename from the
cache, and makerepropkg will proceed as though this filename was initially
specified.
This implements a verifier for pacman/libalpm packages in accordance with the This implements a verifier for pacman/libalpm packages in accordance with the
link:https://reproducible-builds.org/[Reproducible Builds] project. link:https://reproducible-builds.org/[Reproducible Builds] project.

View File

@ -28,7 +28,7 @@ Options
architecture officially supported by Arch Linux. architecture officially supported by Arch Linux.
*-s, --server* <hostname>:: *-s, --server* <hostname>::
Offload to a specific build server. The default is build.archlinux.org Offload to a specific build server. The default is dragon.archlinux.org
which is used as part of the build toolchain for the official Arch Linux which is used as part of the build toolchain for the official Arch Linux
repos. repos.

View File

@ -17,7 +17,7 @@ source /usr/share/makepkg/util/config.sh
shopt -s nullglob shopt -s nullglob
default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg) default_makepkg_args=(--syncdeps --noconfirm --holdver --skipinteg)
makepkg_args=("${default_makepkg_args[@]}") makepkg_args=("${default_makepkg_args[@]}")
verifysource_args=() verifysource_args=()
chrootdir= chrootdir=
@ -64,6 +64,7 @@ usage() {
echo 'Flags:' echo 'Flags:'
echo '-h This help' echo '-h This help'
echo '-c Clean the chroot before building' echo '-c Clean the chroot before building'
echo '-C <dir> Set pacman cache to pass to arch-nspawn'
echo '-d <dir> Bind directory into build chroot as read-write' echo '-d <dir> Bind directory into build chroot as read-write'
echo '-D <dir> Bind directory into build chroot as read-only' echo '-D <dir> Bind directory into build chroot as read-only'
echo '-u Update the working copy of the chroot before building' echo '-u Update the working copy of the chroot before building'
@ -171,9 +172,7 @@ prepare_chroot() {
$install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest} $install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest}
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
for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \
"MAKEFLAGS='${MAKEFLAGS:-}'" "PACKAGER='${PACKAGER:-}'"
do do
grep -q "^$x" "$copydir/etc/makepkg.conf" && continue grep -q "^$x" "$copydir/etc/makepkg.conf" && continue
echo "$x" >>"$copydir/etc/makepkg.conf" echo "$x" >>"$copydir/etc/makepkg.conf"
@ -213,7 +212,9 @@ _chrootbuild() {
# use "$" in arguments to commands with "sudo -i". ${foo} or # use "$" in arguments to commands with "sudo -i". ${foo} or
# ${1} is OK, but $foo or $1 isn't. # ${1} is OK, but $foo or $1 isn't.
# https://bugzilla.sudo.ws/show_bug.cgi?id=765 # https://bugzilla.sudo.ws/show_bug.cgi?id=765
sudo --preserve-env=SOURCE_DATE_EPOCH -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@" mkdir /build/.distcc
chown builduser /build/.distcc
sudo --preserve-env=SOURCE_DATE_EPOCH -iu builduser DISTCC_IO_TIMEOUT=1200 DISTCC_DIR='/build/.distcc' bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$? ret=$?
case $ret in case $ret in
0|14) 0|14)
@ -238,19 +239,10 @@ download_sources() {
# Ensure sources are downloaded # Ensure sources are downloaded
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \ sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || makepkg -A --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" ||
die "Could not download sources." die "Could not download sources."
} }
move_logfiles() {
local l
for l in "$copydir"/logdest/*; do
[[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
mv "$l" "$LOGDEST"
done
}
move_products() { move_products() {
local pkgfile local pkgfile
for pkgfile in "$copydir"/pkgdest/*; do for pkgfile in "$copydir"/pkgdest/*; do
@ -263,7 +255,12 @@ move_products() {
fi fi
done done
move_logfiles local l
for l in "$copydir"/logdest/*; do
[[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
mv "$l" "$LOGDEST"
done
for s in "$copydir"/srcpkgdest/*; do for s in "$copydir"/srcpkgdest/*; do
chown "$src_owner" "$s" chown "$src_owner" "$s"
@ -277,12 +274,13 @@ move_products() {
} }
# }}} # }}}
while getopts 'hcur:I:l:nCTD:d:U:' arg; do while getopts 'hcuC:r:I:l:nCTD:d:U:' arg; do
case "$arg" in case "$arg" in
c) clean_first=1 ;; c) clean_first=1 ;;
D) bindmounts_ro+=("--bind-ro=$OPTARG") ;; D) bindmounts_ro+=("--bind-ro=$OPTARG") ;;
d) bindmounts_rw+=("--bind=$OPTARG") ;; d) bindmounts_rw+=("--bind=$OPTARG") ;;
u) update_first=1 ;; u) update_first=1 ;;
C) cache_dir="-c $OPTARG" ;;
r) passeddir="$OPTARG" ;; r) passeddir="$OPTARG" ;;
I) install_pkgs+=("$OPTARG") ;; I) install_pkgs+=("$OPTARG") ;;
l) copy="$OPTARG" ;; l) copy="$OPTARG" ;;
@ -364,7 +362,8 @@ download_sources
prepare_chroot prepare_chroot
if arch-nspawn "$copydir" \ if arch-nspawn $cache_dir "$copydir" \
--setenv=TERM=xterm \
--bind="${PWD//:/\\:}:/startdir" \ --bind="${PWD//:/\\:}:/startdir" \
--bind="${SRCDEST//:/\\:}:/srcdest" \ --bind="${SRCDEST//:/\\:}:/srcdest" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \ "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
@ -374,7 +373,6 @@ then
move_products move_products
else else
(( ret += 1 )) (( ret += 1 ))
move_logfiles
fi fi
(( temp_chroot )) && delete_chroot "$copydir" "$copy" (( temp_chroot )) && delete_chroot "$copydir" "$copy"

View File

@ -15,7 +15,7 @@ DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
'ftp::/usr/bin/curl -gqfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' 'ftp::/usr/bin/curl -gqfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' 'http::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' 'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -zz %u %o' 'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o') 'scp::/usr/bin/scp -C %u %o')
# Other common tools: # Other common tools:

View File

@ -57,15 +57,9 @@ parse_buildinfo() {
get_pkgfile() { get_pkgfile() {
local cdir=${cache_dirs[0]} local cdir=${cache_dirs[0]}
local pkgfilebase=${1} local pkgfilebase=${1}
local mode=${2}
local pkgname=${pkgfilebase%-*-*-*} local pkgname=${pkgfilebase%-*-*-*}
local pkgfile ext local pkgfile ext
# try without downloading
if [[ ${mode} != localonly ]] && get_pkgfile "${pkgfilebase}" localonly; then
return 0
fi
for ext in .zst .xz ''; do for ext in .zst .xz ''; do
pkgfile=${pkgfilebase}.pkg.tar${ext} pkgfile=${pkgfilebase}.pkg.tar${ext}
@ -78,9 +72,6 @@ get_pkgfile() {
for f in "${pkgfile}" "${pkgfile}.sig"; do for f in "${pkgfile}" "${pkgfile}.sig"; do
if [[ ! -f "${cdir}/${f}" ]]; then if [[ ! -f "${cdir}/${f}" ]]; then
if [[ ${mode} = localonly ]]; then
continue 2
fi
msg2 "retrieving '%s'..." "${f}" >&2 msg2 "retrieving '%s'..." "${f}" >&2
curl -Llf -# -o "${cdir}/${f}" "${archiveurl}/${pkgname:0:1}/${pkgname}/${f}" || continue 2 curl -Llf -# -o "${cdir}/${f}" "${archiveurl}/${pkgname:0:1}/${pkgname}/${f}" || continue 2
fi fi
@ -124,45 +115,19 @@ shift $((OPTIND - 1))
check_root check_root
[[ -f PKGBUILD ]] || { error "No PKGBUILD in current directory."; exit 1; } if [[ -n $1 ]]; then
pkgfile="$1"
# without arguments, get list of packages from PKGBUILD splitpkgs=("$@")
if [[ -z $1 ]]; then for f in "${splitpkgs[@]}"; do
mapfile -t pkgnames < <(source PKGBUILD; pacman -Sddp --print-format '%r/%n' "${pkgname[@]}")
wait $! || {
error "No package file specified and failed to retrieve package names from './PKGBUILD'."
plain "Try '${BASH_SOURCE[0]##*/} -h' for more information." >&2
exit 1
}
msg "Reproducing all pkgnames listed in ./PKGBUILD"
set -- "${pkgnames[@]}"
fi
# check each package to see if it's a file, and if not, try to download it
# using pacman -Sw, and get the filename from there
splitpkgs=()
for p in "$@"; do
if [[ -f ${p} ]]; then
splitpkgs+=("${p}")
else
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null) || { error "package name '%s' not in repos" "${p}"; exit 1; }
pkgfile=${pkgfile_remote#file://}
if [[ ! -f ${pkgfile} ]]; then
msg "Downloading package '%s' into pacman's cache" "${pkgfile}"
sudo pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null)
pkgfile="${pkgfile_remote#file://}"
fi
splitpkgs+=("${pkgfile}")
fi
done
for f in "${splitpkgs[@]}"; do
if ! bsdtar -tqf "${f}" .BUILDINFO >/dev/null 2>&1; then if ! bsdtar -tqf "${f}" .BUILDINFO >/dev/null 2>&1; then
error "file is not a valid pacman package: '%s'" "${f}" error "file is not a valid pacman package: '%s'" "${f}"
exit 1 exit 1
fi fi
done done
else
error "no package file specified. Try '${BASH_SOURCE[0]##*/} -h' for more information. "
exit 1
fi
if (( ${#cache_dirs[@]} == 0 )); then if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf CacheDir) mapfile -t cache_dirs < <(pacman-conf CacheDir)
@ -174,11 +139,11 @@ load_makepkg_config
HOME=${ORIG_HOME} HOME=${ORIG_HOME}
[[ -d ${SRCDEST} ]] || SRCDEST=${PWD} [[ -d ${SRCDEST} ]] || SRCDEST=${PWD}
parse_buildinfo < <(bsdtar -xOqf "${splitpkgs[0]}" .BUILDINFO) parse_buildinfo < <(bsdtar -xOqf "${pkgfile}" .BUILDINFO)
export SOURCE_DATE_EPOCH="${buildinfo[builddate]}" export SOURCE_DATE_EPOCH="${buildinfo[builddate]}"
PACKAGER="${buildinfo[packager]}" PACKAGER="${buildinfo[packager]}"
BUILDDIR="${buildinfo[builddir]}" BUILDDIR="${buildinfo[builddir]}"
PKGEXT=${splitpkgs[0]#${splitpkgs[0]%.pkg.tar*}} PKGEXT=${pkgfile#${pkgfile%.pkg.tar*}}
# nuke and restore reproducible testenv # nuke and restore reproducible testenv
for copy in "${buildroot}"/*/; do for copy in "${buildroot}"/*/; do

View File

@ -24,7 +24,7 @@ source /usr/share/makepkg/util/config.sh
# global defaults suitable for use by Arch staff # global defaults suitable for use by Arch staff
repo=extra repo=extra
arch=x86_64 arch=x86_64
server=build.archlinux.org server=dragon.archlinux.org
die() { printf "error: $1\n" "${@:2}"; exit 1; } die() { printf "error: $1\n" "${@:2}"; exit 1; }
@ -83,9 +83,6 @@ archbuild_cmd=("${repo}${archbuild_arch:+-$archbuild_arch}-build" "$@")
trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
# Load makepkg.conf variables to be available
load_makepkg_config
# Use a source-only tarball as an intermediate to transfer files. This # Use a source-only tarball as an intermediate to transfer files. This
# guarantees the checksums are okay, and guarantees that all needed files are # guarantees the checksums are okay, and guarantees that all needed files are
# transferred, including local sources, install scripts, and changelogs. # transferred, including local sources, install scripts, and changelogs.
@ -101,7 +98,7 @@ mapfile -t files < <(
# This is sort of bash golfing but it allows running a mildly complex # This is sort of bash golfing but it allows running a mildly complex
# command over ssh with a single connection. # command over ssh with a single connection.
# shellcheck disable=SC2145 # shellcheck disable=SC2145
cat "$SRCPKGDEST"/*"$SRCEXT" | cat "$SRCPKGDEST"/*.src.tar.gz |
ssh $server ' ssh $server '
temp="${XDG_CACHE_HOME:-$HOME/.cache}/offload-build" && temp="${XDG_CACHE_HOME:-$HOME/.cache}/offload-build" &&
mkdir -p "$temp" && mkdir -p "$temp" &&
@ -125,6 +122,7 @@ mapfile -t files < <(
if (( ${#files[@]} )); then if (( ${#files[@]} )); then
printf '%s\n' '' '-> copying files...' printf '%s\n' '' '-> copying files...'
load_makepkg_config
scp "${files[@]/#/$server:}" "${TEMPDIR}/" scp "${files[@]/#/$server:}" "${TEMPDIR}/"
mv "${TEMPDIR}"/*.pkg.tar* "${PKGDEST:-${PWD}}/" mv "${TEMPDIR}"/*.pkg.tar* "${PKGDEST:-${PWD}}/"
mv "${TEMPDIR}/PKGBUILD" "${PWD}/" mv "${TEMPDIR}/PKGBUILD" "${PWD}/"