mirror of
https://github.com/outbackdingo/scratchpkg.git
synced 2026-03-21 15:44:48 +00:00
Compare commits
81 Commits
0.3
...
new-world-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1161d001b8 | ||
|
|
a70018062e | ||
|
|
70fa8b3bf2 | ||
|
|
4a631ea4a7 | ||
|
|
b7cd1114da | ||
|
|
7612d83368 | ||
|
|
41151b383e | ||
|
|
ca93ecfe94 | ||
|
|
cdd4cdd71c | ||
|
|
31bba79556 | ||
|
|
643a7ec6bf | ||
|
|
b06326bfd0 | ||
|
|
9eef7b197b | ||
|
|
6626017ff7 | ||
|
|
0b3092bbfb | ||
|
|
da5d1be623 | ||
|
|
da7cce1e23 | ||
|
|
d353ba3bfa | ||
|
|
d53b1b7b08 | ||
|
|
819f42df3a | ||
|
|
c254ac0dc6 | ||
|
|
61dd798a5f | ||
|
|
31e52cc3b5 | ||
|
|
4adcc4bfe9 | ||
|
|
a432db4c26 | ||
|
|
073e7433f7 | ||
|
|
e1dd623125 | ||
|
|
f396d41551 | ||
|
|
59ea432704 | ||
|
|
3dcdee4f9d | ||
|
|
8691210b76 | ||
|
|
d56e9e4d6c | ||
|
|
278bc6c512 | ||
|
|
b9e49bcfac | ||
|
|
5c5324970f | ||
|
|
ece22a4c4a | ||
|
|
1234389c38 | ||
|
|
e2588ff9c8 | ||
|
|
f94e5714a1 | ||
|
|
d800fa1f91 | ||
|
|
0444fb4937 | ||
|
|
c6131b545a | ||
|
|
57c3779d86 | ||
|
|
80e4afcaac | ||
|
|
0e1dd428c0 | ||
|
|
b14ab18b8d | ||
|
|
e651bf371f | ||
|
|
059174e644 | ||
|
|
8c3f3e4bc7 | ||
|
|
6c85489b2c | ||
|
|
dba27d791f | ||
|
|
7e07dcdd0a | ||
|
|
fd011dd3dc | ||
|
|
bc77ed9758 | ||
|
|
b42c48a88c | ||
|
|
497b92c1cd | ||
|
|
f3018114dd | ||
|
|
eee0a24f61 | ||
|
|
ab23dbde67 | ||
|
|
f74b026a13 | ||
|
|
552e0c7bfe | ||
|
|
34b9568afb | ||
|
|
0aa9868d15 | ||
|
|
f0ff3d070e | ||
|
|
985f59fc97 | ||
|
|
2651ad3188 | ||
|
|
3602e0a8e8 | ||
|
|
c816e3b409 | ||
|
|
8d4b7902eb | ||
|
|
32b7462f2d | ||
|
|
a1ef1c5b33 | ||
|
|
b72816f8df | ||
|
|
9b186bfd31 | ||
|
|
8e8c62d338 | ||
|
|
c8b2eca5ba | ||
|
|
a23a22c659 | ||
|
|
9a06fbd474 | ||
|
|
7a91fbdcd4 | ||
|
|
00e55a2473 | ||
|
|
0ee256b921 | ||
|
|
424c56f075 |
@@ -16,7 +16,8 @@ install -dm777 ${DESTDIR}${CACHE_DIR}/packages
|
||||
install -dm777 ${DESTDIR}${CACHE_DIR}/sources
|
||||
install -dm777 ${DESTDIR}${CACHE_DIR}/work
|
||||
|
||||
install -m755 xchroot revdep pkgadd pkgdel pkgbuild pkgquery scratch updateconf ${DESTDIR}${BINDIR}
|
||||
install -m644 scratchpkg.conf scratchpkg.repo scratchpkg.alias ${DESTDIR}${CONFDIR}
|
||||
install -m755 xchroot revdep pkgadd pkgdel pkgbuild scratch updateconf portsync \
|
||||
pkgbase pkgdepends pkgrebuild portcreate ${DESTDIR}${BINDIR}
|
||||
install -m644 scratchpkg.conf scratchpkg.repo scratchpkg.alias scratchpkg.mask ${DESTDIR}${CONFDIR}
|
||||
|
||||
install -m644 revdep.conf ${DESTDIR}${REVDEPCONF}
|
||||
|
||||
@@ -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> ]
|
||||
|
||||
139
pkgadd
139
pkgadd
@@ -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,52 +114,53 @@ 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" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
run_scripts() {
|
||||
if [ "$ROOT_DIR" ]; then
|
||||
xchroot "$ROOT_DIR" sh $@
|
||||
else
|
||||
sh $@
|
||||
fi
|
||||
}
|
||||
|
||||
parse_opts $(extract_opts "$@")
|
||||
|
||||
SCRATCHPKG_DIR="var/lib/scratchpkg"
|
||||
INDEX_DIR="$SCRATCHPKG_DIR/index"
|
||||
PKGDB_DIR="$SCRATCHPKG_DIR/db"
|
||||
PKGDBPERMS_DIR="$PKGDB_DIR.perms"
|
||||
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 does not exist: $ROOT_DIR/$PKGDB_DIR"
|
||||
ret 1
|
||||
}
|
||||
|
||||
# check for root access
|
||||
[ "$(id -u)" = "0" ] || {
|
||||
msgerr "Installing package need root access!"
|
||||
msgerr "Installing packages requires root access!"
|
||||
ret 1
|
||||
}
|
||||
|
||||
# check for lock file
|
||||
[ -f "$ROOT_DIR/$LOCK_FILE" ] && {
|
||||
msgerr "Cant install/remove package simultaneously."
|
||||
msgerr "Cannot install/remove package simultaneously."
|
||||
msgerr "remove '$ROOT_DIR/$LOCK_FILE' if no install/remove package process running."
|
||||
exit 1
|
||||
}
|
||||
|
||||
touch "$ROOT_DIR/$LOCK_FILE" 2>/dev/null || {
|
||||
msgerr "Cant create lock file in '$ROOT_DIR/$LOCK_FILE'."
|
||||
msgerr "Cannot create lock file in '$ROOT_DIR/$LOCK_FILE'."
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -165,7 +168,7 @@ BASEPKGNAME=$(basename $PKGNAME)
|
||||
|
||||
# check existence of package file
|
||||
[ -f "$PKGNAME" ] || {
|
||||
msgerr "Package '$1' not exist!"
|
||||
msgerr "Package '$1' does not exist!"
|
||||
ret 1
|
||||
}
|
||||
|
||||
@@ -177,8 +180,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=$(head -n1 $ROOT_DIR/$PKGDB_DIR/$name | awk '{print $1}')
|
||||
irelease=$(head -n1 $ROOT_DIR/$PKGDB_DIR/$name | awk '{print $2}')
|
||||
ALREADYINSTALLED=yes
|
||||
fi
|
||||
|
||||
@@ -206,7 +209,7 @@ TMP_PKGINSTALL="$ROOT_DIR/$SCRATCHPKG_DIR/.tmp_pkginstall"
|
||||
TMP_CONFLICT="$ROOT_DIR/$SCRATCHPKG_DIR/.tmp_conflict"
|
||||
|
||||
# check integrity of package and save list file/dirs to install in the meantime
|
||||
tar -tf $PKGNAME > $TMP_PKGADD 2>/dev/null || {
|
||||
tar -tvf $PKGNAME > $TMP_PKGADD 2>/dev/null || {
|
||||
msgerr "Package '$1' is corrupted!"
|
||||
ret 1
|
||||
}
|
||||
@@ -220,18 +223,22 @@ echo "$opr: $name-$version-$release..."
|
||||
|
||||
# check for file conflict
|
||||
if [ ! "$IGNORE_CONFLICT" ]; then
|
||||
grep -Ev "^.pkg*" "$TMP_PKGADD" | grep -v '/$' | while read -r line; do
|
||||
grep -v '/$' "$TMP_PKGADD" | awk '{print $6}' | while read -r line; do
|
||||
if [ "$line" = "${line%.*}.spkgnew" ]; then
|
||||
line=${line%.*}
|
||||
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
|
||||
echo "$line"
|
||||
if ! grep -Fqx "$line" "$ROOT_DIR/$PKGDB_DIR/$name"; then
|
||||
_f=$(grep -x ^"$line"$ $ROOT_DIR/$PKGDB_DIR/* | cut -d : -f1 | awk -F / '{print $(NF)}' | head -n1 | grep -v $name)
|
||||
_f=${_f:-(none)}
|
||||
echo "$_f $line"
|
||||
touch "$TMP_CONFLICT"
|
||||
fi
|
||||
else
|
||||
echo "$line"
|
||||
_f=$(grep -x ^"$line"$ $ROOT_DIR/$PKGDB_DIR/* | cut -d : -f1 | awk -F / '{print $(NF)}' | head -n1)
|
||||
_f=${_f:-(none)}
|
||||
echo "$_f $line"
|
||||
touch "$TMP_CONFLICT"
|
||||
fi
|
||||
fi
|
||||
@@ -243,32 +250,10 @@ if [ ! "$IGNORE_CONFLICT" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# pre-install and pre-upgrade script
|
||||
if grep -qx .pkginstall $TMP_PKGADD; then
|
||||
TMP_PKGINSTALL_SCRIPT="$SCRATCHPKG_DIR/pkgadd_installscript"
|
||||
tar -xf "$PKGNAME" .pkginstall -O > "$ROOT_DIR/$TMP_PKGINSTALL_SCRIPT"
|
||||
if [ ! "$NO_PREINSTALL" ] && [ ! "$UPGRADE_PKG" ]; then
|
||||
(cd "$ROOT_DIR"/
|
||||
run_scripts "$TMP_PKGINSTALL_SCRIPT" pre-install "$version"
|
||||
)
|
||||
fi
|
||||
if [ "$UPGRADE_PKG" ] && [ ! "$NO_PREUPGRADE" ]; then
|
||||
(cd "$ROOT_DIR"/
|
||||
run_scripts "$TMP_PKGINSTALL_SCRIPT" pre-upgrade "$version" "$iversion"
|
||||
)
|
||||
fi
|
||||
rm -f "$ROOT_DIR/$TMP_PKGINSTALL_SCRIPT"
|
||||
fi
|
||||
|
||||
# exclude .pkg* files when extract into system
|
||||
for i in $(grep "^.pkg*" $TMP_PKGADD); do
|
||||
excludefile="$excludefile --exclude=$i"
|
||||
done
|
||||
|
||||
rm -f $TMP_PKGINSTALL
|
||||
|
||||
# extract package into ROOT_DIR
|
||||
tar --keep-directory-symlink -p -x -v -f "$PKGNAME" -C "$ROOT_DIR"/ $excludefile | while read -r line; do
|
||||
tar -xvhpf "$PKGNAME" -C "$ROOT_DIR"/ | while read -r line; do
|
||||
if [ "$line" = "${line%.*}.spkgnew" ]; then
|
||||
line=${line%.*}
|
||||
if [ "$UPGRADE_PKG" ] || [ "$REINSTALL_PKG" ]; then
|
||||
@@ -285,54 +270,26 @@ done
|
||||
|
||||
# remove old files from old package that not exist in new package
|
||||
if [ "$UPGRADE_PKG" ] || [ "$REINSTALL_PKG" ]; then
|
||||
rmlist_file="$ROOT_DIR/$SCRATCHPKG_DIR/.rmlist_file"
|
||||
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 \
|
||||
| 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 -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"/
|
||||
[ -s $rmlist_file ] && xargs -a $rmlist_file -d'\n' rm $VERBOSE_INSTALL
|
||||
[ -s $rmlist_dir ] && xargs -a $rmlist_dir -d'\n' rmdir $VERBOSE_INSTALL
|
||||
)
|
||||
rm -f "$rmlist_file" "$rmlist_dir" "$reserve_dir" "$rmlist_all"
|
||||
tail -n+2 "$ROOT_DIR/$PKGDB_DIR/$name" | tac | while read -r line; do
|
||||
case $line in
|
||||
*/) grep "^$line$" $ROOT_DIR/$PKGDB_DIR/* "$TMP_PKGINSTALL" 2>/dev/null | grep -qv "$ROOT_DIR/$PKGDB_DIR/$name" || rmdir $([ "$VERBOSE_INSTALL" ] && echo -v) "$ROOT_DIR/$line";;
|
||||
*) grep -q "^$line$" "$TMP_PKGINSTALL" || rm $([ "$VERBOSE_INSTALL" ] && echo -v) "$ROOT_DIR/$line";;
|
||||
esac
|
||||
done
|
||||
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"
|
||||
|
||||
for ii in $(grep ^.pkg* $TMP_PKGADD); do
|
||||
pkgfiles="$pkgfiles $ii"
|
||||
echo "$version $release" > "$ROOT_DIR/$PKGDB_DIR/$name"
|
||||
cat "$TMP_PKGINSTALL" >> "$ROOT_DIR/$PKGDB_DIR/$name"
|
||||
mkdir -p "$ROOT_DIR/$PKGDBPERMS_DIR"
|
||||
rm -f "$ROOT_DIR/$PKGDBPERMS_DIR/$name"
|
||||
grep '/$' $TMP_PKGADD | while read -r perms own junk1 junk2 junk3 dir junk4; do
|
||||
if [ "$perms" != drwxr-xr-x ] || [ "$own" != root/root ]; then
|
||||
echo "$perms $own $dir" >> "$ROOT_DIR/$PKGDBPERMS_DIR/$name"
|
||||
[ -s "$ROOT_DIR/$PKGDBPERMS_DIR/$name" ] || rm "$ROOT_DIR/$PKGDBPERMS_DIR/$name"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$pkgfiles" ]; then
|
||||
tar -x -f "$PKGNAME" -C "$ROOT_DIR/$INDEX_DIR/$name" $pkgfiles >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
if [ -f "$ROOT_DIR/$INDEX_DIR/$name/.pkginstall" ]; then
|
||||
if [ ! "$NO_POSTINSTALL" ] && [ ! "$UPGRADE_PKG" ]; then
|
||||
(cd "$ROOT_DIR"/
|
||||
run_scripts "$INDEX_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"
|
||||
)
|
||||
fi
|
||||
fi
|
||||
|
||||
# running ldconfig
|
||||
if [ -x "$ROOT_DIR"/sbin/ldconfig ]; then
|
||||
"$ROOT_DIR"/sbin/ldconfig -r "$ROOT_DIR"/
|
||||
|
||||
76
pkgbase
Executable file
76
pkgbase
Executable file
@@ -0,0 +1,76 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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() {
|
||||
while [ "$1" ]; do
|
||||
case $1 in
|
||||
-n) dryrun=1;;
|
||||
-y) yes=$1;;
|
||||
-h) printhelp; exit 0;;
|
||||
*) pkg="$pkg $1"
|
||||
esac
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
printhelp() {
|
||||
cat << EOF
|
||||
Usage:
|
||||
$(basename $0) [options] [packages]
|
||||
|
||||
Options:
|
||||
-n dry-run
|
||||
-y dont ask user confirmation
|
||||
-h print this help msg
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
error=0
|
||||
|
||||
parseopt "$@"
|
||||
|
||||
echo "Calculate packages to keep..."
|
||||
keep=$(scratch deplist base $pkg | awk '{print $2}')
|
||||
|
||||
echo "Calculate selected packages to remove..."
|
||||
for pkg in $(scratch installed | awk '{print $1}'); do
|
||||
echo $keep | tr ' ' '\n' | grep -qx $pkg || {
|
||||
remove="$remove $pkg"
|
||||
}
|
||||
done
|
||||
|
||||
[ "$remove" ] && {
|
||||
[ "$dryrun" = 1 ] && {
|
||||
for i in $remove; do
|
||||
echo "remove: $i..."
|
||||
done
|
||||
echo "This is dry-run, no real action is run!"
|
||||
} || {
|
||||
scratch remove $yes $remove || error=1
|
||||
}
|
||||
} || {
|
||||
echo "Already on base, nothing to remove."
|
||||
}
|
||||
|
||||
exit $error
|
||||
531
pkgbuild
531
pkgbuild
@@ -27,51 +27,52 @@ 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
|
||||
fi
|
||||
needupdatechecksum="$needupdatechecksum $FILENAME"
|
||||
pkg_genchecksums() {
|
||||
for i in $(get_filepath); do
|
||||
[ -f "$i" ] || {
|
||||
msgerr "File missing: $i"
|
||||
err=1
|
||||
}
|
||||
done
|
||||
|
||||
md5sum $needupdatechecksum | sed -e 's| .*/| |' | sort -k 2
|
||||
[ "$err" = 1 ] && abort 1
|
||||
generatemdsum > .checksums
|
||||
msg "Checksums updated."
|
||||
}
|
||||
|
||||
checkmdsum() {
|
||||
generatemdsum() {
|
||||
for s in $(get_filepath); 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
|
||||
}
|
||||
|
||||
pkg_checksum() {
|
||||
TMPCHECKSUM=$WORK_DIR/checksumstmp.$$
|
||||
ORICHECKSUM=$WORK_DIR/checksumsori.$$
|
||||
DIFCHECKSUM=$WORK_DIR/checksumsdiff.$$
|
||||
|
||||
if [ ! -f .checksums ]; then
|
||||
msg "Generating .checksums..."
|
||||
generatemdsum > .checksums
|
||||
pkg_genchecksums
|
||||
else
|
||||
msg "Checking checksums..."
|
||||
generatemdsum > "$TMPCHECKSUM"
|
||||
sort -k2 .checksums > "$ORICHECKSUM"
|
||||
diff -w -t -U 0 "$ORICHECKSUM" "$TMPCHECKSUM" > "$DIFCHECKSUM"
|
||||
if [ "$IGNORE_MDSUM" != "yes" ] && [ "$IGNORE_MDSUM" != 1 ]; then
|
||||
msg "Checking checksums..."
|
||||
generatemdsum > "$TMPCHECKSUM"
|
||||
sort -k2 .checksums > "$ORICHECKSUM"
|
||||
diff -w -t -U 0 "$ORICHECKSUM" "$TMPCHECKSUM" > "$DIFCHECKSUM"
|
||||
fi
|
||||
fi
|
||||
|
||||
[ -s "$DIFCHECKSUM" ] && {
|
||||
@@ -89,48 +90,38 @@ checkmdsum() {
|
||||
[ "$mismatch" = 1 ] && abort 1
|
||||
}
|
||||
|
||||
download_src() {
|
||||
for FILE in $source; do
|
||||
if echo $FILE | grep -Eq '::(http|https|ftp)://'; then
|
||||
FILENAME=$(echo $FILE | awk -F '::' '{print $1}')
|
||||
SRCURL=$(echo $FILE | awk -F '::' '{print $2}')
|
||||
else
|
||||
FILENAME=$(basename $FILE)
|
||||
SRCURL=$FILE
|
||||
fi
|
||||
case $DOWNLOAD_PROG in
|
||||
curl) DLCMD="curl -C - -L --fail --ftp-pasv --retry 3 --retry-delay 3 -o $SOURCE_DIR/$FILENAME.partial $CURL_OPTS" ;;
|
||||
wget) DLCMD="wget -c --passive-ftp --no-directories --tries=3 --waitretry=3 --output-document=$SOURCE_DIR/$FILENAME.partial $WGET_OPTS" ;;
|
||||
get_filepath() {
|
||||
for i in $source; do
|
||||
case $i in
|
||||
*::*) echo $SOURCE_DIR/${i%::*};;
|
||||
*://*) echo $SOURCE_DIR/${i##*/};;
|
||||
*) echo $PWD/$i;;
|
||||
esac
|
||||
if [ "$FILENAME" != "$FILE" ]; then
|
||||
if [ ! -f "$SOURCE_DIR/$FILENAME" ] || [ "$REDOWNLOAD_SOURCE" ]; then
|
||||
[ "$REDOWNLOAD_SOURCE" ] && rm -f "$SOURCE_DIR/$FILENAME.partial"
|
||||
if [ -f "$SOURCE_DIR/$FILENAME.partial" ]; then
|
||||
msg "Resuming '$SRCURL'."
|
||||
else
|
||||
msg "Downloading '$SRCURL'."
|
||||
fi
|
||||
$DLCMD $SRCURL
|
||||
if [ $? = 0 ]; then
|
||||
[ "$REDOWNLOAD_SOURCE" ] && rm -f "$SOURCE_DIR/$FILENAME"
|
||||
mv $SOURCE_DIR/$FILENAME.partial $SOURCE_DIR/$FILENAME
|
||||
else
|
||||
msgerr "Failed downloading '$FILENAME'."
|
||||
abort 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ ! -f "$FILENAME" ]; then
|
||||
msgerr "Source '$FILENAME' not found."
|
||||
abort 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
prepare_src() {
|
||||
[ "$IGNORE_MDSUM" -o "$CHECK_MDSUM" = 0 ] || checkmdsum
|
||||
|
||||
pkg_fetch() {
|
||||
for i in $source; do
|
||||
case $i in
|
||||
*::*) filepath="$SOURCE_DIR/${i%::*}"; url=${i#*::};;
|
||||
*://*) filepath="$SOURCE_DIR/${i##*/}"; url=$i;;
|
||||
*) continue;;
|
||||
esac
|
||||
[ -f "$filepath" ] && {
|
||||
msg "Source found: $filepath"
|
||||
continue
|
||||
}
|
||||
[ -f "$filepath.partial" ] && COPT="-C -"
|
||||
msg "Fetching: $i"
|
||||
curl $COPT -L --fail --ftp-pasv --retry 3 --retry-delay 3 -o $filepath.partial $CURL_OPTS $url || {
|
||||
msgerr "Fetching failed: $i"
|
||||
abort 1
|
||||
}
|
||||
mv $filepath.partial $filepath
|
||||
done
|
||||
}
|
||||
|
||||
pkg_unpack() {
|
||||
SRC=$WORK_DIR/$name/src
|
||||
PKG=$WORK_DIR/$name/pkg
|
||||
|
||||
@@ -140,83 +131,84 @@ prepare_src() {
|
||||
|
||||
mkdir -p $SRC $PKG
|
||||
|
||||
if [ "$source" ]; then
|
||||
for FILE in $source; do
|
||||
if echo $FILE | grep -Eq '::(http|https|ftp)://'; then
|
||||
FILENAME=$SOURCE_DIR/$(echo $FILE | awk -F '::' '{print $1}')
|
||||
elif echo $FILE | grep -Eq '^(http|https|ftp)://'; then
|
||||
FILENAME=$SOURCE_DIR/$(basename $FILE)
|
||||
else
|
||||
FILENAME=$PWD/$(basename $FILE)
|
||||
fi
|
||||
for NOEXT in $noextract; do
|
||||
if [ "$NOEXT" = "$(basename $FILENAME)" ]; then
|
||||
nxt=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
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)
|
||||
if [ $(type -p bsdtar) ]; then
|
||||
COMMAND="bsdtar -p -o -C $SRC -xf $FILENAME"
|
||||
else
|
||||
COMMAND="tar -p -o -C $SRC -xf $FILENAME"
|
||||
fi
|
||||
MODE="Unpacking" ;;
|
||||
*)
|
||||
COMMAND="cp $FILENAME $SRC"
|
||||
MODE="Preparing" ;;
|
||||
esac
|
||||
msg "$MODE '$(basename $FILENAME)'..."
|
||||
$COMMAND || {
|
||||
msgerr "$MODE '$FILENAME' failed."
|
||||
abort 1
|
||||
}
|
||||
else
|
||||
MODE="Preparing"
|
||||
msg "$MODE '$(basename $FILENAME)'..."
|
||||
cp "$FILENAME" "$SRC" || {
|
||||
msgerr "$MODE '$FILENAME' failed."
|
||||
TAR=tar
|
||||
[ $(command -v bsdtar) ] && TAR=bsdtar
|
||||
|
||||
for i in $(get_filepath); do
|
||||
if [ ! -f "$i" ]; then
|
||||
msgerr "Source missing: $i"
|
||||
abort 1
|
||||
fi
|
||||
for n in $noextract; do
|
||||
if [ ${i##*/} = $n ]; then
|
||||
msg "Preparing: $i"
|
||||
cp $i $SRC || {
|
||||
msgerr "Preparing failed: $i"
|
||||
abort 1
|
||||
}
|
||||
continue 2
|
||||
fi
|
||||
unset nxt
|
||||
done
|
||||
fi
|
||||
case $i in
|
||||
*.tar|*.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tar.lz|*.tbz2|*.tar.xz|*.txz|*.tar.lzma|*.zip|*.rpm)
|
||||
msg "Unpacking: $i"
|
||||
$TAR -p -o -C $SRC -xf $i;;
|
||||
*)
|
||||
msg "Preparing: $i"
|
||||
cp $i $SRC;;
|
||||
esac
|
||||
[ $? = 0 ] || {
|
||||
msgerr "Unpacking/Preparing failed: $i"
|
||||
abort 1
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
run_build() {
|
||||
pkg_build() {
|
||||
[ "$(id -u)" = 0 ] || {
|
||||
msgerr "You must build package as root, or use fakeroot."
|
||||
abort 1
|
||||
}
|
||||
|
||||
msg "Start build '$name-$version-$release'."
|
||||
|
||||
[ "$MAKE_FLAGS" = 1 ] && export MAKEFLAGS || unset MAKEFLAGS
|
||||
[ "$BUILD_FLAGS" = 1 ] && export CFLAGS CXXFLAGS || unset CFLAGS CXXFLAGS
|
||||
msg "Build start: $name-$version-$release"
|
||||
|
||||
cd $SRC >/dev/null
|
||||
|
||||
(set -e -x; build 2>&1)
|
||||
if [ "$QUIET" ]; then
|
||||
(set -e -x; build) 2> /dev/null
|
||||
else
|
||||
(set -e -x; build 2>&1)
|
||||
fi
|
||||
|
||||
if [ $? != 0 ]; then
|
||||
msgerr "Build '$name-$version-$release' failed."
|
||||
msgerr "Build failed: $name-$version-$release"
|
||||
abort 1
|
||||
else
|
||||
msg "Build '$name-$version-$release' success."
|
||||
msg "Build success: $name-$version-$release"
|
||||
fi
|
||||
|
||||
cd - >/dev/null
|
||||
}
|
||||
|
||||
removeemptydirs() {
|
||||
find . -type d -empty -delete
|
||||
}
|
||||
|
||||
removelibtool() {
|
||||
find . ! -type d -name "*.la" -delete
|
||||
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' does not exist in PKG!"
|
||||
linterror=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$linterror" = 1 ]; then
|
||||
abort 1
|
||||
fi
|
||||
}
|
||||
|
||||
strip_files() {
|
||||
@@ -232,20 +224,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
|
||||
@@ -253,12 +245,12 @@ strip_files() {
|
||||
}
|
||||
|
||||
compressinfomanpages() {
|
||||
find . -type f -path "*/man/man*/*" | while read -r file; do
|
||||
find . -type f -path "*/share/man/*" | while read -r file; do
|
||||
if [ "$file" = "${file%%.gz}" ]; then
|
||||
gzip -9 -f "$file"
|
||||
fi
|
||||
done
|
||||
find . -type l -path "*/man/man*/*" | while read -r file; do
|
||||
find . -type l -path "*/share/man/*" | while read -r file; do
|
||||
FILE="${file%%.gz}.gz"
|
||||
TARGET="$(readlink $file)"
|
||||
TARGET="${TARGET##*/}"
|
||||
@@ -269,53 +261,16 @@ compressinfomanpages() {
|
||||
ln -sf $TARGET $FILE
|
||||
fi
|
||||
done
|
||||
if [ -d usr/share/info ]; then
|
||||
(cd usr/share/info
|
||||
for file in $(find . -type f); do
|
||||
if [ "$file" = "${file%%.gz}" ]; then
|
||||
gzip -9 "$file"
|
||||
fi
|
||||
done
|
||||
)
|
||||
fi
|
||||
}
|
||||
|
||||
backupconf() {
|
||||
for FILE in $backup; do
|
||||
if [ ! -f $FILE ]; then
|
||||
msgerr "File '$FILE' not exist!"
|
||||
abort 1
|
||||
else
|
||||
mv $FILE $FILE.spkgnew
|
||||
find . -type f -path "*/share/info/*" | while read -r file; do
|
||||
if [ "$file" = "${file%%.gz}" ]; then
|
||||
gzip -9 -f "$file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
removedocs() {
|
||||
for i in doc gtk-doc info; do
|
||||
rm -fr \
|
||||
usr/share/$i \
|
||||
usr/$i \
|
||||
usr/local/$i \
|
||||
usr/local/share/$i
|
||||
done
|
||||
}
|
||||
|
||||
removelocales() {
|
||||
rm -fr \
|
||||
usr/share/locale \
|
||||
usr/locale \
|
||||
usr/local/locale \
|
||||
usr/local/share/locale
|
||||
}
|
||||
|
||||
packaging() {
|
||||
for FILE in $INCLUDEINPKG; do
|
||||
if [ -f $FILE ]; then
|
||||
install -m644 $FILE $PKG/.pkg$FILE
|
||||
addtotar="$addtotar .pkg$FILE"
|
||||
fi
|
||||
done
|
||||
pkg_package() {
|
||||
# lint $PKG before packaging
|
||||
pkglint
|
||||
|
||||
cd $PKG >/dev/null
|
||||
|
||||
@@ -327,18 +282,28 @@ packaging() {
|
||||
find usr/share/fonts \( -name fonts.dir -o -name fonts.scale \) -delete
|
||||
}
|
||||
|
||||
# remove pseudo directories
|
||||
#rm -fr dev sys proc run tmp
|
||||
if [ "$KEEP_LIBTOOL" = 0 ] || [ "$KEEP_LIBTOOL" = "no" ]; then
|
||||
find . ! -type d -name "*.la" -delete
|
||||
fi
|
||||
|
||||
[ "$KEEP_EMPTYDIR" = 0 ] && removeemptydirs
|
||||
[ "$KEEP_LIBTOOL" = 0 ] && removelibtool
|
||||
[ "$STRIP_BINARY" = 1 ] && strip_files
|
||||
[ "$ZIP_MAN" = 1 ] && compressinfomanpages
|
||||
[ "$KEEP_DOCS" = 0 ] && removedocs
|
||||
[ "$KEEP_LOCALES" = 0 ] && removelocales
|
||||
if [ "$KEEP_LOCALE" = 0 ] || [ "$KEEP_LOCALE" = "no" ]; then
|
||||
rm -fr usr/share/locale usr/locale usr/lib/locale
|
||||
fi
|
||||
|
||||
if [ "${#backup[@]}" -gt 0 ]; then
|
||||
backupconf
|
||||
if [ "$KEEP_DOC" = 0 ] || [ "$KEEP_DOC" = "no" ]; then
|
||||
rm -fr usr/share/doc usr/share/gtk-doc usr/doc usr/gtk-doc
|
||||
fi
|
||||
|
||||
if [ "$NO_STRIP" = 0 ] || [ "$NO_STRIP" = "no" ]; then
|
||||
strip_files
|
||||
fi
|
||||
|
||||
compressinfomanpages
|
||||
|
||||
if [ "$backup" ]; then
|
||||
for FILE in $backup; do
|
||||
mv $FILE $FILE.spkgnew
|
||||
done
|
||||
fi
|
||||
|
||||
[ "$FORCE_REBUILD" ] && rm -f "$PACKAGE_DIR/$PKGNAME"
|
||||
@@ -347,118 +312,80 @@ packaging() {
|
||||
xz) COMPRESS="-J" ;;
|
||||
gz) COMPRESS="-z" ;;
|
||||
bz2) COMPRESS="-j" ;;
|
||||
lz4) COMPRESS="--lz4" ;;
|
||||
zstd) COMPRESS="--zstd" ;;
|
||||
esac
|
||||
|
||||
tar -c $COMPRESS -f $PACKAGE_DIR/$PKGNAME * $addtotar || {
|
||||
rm -f $PACKAGE_DIR/$PKGNAME
|
||||
msgerr "Packaging '$PKGNAME' failed."
|
||||
msgerr "Packaging failed: $PKGNAME"
|
||||
abort 1
|
||||
}
|
||||
|
||||
tar -tvf $PACKAGE_DIR/$PKGNAME | sort -k 6
|
||||
|
||||
msg "Successfully created package '$PKGNAME'. ($(ls -lh $PACKAGE_DIR/$PKGNAME | awk '{print $5}'))"
|
||||
msg "Packaging success: $PKGNAME ($(ls -lh $PACKAGE_DIR/$PKGNAME | awk '{print $5}'))"
|
||||
|
||||
cd - >/dev/null
|
||||
|
||||
[ -f .pkgfiles ] || generate_pkgfiles
|
||||
if [ ! -f .pkgfiles ] || [ "$(head -n1 .pkgfiles)" != "$name-$version-$release" ]; then
|
||||
pkg_genpkgfiles
|
||||
fi
|
||||
}
|
||||
|
||||
generate_pkgfiles() {
|
||||
pkg_genpkgfiles() {
|
||||
[ -f "$PACKAGE_DIR/$PKGNAME" ] || {
|
||||
msgerr "Package '$PKGNAME' not found."
|
||||
msgerr "Package not found: $PKGNAME"
|
||||
exit 1
|
||||
}
|
||||
|
||||
for i in $INCLUDEINPKG; do
|
||||
excludefile="$excludefile --exclude=.pkg$i"
|
||||
done
|
||||
echo "$name-$version-$release" > .pkgfiles
|
||||
|
||||
msg "Generating .pkgfiles..."
|
||||
tar -tvf "$PACKAGE_DIR/$PKGNAME" $excludefile \
|
||||
tar -tvf "$PACKAGE_DIR/$PKGNAME" \
|
||||
| awk '{$3=$4=$5=""; print $0}' \
|
||||
| sed "s,lib/modules/$(uname -r),lib/modules/<kernelversion>,g" \
|
||||
| sort -k 3 > .pkgfiles
|
||||
| sort -k 3 >> .pkgfiles
|
||||
msg "Pkgfiles updated."
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
pkg_clean() {
|
||||
[ -e "$PACKAGE_DIR/$PKGNAME" ] && {
|
||||
msg "Removing $PACKAGE_DIR/$PKGNAME"
|
||||
rm -f "$PACKAGE_DIR/$PKGNAME"
|
||||
msg "Package removed: $PACKAGE_DIR/$PKGNAME"
|
||||
}
|
||||
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
|
||||
fi
|
||||
if [ -e "$FILENAME" ] && [ "$FILENAME" != "$src" ]; then
|
||||
msg "Removing $FILENAME"
|
||||
rm -f "$FILENAME"
|
||||
fi
|
||||
for i in $(get_filepath); do
|
||||
case $i in
|
||||
$PWD/*) continue;;
|
||||
esac
|
||||
[ -e "$i" ] && {
|
||||
rm -f "$i"
|
||||
msg "File removed: $i"
|
||||
}
|
||||
[ -e "$i.partial" ] && {
|
||||
rm -f "$i.partial"
|
||||
msg "File removed: $i.partial"
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
check_buildscript() {
|
||||
# check the required field in buildscript
|
||||
if [ -z "$name" ]; then
|
||||
msgerr "'name' is empty!"
|
||||
exit 1
|
||||
elif [ "$(basename $(pwd))" != "$name" ]; then
|
||||
msgerr "Port name and Directory name is different!"
|
||||
exit 1
|
||||
elif [ -z "$version" ]; then
|
||||
msgerr "'version' is empty!"
|
||||
exit 1
|
||||
elif [ -z "$release" ]; then
|
||||
msgerr "'release' is empty!"
|
||||
exit 1
|
||||
elif [ "$(type -t build)" != "function" ]; then
|
||||
msgerr "'build' function not exist!"
|
||||
exit 1
|
||||
elif echo "$version" | grep -q '-'; then
|
||||
msgerr "'version' should not contain '-'."
|
||||
exit 1
|
||||
elif echo "$release" | grep -q '-'; then
|
||||
msgerr "'release' should not contain '-'."
|
||||
exit 1
|
||||
elif [ -z "$description" ]; then
|
||||
msgerr "'description' cant empty."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
set_options() {
|
||||
for OPT in $OPTIONS $options; do
|
||||
case $OPT in
|
||||
libtool) KEEP_LIBTOOL=1 ;;
|
||||
!libtool) KEEP_LIBTOOL=0 ;;
|
||||
emptydirs) KEEP_EMPTYDIR=1;;
|
||||
!emptydirs) KEEP_EMPTYDIR=0;;
|
||||
strip) STRIP_BINARY=1 ;;
|
||||
!strip) STRIP_BINARY=0 ;;
|
||||
zipman) ZIP_MAN=1 ;;
|
||||
!zipman) ZIP_MAN=0 ;;
|
||||
buildflags) BUILD_FLAGS=1 ;;
|
||||
!buildflags) BUILD_FLAGS=0 ;;
|
||||
makeflags) MAKE_FLAGS=1 ;;
|
||||
!makeflags) MAKE_FLAGS=0 ;;
|
||||
checksum) CHECK_MDSUM=1 ;;
|
||||
!checksum) CHECK_MDSUM=0 ;;
|
||||
docs) KEEP_DOCS=1 ;;
|
||||
!docs) KEEP_DOCS=0 ;;
|
||||
locales) KEEP_LOCALES=1 ;;
|
||||
!locales) KEEP_LOCALES=0 ;;
|
||||
esac
|
||||
done
|
||||
[ "$name" ] || { msgerr "'name' is empty!"; exit 1; }
|
||||
case $name in
|
||||
*[A-Z]*) msgerr "Capital letters for port name are not allowed!"; exit 1;;
|
||||
esac
|
||||
[ "$(basename $(pwd))" = "$name" ] || { msgerr "Port name and Directory name is different!"; exit 1; }
|
||||
[ "$version" ] || { msgerr "'version' is empty!"; exit 1; }
|
||||
[ "$release" ] || { msgerr "'release' is empty!"; exit 1; }
|
||||
[ "$(command -v build)" ] || { msgerr "'build' function not exist!"; exit 1; }
|
||||
[ "$(echo "$version" | grep '-')" ] && { msgerr "'version' should not contain '-'."; exit 1; }
|
||||
[ "$(echo "$release" | grep '-')" ] && { msgerr "'release' should not contain '-'."; exit 1; }
|
||||
[ "$description" ] || { msgerr "'description' is empty!"; exit 1; }
|
||||
}
|
||||
|
||||
checkdir() {
|
||||
for DIR in "$@"; do
|
||||
if [ ! -d $DIR ]; then
|
||||
msgerr "Directory '$DIR' not exist."
|
||||
msgerr "Directory '$DIR' does not exist."
|
||||
exit 1
|
||||
elif [ ! -w $DIR ]; then
|
||||
msgerr "Directory '$DIR' not writable."
|
||||
@@ -470,10 +397,10 @@ checkdir() {
|
||||
done
|
||||
}
|
||||
|
||||
clearworkdir() {
|
||||
pkg_cleanup() {
|
||||
if [ ! "$KEEP_WORK" ]; then
|
||||
if [ "$name" ]; then
|
||||
rm -fr $WORK_DIR/$name
|
||||
rm -fr "$WORK_DIR/$name"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -485,13 +412,14 @@ interrupted() {
|
||||
|
||||
abort() {
|
||||
rm -f "$LOCK_FILE"
|
||||
clearworkdir
|
||||
pkg_cleanup
|
||||
exit $1
|
||||
}
|
||||
|
||||
parse_opts() {
|
||||
while [ "$1" ]; do
|
||||
case $1 in
|
||||
-q | --quiet) QUIET=yes ;;
|
||||
-i | --install) INSTALL_PKG=yes ;;
|
||||
-u | --upgrade) UPGRADE_PKG=yes; OPTS="$OPTS $1" ;;
|
||||
-r | --reinstall) REINSTALL_PKG=yes; OPTS="$OPTS $1" ;;
|
||||
@@ -506,13 +434,8 @@ parse_opts() {
|
||||
-p | --pkgfiles) GENPKGFILES=yes ;;
|
||||
-h | --help) SHOWHELP=yes ;;
|
||||
--clean) CLEANUP=yes ;;
|
||||
--root=*) OPTS="$OPTS $1" ;;
|
||||
--no-preinstall) OPTS="$OPTS $1" ;;
|
||||
--no-postinstall) OPTS="$OPTS $1" ;;
|
||||
--no-preupgrade) OPTS="$OPTS $1" ;;
|
||||
--no-postupgrade) OPTS="$OPTS $1" ;;
|
||||
--no-backup) OPTS="$OPTS $1" ;;
|
||||
--redownload) REDOWNLOAD_SOURCE=yes ;;
|
||||
--root=*) OPTS="$OPTS $1" ;;
|
||||
--config=*) PKGBUILD_CONF="${1#*=}" ;;
|
||||
--srcdir=*) CUSTOM_SOURCE_DIR="${1#*=}" ;;
|
||||
--pkgdir=*) CUSTOM_PACKAGE_DIR="${1#*=}" ;;
|
||||
@@ -529,6 +452,7 @@ Usage:
|
||||
$(basename $0) [ <options> <arguments> ]
|
||||
|
||||
Options:
|
||||
-q --quiet show only status messages and errors
|
||||
-i, --install install package into system
|
||||
-u, --upgrade upgrade package
|
||||
-r, --reinstall reinstall package
|
||||
@@ -547,12 +471,7 @@ Options:
|
||||
--srcdir=<path> override directory path for sources
|
||||
--pkgdir=<path> override directory path for compiled package
|
||||
--workdir=<path> override directory path for working dir
|
||||
--no-preinstall skip preinstall script before install package
|
||||
--no-postinstall skip postinstall script after install package
|
||||
--no-preupgrade skip preupgrade script before upgrade package
|
||||
--no-postupgrade skip postupgrade script after upgrade package
|
||||
--no-backup skip backup configuration file when upgrading package
|
||||
--redownload re-download source file
|
||||
|
||||
EOF
|
||||
}
|
||||
@@ -573,13 +492,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
|
||||
|
||||
@@ -597,49 +516,46 @@ 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
|
||||
fi
|
||||
|
||||
check_buildscript
|
||||
set_options
|
||||
|
||||
case $COMPRESSION_MODE in
|
||||
gz|bz2|xz) PKGNAME="$name-$version-$release.spkg.tar.$COMPRESSION_MODE" ;;
|
||||
*) msgerr "Invalid compression mode. ($COMPRESSION_MODE)"; exit 1 ;;
|
||||
gz|bz2|xz|lz4|zstd) PKGNAME="$name-$version-$release.spkg.tar.$COMPRESSION_MODE" ;;
|
||||
*) msgerr "Invalid compression mode: $COMPRESSION_MODE"; exit 1 ;;
|
||||
esac
|
||||
|
||||
# generate .pkgfiles
|
||||
[ "$GENPKGFILES" ] && {
|
||||
generate_pkgfiles
|
||||
pkg_genpkgfiles
|
||||
exit 0
|
||||
}
|
||||
|
||||
# download source only
|
||||
[ "$DOWNLOAD_ONLY" ] && {
|
||||
download_src
|
||||
pkg_fetch
|
||||
exit 0
|
||||
}
|
||||
|
||||
# extract source only
|
||||
[ "$EXTRACT_ONLY" ] && {
|
||||
download_src
|
||||
prepare_src
|
||||
pkg_unpack
|
||||
exit 0
|
||||
}
|
||||
|
||||
# update md5sum
|
||||
[ "$UPDATE_MDSUM" ] && {
|
||||
download_src
|
||||
updatemdsum
|
||||
pkg_genchecksums
|
||||
exit 0
|
||||
}
|
||||
|
||||
# remove source and package
|
||||
[ "$CLEANUP" ] && {
|
||||
cleanup
|
||||
pkg_clean
|
||||
exit 0
|
||||
}
|
||||
|
||||
@@ -647,30 +563,41 @@ main() {
|
||||
|
||||
# check for lock file
|
||||
[ -f "$LOCK_FILE" ] && {
|
||||
msgerr "Cant build same package simultaneously."
|
||||
msgerr "Cannot build same package simultaneously."
|
||||
msgerr "remove '$LOCK_FILE' if no build process for '$name'."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# create lock file
|
||||
touch "$LOCK_FILE" 2>/dev/null || {
|
||||
msgerr "Cant create lock file in '$LOCK_FILE'."
|
||||
msgerr "Cannot create lock file in '$LOCK_FILE'."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# build package
|
||||
if [ -f "$PACKAGE_DIR/$PKGNAME" ] && [ ! "$FORCE_REBUILD" ]; then
|
||||
if [ ! "$INSTALL_PKG" ] && [ ! "$REINSTALL_PKG" ] && [ ! "$UPGRADE_PKG" ]; then
|
||||
echo "Package '$PKGNAME' is up-to-date."
|
||||
msg "Package is up-to-date: $PKGNAME"
|
||||
abort 0
|
||||
fi
|
||||
else
|
||||
msg "Building '$name-$version-$release'..."
|
||||
download_src
|
||||
prepare_src
|
||||
run_build
|
||||
packaging
|
||||
clearworkdir
|
||||
if [ "$QUIET" ]; then
|
||||
msg "Building: $name-$version-$release"
|
||||
pkg_fetch 2> /dev/null
|
||||
pkg_checksum > /dev/null
|
||||
pkg_unpack > /dev/null
|
||||
pkg_build > /dev/null
|
||||
pkg_package > /dev/null
|
||||
pkg_cleanup > /dev/null
|
||||
else
|
||||
msg "Building: $name-$version-$release"
|
||||
pkg_fetch
|
||||
pkg_checksum
|
||||
pkg_unpack
|
||||
pkg_build
|
||||
pkg_package
|
||||
pkg_cleanup
|
||||
fi
|
||||
fi
|
||||
|
||||
# install package
|
||||
@@ -691,11 +618,11 @@ PKGBUILD_BSCRIPT="spkgbuild"
|
||||
SOURCE_DIR="/var/cache/scratchpkg/sources"
|
||||
PACKAGE_DIR="/var/cache/scratchpkg/packages"
|
||||
WORK_DIR="/var/cache/scratchpkg/work"
|
||||
DOWNLOAD_PROG="wget"
|
||||
COMPRESSION_MODE="xz"
|
||||
|
||||
OPTIONS="!libtool emptydirs strip zipman buildflags makeflags checksum !docs !locales"
|
||||
|
||||
INCLUDEINPKG="install readme mkdirs"
|
||||
NO_STRIP="no"
|
||||
IGNORE_MDSUM="no"
|
||||
KEEP_LIBTOOL="no"
|
||||
KEEP_LOCALE="no"
|
||||
KEEP_DOC="no"
|
||||
|
||||
main "$@"
|
||||
|
||||
88
pkgbuild.8
88
pkgbuild.8
@@ -1,88 +0,0 @@
|
||||
." Man page for pkgbuild
|
||||
."
|
||||
.TH pkgbuild 8 "" ""
|
||||
.SH NAME
|
||||
pkgbuild - package creator
|
||||
|
||||
.SH SYNOPSIS
|
||||
pkgbuild <options>
|
||||
|
||||
.SH DESCRIPTION
|
||||
\fIpkgbuild\fP is a tool to build package from ports. Is will source \fIspkgbuild\fP
|
||||
to get build information before creating package. Package is created into
|
||||
\fI<name>-<version>-<release>.spkg.tar.xz\fP format. To build package, you need
|
||||
change into port directory before run \fIpkgbuild\fP command.
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B "-i, --install"
|
||||
install package into system
|
||||
.TP
|
||||
.B "-u, --upgrade"
|
||||
upgrade package
|
||||
.TP
|
||||
.B "-r, --reinstall"
|
||||
reinstall package
|
||||
.TP
|
||||
.B "-c, --ignore-conflict"
|
||||
ignore conflict when installing package
|
||||
.TP
|
||||
.B "-v, --verbose"
|
||||
verbose install process
|
||||
.TP
|
||||
.B "-f, --force-rebuild"
|
||||
rebuild package
|
||||
.TP
|
||||
.B "-m, --skip-mdsum"
|
||||
skip md5sum checking
|
||||
.TP
|
||||
.B "-g, --genmdsum"
|
||||
generate md5sum
|
||||
.TP
|
||||
.B "-o, --download"
|
||||
download only source file
|
||||
.TP
|
||||
.B "-x, --extract"
|
||||
extract only source file
|
||||
.TP
|
||||
.B "-w, --keep-work"
|
||||
keep working directory
|
||||
.TP
|
||||
.B "-s, --silent"
|
||||
print install message in simple format
|
||||
.TP
|
||||
.B "-h, --help"
|
||||
show this help message
|
||||
.TP
|
||||
.B "--srcdir=<path>"
|
||||
override directory path for sources
|
||||
.TP
|
||||
.B "--pkgdir=<path>"
|
||||
override directory path for compiled package
|
||||
.TP
|
||||
.B "--no-prebuild"
|
||||
skip prebuild script before build package
|
||||
.TP
|
||||
.B "--no-preinstall"
|
||||
skip preinstall script before install package
|
||||
.TP
|
||||
.B "--no-postinstall"
|
||||
skip postinstall script after install package
|
||||
.TP
|
||||
.B "--no-preupgrade"
|
||||
skip preupgrade script before upgrade package
|
||||
.TP
|
||||
.B "--no-postupgrade"
|
||||
skip postupgrade script after upgrade package
|
||||
.TP
|
||||
.B "--no-backup"
|
||||
skip backup configuration file when upgrading package
|
||||
.TP
|
||||
.B "--redownload"
|
||||
re-download source file
|
||||
|
||||
.SH AUTHOR
|
||||
Emmett1 <emmett1.2miligrams@gmail.com>
|
||||
|
||||
.SH SEE ALSO
|
||||
pkgadd(8), pkgdel(8), revdep(8)
|
||||
86
pkgdel
86
pkgdel
@@ -36,11 +36,11 @@ msg2() {
|
||||
}
|
||||
|
||||
msgerr() {
|
||||
echo "==> ERROR: $1"
|
||||
echo "==> ERROR: $1" >&2
|
||||
}
|
||||
|
||||
msgwarn() {
|
||||
echo "==> WARNING: $1"
|
||||
echo "==> WARNING: $1" >&2
|
||||
}
|
||||
|
||||
help() {
|
||||
@@ -51,8 +51,6 @@ Usage:
|
||||
Options:
|
||||
-h, --help show this help message
|
||||
-v, --verbose print removed files
|
||||
--no-preremove don't run pre-remove script
|
||||
--no-postremove don't run post-remove script
|
||||
--root=<path> remove package from custom root directory
|
||||
|
||||
EOF
|
||||
@@ -82,8 +80,6 @@ parse_opts() {
|
||||
case $1 in
|
||||
-h | --help) SHOWHELP=yes ;;
|
||||
-v | --verbose) VERBOSE_REMOVE="-v" ;;
|
||||
--no-preremove) NO_PREREMOVE=yes ;;
|
||||
--no-postremove) NO_POSTREMOVE=yes ;;
|
||||
--root=*) ROOT_DIR="${1#*=}" ;;
|
||||
-*) msg "Invalid option: ($1)"; exit 1 ;;
|
||||
*) RMNAME=$1 ;;
|
||||
@@ -95,29 +91,28 @@ parse_opts() {
|
||||
|
||||
ret() {
|
||||
# remove lock file on exit
|
||||
rm -f "$ROOT_DIR/$LOCK_FILE" "$reserve" "$dirs" "$remove" "$files"
|
||||
rm -f "$ROOT_DIR/$LOCK_FILE"
|
||||
exit $1
|
||||
}
|
||||
|
||||
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" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
run_scripts() {
|
||||
if [ "$ROOT_DIR" ]; then
|
||||
xchroot "$ROOT_DIR" sh $@
|
||||
else
|
||||
sh $@
|
||||
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 /
|
||||
PKGDBPERMS_DIR="$PKGDB_DIR.perms"
|
||||
LOCK_FILE="var/lib/scratchpkg/spkg.lock"
|
||||
|
||||
# show help page
|
||||
@@ -134,13 +129,13 @@ LOCK_FILE="var/lib/scratchpkg/spkg.lock"
|
||||
|
||||
# check for lock file
|
||||
[ -f "$ROOT_DIR/$LOCK_FILE" ] && {
|
||||
msgerr "Cant install/remove package simultaneously."
|
||||
msgerr "Cannot install/remove package simultaneously."
|
||||
msgerr "remove '$ROOT_DIR/$LOCK_FILE' if no install/remove package process running."
|
||||
exit 1
|
||||
}
|
||||
|
||||
touch "$ROOT_DIR/$LOCK_FILE" 2>/dev/null || {
|
||||
msgerr "Cant create lock file in '$ROOT_DIR/$LOCK_FILE'"
|
||||
msgerr "Cannot create lock file in '$ROOT_DIR/$LOCK_FILE'"
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -149,56 +144,25 @@ 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=$RMNAME
|
||||
version=$(head -n1 $ROOT_DIR/$PKGDB_DIR/$name | awk '{print $1}')
|
||||
release=$(head -n1 $ROOT_DIR/$PKGDB_DIR/$name | awk '{print $2}')
|
||||
|
||||
if [ -z "$name" ] && [ -z "$version" ] && [ -z "$release" ]; then
|
||||
msgerr "Package '$RMNAME' not installed but exist in database."
|
||||
if [ -z "$version" ] && [ -z "$release" ]; then
|
||||
msgerr "Package '$RMNAME' is not installed but exists in database."
|
||||
ret 1
|
||||
fi
|
||||
|
||||
# create list for reserve and remove (dirs and files)
|
||||
reserve="$ROOT_DIR/$SCRATCHPKG_DIR/.pkgdel_reserve"
|
||||
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" \
|
||||
| awk -F : '{print $2}' \
|
||||
| sort \
|
||||
| uniq > "$reserve"
|
||||
grep '/$' "$ROOT_DIR/$INDEX_DIR/$name/.files" > "$remove"
|
||||
grep -Fxv -f "$reserve" "$remove" | tac > "$dirs"
|
||||
grep -v '/$' "$ROOT_DIR/$INDEX_DIR/$name/.files" | tac >> "$files"
|
||||
|
||||
echo "remove: $name-$version-$release..."
|
||||
|
||||
# pre-remove script
|
||||
if [ ! "$NO_PREREMOVE" ] && [ -f "$ROOT_DIR/$INDEX_DIR/$name/.pkginstall" ]; then
|
||||
(cd "$ROOT_DIR"/
|
||||
run_scripts "$INDEX_DIR/$name/.pkginstall" pre-remove "$version"
|
||||
)
|
||||
fi
|
||||
|
||||
# remove files and dirs
|
||||
(cd "$ROOT_DIR"/
|
||||
[ -s $files ] && xargs -a $files -d'\n' rm $VERBOSE_REMOVE
|
||||
[ -s $dirs ] && xargs -a $dirs -d'\n' rmdir $VERBOSE_REMOVE
|
||||
)
|
||||
|
||||
rm -f "$reserve" "$dirs" "$remove" "$files"
|
||||
|
||||
# post-remove script
|
||||
if [ ! "$NO_POSTREMOVE" ] && [ -f "$ROOT_DIR/$INDEX_DIR/$name/.pkginstall" ]; then
|
||||
(cd "$ROOT_DIR"/
|
||||
run_scripts "$INDEX_DIR/$name/.pkginstall" post-remove "$version"
|
||||
)
|
||||
fi
|
||||
tail -n+2 "$ROOT_DIR/$PKGDB_DIR"/$name | tac | while read -r line; do
|
||||
case $line in
|
||||
*/) grep "^$line$" "$ROOT_DIR/$PKGDB_DIR"/* 2>/dev/null | grep -qv "$ROOT_DIR/$PKGDB_DIR"/$name: || rmdir $([ "$VERBOSE_REMOVE" ] && echo -v) "$ROOT_DIR/$line";;
|
||||
*) rm $([ "$VERBOSE_REMOVE" ] && echo -v) "$ROOT_DIR/$line";;
|
||||
esac
|
||||
done
|
||||
|
||||
# remove from database
|
||||
rm -rf "$ROOT_DIR/$INDEX_DIR/$name"
|
||||
rm -f "$ROOT_DIR/$PKGDB_DIR/$name"
|
||||
rm -f "$ROOT_DIR/$PKGDBPERMS_DIR/$name"
|
||||
|
||||
# running ldconfig
|
||||
if [ -x "$ROOT_DIR"/sbin/ldconfig ]; then
|
||||
|
||||
72
pkgdepends
Executable file
72
pkgdepends
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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() {
|
||||
ldd $1 2>/dev/null | grep $2 | awk '{print $3}'
|
||||
}
|
||||
|
||||
scratch files $1 | while read -r line; do
|
||||
case $line in
|
||||
usr/share/gir-1.0/*.gir) extra_dep="$extra_dep gobject-introspection";;
|
||||
usr/share/vala/vapi/*.vapi) extra_dep="$extra_dep vala";;
|
||||
esac
|
||||
case $line in
|
||||
*/) continue;;
|
||||
esac
|
||||
case "$(file -bi /$line)" in
|
||||
*application/x-sharedlib* | *application/x-executable* | *application/x-pie-executable*)
|
||||
for NEEDED in $(objdump -x /$line | grep NEEDED | awk '{print $2}'); do
|
||||
case $NEEDED in
|
||||
libc.so|libc.so.6) continue;;
|
||||
esac
|
||||
[ "$NEEDED" ] || continue
|
||||
[ -f /"$line" ] || continue
|
||||
libs=$(get_libpath /$line $NEEDED)
|
||||
[ "$libs" ] || continue
|
||||
if ! echo $all_libs | grep -qw $libs; then
|
||||
pkg=$(scratch provide $libs$ | awk '{print $1}' | head -n1)
|
||||
case $pkg in
|
||||
$1|gcc|glibc|musl) continue;;
|
||||
esac
|
||||
[ "$pkg" ] || continue
|
||||
if ! echo $all_pkgs | grep -qw $pkg; then
|
||||
echo $pkg
|
||||
all_pkgs="$all_pkgs $pkg"
|
||||
unset pkg
|
||||
fi
|
||||
all_libs="$all_libs $libs"
|
||||
unset libs
|
||||
fi
|
||||
done ;;
|
||||
esac
|
||||
[ "$extra_dep" ] && {
|
||||
for e in $extra_dep; do
|
||||
if ! echo $all_pkgs | grep -qw $e; then
|
||||
echo $e
|
||||
all_pkgs="$all_pkgs $e"
|
||||
fi
|
||||
done
|
||||
}
|
||||
done
|
||||
|
||||
exit 0
|
||||
359
pkgquery
359
pkgquery
@@ -1,359 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
msg() {
|
||||
echo "==> $1"
|
||||
}
|
||||
|
||||
msgerr() {
|
||||
msg "ERROR: $*"
|
||||
}
|
||||
|
||||
msgwarn() {
|
||||
msg "WARNING: $*"
|
||||
}
|
||||
|
||||
msginst() {
|
||||
echo "[i] $1"
|
||||
}
|
||||
|
||||
msgmiss() {
|
||||
echo "[m] $1"
|
||||
}
|
||||
|
||||
msgnoinst() {
|
||||
echo "[-] $1"
|
||||
}
|
||||
|
||||
needarg() {
|
||||
[ "$*" ] || {
|
||||
msgerr "This operation required an arguments!"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
isinstalled() {
|
||||
if [ -s "$INDEX_DIR/$1/.pkginfo" ] && [ "$(grep $1 $INDEX_DIR/$1/.pkginfo)" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
allinstalled() {
|
||||
grep ^name "$INDEX_DIR"/*/.pkginfo | awk '{print $3}'
|
||||
}
|
||||
|
||||
installed_pkg_info() {
|
||||
if isinstalled $1; then
|
||||
grep ^$2 "$INDEX_DIR/$1/.pkginfo" | cut -d " " -f3-
|
||||
fi
|
||||
}
|
||||
|
||||
deps_alias() {
|
||||
[ -f $ALIAS_FILE ] || {
|
||||
echo $@
|
||||
return
|
||||
}
|
||||
while [ "$1" ]; do
|
||||
getalias=$(grep -w ^$1 $ALIAS_FILE | awk '{print $2}')
|
||||
echo ${getalias:-$1}
|
||||
shift
|
||||
done
|
||||
unset getalias
|
||||
}
|
||||
|
||||
getdepends() {
|
||||
ppath=$(getportpath $1) || return 0
|
||||
deps=$(grep "^# depends[[:blank:]]*:" $ppath/$BUILD_SCRIPT \
|
||||
| sed 's/^# depends[[:blank:]]*:[[:blank:]]*//' \
|
||||
| tr ' ' '\n' \
|
||||
| awk '!a[$0]++' \
|
||||
| sed 's/,//')
|
||||
deps_alias $deps
|
||||
}
|
||||
|
||||
getportpath() {
|
||||
for repo in $REPO; do
|
||||
if [ -f $repo/$1/$BUILD_SCRIPT ]; then
|
||||
dirname $repo/$1/$BUILD_SCRIPT
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
pkg_dependent() {
|
||||
needarg $@
|
||||
if [ "$(getportpath $1)" ]; then
|
||||
grep -R "# depends[[:blank:]]*:" $REPO \
|
||||
| sed "s,:# depends[[:blank:]]*:[[:blank:]]*,#|,;s, ,|,g;s,$,|,g" \
|
||||
| grep "|$1|" \
|
||||
| awk -F "#" '{print $1}' \
|
||||
| rev \
|
||||
| awk -F / '{print $2}' \
|
||||
| rev
|
||||
else
|
||||
msgerr "Port '$1' not exist."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_orphan() {
|
||||
tmpallpkg="/tmp/.pkgquery_allpkg.$$"
|
||||
tmpalldep="/tmp/.pkgquery_alldep.$$"
|
||||
for pkg in $(allinstalled); do
|
||||
echo $pkg >> $tmpallpkg
|
||||
dep="$dep $(getdepends $pkg)"
|
||||
done
|
||||
echo $dep | tr ' ' '\n' | sort | uniq > "$tmpalldep"
|
||||
grep -xvF -f "$tmpalldep" "$tmpallpkg"
|
||||
rm "$tmpalldep" "$tmpallpkg"
|
||||
}
|
||||
|
||||
pkg_dup() {
|
||||
dup=$(find $REPO -type d -print | grep -Exv "($(echo $REPO | tr ' ' '|'))" | \
|
||||
rev | cut -d '/' -f1 | rev | sort | uniq -d)
|
||||
|
||||
if [ "$dup" ]; then
|
||||
for dp in $dup; do
|
||||
for repo in $REPO; do
|
||||
[ -d $repo/$dp ] && echo "$repo/$dp"
|
||||
done
|
||||
done
|
||||
else
|
||||
msg "No duplicate ports found."
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_foreign() {
|
||||
for pkg in $(allinstalled); do
|
||||
if ! getportpath $pkg >/dev/null; then
|
||||
iname=$(installed_pkg_info $pkg name)
|
||||
iversion=$(installed_pkg_info $pkg version)
|
||||
irelease=$(installed_pkg_info $pkg release)
|
||||
echo "$iname $iversion-$irelease"
|
||||
fi
|
||||
unset iname iversion irelease
|
||||
done
|
||||
}
|
||||
|
||||
pkg_search() {
|
||||
needarg $@
|
||||
arg=$*
|
||||
for repo in $REPO; do
|
||||
out=$(grep -R "# description" $repo | grep $BUILD_SCRIPT | grep "$arg" | awk -F : '{print $1}' | sort)
|
||||
[ "$out" ] || continue
|
||||
for line in $out; do
|
||||
repo=$(echo $line | rev | awk -F / '{print $3}' | rev)
|
||||
desc=$(grep "^# description[[:blank:]]*:" $line | sed 's/^# description[[:blank:]]*:[[:blank:]]*//')
|
||||
. $line
|
||||
echo "($repo) $name $version-$release: $desc"
|
||||
unset repo desc name version release build
|
||||
done
|
||||
unset out
|
||||
done
|
||||
}
|
||||
|
||||
pkg_locked() {
|
||||
for pkg in $(allinstalled); do
|
||||
[ -f "$INDEX_DIR/$pkg/.lock" ] && echo "$pkg"
|
||||
done
|
||||
}
|
||||
|
||||
pkg_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:\-$::'
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
pkg_missingdep() {
|
||||
for pkg in $(allinstalled); do
|
||||
if getportpath "$pkg" >/dev/null; then
|
||||
depends=$(getdepends $pkg)
|
||||
fi
|
||||
if [ "$depends" ]; then
|
||||
for d in $depends; do
|
||||
if ! isinstalled $d; then
|
||||
if [ -z "$msd" ]; then
|
||||
msd="$d"
|
||||
else
|
||||
msd="$msd $d"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
[ "$msd" ] && echo "$pkg: $msd"
|
||||
unset depends msd
|
||||
done
|
||||
}
|
||||
|
||||
pkg_info() {
|
||||
needarg $@
|
||||
ppath=$(getportpath $1) || return 1
|
||||
|
||||
. $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=$(getdepends $1 | tr '\n' ' ')
|
||||
|
||||
echo "Name: $1"
|
||||
echo "Path: $ppath"
|
||||
echo "Version: $version"
|
||||
echo "Release: $release"
|
||||
echo "Description: $desc"
|
||||
echo "Homepage: $url"
|
||||
echo "Maintainer: $maint"
|
||||
echo "Dependencies: $deps"
|
||||
}
|
||||
|
||||
pkg_depends() {
|
||||
needarg $@
|
||||
if getportpath "$1" >/dev/null; then
|
||||
depends=$(getdepends $1)
|
||||
else
|
||||
msgerr "Port '$1' not exist."
|
||||
return 1
|
||||
fi
|
||||
|
||||
for dep in $depends; do
|
||||
if isinstalled $dep; then
|
||||
msginst "$dep"
|
||||
elif getportpath $dep >/dev/null; then
|
||||
msgnoinst "$dep"
|
||||
else
|
||||
msgmiss "$dep"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
pkg_path() {
|
||||
needarg $@
|
||||
if PPATH=$(getportpath "$1"); then
|
||||
echo "$PPATH"
|
||||
else
|
||||
msgerr "Port '$1' not exist."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_provide() {
|
||||
needarg $@
|
||||
arg=$(echo $1 | sed "s/^\///")
|
||||
grep -R "$arg" $INDEX_DIR/*/.files \
|
||||
| sed "s:$INDEX_DIR/::" \
|
||||
| sed "s:/.files::" \
|
||||
| tr : " " \
|
||||
| column -t
|
||||
}
|
||||
|
||||
pkg_readme() {
|
||||
needarg $@
|
||||
if PPATH=$(getportpath "$1"); then
|
||||
if [ -f "$PPATH/readme" ]; then
|
||||
cat "$PPATH/readme"
|
||||
else
|
||||
msgerr "Port '$1' does not have readme."
|
||||
fi
|
||||
else
|
||||
msgerr "Port '$1' not exist."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_files() {
|
||||
needarg $@
|
||||
if isinstalled $1; then
|
||||
cat "$INDEX_DIR/$1/.files"
|
||||
else
|
||||
msg "Package '$1' not installed."
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_cat() {
|
||||
needarg $@
|
||||
if PPATH=$(getportpath "$1"); then
|
||||
cat "$PPATH/$BUILD_SCRIPT"
|
||||
else
|
||||
msgerr "Port '$1' not exist."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_help() {
|
||||
cat << EOF
|
||||
Usage:
|
||||
$(basename $0) <options> [<arg>]
|
||||
|
||||
Options:
|
||||
search <pattern> find ports in repo
|
||||
cat <port> print spkgbuild
|
||||
depends <port> print dependencies
|
||||
dependent <port> print dependent
|
||||
path <port> print path in repo
|
||||
provide <files> print port's provided files
|
||||
readme <port> print readme file, if exist
|
||||
files <port> print files installed
|
||||
info <port> print information
|
||||
dup print duplicate ports in repo
|
||||
installed print all installed ports
|
||||
locked print loacked ports
|
||||
missingdep print missing dependencies
|
||||
orphan print orphan installed ports
|
||||
foreign print foreign ports
|
||||
help print this help msg
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
print_runhelp_msg() {
|
||||
echo "Run '$(basename $0) help' to see available options."
|
||||
exit 2
|
||||
}
|
||||
|
||||
BUILD_SCRIPT="spkgbuild"
|
||||
INDEX_DIR="/var/lib/scratchpkg/index"
|
||||
REPO_FILE="/etc/scratchpkg.repo"
|
||||
ALIAS_FILE="/etc/scratchpkg.alias"
|
||||
|
||||
if [ -f "$REPO_FILE" ]; then
|
||||
for repodir in $(grep -Ev '^(#|$)' "$REPO_FILE" | awk '{print $1}'); do
|
||||
REPO="$REPO $repodir"
|
||||
done
|
||||
fi
|
||||
|
||||
opts=$1
|
||||
|
||||
if [ -z "$opts" ]; then
|
||||
print_runhelp_msg
|
||||
fi
|
||||
|
||||
shift
|
||||
|
||||
if [ $(type -t pkg_$opts) ]; then
|
||||
pkg_$opts "$@"
|
||||
else
|
||||
print_runhelp_msg
|
||||
fi
|
||||
|
||||
exit $?
|
||||
51
pkgrebuild
Executable file
51
pkgrebuild
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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"
|
||||
touch $LIST
|
||||
|
||||
TOOLCHAIN="linux-api-headers glibc-pass1 binutils-pass1 gcc binutils glibc"
|
||||
|
||||
#scratch sync || exit 1
|
||||
|
||||
for tc in $TOOLCHAIN; do
|
||||
if [ ! $(grep -x $tc $LIST) ]; then
|
||||
pkgname="$(echo $tc | sed 's/-pass1//')"
|
||||
scratch build -f $pkgname || exit 1
|
||||
echo $tc >> $LIST
|
||||
scratch install -r $pkgname --no-backup || exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
for pkg in $(scratch deplist base | awk '{print $2}'); do
|
||||
case $pkg in
|
||||
linux-api-headers|musl|gcc|binutils|glibc) continue;;
|
||||
esac
|
||||
if [ ! $(grep -x $pkg $LIST) ]; then
|
||||
scratch build -f $pkg || exit 1
|
||||
echo $pkg >> $LIST
|
||||
scratch install -r $pkg --no-backup || exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
46
portcreate
Executable file
46
portcreate
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
if [ -d "$1" ]; then
|
||||
echo "ERROR: Directory '$1' already exist!"
|
||||
exit 1
|
||||
else
|
||||
mkdir "$1"
|
||||
echo "# description :
|
||||
# homepage :
|
||||
# depends :
|
||||
|
||||
name=$1
|
||||
version=
|
||||
release=1
|
||||
noextract=\"\"
|
||||
backup=\"\"
|
||||
source=\"\"
|
||||
|
||||
build() {
|
||||
cd \$name-\$version
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
make DESTDIR=\$PKG install
|
||||
}" > "$1"/spkgbuild
|
||||
echo "Template port have created for '$1'."
|
||||
fi
|
||||
|
||||
exit 0
|
||||
129
portsync
Executable file
129
portsync
Executable file
@@ -0,0 +1,129 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
cmp_copy() {
|
||||
# usage:
|
||||
# cmp_copy <source dir> <target dir>
|
||||
#
|
||||
reponame=${2##*/}
|
||||
for p in $1/*; do
|
||||
[ -d $p ] || continue
|
||||
pname=${p##*/}
|
||||
if [ ! -d $2/$pname ]; then
|
||||
mkdir -p $2/$pname
|
||||
for f in $p/* $p/.pkgfiles $p/.checksums; do
|
||||
[ -f $f ] || continue
|
||||
case $f in
|
||||
*/update) continue;;
|
||||
esac
|
||||
fname=${f##*/}
|
||||
echo "+ $reponame/$pname/$fname"
|
||||
cp $f $2/$pname/$fname
|
||||
done
|
||||
else
|
||||
for f in $p/* $p/.pkgfiles $p/.checksums; do
|
||||
[ -f $f ] || continue
|
||||
case $f in
|
||||
*/update) continue;;
|
||||
esac
|
||||
fname=${f##*/}
|
||||
cmp -s $f $2/$pname/$fname || {
|
||||
echo "* $reponame/$pname/$fname"
|
||||
cp $f $2/$pname/$fname
|
||||
}
|
||||
done
|
||||
fi
|
||||
done
|
||||
for p in $2/*; do
|
||||
[ -d $p ] || continue
|
||||
pname=${p##*/}
|
||||
for f in $p/* $p/.pkgfiles $p/.checksums; do
|
||||
[ -f $f ] || continue
|
||||
fname=${f##*/}
|
||||
if [ ! -f $1/$pname/$fname ]; then
|
||||
echo "- $reponame/$pname/$fname"
|
||||
rm $2/$pname/$fname
|
||||
fi
|
||||
done
|
||||
if [ ! -d $1/$pname ]; then
|
||||
rmdir $2/$pname
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
sync_repo() {
|
||||
# usage:
|
||||
# sync_repo <repo url> <ports dir>
|
||||
#
|
||||
url=$(echo $1 | cut -d / -f -5)
|
||||
portdir=$2
|
||||
|
||||
case $1 in
|
||||
*github.com/*)
|
||||
branch=$(echo $1 | cut -d / -f 7)
|
||||
repodir=$(echo $1 | cut -d / -f 8-);;
|
||||
*gitlab.com/*)
|
||||
branch=$(echo $1 | cut -d / -f 8)
|
||||
repodir=$(echo $1 | cut -d / -f 9-);;
|
||||
*) # will add more git service
|
||||
branch=$(echo $1 | cut -d / -f 8)
|
||||
repodir=$(echo $1 | cut -d / -f 9-);;
|
||||
esac
|
||||
|
||||
# if branch not in the url, assume it master branch
|
||||
[ "$branch" ] || branch=master
|
||||
|
||||
echo "fetching ports: $1"
|
||||
|
||||
# cloning ports repository
|
||||
git clone -q -b $branch $url $tmprepo || {
|
||||
echo " failed sync repo"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# copying ports to port directory by comparing
|
||||
cmp_copy $tmprepo/$repodir $portdir
|
||||
|
||||
# cleanup tmp cloned repo
|
||||
rm -fr $tmprepo
|
||||
|
||||
echo "ports synced: $2"
|
||||
}
|
||||
|
||||
tmprepo=/tmp/tmprepo
|
||||
repo_file=/etc/scratchpkg.repo
|
||||
|
||||
if [ ! -e "$repo_file" ]; then
|
||||
echo "missing repo file: $repo_file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != 0 ]; then
|
||||
echo "this operation need root access."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
grep -Ev '^(#|$)' "$repo_file" | awk '{print $1,$2}' | while read -r repodir repourl; do
|
||||
if [ "$repodir" ] && [ "$repourl" ]; then
|
||||
sync_repo $repourl $repodir
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
72
revdep
72
revdep
@@ -114,7 +114,7 @@ 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 install -fr $p || { cleanup; exit 1; }
|
||||
done
|
||||
fi
|
||||
}
|
||||
@@ -161,10 +161,43 @@ rev_exclude() {
|
||||
EXCLUDED_LIBS=$(echo $EXCLUDE_LIBS | tr ' ' '\n' | sort | uniq)
|
||||
}
|
||||
|
||||
check_pythonmodules() {
|
||||
command -v python3 >/dev/null || return
|
||||
pylibpath=$(python3 -c "import sys; print(':'.join(x for x in sys.path if x))" | tr ':' '\n' | sort | head -n1)
|
||||
for i in /usr/lib/python3.*; do
|
||||
[ -d "$i" ] || continue
|
||||
[ "$i" = "$pylibpath" ] && continue
|
||||
brokenpkg="$brokenpkg $(scratch provide $i/$ | awk '{print $1}')"
|
||||
done
|
||||
}
|
||||
|
||||
check_perlmodules() {
|
||||
command -v perl >/dev/null || return
|
||||
perlpath=$(dirname $(perl -V:sitearch | grep -o "'.*'" | sed "s/'//g"))
|
||||
for i in $(dirname $perlpath)/*; do
|
||||
[ "$perlpath" = "$i" ] && continue
|
||||
brokenpkg="$brokenpkg $(scratch provide $i/$ | awk '{print $1}')"
|
||||
done
|
||||
}
|
||||
|
||||
check_rubygem() {
|
||||
command -v gem >/dev/null || return
|
||||
gempath=$(gem env gemdir)
|
||||
for i in $(dirname $gempath)/*; do
|
||||
[ "$gempath" = "$i" ] && continue
|
||||
brokenpkg="$brokenpkg $(scratch provide $i/$ | awk '{print $1}')"
|
||||
done
|
||||
}
|
||||
|
||||
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 +207,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" ]; then
|
||||
echo "ERROR: Package '$PKG' not installed"
|
||||
cleanup
|
||||
exit 1
|
||||
@@ -249,7 +282,7 @@ if [ "$PKG" ]; then
|
||||
filterdir=cat
|
||||
fi
|
||||
printf "Find '$PKG' files... "
|
||||
sed 's/^/\//' $INDEX_DIR/$PKG/.files | grep $gx | $filterfile | $filterdir > $FILE_LIST
|
||||
tail -n +2 $PKGDB_DIR/$PKG | sed 's/^/\//' | 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
|
||||
@@ -264,7 +297,7 @@ echo "Checking for broken linkage..."
|
||||
|
||||
while read -r line; do
|
||||
count=$(( count + 1 ))
|
||||
libname=$(basename "$line")
|
||||
libname=${line##*/}
|
||||
printf " $(( 100*count/total ))%% $libname\033[0K\r"
|
||||
case "$(file -bi "$line")" in
|
||||
*application/x-sharedlib* | *application/x-executable* | *application/x-pie-executable*)
|
||||
@@ -275,13 +308,12 @@ while read -r line; do
|
||||
NEW_LIB_NAME="$NEW_LIB_NAME $l"
|
||||
fi
|
||||
done
|
||||
[ "$NEW_LIB_NAME" ] || continue
|
||||
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=${line#?} # remove leading slash
|
||||
PKG_NAME=$(grep -Rx $PKG_NAME "$PKGDB_DIR"/* | awk -F : '{print $1}')
|
||||
[ "$PKG_NAME" ] || continue
|
||||
PKG_NAME=$(dirname $PKG_NAME)
|
||||
PKG_NAME=$(basename $PKG_NAME)
|
||||
PKG_NAME=${PKG_NAME##*/}
|
||||
echo $expkg | tr ' ' '\n' | grep -qx $PKG_NAME && continue
|
||||
REQ_LIB=$(objdump -p $line 2>/dev/null | grep NEEDED | awk '{print $2}' | tr '\n' ' ')
|
||||
for i in $LIB_NAME; do
|
||||
@@ -302,6 +334,24 @@ while read -r line; do
|
||||
done < $FILE_LIST
|
||||
|
||||
printf "\033[0K"
|
||||
|
||||
[ "$PKG" ] || {
|
||||
echo
|
||||
echo "Checking for broken packages..."
|
||||
check_pythonmodules
|
||||
check_perlmodules
|
||||
check_rubygem
|
||||
}
|
||||
|
||||
if [ "$brokenpkg" ]; then
|
||||
for i in $brokenpkg; do
|
||||
if echo "$ALLPKG" | tr ' ' '\n' | grep -qx "$i"; then
|
||||
continue
|
||||
else
|
||||
ALLPKG="$ALLPKG $i"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "$ALLPKG" ]; then
|
||||
echo
|
||||
@@ -313,7 +363,7 @@ if [ "$ALLPKG" ]; then
|
||||
rebuild
|
||||
fi
|
||||
else
|
||||
echo "All packages is doing fine."
|
||||
echo "All packages are doing fine."
|
||||
fi
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -6,4 +6,4 @@
|
||||
#
|
||||
# example:
|
||||
# openssl libressl
|
||||
#
|
||||
#
|
||||
|
||||
@@ -2,32 +2,17 @@
|
||||
# Configuration file for scratchpkg
|
||||
#
|
||||
|
||||
CFLAGS="-O2 -march=x86-64 -pipe"
|
||||
CXXFLAGS="${CFLAGS}"
|
||||
MAKEFLAGS="-j$(nproc)"
|
||||
# export CFLAGS="-O2 -march=x86-64 -pipe"
|
||||
# export CXXFLAGS="${CFLAGS}"
|
||||
# export MAKEFLAGS="-j$(nproc)"
|
||||
|
||||
# SOURCE_DIR="/var/cache/scratchpkg/sources"
|
||||
# PACKAGE_DIR="/var/cache/scratchpkg/packages"
|
||||
# WORK_DIR="/var/cache/scratchpkg/work"
|
||||
# DOWNLOAD_PROG="wget"
|
||||
# WGET_OPTS=""
|
||||
# CURL_OPTS=""
|
||||
# COMPRESSION_MODE="xz"
|
||||
|
||||
#
|
||||
# GLOBAL PACKAGE OPTIONS
|
||||
#
|
||||
# -- libtool: Keep libtool file (*.la) in packages
|
||||
# -- emptydirs: Keep empty directories in packages
|
||||
# -- strip: Strip symbols from binaries/libraries
|
||||
# -- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
|
||||
# -- buildflags: Enable buildflags (CFLAGS and CXXFLAGS)
|
||||
# -- makeflags: Enable makeflags (MAKEFLAGS)
|
||||
# -- checksum: Enable checking checksum
|
||||
# -- docs: Keep docs
|
||||
# -- locales: Keep locales
|
||||
#
|
||||
# -- These are default values for the options="" settings
|
||||
# -- add '!' in front of this option to disable it
|
||||
#
|
||||
# OPTIONS="!libtool emptydirs strip zipman buildflags makeflags checksum !docs !locales"
|
||||
# NO_STRIP="no"
|
||||
# IGNORE_MDSUM="no"
|
||||
# KEEP_LIBTOOL="no"
|
||||
# KEEP_LOCALE="no"
|
||||
# KEEP_DOC="no"
|
||||
|
||||
3
scratchpkg.mask
Normal file
3
scratchpkg.mask
Normal file
@@ -0,0 +1,3 @@
|
||||
#
|
||||
# /etc/scratchpkg.mask : exclude packages from sysup
|
||||
#
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
EDITOR=${EDITOR:-vi}
|
||||
|
||||
type -p $EDITOR >/dev/null || {
|
||||
command -v $EDITOR >/dev/null || {
|
||||
echo "Editor '$EDITOR' not exist. Append 'EDITOR=<your editor>' to ${0##*/}."
|
||||
exit 2
|
||||
}
|
||||
|
||||
22
xchroot
22
xchroot
@@ -1,4 +1,7 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# script to enter chroot
|
||||
#
|
||||
|
||||
printhelp() {
|
||||
cat << EOF
|
||||
@@ -14,6 +17,13 @@ EOF
|
||||
msgerr() {
|
||||
echo "ERROR: $*"
|
||||
}
|
||||
|
||||
unmount() {
|
||||
while true; do
|
||||
mountpoint -q $1 || break
|
||||
umount $1 2>/dev/null
|
||||
done
|
||||
}
|
||||
|
||||
[ "$(id -u)" = "0" ] || {
|
||||
msgerr "$(basename $0) need root access!"
|
||||
@@ -78,13 +88,13 @@ retval=$?
|
||||
mv $TARGET/etc/resolv.conf.tmp $TARGET/etc/resolv.conf
|
||||
}
|
||||
|
||||
umount $TARGET/dev/pts
|
||||
umount $TARGET/dev
|
||||
umount $TARGET/run
|
||||
umount $TARGET/proc
|
||||
unmount $TARGET/dev/pts
|
||||
unmount $TARGET/dev
|
||||
unmount $TARGET/run
|
||||
unmount $TARGET/proc
|
||||
if [ -n "$EFI_SYSTEM" ]; then
|
||||
umount $TARGET/sys/firmware/efi/efivars
|
||||
unmount $TARGET/sys/firmware/efi/efivars
|
||||
fi
|
||||
umount $TARGET/sys
|
||||
unmount $TARGET/sys
|
||||
|
||||
exit $retval
|
||||
|
||||
Reference in New Issue
Block a user