7 Commits

Author SHA1 Message Date
emmett1
f3018114dd add mask function 2020-07-29 22:09:27 +08:00
emmett1
eee0a24f61 remove obsolete part in scratch info 2020-04-28 23:57:15 +08:00
emmett1
ab23dbde67 add CROSS_COMPILE env for strip 2020-04-28 23:56:04 +08:00
emmett1
f74b026a13 add logging option to scratch build 2020-04-27 18:02:18 +08:00
emmett1
552e0c7bfe updated 2020-04-27 13:52:05 +08:00
emmett1
34b9568afb fix printf colourize 2020-04-27 13:09:02 +08:00
emmett1
0aa9868d15 fixesss 2020-04-22 14:27:39 +08:00
14 changed files with 294 additions and 162 deletions

View File

@@ -129,7 +129,7 @@ Available options:
### pkgadd
`pkgadd` is a tool to install and upgrade package created by `pkgbuild`. Install package is simply extract
`<name>-<version>-<release>.spkg.txz` by using tar into real system then save list extracted file into package `INDEX_DIR`.
`<name>-<version>-<release>.spkg.txz` by using tar into real system then save list extracted file into package `PKGDB_DIR`.
Upgrading package is also using same extract as install, it will replace old files then compare list file from old and new
package and remove old file which not exist in new package (like Slackware pkgtool does).
@@ -154,7 +154,7 @@ package and remove old file which not exist in new package (like Slackware pkgto
old configuration files and skip conflict check
### pkgdel
`pkgdel` is a tool to remove package from system. It will read file listed in package `INDEX_DIR` and remove it.
`pkgdel` is a tool to remove package from system. It will read file listed in package `PKGDB_DIR` and remove it.
Usage:
pkgdel [ <options> <package name> ]

53
pkgadd
View File

@@ -36,11 +36,11 @@ msg2() {
}
msgerr() {
echo "==> ERROR: $1"
echo "==> ERROR: $1" >&2
}
msgwarn() {
echo "==> WARNING: $1"
echo "==> WARNING: $1" >&2
}
help() {
@@ -59,6 +59,7 @@ Options:
--no-preupgrade skip preupgrade script before upgrade package
--no-postupgrade skip postupgrade script after upgrade package
--no-backup skip backup when upgrading package
--print-dbdir print package database path
--root=<path> install to custom root directory
EOF
@@ -96,6 +97,7 @@ parse_opts() {
--no-preupgrade) NO_PREUPGRADE=yes ;;
--no-postupgrade) NO_POSTUPGRADE=yes ;;
--no-backup) NO_BACKUP=yes ;;
--print-dbdir) PRINTDBDIR=yes ;;
--root=*) ROOT_DIR="${1#*=}" ;;
*.spkg.tar.*) PKGNAME="$(realpath $1)" ;;
*) msg "Invalid option! ($1)"; exit 1 ;;
@@ -112,7 +114,7 @@ ret() {
}
isinstalled() {
if [ -s "$ROOT_DIR/$INDEX_DIR/$1/.pkginfo" ] && grep -q "$1" "$ROOT_DIR/$INDEX_DIR/$1/.pkginfo"; then
if [ -s "$ROOT_DIR/$PKGDB_DIR/$1/.pkginfo" ] && grep -q "$1" "$ROOT_DIR/$PKGDB_DIR/$1/.pkginfo"; then
return 0
else
return 1
@@ -130,17 +132,24 @@ run_scripts() {
parse_opts $(extract_opts "$@")
SCRATCHPKG_DIR="var/lib/scratchpkg"
INDEX_DIR="$SCRATCHPKG_DIR/index"
PKGDB_DIR="$SCRATCHPKG_DIR/index"
LOCK_FILE="$SCRATCHPKG_DIR/spkg.lock"
ROOT_DIR="${ROOT_DIR%/}" # remove trailing slash
[ "$PRINTDBDIR" ] && {
echo "$ROOT_DIR/$PKGDB_DIR"
ret 0
}
# show help page
[ "$SHOWHELP" ] || [ -z "$PKGNAME" ] && {
help
ret 0
}
[ -d "$ROOT_DIR/$INDEX_DIR" ] || {
msgerr "Package's database directory not exist! ($ROOT_DIR/$INDEX_DIR)"
[ -d "$ROOT_DIR/$PKGDB_DIR" ] || {
msgerr "Package's database directory not exist: $ROOT_DIR/$PKGDB_DIR"
ret 1
}
@@ -178,8 +187,8 @@ name=${noextname%-*}
# get package information if installed
if isinstalled $name; then
iversion=$(grep ^version $ROOT_DIR/$INDEX_DIR/$name/.pkginfo | cut -d " " -f3-)
irelease=$(grep ^release $ROOT_DIR/$INDEX_DIR/$name/.pkginfo | cut -d " " -f3-)
iversion=$(grep ^version $ROOT_DIR/$PKGDB_DIR/$name/.pkginfo | cut -d " " -f3-)
irelease=$(grep ^release $ROOT_DIR/$PKGDB_DIR/$name/.pkginfo | cut -d " " -f3-)
ALREADYINSTALLED=yes
fi
@@ -227,7 +236,7 @@ if [ ! "$IGNORE_CONFLICT" ]; then
fi
if [ -e "$ROOT_DIR/$line" ] || [ -L "$ROOT_DIR/$line" ]; then
if [ "$UPGRADE_PKG" ] || [ "$REINSTALL_PKG" ]; then
if ! grep -Fqx "$line" "$ROOT_DIR/$INDEX_DIR/$name/.files"; then
if ! grep -Fqx "$line" "$ROOT_DIR/$PKGDB_DIR/$name/.files"; then
echo "$line"
touch "$TMP_CONFLICT"
fi
@@ -290,12 +299,12 @@ if [ "$UPGRADE_PKG" ] || [ "$REINSTALL_PKG" ]; then
rmlist_dir="$ROOT_DIR/$SCRATCHPKG_DIR/.rmlist_dir"
reserve_dir="$ROOT_DIR/$SCRATCHPKG_DIR/.reserve_dir"
rmlist_all="$ROOT_DIR/$SCRATCHPKG_DIR/.rmlist_all"
grep '/$' $ROOT_DIR/$INDEX_DIR/*/.files \
| grep -v $ROOT_DIR/$INDEX_DIR/$name/.files \
grep '/$' $ROOT_DIR/$PKGDB_DIR/*/.files \
| grep -v $ROOT_DIR/$PKGDB_DIR/$name/.files \
| awk -F : '{print $2}' \
| sort \
| uniq > $reserve_dir # get list reserved dirs
grep -Fxv -f "$TMP_PKGINSTALL" $ROOT_DIR/$INDEX_DIR/$name/.files > $rmlist_all # get list files and dirs to remove
grep -Fxv -f "$TMP_PKGINSTALL" $ROOT_DIR/$PKGDB_DIR/$name/.files > $rmlist_all # get list files and dirs to remove
grep -v '/$' "$rmlist_all" | tac > "$rmlist_file" # get files only to remove
grep -Fxv -f "$reserve_dir" "$rmlist_all" | grep '/$' | tac > "$rmlist_dir" # get dirs only (safe) to remove
(cd "$ROOT_DIR"/
@@ -306,30 +315,30 @@ if [ "$UPGRADE_PKG" ] || [ "$REINSTALL_PKG" ]; then
fi
# register package into database
rm -fr "$ROOT_DIR/$INDEX_DIR/$name"
mkdir "$ROOT_DIR/$INDEX_DIR/$name"
echo "name = $name" > "$ROOT_DIR/$INDEX_DIR/$name/.pkginfo"
echo "version = $version" >> "$ROOT_DIR/$INDEX_DIR/$name/.pkginfo"
echo "release = $release" >> "$ROOT_DIR/$INDEX_DIR/$name/.pkginfo"
install -m644 "$TMP_PKGINSTALL" "$ROOT_DIR/$INDEX_DIR/$name/.files"
rm -fr "$ROOT_DIR/$PKGDB_DIR/$name"
mkdir "$ROOT_DIR/$PKGDB_DIR/$name"
echo "name = $name" > "$ROOT_DIR/$PKGDB_DIR/$name/.pkginfo"
echo "version = $version" >> "$ROOT_DIR/$PKGDB_DIR/$name/.pkginfo"
echo "release = $release" >> "$ROOT_DIR/$PKGDB_DIR/$name/.pkginfo"
install -m644 "$TMP_PKGINSTALL" "$ROOT_DIR/$PKGDB_DIR/$name/.files"
for ii in $(grep ^.pkg* $TMP_PKGADD); do
pkgfiles="$pkgfiles $ii"
done
if [ "$pkgfiles" ]; then
tar -x -f "$PKGNAME" -C "$ROOT_DIR/$INDEX_DIR/$name" $pkgfiles >/dev/null 2>&1
tar -x -f "$PKGNAME" -C "$ROOT_DIR/$PKGDB_DIR/$name" $pkgfiles >/dev/null 2>&1
fi
if [ -f "$ROOT_DIR/$INDEX_DIR/$name/.pkginstall" ]; then
if [ -f "$ROOT_DIR/$PKGDB_DIR/$name/.pkginstall" ]; then
if [ ! "$NO_POSTINSTALL" ] && [ ! "$UPGRADE_PKG" ]; then
(cd "$ROOT_DIR"/
run_scripts "$INDEX_DIR/$name/.pkginstall" post-install "$version"
run_scripts "$PKGDB_DIR/$name/.pkginstall" post-install "$version"
)
fi
if [ "$UPGRADE_PKG" ] && [ ! "$NO_POSTUPGRADE" ]; then
(cd "$ROOT_DIR"/
run_scripts "$INDEX_DIR/$name/.pkginstall" post-upgrade "$version" "$iversion"
run_scripts "$PKGDB_DIR/$name/.pkginstall" post-upgrade "$version" "$iversion"
)
fi
fi

20
pkgbase
View File

@@ -1,6 +1,24 @@
#!/bin/sh
#
# script to remove all packages other than base and any user input
# scratchpkg
#
# Copyright (c) 2018 by Emmett1 (emmett1.2miligrams@gmail.com)
#
# 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 3 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/>.
#
#
# script to remove all packages other than base and any user input
#
parseopt() {

130
pkgbuild
View File

@@ -27,46 +27,59 @@ msg2() {
}
msgerr() {
echo "==> ERROR: $1"
echo "==> ERROR: $1" >&2
}
msgwarn() {
echo "==> WARNING: $1"
echo "==> WARNING: $1" >&2
}
updatemdsum() {
msg "Generating .checksums..."
generatemdsum > .checksums
}
generatemdsum() {
if [ -z "$source" ]; then
echo SKIP
return 0
fi
for src in $source; do
if echo $src | grep -qE "::(ftp|http|https)://"; then
FILENAME=$SOURCE_DIR/$(echo $src | awk -F '::' '{print $1}')
elif echo $src | grep -qE "(ftp|http|https)://"; then
FILENAME=$SOURCE_DIR/$(basename $src)
else
FILENAME=$src
for s in $(getsourcelist); do
if [ ! -f $s ]; then
msgerr "Source file '$s' not found."
err=1
fi
needupdatechecksum="$needupdatechecksum $FILENAME"
done
md5sum $needupdatechecksum | sed -e 's| .*/| |' | sort -k 2
[ "$err" = 1 ] && abort 1
generatemdsum > .checksums
msg "Checksums updated."
}
checkmdsum() {
getsourcelist() {
for s in $source; do
if echo $s | grep -qE "::(ftp|http|https)://"; then
FILENAME=$SOURCE_DIR/$(echo $s | awk -F '::' '{print $1}')
elif echo $s | grep -qE "(ftp|http|https)://"; then
FILENAME=$SOURCE_DIR/$(basename $s)
else
FILENAME=$PWD/$s
fi
echo $FILENAME
done
}
generatemdsum() {
for s in $(getsourcelist); do
if [ -f $s ]; then
needupdatechecksum="$needupdatechecksum $s"
fi
done
if [ "$needupdatechecksum" ]; then
md5sum $needupdatechecksum | sed -e 's| .*/| |' | sort -k 2
else
echo SKIP
fi
}
checkmdsum() {
[ "$CHECK_MDSUM" = 0 ] || [ "$IGNORE_MDSUM" = yes ] && return 0
TMPCHECKSUM=$WORK_DIR/checksumstmp.$$
ORICHECKSUM=$WORK_DIR/checksumsori.$$
DIFCHECKSUM=$WORK_DIR/checksumsdiff.$$
if [ ! -f .checksums ]; then
msg "Generating .checksums..."
generatemdsum > .checksums
updatemdsum
else
msg "Checking checksums..."
generatemdsum > "$TMPCHECKSUM"
@@ -134,8 +147,6 @@ download_src() {
}
prepare_src() {
[ "$IGNORE_MDSUM" -o "$CHECK_MDSUM" = 0 ] || checkmdsum
SRC=$WORK_DIR/$name/src
PKG=$WORK_DIR/$name/pkg
@@ -160,6 +171,11 @@ prepare_src() {
break
fi
done
if [ ! -f $FILENAME ]; then
msgerr "File source '$FILENAME' not found."
err=1
continue
fi
if [ "$FILENAME" != "$FILE" ] && [ "$nxt" != 1 ]; then
case $FILENAME in
*.tar|*.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tar.xz|*.txz|*.tar.lzma|*.zip|*.rpm)
@@ -171,7 +187,7 @@ prepare_src() {
MODE="Unpacking" ;;
*)
COMMAND="cp $FILENAME $SRC"
MODE="Preparing" ;;
MODE="Preparing" ;;
esac
msg "$MODE '$(basename $FILENAME)'..."
$COMMAND || {
@@ -216,8 +232,30 @@ run_build() {
cd - >/dev/null
}
pkglint() {
linterror=0
# cant package empty PKG
if [ ! "$(find $PKG/* -maxdepth 1 -type d 2>/dev/null)" ]; then
msgerr "PKG is empty."
abort 1
fi
# check for backup file
for f in $backup; do
if [ ! -f $PKG/$f ]; then
msgerr "Backup file '$f' not exist in PKG!"
linterror=1
fi
done
if [ "$linterror" = 1 ]; then
abort 1
fi
}
removeemptydirs() {
find . -type d -empty -delete
find . -type d -empty -delete
}
removelibtool() {
@@ -237,20 +275,20 @@ strip_files() {
find . -type f -printf "%P\n" 2>/dev/null | $FILTER | while read -r binary ; do
case "$(file -bi "$binary")" in
*application/x-sharedlib*) # Libraries (.so)
strip --strip-unneeded "$binary" 2>/dev/null ;;
${CROSS_COMPILE}strip --strip-unneeded "$binary" 2>/dev/null ;;
*application/x-pie-executable*) # Libraries (.so)
strip --strip-unneeded "$binary" 2>/dev/null ;;
${CROSS_COMPILE}strip --strip-unneeded "$binary" 2>/dev/null ;;
*application/x-archive*) # Libraries (.a)
strip --strip-debug "$binary" 2>/dev/null ;;
${CROSS_COMPILE}strip --strip-debug "$binary" 2>/dev/null ;;
*application/x-object*)
case "$binary" in
*.ko) # Kernel module
strip --strip-unneeded "$binary" 2>/dev/null ;;
${CROSS_COMPILE}strip --strip-unneeded "$binary" 2>/dev/null ;;
*)
continue;;
esac;;
*application/x-executable*) # Binaries
strip --strip-all "$binary" 2>/dev/null ;;
${CROSS_COMPILE}strip --strip-all "$binary" 2>/dev/null ;;
*)
continue ;;
esac
@@ -287,12 +325,7 @@ compressinfomanpages() {
backupconf() {
for FILE in $backup; do
if [ ! -f $FILE ]; then
msgerr "File '$FILE' not exist!"
abort 1
else
mv $FILE $FILE.spkgnew
fi
mv $FILE $FILE.spkgnew
done
}
@@ -316,6 +349,9 @@ removelocales() {
}
packaging() {
# lint $PKG before packaging
pkglint
for FILE in $INCLUDEINPKG; do
if [ -f $FILE ]; then
install -m644 $FILE $PKG/.pkg$FILE
@@ -333,9 +369,6 @@ packaging() {
find usr/share/fonts \( -name fonts.dir -o -name fonts.scale \) -delete
}
# remove pseudo directories
#rm -fr dev sys proc run tmp
[ "$KEEP_EMPTYDIR" = 0 ] && removeemptydirs
[ "$KEEP_LIBTOOL" = 0 ] && removelibtool
[ "$STRIP_BINARY" = 1 ] && strip_files
@@ -380,11 +413,11 @@ generate_pkgfiles() {
excludefile="$excludefile --exclude=.pkg$i"
done
msg "Generating .pkgfiles..."
tar -tvf "$PACKAGE_DIR/$PKGNAME" $excludefile \
| awk '{$3=$4=$5=""; print $0}' \
| sed "s,lib/modules/$(uname -r),lib/modules/<kernelversion>,g" \
| sort -k 3 > .pkgfiles
msg "Pkgfiles updated."
}
cleanup() {
@@ -579,13 +612,13 @@ extract_opts() {
echo $opts
}
main() {
main() {
parse_opts $(extract_opts "$@")
if [ -f "$PKGBUILD_CONF" ]; then
. "$PKGBUILD_CONF"
else
msgerr "Config file not found ('$PKGBUILD_CONF')"
msgerr "Config file not found: $PKGBUILD_CONF"
exit 1
fi
@@ -603,7 +636,7 @@ main() {
if [ -f "$PKGBUILD_BSCRIPT" ]; then
description=$(grep "^# description[[:blank:]]*:" $PKGBUILD_BSCRIPT | sed 's/^# description[[:blank:]]*:[[:blank:]]*//')
. ./$PKGBUILD_BSCRIPT
. ./$PKGBUILD_BSCRIPT
else
msgerr "'$PKGBUILD_BSCRIPT' file not found."
exit 1
@@ -631,14 +664,12 @@ main() {
# extract source only
[ "$EXTRACT_ONLY" ] && {
download_src
prepare_src
exit 0
}
# update md5sum
[ "$UPDATE_MDSUM" ] && {
download_src
updatemdsum
exit 0
}
@@ -673,6 +704,7 @@ main() {
else
msg "Building '$name-$version-$release'..."
download_src
checkmdsum
prepare_src
run_build
packaging

38
pkgdel
View File

@@ -36,11 +36,11 @@ msg2() {
}
msgerr() {
echo "==> ERROR: $1"
echo "==> ERROR: $1" >&2
}
msgwarn() {
echo "==> WARNING: $1"
echo "==> WARNING: $1" >&2
}
help() {
@@ -100,7 +100,7 @@ ret() {
}
isinstalled() {
if [ -s "$ROOT_DIR/$INDEX_DIR/$1/.pkginfo" ] && grep -q "$1" "$ROOT_DIR/$INDEX_DIR/$1/.pkginfo"; then
if [ -s "$ROOT_DIR/$PKGDB_DIR/$1/.pkginfo" ] && grep -q "$1" "$ROOT_DIR/$PKGDB_DIR/$1/.pkginfo"; then
return 0
else
return 1
@@ -115,9 +115,15 @@ run_scripts() {
fi
}
command -v pkgadd >/dev/null 2>&1 || {
msgerr "'pkgadd' not found in \$PATH!"
exit 1
}
parse_opts $(extract_opts "$@")
INDEX_DIR="var/lib/scratchpkg/index"
PKGDB_DIR="$(pkgadd --print-dbdir)"
PKGDB_DIR="${PKGDB_DIR##/}" # remove leading /
LOCK_FILE="var/lib/scratchpkg/spkg.lock"
# show help page
@@ -149,9 +155,9 @@ if ! isinstalled "$RMNAME"; then
ret 1
fi
name=$(grep ^name $ROOT_DIR/$INDEX_DIR/$RMNAME/.pkginfo | cut -d " " -f3-)
version=$(grep ^version $ROOT_DIR/$INDEX_DIR/$RMNAME/.pkginfo | cut -d " " -f3-)
release=$(grep ^release $ROOT_DIR/$INDEX_DIR/$RMNAME/.pkginfo | cut -d " " -f3-)
name=$(grep ^name $ROOT_DIR/$PKGDB_DIR/$RMNAME/.pkginfo | cut -d " " -f3-)
version=$(grep ^version $ROOT_DIR/$PKGDB_DIR/$RMNAME/.pkginfo | cut -d " " -f3-)
release=$(grep ^release $ROOT_DIR/$PKGDB_DIR/$RMNAME/.pkginfo | cut -d " " -f3-)
if [ -z "$name" ] && [ -z "$version" ] && [ -z "$release" ]; then
msgerr "Package '$RMNAME' not installed but exist in database."
@@ -164,21 +170,21 @@ remove="$ROOT_DIR/$SCRATCHPKG_DIR/.pkgdel_remove"
dirs="$ROOT_DIR/$SCRATCHPKG_DIR/.pkgdel_dirs"
files="$ROOT_DIR/$SCRATCHPKG_DIR/.pkgdel_files"
grep '/$' $ROOT_DIR/$INDEX_DIR/*/.files \
| grep -v "$ROOT_DIR/$INDEX_DIR/$name" \
grep '/$' $ROOT_DIR/$PKGDB_DIR/*/.files \
| grep -v "$ROOT_DIR/$PKGDB_DIR/$name" \
| awk -F : '{print $2}' \
| sort \
| uniq > "$reserve"
grep '/$' "$ROOT_DIR/$INDEX_DIR/$name/.files" > "$remove"
grep '/$' "$ROOT_DIR/$PKGDB_DIR/$name/.files" > "$remove"
grep -Fxv -f "$reserve" "$remove" | tac > "$dirs"
grep -v '/$' "$ROOT_DIR/$INDEX_DIR/$name/.files" | tac >> "$files"
grep -v '/$' "$ROOT_DIR/$PKGDB_DIR/$name/.files" | tac >> "$files"
echo "remove: $name-$version-$release..."
# pre-remove script
if [ ! "$NO_PREREMOVE" ] && [ -f "$ROOT_DIR/$INDEX_DIR/$name/.pkginstall" ]; then
if [ ! "$NO_PREREMOVE" ] && [ -f "$ROOT_DIR/$PKGDB_DIR/$name/.pkginstall" ]; then
(cd "$ROOT_DIR"/
run_scripts "$INDEX_DIR/$name/.pkginstall" pre-remove "$version"
run_scripts "$PKGDB_DIR/$name/.pkginstall" pre-remove "$version"
)
fi
@@ -191,14 +197,14 @@ fi
rm -f "$reserve" "$dirs" "$remove" "$files"
# post-remove script
if [ ! "$NO_POSTREMOVE" ] && [ -f "$ROOT_DIR/$INDEX_DIR/$name/.pkginstall" ]; then
if [ ! "$NO_POSTREMOVE" ] && [ -f "$ROOT_DIR/$PKGDB_DIR/$name/.pkginstall" ]; then
(cd "$ROOT_DIR"/
run_scripts "$INDEX_DIR/$name/.pkginstall" post-remove "$version"
run_scripts "$PKGDB_DIR/$name/.pkginstall" post-remove "$version"
)
fi
# remove from database
rm -rf "$ROOT_DIR/$INDEX_DIR/$name"
rm -rf "$ROOT_DIR/$PKGDB_DIR/$name"
# running ldconfig
if [ -x "$ROOT_DIR"/sbin/ldconfig ]; then

View File

@@ -1,7 +1,24 @@
#!/bin/sh
#
# script to check dependencies
# scratchpkg
#
# Copyright (c) 2018 by Emmett1 (emmett1.2miligrams@gmail.com)
#
# 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 3 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/>.
#
#
# script to check shared libraries dependencies
#
get_libpath() {

3
pkgfix
View File

@@ -128,7 +128,8 @@ if [ "$REBUILD" = 1 ]; then
confirm "Continue rebuild & reinstall broken packages?" "Operation cancelled."
}
for p in $order; do
scratch build -f $p && scratch install -r $p || exit 1
scratch build -f $p || exit 1
scratch install -r $p || exit 1
done
else
echo "Broken packages:"

View File

@@ -1,6 +1,24 @@
#!/bin/sh
#
# script to rebuild base packages in right toolchain order
# scratchpkg
#
# Copyright (c) 2018 by Emmett1 (emmett1.2miligrams@gmail.com)
#
# 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 3 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/>.
#
#
# script to rebuild base packages in right toolchain order
#
LIST="/tmp/$(basename $0)-list"

View File

@@ -24,8 +24,6 @@ if [ -d "$1" ]; then
else
mkdir "$1"
echo "# description :
# homepage :
# maintainer :
# depends :
name=$1

16
revdep
View File

@@ -114,7 +114,8 @@ rebuild() {
confirm "Continue rebuild & reinstall broken packages?" "Operation cancelled."
fi
for p in $order; do
scratch build -f $p && scratch install -r $p || { cleanup; exit 1; }
scratch build -f $p || { cleanup; exit 1; }
scratch install -r $p || { cleanup; exit 1; }
done
fi
}
@@ -163,8 +164,13 @@ rev_exclude() {
trap "interrupted" 1 2 3 15
command -v pkgadd >/dev/null 2>&1 || {
echo "'pkgadd' not found in \$PATH!"
exit 1
}
# package database directory
INDEX_DIR="/var/lib/scratchpkg/index"
PKGDB_DIR="$(pkgadd --print-dbdir)"
SEARCH_DIRS="/bin /usr/bin /sbin /usr/sbin /lib /usr/lib /lib64 /usr/lib64 /usr/libexec"
parse_opt $(extract_opts "$@")
@@ -174,7 +180,7 @@ if [ "$(id -u)" != 0 ] && [ "$REBUILD" = 1 ]; then
exit 1
fi
if [ "$PKG" ] && [ ! -f "$INDEX_DIR/$PKG/.files" ]; then
if [ "$PKG" ] && [ ! -f "$PKGDB_DIR/$PKG/.files" ]; then
echo "ERROR: Package '$PKG' not installed"
cleanup
exit 1
@@ -249,7 +255,7 @@ if [ "$PKG" ]; then
filterdir=cat
fi
printf "Find '$PKG' files... "
sed 's/^/\//' $INDEX_DIR/$PKG/.files | grep $gx | $filterfile | $filterdir > $FILE_LIST
sed 's/^/\//' $PKGDB_DIR/$PKG/.files | grep $gx | $filterfile | $filterdir > $FILE_LIST
else
printf "Find all files... "
find $SEARCH_DIRS $EXCLUDED_DIRS $EXCLUDED_FILES -type f \( -perm /+u+x -o -name '*.so' -o -name '*.so.*' \) -print 2> /dev/null | sort -u > $FILE_LIST
@@ -278,7 +284,7 @@ while read -r line; do
LIB_NAME=$NEW_LIB_NAME
[ "$LIB_NAME" ] || continue
PKG_NAME=$(echo $line | sed 's#^/##')
PKG_NAME=$(grep -Rx $PKG_NAME "$INDEX_DIR"/*/.files | cut -d : -f1)
PKG_NAME=$(grep -Rx $PKG_NAME "$PKGDB_DIR"/*/.files | cut -d : -f1)
[ "$PKG_NAME" ] || continue
PKG_NAME=$(dirname $PKG_NAME)
PKG_NAME=$(basename $PKG_NAME)

135
scratch
View File

@@ -35,27 +35,27 @@ nocolor() {
}
msg() {
printf "${GREEN}==>${CRESET} $1\n"
}
msgerr() {
printf "${RED}==> ERROR:${CRESET} $1\n"
printf "${GREEN}==>${CRESET} %s\n" "$1"
}
msginst() {
printf "[${GREEN}i${CRESET}] $1\n"
printf "[${GREEN}i${CRESET}] %s\n" "$1"
}
msgmiss() {
printf "[${YELLOW}m${CRESET}] $1\n"
printf "[${YELLOW}m${CRESET}] %s\n" "$1"
}
msgnoinst() {
printf "[-] $1\n"
printf "[-] %s\n" "$1"
}
msgerr() {
printf "${RED}==> ERROR:${CRESET} %s\n" "$1" >&2
}
msgwarn() {
printf "${YELLOW}==> WARNING:${CRESET} $1\n"
printf "${YELLOW}==> WARNING:${CRESET} %s\n" "$1" >&2
}
needroot() {
@@ -91,12 +91,12 @@ vercomp() {
installed_pkg_info() {
if isinstalled $2; then
grep ^$1 $INDEX_DIR/$2/.pkginfo | cut -d " " -f3-
grep ^$1 $PKGDB_DIR/$2/.pkginfo 2>/dev/null | cut -d " " -f3-
fi
}
allinstalled() {
grep ^name "$INDEX_DIR"/*/.pkginfo | awk '{print $3}'
grep ^name "$PKGDB_DIR"/*/.pkginfo 2>/dev/null | awk '{print $3}'
}
deps_alias() {
@@ -151,7 +151,7 @@ needarg() {
}
isinstalled() {
if [ -s "$INDEX_DIR/$1/.pkginfo" ] && [ "$(grep $1 $INDEX_DIR/$1/.pkginfo)" ]; then
if [ -s "$PKGDB_DIR/$1/.pkginfo" ] && [ "$(grep $1 $PKGDB_DIR/$1/.pkginfo)" ]; then
return 0
else
return 1
@@ -165,8 +165,8 @@ settermtitle() {
scratch_integrity() {
if [ "$1" ]; then
cd /
if [ -f $INDEX_DIR/$1/.files ]; then
cat $INDEX_DIR/$1/.files | while read -r line; do
if [ -f $PKGDB_DIR/$1/.files ]; then
cat $PKGDB_DIR/$1/.files | while read -r line; do
if [ ! -e "$line" ]; then
if [ -L "$line" ]; then
printf "${YELLOW}broken symlink${CRESET} $1: /$line"
@@ -183,7 +183,7 @@ scratch_integrity() {
else
cd /
for pkg in $(allinstalled); do
cat $INDEX_DIR/$pkg/.files | while read -r line; do
cat $PKGDB_DIR/$pkg/.files | while read -r line; do
if [ ! -e "$line" ]; then
if [ -L "$line" ]; then
echo "broken symlink $pkg: /$line"
@@ -202,10 +202,10 @@ scratch_lock() {
for pkg in "$@"; do
if ! isinstalled $pkg; then
msgerr "Package '$pkg' is not installed."
elif [ -f $INDEX_DIR/$pkg/.lock ]; then
elif [ -f $PKGDB_DIR/$pkg/.lock ]; then
msgerr "Package '$pkg' already locked."
else
touch $INDEX_DIR/$pkg/.lock && msg "Successfully locked package '$pkg'."
touch $PKGDB_DIR/$pkg/.lock && msg "Successfully locked package '$pkg'."
fi
done
}
@@ -213,7 +213,7 @@ scratch_lock() {
scratch_locate() {
needarg $@
for repo in $PORT_REPO; do
grep -R $@ $repo/*/.pkgfiles | sed 's/:/ /;s/\/\.pkgfiles//' | awk '{print $1,$4}' | column -t
grep -R $@ $repo/*/.pkgfiles 2>/dev/null | sed 's/:/ /;s/\/\.pkgfiles//' | awk '{print $1,$4}' | column -t
done
}
@@ -222,10 +222,10 @@ scratch_unlock() {
for pkg in "$@"; do
if ! isinstalled $pkg; then
msgerr "Package '$pkg' is not installed."
elif [ ! -f $INDEX_DIR/$pkg/.lock ]; then
elif [ ! -f $PKGDB_DIR/$pkg/.lock ]; then
msgerr "Package '$pkg' is not locked."
else
rm -f $INDEX_DIR/$pkg/.lock && msg "Successfully unlocked package '$pkg'."
rm -f $PKGDB_DIR/$pkg/.lock && msg "Successfully unlocked package '$pkg'."
fi
done
}
@@ -279,7 +279,7 @@ scratch_trigger() {
post_triggers() {
if [ "$trig_12" = 1 ]; then
echo "trigger: Running mkdirs..."
for mkd in $INDEX_DIR/*/.pkgmkdirs; do
for mkd in $PKGDB_DIR/*/.pkgmkdirs; do
[ -s $mkd ] || continue
grep -Ev '^(#|$)' $mkd | while read -r dir mode uid gid junk; do
if [ -e "$dir" ]; then
@@ -370,7 +370,7 @@ pre_triggers() {
# mime db
if [ "$trig_1" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/mime/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/mime/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_1=1
break
fi
@@ -380,7 +380,7 @@ pre_triggers() {
# desktop db
if [ "$trig_2" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/applications/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/applications/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_2=1
break
fi
@@ -390,7 +390,7 @@ pre_triggers() {
# mkfontdir
if [ "$trig_3" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/fonts/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/fonts/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_3=1
break
fi
@@ -400,7 +400,7 @@ pre_triggers() {
# hwdb
if [ "$trig_4" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^etc/udev/hwdb.d/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^etc/udev/hwdb.d/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_4=1
break
fi
@@ -410,7 +410,7 @@ pre_triggers() {
# icon caches
if [ "$trig_5" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/icons/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/icons/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_5=1
break
fi
@@ -420,7 +420,7 @@ pre_triggers() {
# gtk3 immodules
if [ "$trig_6" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gtk-3.0/3.0.0/immodules/.*.so $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gtk-3.0/3.0.0/immodules/.*.so $PKGDB_DIR/$pkg/.files)" ]; then
trig_6=1
break
fi
@@ -430,7 +430,7 @@ pre_triggers() {
# gtk2 immodules
if [ "$trig_7" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gtk-2.0/2.10.0/immodules/.*.so $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gtk-2.0/2.10.0/immodules/.*.so $PKGDB_DIR/$pkg/.files)" ]; then
trig_7=1
break
fi
@@ -440,7 +440,7 @@ pre_triggers() {
# gsettings schema
if [ "$trig_8" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/glib-2.0/schemas/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/glib-2.0/schemas/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_8=1
break
fi
@@ -450,7 +450,7 @@ pre_triggers() {
# gio modules
if [ "$trig_9" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gio/modules/.*.so $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gio/modules/.*.so $PKGDB_DIR/$pkg/.files)" ]; then
trig_9=1
break
fi
@@ -460,7 +460,7 @@ pre_triggers() {
# gdk-pixbuf
if [ "$trig_10" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/.*.so $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/.*.so $PKGDB_DIR/$pkg/.files)" ]; then
trig_10=1
break
fi
@@ -470,7 +470,7 @@ pre_triggers() {
# font caches
if [ "$trig_11" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/fonts/$ $INDEX_DIR/$pkg/.files)" ]; then
if [ -s "$PKGDB_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/fonts/$ $PKGDB_DIR/$pkg/.files)" ]; then
trig_11=1
break
fi
@@ -480,7 +480,7 @@ pre_triggers() {
# makedirs
if [ "$trig_12" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.pkgmkdirs" ]; then
if [ -s "$PKGDB_DIR/$pkg/.pkgmkdirs" ]; then
trig_12=1
break
fi
@@ -492,6 +492,7 @@ scratch_build() {
while [ "$1" ]; do
case $1 in
-i|-u|-r|-g|-p) ;;
--log) LOG=1;;
-*) OPTS="$OPTS $1";;
*) PKGNAME="$PKGNAME $1";;
esac
@@ -508,10 +509,17 @@ scratch_build() {
}
cd $ppath
settermtitle "Building $pkg..."
pkgbuild $OPTS || {
settermtitle "Building $pkg failed."
return 1
}
if [ "$LOG" ]; then
pkgbuild $OPTS | tee /var/log/pkgbuild.log || {
settermtitle "Building $pkg failed."
return 1
}
else
pkgbuild $OPTS || {
settermtitle "Building $pkg failed."
return 1
}
fi
settermtitle "Building $pkg done."
cd - >/dev/null
done
@@ -689,18 +697,21 @@ scratch_remove() {
outdatepkg() {
for pkg in $(allinstalled); do
if [ ! -e "$INDEX_DIR/$pkg/.lock" ] && getportpath $pkg >/dev/null; then
. $(getportpath $pkg)/$BUILD_SCRIPT
if [ -z "$name" ] || [ -z "$version" ]; then
continue
fi
iversion=$(installed_pkg_info version $pkg)
irelease=$(installed_pkg_info release $pkg)
if [ "$release" != "$irelease" ] || [ "$version" != "$iversion" ]; then
echo $name
fi
unset iversion irelease version release
if [ -f "$MASK_FILE" ] && [ $(grep -Ev '^(#|$| )' $MASK_FILE | grep $pkg) ]; then
continue
fi
[ -e "$PKGDB_DIR/$pkg/.lock" ] && continue
getportpath $pkg >/dev/null || continue
. $(getportpath $pkg)/$BUILD_SCRIPT
if [ -z "$name" ] || [ -z "$version" ]; then
continue
fi
iversion=$(installed_pkg_info version $pkg)
irelease=$(installed_pkg_info release $pkg)
if [ "$release" != "$irelease" ] || [ "$version" != "$iversion" ]; then
echo $name
fi
unset iversion irelease version release
done
}
@@ -895,7 +906,10 @@ scratch_outdate() {
fi
iversion=$(installed_pkg_info version $pkg)
irelease=$(installed_pkg_info release $pkg)
[ -f "$INDEX_DIR/$pkg/.lock" ] && ITSLOCK="[locked]"
[ -f "$PKGDB_DIR/$pkg/.lock" ] && ITSLOCK="[masked]"
if [ -f "$MASK_FILE" ] && [ $(grep -Ev '^(#|$| )' $MASK_FILE | grep $pkg) ]; then
ITSLOCK="[masked]"
fi
outdatemsg="$name $iversion-$irelease => $version-$release $ITSLOCK"
newerinstmsg="$name $iversion-$irelease => $version-$release [newer installed] $ITSLOCK"
if [ "$version" != "$iversion" ]; then
@@ -928,6 +942,7 @@ scratch_search() {
needarg $@
arg=$*
for repo in $PORT_REPO; do
[ -d $repo ] || continue
out=$(grep -R "# description" $repo | grep $BUILD_SCRIPT | grep "$arg" | awk -F : '{print $1}' | sort)
[ "$out" ] || continue
found=1
@@ -1221,7 +1236,6 @@ scratch_info() {
. $ppath/$BUILD_SCRIPT
desc=$(grep "^# description[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# description[[:blank:]]*:[[:blank:]]*//')
url=$(grep "^# homepage[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# homepage[[:blank:]]*:[[:blank:]]*//')
maint=$(grep "^# maintainer[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# maintainer[[:blank:]]*:[[:blank:]]*//')
deps=$(get_depends $1 | tr '\n' ' ')
@@ -1230,7 +1244,6 @@ scratch_info() {
echo "Version: $version"
echo "Release: $release"
echo "Description: $desc"
echo "Homepage: $url"
echo "Maintainer: $maint"
echo "Dependencies: $deps"
}
@@ -1238,7 +1251,7 @@ scratch_info() {
scratch_installed() {
for all in $(allinstalled); do
printf "%s" "$all "
grep -e ^version -e ^release $INDEX_DIR/$all/.pkginfo | awk '{print $3}' | tr '\n' '-' | sed 's:\-$::'
grep -e ^version -e ^release $PKGDB_DIR/$all/.pkginfo | awk '{print $3}' | tr '\n' '-' | sed 's:\-$::'
echo
done
}
@@ -1266,7 +1279,7 @@ scratch_missingdep() {
scratch_locked() {
for pkg in $(allinstalled); do
[ -f "$INDEX_DIR/$pkg/.lock" ] && echo "$pkg"
[ -f "$PKGDB_DIR/$pkg/.lock" ] && echo "$pkg"
done
}
@@ -1295,8 +1308,8 @@ scratch_path() {
scratch_provide() {
needarg $@
arg=$(echo $1 | sed "s/^\///")
grep -R "$arg" $INDEX_DIR/*/.files \
| sed "s:$INDEX_DIR/::" \
grep -R "$arg" $PKGDB_DIR/*/.files \
| sed "s:$PKGDB_DIR/::" \
| sed "s:/.files::" \
| tr : " " \
| column -t
@@ -1319,7 +1332,7 @@ scratch_readme() {
scratch_files() {
needarg $@
if isinstalled $1; then
cat "$INDEX_DIR/$1/.files"
cat "$PKGDB_DIR/$1/.files"
else
msg "Package '$1' not installed."
fi
@@ -1355,6 +1368,7 @@ Options:
--exclude=* exclude dependencies, comma separated
build <ports> <arg> build ports (use pkgbuild arg, except '-i', '-u', '-r', '-g', & '-p')
--log log build process (/var/log/pkgbuild.log)
lock <ports> locking ports prevent upgrade
unlock <ports> unlock locked ports
@@ -1395,6 +1409,12 @@ print_runhelp_msg() {
exit 2
}
# check for 'pkgadd', required for package database path
command -v pkgadd >/dev/null 2>&1 || {
echo "'pkgadd' not found in \$PATH!"
exit 1
}
mode=$1
[ "$mode" ] || {
@@ -1421,9 +1441,10 @@ for opt in $@; do
done
BUILD_SCRIPT="spkgbuild"
INDEX_DIR="/var/lib/scratchpkg/index"
PKGDB_DIR="$(pkgadd --print-dbdir)"
REPO_FILE="${REPO_FILE:-/etc/scratchpkg.repo}"
ALIAS_FILE="${ALIAS_FILE:-/etc/scratchpkg.alias}"
MASK_FILE="${MASK_FILE:-/etc/scratchpkg.mask}"
# default value from pkgbuild
SOURCE_DIR="/var/cache/scratchpkg/sources"

View File

@@ -6,4 +6,4 @@
#
# example:
# openssl libressl
#
#

View File

@@ -2,9 +2,9 @@
# Configuration file for scratchpkg
#
CFLAGS="-O2 -march=x86-64 -pipe"
CXXFLAGS="${CFLAGS}"
MAKEFLAGS="-j$(nproc)"
# CFLAGS="-O2 -march=x86-64 -pipe"
# CXXFLAGS="${CFLAGS}"
# MAKEFLAGS="-j$(nproc)"
# SOURCE_DIR="/var/cache/scratchpkg/sources"
# PACKAGE_DIR="/var/cache/scratchpkg/packages"

6
scratchpkg.mask Normal file
View File

@@ -0,0 +1,6 @@
# exclude packages from sysup
glibc
gcc
linux-api-headers
binutils