Compare commits

..

1 Commits

Author SHA1 Message Date
Jan Alexander Steffens (heftig)
24a298d475 Version 20170824 2017-08-24 17:20:59 +02:00
26 changed files with 364 additions and 598 deletions

2
.gitignore vendored
View File

@@ -3,6 +3,7 @@ devtools-*.tar.gz*
archbuild
archco
archrelease
archrm
bash_completion
checkpkg
commitpkg
@@ -15,4 +16,3 @@ zsh_completion
find-libdeps
crossrepomove
arch-nspawn
doc/*.1

View File

@@ -1,28 +0,0 @@
language: shell
sudo: required
services:
- docker
arch:
packages:
- openssh
- subversion
- rsync
- arch-install-scripts
- git
- bzr
- mercurial
- diffutils
- asciidoc
- shellcheck
script:
- sudo pacman -Syu --noconfirm --needed "${CONFIG_PACKAGES[@]}"
- make PREFIX=/usr
- make PREFIX=/usr DESTDIR="$(mktemp -d)" install
- make check || true
- SHELLCHECK_OPTS="-S error" make check
script: 'curl -s https://raw.githubusercontent.com/mikkeloscar/arch-travis/master/arch-travis.sh | bash'
# vim: ft=yaml ts=2 sw=2 et:

View File

@@ -1,13 +1,13 @@
V=20190329
V=20170824
PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man
IN_PROGS = \
BINPROGS = \
checkpkg \
commitpkg \
archco \
archrelease \
archrm \
archbuild \
lddd \
finddeps \
@@ -18,11 +18,8 @@ IN_PROGS = \
mkarchroot \
makechrootpkg
BINPROGS = \
$(IN_PROGS) \
sogrep
CONFIGFILES = \
makepkg-i686.conf \
makepkg-x86_64.conf \
pacman-extra.conf \
pacman-testing.conf \
@@ -35,6 +32,7 @@ CONFIGFILES = \
COMMITPKG_LINKS = \
extrapkg \
corepkg \
testingpkg \
stagingpkg \
communitypkg \
@@ -47,13 +45,18 @@ COMMITPKG_LINKS = \
gnome-unstablepkg
ARCHBUILD_LINKS = \
extra-i686-build \
extra-x86_64-build \
testing-i686-build \
testing-x86_64-build \
staging-i686-build \
staging-x86_64-build \
multilib-build \
multilib-testing-build \
multilib-staging-build \
kde-unstable-i686-build \
kde-unstable-x86_64-build \
gnome-unstable-i686-build \
gnome-unstable-x86_64-build
CROSSREPOMOVE_LINKS = \
@@ -64,18 +67,7 @@ BASHCOMPLETION_LINKS = \
archco \
communityco
MANS = \
doc/lddd.1 \
doc/checkpkg.1 \
doc/sogrep.1 \
doc/mkarchroot.1 \
doc/find-libdeps.1 \
doc/find-libprovides.1
all: $(BINPROGS) bash_completion zsh_completion man
man: $(MANS)
all: $(BINPROGS) bash_completion zsh_completion
edit = sed -e "s|@pkgdatadir[@]|$(DESTDIR)$(PREFIX)/share/devtools|g"
@@ -87,13 +79,8 @@ edit = sed -e "s|@pkgdatadir[@]|$(DESTDIR)$(PREFIX)/share/devtools|g"
@chmod +x "$@"
@bash -O extglob -n "$@"
$(MANS): doc/asciidoc.conf doc/footer.asciidoc
doc/%: doc/%.asciidoc
a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage -D doc $<
clean:
rm -f $(IN_PROGS) bash_completion zsh_completion $(MANS)
rm -f $(BINPROGS) bash_completion zsh_completion
install:
install -dm0755 $(DESTDIR)$(PREFIX)/bin
@@ -108,9 +95,6 @@ install:
for l in ${BASHCOMPLETION_LINKS}; do ln -sf devtools $(DESTDIR)/usr/share/bash-completion/completions/$$l; done
install -Dm0644 zsh_completion $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
ln -sf archco $(DESTDIR)$(PREFIX)/bin/communityco
for manfile in $(MANS); do \
install -Dm644 $$manfile -t $(DESTDIR)$(MANDIR)/man$${manfile##*.}; \
done;
uninstall:
for f in ${BINPROGS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
@@ -122,9 +106,6 @@ uninstall:
rm $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
rm -f $(DESTDIR)$(PREFIX)/bin/communityco
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
for manfile in $(MANS); do \
rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile#doc/}; \
done;
dist:
git archive --format=tar --prefix=devtools-$(V)/ $(V) | gzip -9 > devtools-$(V).tar.gz

View File

@@ -1,24 +0,0 @@
# Devtools - development tools for Arch Linux
This repository contains tools for the Arch Linux distribution for building
and maintaining official repository packages.
## Patches
Patches can be send to arch-projects@archlinux.org or via a pull request on
Github. When sending patches to the mailing list make sure to set a valid
subjectprefix otherwise the email is denied by mailman. Git can be configured
as following.
```
git config format.subjectprefix 'devtools] [PATCH'
```
## Releasing
1. bump the version in the Makefile
2. Commit everything as ```Version $(date +"%Y%m%d")```
3. Create a new tag ```git tag -s $(date +"%Y%m%d")```
4. Push changes
5. Upload the source tarball with ```make dist upload```
6. Update the package

View File

@@ -58,21 +58,18 @@ else
cache_dirs=("$cache_dir")
fi
pacconf_cmd=$(command -v pacman-conf || command -v pacconf)
# shellcheck disable=2016
host_mirrors=($($pacconf_cmd --repo extra Server 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#')
# shellcheck disable=2016
[[ $host_mirror == *file://* ]] && host_mirror_path=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
# {{{ functions
build_mount_args() {
declare -g mount_args=()
for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then
host_mirror_path=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
mount_args+=("--bind-ro=$host_mirror_path")
fi
done
if [[ -n $host_mirror_path ]]; then
mount_args+=("--bind-ro=$host_mirror_path")
fi
mount_args+=("--bind=${cache_dirs[0]}")
@@ -83,7 +80,7 @@ build_mount_args() {
copy_hostconf () {
cp -a /etc/pacman.d/gnupg "$working_dir/etc/pacman.d"
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
echo "Server = $host_mirror" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
@@ -94,7 +91,7 @@ copy_hostconf () {
cp -T "$file" "$working_dir$file"
done
sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "$working_dir/etc/pacman.conf"
sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n "${cache_dirs[@]}")|g" -i "$working_dir/etc/pacman.conf"
}
# }}}
@@ -110,13 +107,12 @@ fi
build_mount_args
copy_hostconf
eval "$(grep -a '^CARCH=' "$working_dir/etc/makepkg.conf")"
eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")"
[[ -z $nosetarch ]] || unset CARCH
exec ${CARCH:+setarch "$CARCH"} systemd-nspawn -q \
-D "$working_dir" \
-E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \
--register=no --keep-unit --as-pid2 \
--register=no --keep-unit \
"${mount_args[@]}" \
"$@"

View File

@@ -39,7 +39,7 @@ while getopts 'hcr:' arg; do
esac
done
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME
check_root
# Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}")
@@ -74,10 +74,5 @@ else
pacman -Syu --noconfirm || abort
fi
# Always build official packages reproducibly
if [[ ! -v SOURCE_DATE_EPOCH ]]; then
export SOURCE_DATE_EPOCH=$(date +%s)
fi
msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}"
exec makechrootpkg -r "${chroots}/${repo}-${arch}" "${makechrootpkg_args[@]}"

16
archrm.in Normal file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
# License: Unspecified
m4_include(lib/common.sh)
if [[ -z $1 ]]; then
echo 'Usage: archrm <path to checkout>'
exit 1
fi
# FIXME: Check if there are uncommited changes
#pushd $1
#
#popd
rm -rf "$1"

View File

@@ -189,11 +189,12 @@ if [[ ${#uploads[*]} -gt 0 ]]; then
fi
if [[ "${arch[*]}" == 'any' ]]; then
if [[ -d ../repos/$repo-x86_64 ]]; then
if [[ -d ../repos/$repo-i686 && -d ../repos/$repo-x86_64 ]]; then
pushd ../repos/ >/dev/null
stat_busy "Removing %s" "$repo-x86_64"
stat_busy "Removing %s and %s" "$repo-i686" "$repo-x86_64"
svn rm -q "$repo-i686"
svn rm -q "$repo-x86_64"
svn commit -q -m "Removed $repo-x86_64 for $pkgname"
svn commit -q -m "Removed $repo-i686 and $repo-x86_64 for $pkgname"
stat_done
popd >/dev/null
fi

View File

@@ -64,6 +64,7 @@ done
msg "Adding %s to %s" "${pkgbase}" "${target_repo}"
svn -q add "target_checkout/${pkgbase}"
svn -q propset svn:keywords 'Id' "target_checkout/${pkgbase}/trunk/PKGBUILD"
svn -q commit -m"${scriptname}: Moving ${pkgbase} from ${source_repo} to ${target_repo}" target_checkout
pushd "target_checkout/${pkgbase}/trunk" >/dev/null
archrelease "${arch[@]/#/$target_repo-}" || die

View File

@@ -1,37 +0,0 @@
## linkman: macro
# Inspired by/borrowed from the GIT source tree at Documentation/asciidoc.conf
#
# Usage: linkman:command[manpage-section]
#
# Note, {0} is the manpage section, while {target} is the command.
#
# Show man link as: <command>(<section>); if section is defined, else just show
# the command.
[macros]
(?su)[\\]?(?P<name>linkman):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
[attributes]
asterisk=&#42;
plus=&#43;
caret=&#94;
startsb=&#91;
endsb=&#93;
backslash=&#92;
tilde=&#126;
apostrophe=&#39;
backtick=&#96;
litdd=&#45;&#45;
ifdef::backend-docbook[]
[linkman-inlinemacro]
{0%{target}}
{0#<citerefentry>}
{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
{0#</citerefentry>}
endif::backend-docbook[]
ifdef::backend-xhtml11[]
[linkman-inlinemacro]
<a href="{target}.{0}.html">{target}{0?({0})}</a>
endif::backend-xhtml11[]

View File

@@ -1,27 +0,0 @@
checkpkg(1)
===========
Name
----
checkpkg - Compare the current build package with the repository version
Synopsis
--------
checkpkg
Description
-----------
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories. It
then compares the list of .so files provided by each version of the package and
outputs if there are soname differences for the new package. A directory is
also created using mktemp with files containing a file list for both packages
and a library list for both packages.
See Also
--------
linkman:find-libprovides[1]
include::footer.asciidoc[]

View File

@@ -1,24 +0,0 @@
find-libdeps(1)
===============
Name
----
find-libdeps - Find soname dependencies for a package
Synopsis
--------
find-libdeps [options]
Description
-----------
Finds soname dependencies of a package and prints out a list in the following
format '<soname>=<soversion>-<soarch>'.
Options
-------
*--ignore-internal*::
Ignore internal libraries.
include::footer.asciidoc[]

View File

@@ -1,24 +0,0 @@
find-libprovides(1)
===================
Name
----
find-libprovides - Find soname's which are provided by a package
Synopsis
--------
find-libprovides [options]
Description
-----------
Finds soname's provided by a package and prints out a list in the following
format '<soname>=<soversion>-<soarch>'.
Options
-------
*--ignore-internal*::
Ignore internal libraries.
include::footer.asciidoc[]

View File

@@ -1,29 +0,0 @@
Bugs
----
Bugs can be reported on the bug tracker 'https://bugs.archlinux.org' in the Arch
Linux category and title prefixed with [devtools] or via
mailto:arch-projects@archlinux.org[].
Authors
-------
Maintainers:
* Aaron Griffin <aaronmgriffin@gmail.com>
* Allan McRae <allan@archlinux.org>
* Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
* Dan McGee <dan@archlinux.org>
* Dave Reisner <dreisner@archlinux.org>
* Evangelos Foutras <evangelos@foutrelis.com>
* Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
* Jelle van der Waa <jelle@archlinux.org>
* Levente Polyak <anthraxx@archlinux.org>
* Pierre Schmitz <pierre@archlinux.de>
* Sébastien Luttringer <seblu@seblu.net>
* Sven-Hendrik Haase <svenstaro@gmail.com>
* Thomas Bächler <thomas@archlinux.org>
For additional contributors, use `git shortlog -s` on the devtools.git
repository.

View File

@@ -1,25 +0,0 @@
lddd(1)
=======
Name
----
lddd - Find broken library links on your system
Synopsis
--------
lddd
Description
-----------
Scans '$PATH', '/lib', '/usr/lib', '/usr/local/lib' and
'/etc/ld.so.conf.d/*.conf' directories for ELF files with references to missing
shared libraries, and suggests which packages might need to be rebuilt. The
collected data is written to a temporary directory created by mktemp.
See Also
--------
linkman:ldd[1]
include::footer.asciidoc[]

View File

@@ -1,46 +0,0 @@
mkarchroot(1)
==============
Name
----
mkarchroot - Creates an arch chroot in a specified location with a specified set of packages
Synopsis
--------
mkarchroot [options] [location] [packages]
Description
-----------
'mkarchroot' is a script to create an Arch Linux chroot at a specified location
with specified packages. Typically used by 'makechrootpkg' to create build
chroots. Apart from installing specified packages the chroot is created with an
en_US.UTF-8 and de_DE.UTF-8 locale and a generated machine-id.
Options
-------
*-C* <file>::
Location of a pacman config file.
*-M* <file>::
Location of a makepkg config file.
*-c* <dir>::
Set pacman cache.
*-f* <file>::
Copy file from the host to the chroot.
*-s*::
Do not run setarch.
*-h*::
Output command line options.
See Also
--------
linkman:pacman[1]
include::footer.asciidoc[]

View File

@@ -1,48 +0,0 @@
sogrep(1)
=========
Name
----
sogrep - Find shared library links in an Arch Linux repository
Synopsis
--------
sogrep [options] repo libname
Description
-----------
Check the soname links database for Arch Linux repositories containing packages
linked to a given shared library. If the repository specified is "all", then
all repositories will be searched, otherwise only the named repository will be
searched.
If the links database does not exist, it will be downloaded first.
Options
-------
*-v, --verbose*::
Provide detailed output containing the matched links for each package, the
repository it came from (in the event that all repositories are being
searched), and, in combination with `-r`, a progress bar for the links
database download.
*-r, --refresh*::
Refresh the links databases
*-h, --help*::
Show a help text
Environment Variables
---------------------
**SOLINKS_MIRROR**="https://mirror.foo.com"
Alternative mirror to use for downloading soname links database.
**SOCACHE_DIR**="/path/to/directory"::
Directory where soname links database is stored, overrides the default
directory set by the **XDG_CACHE_HOME** environment variable or the
**HOME** environment variable if **XDG_CACHE_HOME** is not set.
include::footer.asciidoc[]

View File

@@ -46,7 +46,7 @@ process_sofile() {
# extract the major version: 1
soversion="${sofile##*\.so\.}"
if [[ "$soversion" = "$sofile" ]] && ((IGNORE_INTERNAL)); then
return
continue
fi
if ! in_array "${soname}=${soversion}-${soarch}" "${soobjects[@]}"; then
# libfoo.so=1-64
@@ -57,7 +57,7 @@ process_sofile() {
case $script_mode in
deps) find_args=(-perm -u+x);;
provides) find_args=(-name '*.so*');;
provides) find_args=(-name '*.so*');;
esac
find . -type f "${find_args[@]}" | while read -r filename; do

View File

@@ -6,15 +6,13 @@
CHROOT_VERSION='v4'
##
# usage : check_root $keepenv
# usage : check_root
##
orig_argv=("$0" "$@")
check_root() {
local keepenv=$1
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo --preserve-env=$keepenv -- "${orig_argv[@]}"
exec sudo -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi

View File

@@ -4,12 +4,7 @@
# License: Unspecified
[[ -z ${_INCLUDE_COMMON_SH:-} ]] || return 0
_INCLUDE_COMMON_SH="$(set +o|grep nounset)"
set +u +o posix
# shellcheck disable=1091
. /usr/share/makepkg/util.sh
$_INCLUDE_COMMON_SH
_INCLUDE_COMMON_SH=true
# Avoid any encoding problems
export LANG=C
@@ -17,12 +12,56 @@ export LANG=C
shopt -s extglob
# check if messages are to be printed using color
declare ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
if [[ -t 2 ]]; then
colorize
else
# shellcheck disable=2034
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
# prefer terminal safe colored and bold text when tput is supported
if tput setaf 0 &>/dev/null; then
ALL_OFF="$(tput sgr0)"
BOLD="$(tput bold)"
BLUE="${BOLD}$(tput setaf 4)"
GREEN="${BOLD}$(tput setaf 2)"
RED="${BOLD}$(tput setaf 1)"
YELLOW="${BOLD}$(tput setaf 3)"
else
ALL_OFF="\e[1;0m"
BOLD="\e[1;1m"
BLUE="${BOLD}\e[1;34m"
GREEN="${BOLD}\e[1;32m"
RED="${BOLD}\e[1;31m"
YELLOW="${BOLD}\e[1;33m"
fi
fi
readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
plain() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg2() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
warning() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${YELLOW}==> WARNING:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
error() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${RED}==> ERROR:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
stat_busy() {
local mesg=$1; shift
@@ -71,6 +110,51 @@ die() {
cleanup 255
}
##
# usage : in_array( $needle, $haystack )
# return : 0 - found
# 1 - not found
##
in_array() {
local needle=$1; shift
local item
for item in "$@"; do
[[ $item = "$needle" ]] && return 0 # Found
done
return 1 # Not Found
}
##
# usage : get_full_version( [$pkgname] )
# return : full version spec, including epoch (if necessary), pkgver, pkgrel
##
get_full_version() {
# set defaults if they weren't specified in buildfile
local pkgbase=${pkgbase:-${pkgname[0]}}
local epoch=${epoch:-0}
local pkgver=${pkgver}
local pkgrel=${pkgrel}
if [[ -z $1 ]]; then
if (( ! epoch )); then
printf '%s\n' "$pkgver-$pkgrel"
else
printf '%s\n' "$epoch:$pkgver-$pkgrel"
fi
else
local pkgver_override='' pkgrel_override='' epoch_override=''
for i in pkgver pkgrel epoch; do
local indirect="${i}_override"
eval "$(declare -f "package_$1" | sed -n "s/\(^[[:space:]]*$i=\)/${i}_override=/p")"
[[ -z ${!indirect} ]] && eval ${indirect}=\"${!i}\"
done
if (( ! epoch_override )); then
printf '%s\n' "$pkgver_override-$pkgrel_override"
else
printf '%s\n' "$epoch_override:$pkgver_override-$pkgrel_override"
fi
fi
}
##
# usage : lock( $fd, $file, $message, [ $message_arguments... ] )
##

View File

@@ -4,22 +4,23 @@
# shellcheck disable=2034
_arch=(
i686
x86_64
any
)
# shellcheck disable=2034
_tags=(
core-x86_64 core-any
extra-x86_64 extra-any
core-i686 core-x86_64 core-any
extra-i686 extra-x86_64 extra-any
multilib-x86_64
staging-x86_64 staging-any
testing-x86_64 testing-any
staging-i686 staging-x86_64 staging-any
testing-i686 testing-x86_64 testing-any
multilib-testing-x86_64
multilib-staging-x86_64
community-x86_64 community-any
community-staging-x86_64 community-staging-any
community-testing-x86_64 community-testing-any
kde-unstable-x86_64 kde-unstable-any
gnome-unstable-x86_64 gnome-unstable-any
community-i686 community-x86_64 community-any
community-staging-i686 community-staging-x86_64 community-staging-any
community-testing-i686 community-testing-x86_64 community-testing-any
kde-unstable-i686 kde-unstable-x86_64 kde-unstable-any
gnome-unstable-i686 gnome-unstable-x86_64 gnome-unstable-any
)

View File

@@ -15,6 +15,29 @@ m4_include(lib/archroot.sh)
shopt -s nullglob
init_variables() {
default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg)
makepkg_args=("${default_makepkg_args[@]}")
keepbuilddir=false
update_first=false
clean_first=false
run_namcap=false
temp_chroot=false
chrootdir=
passeddir=
makepkg_user=
declare -ga install_pkgs
declare -gi ret=0
bindmounts_ro=()
bindmounts_rw=()
copy=$USER
[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
[[ -z "$copy" || $copy = root ]] && copy=copy
src_owner=${SUDO_USER:-$USER}
}
usage() {
echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
echo ' Run this script in a PKGBUILD dir to build a package inside a'
@@ -69,7 +92,7 @@ load_vars() {
[[ -f $makepkg_conf ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
[[ -z ${!var:-} ]] && eval "$(grep -a "^${var}=" "$makepkg_conf")"
[[ -z ${!var:-} ]] && eval "$(grep "^${var}=" "$makepkg_conf")"
done
return 0
@@ -165,7 +188,7 @@ prepare_chroot() {
local keepbuilddir=$3
local run_namcap=$4
[[ $keepbuilddir = true ]] || rm -rf "$copydir/build"
$keepbuilddir || rm -rf "$copydir/build"
local builduser_uid builduser_gid
builduser_uid="${SUDO_UID:-$UID}"
@@ -176,12 +199,16 @@ prepare_chroot() {
# We can't use useradd without chrooting, otherwise it invokes PAM modules
# which we might not be able to load (i.e. when building i686 packages on
# an x86_64 host).
sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,shadow,group}
sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,group}
printf >>"$copydir/etc/group" 'builduser:x:%d:\n' "$builduser_gid"
printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' "$builduser_uid" "$builduser_gid"
printf >>"$copydir/etc/shadow" 'builduser:!!:%d::::::\n' "$(( $(date -u +%s) / 86400 ))"
$install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest}
$install -d "$copydir"/{build,build/.gnupg,startdir,{pkg,srcpkg,src,log}dest}
for x in .gnupg/pubring.{kbx,gpg}; do
[[ -r $USER_HOME/$x ]] || continue
$install -m 644 "$USER_HOME/$x" "$copydir/build/$x"
done
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 \
@@ -201,10 +228,9 @@ EOF
{
printf '#!/bin/bash\n'
declare -f _chrootbuild
declare -p SOURCE_DATE_EPOCH 2>/dev/null || true
printf '_chrootbuild "$@" || exit\n'
if [[ $run_namcap = true ]]; then
if $run_namcap; then
declare -f _chrootnamcap
printf '_chrootnamcap || exit\n'
fi
@@ -215,24 +241,13 @@ EOF
# These functions aren't run in makechrootpkg,
# so no global variables
_chrootbuild() {
# No coredumps
ulimit -c 0
# shellcheck source=/dev/null
. /etc/profile
# Beware, there are some stupid arbitrary rules on how you can
# use "$" in arguments to commands with "sudo -i". ${foo} or
# ${1} is OK, but $foo or $1 isn't.
# https://bugzilla.sudo.ws/show_bug.cgi?id=765
sudo --preserve-env=SOURCE_DATE_EPOCH -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$?
case $ret in
0|14)
return 0;;
*)
return $ret;;
esac
sudo -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
}
_chrootnamcap() {
@@ -246,25 +261,28 @@ _chrootnamcap() {
# Usage: download_sources $copydir $makepkg_user
# Globals:
# - SRCDEST
# - USER
download_sources() {
local copydir=$1
local makepkg_user=$2
setup_workdir
chown "$makepkg_user:" "$WORKDIR"
local builddir
builddir="$(mktemp -d)"
chmod 1777 "$builddir"
# Ensure sources are downloaded
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \
sudo -u "$makepkg_user" env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
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
# Globals:
# - PKGDEST
# - LOGDEST
# - SRCPKGDEST
move_products() {
local copydir=$1
local src_owner=$2
@@ -300,26 +318,7 @@ move_products() {
# }}}
main() {
default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg)
makepkg_args=("${default_makepkg_args[@]}")
keepbuilddir=false
update_first=false
clean_first=false
run_namcap=false
temp_chroot=false
chrootdir=
passeddir=
makepkg_user=
declare -a install_pkgs
declare -i ret=0
bindmounts_ro=()
bindmounts_rw=()
copy=$USER
[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
[[ -z "$copy" || $copy = root ]] && copy=copy
src_owner=${SUDO_USER:-$USER}
init_variables
while getopts 'hcur:I:l:nTD:d:U:' arg; do
case "$arg" in
@@ -341,7 +340,7 @@ main() {
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}}
check_root SOURCE_DATE_EPOCH,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER
check_root
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
@@ -409,7 +408,7 @@ main() {
download_sources "$copydir" "$makepkg_user"
prepare_chroot "$copydir" "$USER_HOME" "$keepbuilddir" "$run_namcap"
prepare_chroot "$copydir" "$USER_HOME" "$keepbuilddir"
if arch-nspawn "$copydir" \
--bind="$PWD:/startdir" \

150
makepkg-i686.conf Normal file
View File

@@ -0,0 +1,150 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf
#
#########################################################################
# SOURCE ACQUISITION
#########################################################################
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
# Other common tools:
# /usr/bin/snarf
# /usr/bin/lftpget -c
# /usr/bin/wget
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
'git::git'
'hg::mercurial'
'svn::subversion')
#########################################################################
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="i686"
CHOST="i686-pc-linux-gnu"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#-- Debugging flags
DEBUG_CFLAGS="-g -fvar-tracking-assignments"
DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
#########################################################################
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
#-- color: Colorize output messages
#-- ccache: Use ccache to cache compilation
#-- check: Run the check() function if present in the PKGBUILD
#-- sign: Generate PGP signature file
#
BUILDENV=(!distcc color !ccache check !sign)
#
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
#-- specify a space-delimited list of hosts running in the DistCC cluster.
#DISTCC_HOSTS=""
#
#-- Specify a directory for package building.
#BUILDDIR=/tmp/makepkg
#########################################################################
# GLOBAL PACKAGE OPTIONS
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
#-- docs: Save doc directories specified by DOC_DIRS
#-- libtool: Leave libtool (.la) files in packages
#-- staticlibs: Leave static library (.a) files in packages
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- optipng: Optimize PNG images with optipng
#-- debug: Add debugging flags as specified in DEBUG_* variables
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
#-- Options to be used when stripping binaries. See `man strip' for details.
STRIP_BINARIES="--strip-all"
#-- Options to be used when stripping shared libraries. See `man strip' for details.
STRIP_SHARED="--strip-unneeded"
#-- Options to be used when stripping static libraries. See `man strip' for details.
STRIP_STATIC="--strip-debug"
#-- Manual (man and info) directories to compress (if zipman is specified)
MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
#-- Doc directories to remove (if !docs is specified)
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#########################################################################
# PACKAGE OUTPUT
#########################################################################
#
# Default: put built package and cached source in build directory
#
#-- Destination: specify a fixed directory where all packages will be placed
#PKGDEST=/home/packages
#-- Source cache: specify a fixed directory where source files will be cached
#SRCDEST=/home/sources
#-- Source packages: specify a fixed directory where all src packages will be placed
#SRCPKGDEST=/home/srcpackages
#-- Log files: specify a fixed directory where all log files will be placed
#LOGDEST=/home/makepkglogs
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"
#-- Specify a key to use for package signing
#GPGKEY=""
#########################################################################
# COMPRESSION DEFAULTS
#########################################################################
#
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
#########################################################################
# EXTENSION DEFAULTS
#########################################################################
#
# WARNING: Do NOT modify these variables unless you know what you are
# doing.
#
PKGEXT='.pkg.tar.xz'
SRCEXT='.src.tar.gz'
# vim: set ft=sh ts=2 sw=2 et:

View File

@@ -11,10 +11,9 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('file::/usr/bin/curl -gqC - -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'
'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
@@ -38,9 +37,11 @@ CARCH="x86_64"
CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
@@ -52,7 +53,7 @@ DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc !color !ccache check !sign)
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
@@ -75,7 +76,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug)
# Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -85,9 +86,11 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- optipng: Optimize PNG images with optipng
#-- debug: Add debugging flags as specified in DEBUG_* variables
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug)
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
@@ -103,8 +106,6 @@ MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#########################################################################
# PACKAGE OUTPUT

149
sogrep
View File

@@ -1,149 +0,0 @@
#!/bin/bash
#
# sogrep - find shared library links in an Arch Linux repository.
#
# Copyright (c) 2019 by Eli Schwartz <eschwartz@archlinux.org>
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# globals
: ${SOLINKS_MIRROR:="https://mirror.pkgbuild.com"}
: ${SOCACHE_DIR:="${XDG_CACHE_HOME:-${HOME}/.cache}/sogrep"}
repos=('staging' 'testing' 'core' 'extra'
'community-staging' 'community-testing' 'community'
'multilib-staging' 'multilib-testing' 'multilib'
'gnome-unstable' 'kde-unstable')
arches=('x86_64')
# options
REFRESH=0
VERBOSE=0
source /usr/share/makepkg/util/parseopts.sh
source /usr/share/makepkg/util/util.sh
recache() {
local repo arch verbosity=-s
(( VERBOSE )) && verbosity=--progress-bar
for repo in "${repos[@]}"; do
for arch in "${arches[@]}"; do
rm -rf "${SOCACHE_DIR}/${arch}/${repo}"
mkdir -p "${SOCACHE_DIR}/${arch}/${repo}"
curl "$verbosity" "${SOLINKS_MIRROR}/${repo}/os/${arch}/${repo}.links.tar.gz" | bsdtar -xf - -C "${SOCACHE_DIR}/${arch}/${repo}"
done
done
}
search() {
local repo=$1 arch lib=$2 srepos=("${repos[@]}")
if [[ $repo != all ]]; then
if ! in_array "${repo}" "${repos[@]}"; then
echo "${BASH_SOURCE[0]##*/}: unrecognized repo '$repo'"
echo "Try '${BASH_SOURCE[0]##*/} --help' for more information."
exit 1
fi
srepos=("${repo}")
fi
for arch in "${arches[@]}"; do
for repo in "${srepos[@]}"; do
local prefix=
(( VERBOSE && ${#srepos[@]} > 1 )) && prefix=${repo}/
db=${SOCACHE_DIR}/${arch}/${repo}/
if [[ -d ${db} ]]; then
while read -rd '' pkg; do
read -r match
pkg=${pkg#${db}}
pkg="${prefix}${pkg%-*-*/links}"
if (( VERBOSE )); then
printf '%-35s %s\n' "${pkg}" "${match}"
else
printf '%s\n' "${pkg}"
fi
done < <(grep -rZ "${lib}" "${db}") | sort -u
fi
done
done | resort
}
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] REPO LIBNAME
Check the soname links database for Arch Linux repositories containing
packages linked to a given shared library. If the repository specified
is "all", then all repositories will be searched, otherwise only the
named repository will be searched.
If the links database does not exist, it will be downloaded first.
OPTIONS
-v, --verbose Show matched links in addition to pkgname
-r, --refresh Refresh the links databases
-h, --help Show this help text
_EOF_
}
# utility function to resort with multiple repos + no-verbose
resort() { sort -u; }
if (( $# == 0 )); then
echo "error: No arguments passed."
echo "Try '${BASH_SOURCE[0]##*/} --help' for more information."
exit 1
fi
OPT_SHORT='vrh'
OPT_LONG=('verbose' 'refresh' 'help')
if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
exit 1
fi
set -- "${OPTRET[@]}"
while :; do
case $1 in
-v|--verbose)
resort() { cat; }
VERBOSE=1
;;
-r|--refresh)
REFRESH=1
;;
-h|--help)
usage
exit 0
;;
--)
shift; break
;;
esac
shift
done
if ! (( ( REFRESH && $# == 0 ) || $# == 2 )); then
echo "error: Incorrect number of arguments passed."
echo "Try '${BASH_SOURCE[0]##*/} --help' for more information."
exit 1
fi
if (( REFRESH )) || [[ ! -d ${SOCACHE_DIR} ]]; then
recache
(( $# == 2 )) || exit 0
fi
search "$@"

View File

@@ -1,4 +1,4 @@
#compdef archbuild archco arch-nspawn archrelease commitpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild communityco=archco
#compdef archbuild archco arch-nspawn archrelease archrm commitpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-i686-build=archbuild extra-x86_64-build=archbuild testing-i686-build=archbuild testing-x86_64-build=archbuild staging-i686-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-i686-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-i686-build=archbuild gnome-unstable-x86_64-build=archbuild communityco=archco
# License: Unspecified
m4_include(lib/valid-tags.sh)
@@ -23,6 +23,10 @@ _archrelease_args=(
"*:arch:($_tags[*])"
)
_archrm_args=(
'1:path:_files -/'
)
_commitpkg_args=(
"-a[Release to a specific architecture only]:arch:($_arch[*])"
'-l[Set bandwidth limit]:limit'