mirror of
https://github.com/emmett1/lfs-scripts.git
synced 2026-01-12 07:57:01 +00:00
473 lines
12 KiB
Bash
Executable File
473 lines
12 KiB
Bash
Executable File
#!/bin/sh -e
|
|
|
|
is32bit() {
|
|
case $name in
|
|
*-32) return 0;;
|
|
*) return 1;;
|
|
esac
|
|
}
|
|
|
|
_auto_patch() {
|
|
if [ -d $CWD/patch ]; then
|
|
for p in $CWD/patch/*.patch; do
|
|
patch ${patch_opt:--Np1} -i $p
|
|
done
|
|
fi
|
|
}
|
|
|
|
_auto_build() {
|
|
if [ -f meson.build ]; then
|
|
is32bit && build_opt="$build_opt --libdir=/usr/lib32" || :
|
|
msg "running _meson_build"
|
|
_meson_build $@ || return $?
|
|
elif [ -f configure ]; then
|
|
is32bit && build_opt="$build_opt --libdir=/usr/lib32" || :
|
|
msg "running _configure_build"
|
|
_configure_build $@ || return $?
|
|
elif [ -f CMakeLists.txt ]; then
|
|
msg "running _cmake_build"
|
|
_cmake_build $@ || return $?
|
|
elif [ -f setup.py ]; then
|
|
msg "running _python3_build"
|
|
_python3_build $@ || return $?
|
|
elif [ -f Makefile.PL ]; then
|
|
msg "running _perlmodule_build"
|
|
_perlmodule_build || return $?
|
|
elif [ -f Makefile ]; then
|
|
msg "running _makefile_build"
|
|
is32bit && {
|
|
export LIBDIR=/usr/lib32
|
|
export PKGCONFIGDIR=/usr/lib32/pkgconfig
|
|
} || :
|
|
_makefile_build $@ || return $?
|
|
else
|
|
echo "failed to detect buildtype"
|
|
exit 1
|
|
fi
|
|
|
|
# keep only usr/lib32 if 32bit pkg
|
|
is32bit && {
|
|
mv $PKG lib32PKG
|
|
mkdir -p $PKG/usr
|
|
cp -rv lib32PKG/usr/lib32 $PKG/usr
|
|
} || :
|
|
}
|
|
|
|
_makefile_build() {
|
|
make || return $?
|
|
make \
|
|
PREFIX=/usr \
|
|
prefix=/usr \
|
|
SYSCONFDIR=/etc \
|
|
sysconfdir=/etc \
|
|
MANDIR=/usr/share/man \
|
|
mandir=/usr/share/man \
|
|
DESTDIR=$PKG install || return $?
|
|
}
|
|
|
|
_perlmodule_build() {
|
|
perl Makefile.PL || return $?
|
|
make || return $?
|
|
make DESTDIR=$PKG install || return $?
|
|
}
|
|
|
|
_cmake_build() {
|
|
mkdir -p cmakebuild
|
|
cd cmakebuild
|
|
cmake -DCMAKE_INSTALL_PREFIX=/usr \
|
|
-DCMAKE_INSTALL_SYSCONFDIR=/etc \
|
|
-DCMAKE_INSTALL_LIBDIR=lib \
|
|
-DCMAKE_INSTALL_LIBEXECDIR=lib \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DFETCHCONTENT_FULLY_DISCONNECTED=ON \
|
|
-DCMAKE_C_FLAGS_RELEASE="$CFLAGS" \
|
|
-DCMAKE_CXX_FLAGS_RELEASE="$CXXFLAGS" \
|
|
$build_opt $@ \
|
|
-G Ninja .. || return $?
|
|
if [ -f build.ninja ]; then
|
|
ninja || return $?
|
|
DESTDIR=$PKG ninja install || return $?
|
|
else
|
|
cmake --build build || return $?
|
|
DESTDIR=$PKG cmake --install build || return $?
|
|
fi
|
|
}
|
|
|
|
_python3_build() {
|
|
python3 setup.py build || return $?
|
|
python3 setup.py install --prefix=/usr --root=$PKG --optimize=1 || return $?
|
|
}
|
|
|
|
_configure_build() {
|
|
if [ "$BOOTSTRAP" ]; then
|
|
./configure --prefix=$TOOLS $build_opt $@ || return $?
|
|
make || return $?
|
|
make install || return $?
|
|
else
|
|
./configure \
|
|
--prefix=/usr \
|
|
--sysconfdir=/etc \
|
|
--libexecdir=/usr/lib \
|
|
--localstatedir=/var \
|
|
--mandir=/usr/share/man \
|
|
$build_opt $@ || return $?
|
|
make || return $?
|
|
make DESTDIR=$PKG install || return $?
|
|
fi
|
|
}
|
|
|
|
_meson_build() {
|
|
meson setup _meson_build \
|
|
--prefix=/usr \
|
|
--libdir=/usr/lib \
|
|
--libexecdir=/usr/lib \
|
|
--bindir=/usr/bin \
|
|
--sbindir=/usr/sbin \
|
|
--includedir=/usr/include \
|
|
--datadir=/usr/share \
|
|
--mandir=/usr/share/man \
|
|
--infodir=/usr/share/info \
|
|
--localedir=/usr/share/locale \
|
|
--sysconfdir=/etc \
|
|
--localstatedir=/var \
|
|
--sharedstatedir=/var/lib \
|
|
--buildtype=plain \
|
|
--auto-features=auto \
|
|
--wrap-mode=nodownload \
|
|
-Db_lto=true \
|
|
-Db_pie=true \
|
|
-Db_thinlto_cache=true \
|
|
$build_opt || return $?
|
|
meson compile -C _meson_build || return $?
|
|
DESTDIR=$PKG meson install --no-rebuild -C _meson_build || return $?
|
|
}
|
|
|
|
run_trigger() {
|
|
set +e
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/share/mime/$ && {
|
|
msg "Updating the MIME type database..."
|
|
chroot ${ROOT:-/} update-mime-database /usr/share/mime
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/share/applications/$ && {
|
|
msg "Updating desktop file MIME type cache..."
|
|
chroot ${ROOT:-/} update-desktop-database --quiet
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^etc/udev/hwdb.d/$ && {
|
|
msg "Updating hardware database..."
|
|
chroot ${ROOT:-/} udevadm hwdb --update
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/lib/gtk-3.0/3.0.0/immodules/.*.so && {
|
|
msg "Probing GTK3 input method modules..."
|
|
chroot ${ROOT:-/} gtk-query-immodules-3.0 --update-cache
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/lib/gtk-2.0/2.10.0/immodules/.*.so && {
|
|
msg "Probing GTK2 input method modules..."
|
|
chroot ${ROOT:-/} gtk-query-immodules-2.0 --update-cache
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/share/glib-2.0/schemas/$ && {
|
|
msg "Compiling GSettings XML schema files..."
|
|
chroot ${ROOT:-/} glib-compile-schemas /usr/share/glib-2.0/schemas
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/lib/gio/modules/.*.so && {
|
|
msg "Updating GIO module cache..."
|
|
chroot ${ROOT:-/} gio-querymodules /usr/lib/gio/modules
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/.*.so && {
|
|
msg "Probing GDK-Pixbuf loader modules..."
|
|
chroot ${ROOT:-/} gdk-pixbuf-query-loaders --update-cache
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/share/fonts/$ && {
|
|
msg "Updating X fontdir indices..."
|
|
for dir in $(find ${ROOT:-/}/usr/share/fonts -maxdepth 1 -type d \( ! -path ${ROOT:-/}/usr/share/fonts \)); do
|
|
dir=$(echo $dir | sed "s,${ROOT:-/},,")
|
|
rm -f ${ROOT:-/}$dir/fonts.scale ${ROOT:-/}$dir/fonts.dir ${ROOT:-/}$dir/.uuid
|
|
rmdir --ignore-fail-on-non-empty ${ROOT:-/}$dir
|
|
[ -d "${ROOT:-/}$dir" ] || continue
|
|
chroot ${ROOT:-/} mkfontdir $dir
|
|
chroot ${ROOT:-/} mkfontscale $dir
|
|
done
|
|
msg "Updating fontconfig cache..."
|
|
chroot ${ROOT:-/} fc-cache -s
|
|
}
|
|
pkginfo $pkginfoopt -l $name | grep -q ^usr/share/icons/$ && {
|
|
msg "Updating icon theme caches..."
|
|
for dir in ${ROOT:-/}/usr/share/icons/* ; do
|
|
if [ -e $dir/index.theme ]; then
|
|
chroot ${ROOT:-/} gtk-update-icon-cache -q $dir 2>/dev/null
|
|
else
|
|
rm -f $dir/icon-theme.cache
|
|
rmdir --ignore-fail-on-non-empty $dir
|
|
fi
|
|
done
|
|
}
|
|
set +e
|
|
}
|
|
|
|
msg() {
|
|
echo "=> $@"
|
|
}
|
|
|
|
export PATH=$PATH:/sbin:/usr/sbin
|
|
|
|
if [ "$(id -u)" != 0 ] && [ ! "$FAKEROOTKEY" ]; then
|
|
echo "run this script as root or use fakeroot"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$DEBUG" = 1 ]; then
|
|
set -x
|
|
fi
|
|
|
|
TOPDIR=$(dirname $(realpath $0))
|
|
|
|
umask 022
|
|
|
|
export CWD=$PWD
|
|
export name=${CWD##*/}
|
|
export PATCH=$CWD/patch
|
|
export FILES=$CWD/files
|
|
|
|
if [ -s ./version ]; then
|
|
export version=$(head -n1 ./version)
|
|
else
|
|
export version=0
|
|
fi
|
|
if [ -s ./release ]; then
|
|
export release=$(head -n1 ./release)
|
|
else
|
|
export release=0
|
|
fi
|
|
if [ -s ./source ]; then
|
|
source=$(cat ./source)
|
|
fi
|
|
|
|
PKGFILE=$name#$version-$release.pkg.tar.xz
|
|
|
|
while [ $1 ]; do
|
|
case $1 in
|
|
-b) REBUILD=1;;
|
|
-i) INSTALL=1;;
|
|
-u) UPGRADE=1;;
|
|
-f) pkgadd_opt="$pkgadd_opt $1";;
|
|
-r) pkgadd_opt="$pkgadd_opt $1 $2"; ROOT="$2"; shift;;
|
|
-c) pkgadd_opt="$pkgadd_opt $1 $2"; shift;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ "$ROOT" ]; then
|
|
pkginfoopt="-r $ROOT"
|
|
fi
|
|
|
|
if [ ! -f "$ROOT"/var/lib/pkg/db ] && [ ! "$BOOTSTRAP" ]; then
|
|
echo "package database file not exist: $ROOT/var/lib/pkg/db"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -f $TOPDIR/config ]; then
|
|
. $TOPDIR/config
|
|
fi
|
|
|
|
if [ -f $CWD/config ]; then
|
|
. $CWD/config
|
|
fi
|
|
|
|
SOURCEDIR=${SOURCEDIR:-$CWD}
|
|
PACKAGEDIR=${PACKAGEDIR:-$CWD}
|
|
WORKDIR=${WORKDIR:-$CWD/work}
|
|
|
|
mkdir -p $SOURCEDIR $PACKAGEDIR
|
|
|
|
if [ -f "$PACKAGEDIR/$PKGFILE" ] && [ "$REBUILD" != 1 ]; then
|
|
if [ ! "$UPGRADE" ] && [ ! "$INSTALL" ]; then
|
|
msg "$PACKAGEDIR/$PKGFILE found"
|
|
fi
|
|
else
|
|
# fetch source
|
|
for i in $source; do
|
|
url=${i%::*}
|
|
if [ ! -f $SOURCEDIR/${url##*/} ]; then
|
|
echo "fetching: $url"
|
|
curl -L -C - -o $SOURCEDIR/${url##*/} $url
|
|
fi
|
|
done
|
|
|
|
export PKG=$WORKDIR/pkg
|
|
export SRC=$WORKDIR/src
|
|
|
|
rm -fr $WORKDIR
|
|
mkdir -p $PKG $SRC
|
|
|
|
# prepare source
|
|
for i in $source; do
|
|
url=${i%::*}
|
|
case $i in
|
|
*::noextract) cp $SOURCEDIR/${url##*/} $SRC;;
|
|
*.tar.*|*.t?z) bsdtar xvf $SOURCEDIR/${url##*/} -C $SRC || { msg "failed extracting ${url##*/}"; exit 1; };;
|
|
*) cp $SOURCEDIR/${url##*/} $SRC;;
|
|
esac
|
|
done
|
|
|
|
# get dirname
|
|
for i in $source; do
|
|
url=${i%::*}
|
|
case $url in
|
|
*.tar.*|*.tgz) srcdir=$(tar -tf $SOURCEDIR/${url##*/} | cut -d / -f1 | head -n1);;
|
|
esac
|
|
break
|
|
done
|
|
cd $SRC
|
|
|
|
if [ "$srcdir" ] && [ -d "$srcdir" ]; then
|
|
cd $srcdir
|
|
fi
|
|
|
|
if [ ! "$SKIP_PATCH" ]; then
|
|
_auto_patch
|
|
fi
|
|
|
|
# dont export this if bootsrap
|
|
if [ ! "$BOOTSTRAP" ]; then
|
|
export DESTDIR=$PKG
|
|
export DEST_DIR=$PKG # p7zip
|
|
export INSTALLROOT=$PKG # syslinux
|
|
export install_root=$PKG # glibc
|
|
export INSTALL_ROOT=$PKG # qt5
|
|
fi
|
|
|
|
is32bit && {
|
|
export CC="${CC:-gcc} -m32"
|
|
export CXX="${CXX:-g++} -m32"
|
|
export PKG_CONFIG_LIBDIR="/usr/lib32/pkgconfig"
|
|
} || :
|
|
|
|
if [ -f $CWD/build ]; then
|
|
msg "running build script: $CWD/build"
|
|
chmod +x $CWD/build
|
|
. $CWD/build || { msg "error, build $name failed"; exit 1; }
|
|
else
|
|
msg "running auto_build"
|
|
_auto_build || { msg "error, build $name failed"; exit 1; }
|
|
fi
|
|
|
|
if [ -d $PKG/$WORKDIR ]; then
|
|
echo "ERROR: dir '$WORKDIR' inside \$PKG"
|
|
exit 1
|
|
fi
|
|
|
|
# Compress manpages and infopages
|
|
if [ -d $PKG/usr/share/man ]; then
|
|
find $PKG/usr/share/man -type f | while read -r file; do
|
|
if [ "$file" = "${file%%.gz}" ]; then
|
|
gzip -9 -f "$file"
|
|
fi
|
|
done
|
|
fi
|
|
if [ -d $PKG/usr/share/info ]; then
|
|
rm -f $PKG/usr/share/info/dir
|
|
find $PKG/usr/share/info -type f | while read -r file; do
|
|
if [ "$file" = "${file%%.gz}" ]; then
|
|
gzip -9 -f "$file"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# remove libtool (.la)
|
|
[ "$KEEP_LIBTOOL" = 1 ] || find $PKG ! -type d -name "*.la" -delete
|
|
|
|
# remove staticlib (.a)
|
|
[ "$KEEP_STATICLIB" = 1 ] || find $PKG ! -type d -name "*.a" -delete
|
|
|
|
# remove locales
|
|
[ "$KEEP_LOCALE" = 1 ] || rm -rf $PKG/usr/share/locale
|
|
|
|
# remove perllocal.pod
|
|
find $PKG ! -type d -name "perllocal.pod" -delete
|
|
|
|
# remove fonts.scale & fonts.dir
|
|
#find $PKG -name fonts.scale -exec rm {} \;
|
|
find $PKG ! -type d -name "fonts.scale" -delete
|
|
find $PKG ! -type d -name "fonts.dir" -delete
|
|
|
|
# strip binaries & libraries
|
|
if [ "$NO_STRIP" != 1 ]; then
|
|
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
|
|
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
|
|
fi
|
|
|
|
# postinstallscript
|
|
if [ -f $CWD/postinstall ]; then
|
|
mkdir -p $PKG/var/lib/pkg/installscripts
|
|
install -m755 $CWD/postinstall $PKG/var/lib/pkg/installscripts/$name
|
|
fi
|
|
|
|
# runit services
|
|
for i in $CWD/files/*/run; do
|
|
[ -f "$i" ] || continue
|
|
svname=${i%/*}; svname=${svname##*/}
|
|
for f in $CWD/files/$svname/*; do
|
|
file=${f##*/}
|
|
case $file in
|
|
run) install -Dm755 $CWD/files/$svname/$file $PKG/etc/sv/$svname/$file
|
|
ln -s /run/runit/supervise.$svname $PKG/etc/sv/$svname/supervise;;
|
|
*) install -Dm644 $CWD/files/$svname/$file $PKG/etc/sv/$svname/$file;;
|
|
esac
|
|
done
|
|
done
|
|
|
|
# if bootstrap, dont package it, just exit after build
|
|
if [ "$BOOTSTRAP" ]; then
|
|
rm -fr $WORKDIR
|
|
exit 0
|
|
fi
|
|
|
|
rm -f $PACKAGEDIR/$PKGFILE
|
|
cd $PKG
|
|
msg "packaging $PKGFILE..."
|
|
bsdtar --format=gnutar -c -J -f $PACKAGEDIR/$PKGFILE * || {
|
|
echo "error makepkg"
|
|
rm -f $PACKAGEDIR/$PKGFILE
|
|
exit 1
|
|
}
|
|
bsdtar -tvf $PACKAGEDIR/$PKGFILE
|
|
msg "package created in $PACKAGEDIR/$PKGFILE"
|
|
cd $CWD
|
|
[ -f .files ] || tar -tvf $PACKAGEDIR/$PKGFILE | awk '{print $1,$2,$6}' > .files
|
|
rm -fr $WORKDIR
|
|
fi
|
|
|
|
if [ "$INSTALL" = 1 ]; then
|
|
[ "$FAKEROOTKEY" ] && { msg "cant use fakeroot to install packages"; exit 1; }
|
|
if [ $(pkginfo -i $pkginfoopt | awk '{print $1}' | grep -x $name) ]; then
|
|
echo "$name is already installed"
|
|
exit 0
|
|
else
|
|
msg "installing $PKGFILE..."
|
|
pkgadd $pkgadd_opt $PACKAGEDIR/$PKGFILE
|
|
if [ -x $ROOT/var/lib/pkg/installscripts/$name ]; then
|
|
msg "running installscripts for $name"
|
|
chroot ${ROOT:-/} /var/lib/pkg/installscripts/$name
|
|
fi
|
|
run_trigger
|
|
exit 0
|
|
fi
|
|
fi
|
|
if [ "$UPGRADE" = 1 ]; then
|
|
[ "$FAKEROOTKEY" ] && { msg "cant use fakeroot to upgrade packages"; exit 1; }
|
|
if [ ! $(pkginfo -i $pkginfoopt | awk '{print $1}' | grep -x $name) ]; then
|
|
echo "$name not installed"
|
|
exit 1
|
|
else
|
|
msg "upgrading $name-$version-$release..."
|
|
pkgadd $pkgadd_opt -u $PACKAGEDIR/$PKGFILE
|
|
if [ -x $ROOT/var/lib/pkg/installscripts/$name ]; then
|
|
msg "running installscripts for $name"
|
|
chroot ${ROOT:-/} /var/lib/pkg/installscripts/$name
|
|
fi
|
|
run_trigger
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
exit 0
|