#!/bin/bash
#
######################################################
# Build script for Core 6.0                          #
#                                                    #
# See .info for details                              #
######################################################

tce-load -wli compiletc squashfs-tools git cmake meson coreutils gperf \
            libcap-dev util-linux_base-dev util-linux-dev python3.11-dev libgcrypt-dev \
            glib2-dev gobject-introspection-dev pciutils usbutils

######################################################
# Configure extension creation parameters            #
######################################################
SRCPATH="../../../sources"

#https://github.com/systemd/systemd/archive/v257.3/systemd-257.3.tar.gz

VERSION="257.3"
SRCNAM=systemd-${VERSION}.tar.gz
WRKDIR=systemd-${VERSION}

VERSION="${VERSION%.*}"
BASENAME=udev_base${VERSION}
UDEVLIB=udev${VERSION}-lib
UDEVEXTRA=udev${VERSION}-extra
UDEVV4L=udev${VERSION}_extras_v4l
GUDEVLIB=gudev${VERSION}-lib
GUDEVGIR=gudev${VERSION}-gir
export TMPBASE=/tmp/$BASENAME
export TMPUDEV=/tmp/$UDEVLIB
TMPUDEVEXTRA=/tmp/$UDEVEXTRA
TMPUDEVV4L=/tmp/$UDEVV4L
TMPGUDEV=/tmp/$GUDEVLIB
TMPGUDEVGIR=/tmp/$GUDEVGIR

######################################################
# Prepare extension creation                         #
######################################################

# Remove dirs and files left from previous creation

rm -r -f $WRKDIR

rm -r -f $TMPUDEV
rm -r -f $TMPUDEV-dev
rm -r -f $TMPBASE
rm -r -f $TMPUDEVEXTRA
rm -r -f $TMPUDEVV4L
rm -r -f $TMPGUDEV
rm -r -f $TMPGUDEVGIR

# Crete temporary directory

mkdir -p $TMPBASE

######################################################
# Compile extension                                  #
######################################################

# Export variables needed for compilation

case $(find /lib | grep ld-linux) in
    *armhf*)
       export CFLAGS="-Os -pipe -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp"
       export CXXFLAGS="-Os -pipe -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp"
       BIT32="linux32"
    ;;
    *aarch64*)
       export CFLAGS="-Os -pipe -march=armv8-a+crc -mtune=cortex-a72"
       export CXXFLAGS="-Os -pipe -march=armv8-a+crc -mtune=cortex-a72"
       BIT32=""
    ;;
esac
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig

# Unpack source in current directory

tar xf ${SRCPATH}/${SRCNAM}

# Configure it

cd $WRKDIR

#Remove two unneeded groups, render and sgx, from the default udev rules:
sed -e 's/GROUP="render"/GROUP="video"/' \
    -e 's/GROUP="sgx", //'               \
    -i rules.d/50-udev-default.rules.in

#Remove one udev rule requiring a full Systemd installation:
sed -i '/systemd-sysctl/s/^/#/' rules.d/99-systemd.rules.in

#Adjust the hardcoded paths to network configuration files for the standalone udev installation:
sed -e '/NETWORK_DIRS/s/systemd/udev/' \
    -i src/libsystemd/sd-network/network-util.h


mkdir -p build
cd       build

python3 -m venv pyenv
source ./pyenv/bin/activate
pip install --upgrade pip setuptools
pip install meson ninja
pip install Jinja2

# Build with --disable-gudev before glib2 is built.
# Build with --disable-introspection until libgudev is built.  
#   The makefile cannot find the libs in the build dir on armvxx

${BIT32} meson setup ..                  \
      --prefix=/usr       \
      -D optimization=s         \
      --buildtype=release       \
      -D mode=release           \
      -D dev-kvm-mode=0660      \
      -D link-udev-shared=false \
      -D logind=false           \
      -D vconsole=false         \
      -D sysconfdir=/etc          \
      -D sbindir=/usr/sbin        \
      -D libexecdir=/usr/lib/udev   \
      -D bindir=/usr/bin

#Get the list of the shipped udev helpers 
export udev_helpers=$(grep "'name' :" ../src/udev/meson.build | \
                      awk '{print $3}' | tr -d ",'" | grep -v 'udevadm')

#Only build the components needed for udev:
${BIT32} ninja udevadm systemd-hwdb                                           \
      $(ninja -n | grep -Eo '(src/(lib)?udev|rules.d|hwdb.d)/[^ ]*') \
      $(realpath libudev.so --relative-to .)                         \
      $udev_helpers

deactivate

# Install in base temp dir

install -vm755 -d $TMPUDEV/usr/{bin,sbin}
install -vm755 -d {$TMPUDEV/usr/lib,$TMPUDEV/etc}/udev/{hwdb.d,rules.d,network}
install -vm755 -d ${TMPUDEV}/usr/local/{lib,share}/pkgconfig
install -vm755 -d $TMPUDEV/usr/local/include

install -vm755 udevadm                             ${TMPUDEV}/usr/bin/
install -vm755 systemd-hwdb                        ${TMPUDEV}/usr/bin/udev-hwdb
ln      -svfn  ../bin/udevadm                      ${TMPUDEV}/usr/sbin/udevd

cp      -av    libudev.so{,*[0-9]}                 ${TMPUDEV}/usr/local/lib/
install -vm644 ../src/libudev/libudev.h            ${TMPUDEV}/usr/local/include/
install -vm644 src/libudev/*.pc                    ${TMPUDEV}/usr/local/lib/pkgconfig/
install -vm644 src/udev/*.pc                       ${TMPUDEV}/usr/local/share/pkgconfig/
install -vm644 ../src/udev/udev.conf               ${TMPUDEV}/etc/udev/

install -vm644 rules.d/* ../rules.d/README         ${TMPUDEV}/usr/lib/udev/rules.d/
install -vm644 $(find ../rules.d/*.rules \
                      -not -name '*power-switch*') ${TMPUDEV}/usr/lib/udev/rules.d/
install -vm644 hwdb.d/*  ../hwdb.d/{*.hwdb,README} ${TMPUDEV}/usr/lib/udev/hwdb.d/
install -vm755 $udev_helpers                       ${TMPUDEV}/usr/lib/udev
install -vm644 ../network/99-default.link          ${TMPUDEV}/usr/lib/udev/network


unset udev_helpers

$TMPUDEV/usr/bin/udev-hwdb update -r $TMPUDEV

cd ../..
rm -rf $WRKDIR

# Adjust directory access rigths

find $TMPUDEV/ -type d | xargs chmod -v 755;

# Strip executables

find $TMPUDEV | xargs file | grep ELF | cut -f 1 -d : | ${BIT32} xargs strip --strip-unneeded

# Move files to doc extension

#mkdir -p $TMPUDEV-doc/usr/local/share
#mv $TMPUDEV/usr/local/share/doc $TMPUDEV-doc/usr/local/share
#mv $TMPUDEV/usr/local/share/man $TMPUDEV-doc/usr/local/share
#mv $TMPUDEV/usr/local/share/gtk-doc $TMPUDEV-doc/usr/local/share

# Move files for base
mkdir -p ${TMPBASE}
mv -f $TMPUDEV/etc $TMPBASE
mv -f $TMPUDEV/usr/sbin $TMPBASE
mv -f $TMPUDEV/usr/bin $TMPBASE
mkdir -p ${TMPBASE}/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/udevd $TMPBASE/sbin
mv $TMPUDEV/usr/lib/udev/rules.d/42* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/50* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/60-cd* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/60-persistent-alsa* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/60-persistent-input* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/60-persistent-serial* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/60-persistent-storage* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/80-drivers* $TMPBASE/etc/udev/rules.d
mv $TMPUDEV/usr/lib/udev/rules.d/95-udev* $TMPBASE/etc/udev/rules.d

# Move files to udev dev extension
mkdir -p $TMPUDEV-dev/usr/local/lib
mv $TMPUDEV/usr/local/include $TMPUDEV-dev/usr/local
mv $TMPUDEV/usr/local/lib/pkgconfig $TMPUDEV-dev/usr/local/lib
mv $TMPUDEV/usr/local/share/pkgconfig/* $TMPUDEV-dev/usr/local/lib/pkgconfig
rm -rf $TMPUDEV/usr/local/share

sed -i 's|/usr|/usr/local|' $TMPUDEV-dev/usr/local/lib/pkgconfig/libudev.pc

# Move extras v4l
mkdir -p $TMPUDEVV4L/usr/lib/udev
mv $TMPUDEV/usr/lib/udev/v4l* $TMPUDEVV4L/usr/lib/udev/
mkdir -p $TMPUDEVV4L/usr/local/share/udev/files
mv $TMPUDEV/usr/lib/udev/rules.d/60-persistent-v4l* $TMPUDEVV4L/usr/local/share/udev/files
mkdir -p $TMPUDEVV4L/usr/local/tce.installed
cp -f udev_extras_v4l $TMPUDEVV4L/usr/local/tce.installed
chmod -R 775 $TMPUDEVV4L/usr/local/tce.installed
sudo chown -R root:staff $TMPUDEVV4L/usr/local/tce.installed

# move udev extras
mkdir -p $TMPUDEVEXTRA/usr/lib
mv $TMPUDEV/usr/lib/udev $TMPUDEVEXTRA/usr/lib
mkdir -p $TMPUDEVEXTRA/usr/local/etc
mkdir -p $TMPUDEVEXTRA/usr/local/tce.installed
cp udev-extra.conf $TMPUDEVEXTRA/usr/local/etc
cp udev-extra $TMPUDEVEXTRA/usr/local/tce.installed
chmod -R 775 $TMPUDEVEXTRA/usr/local/tce.installed
sudo chown -R root:staff $TMPUDEVEXTRA/usr/local/tce.installed

rm -rf $TMPUDEV/usr/lib

###For now remove link of .so to so.1 so the old udev-lib takes priority
rm -f $TMPUDEV/usr/local/lib/*.so

###################################################
# Create base extension in temp dir               #
###################################################

EXTLIST="udev${VERSION}-lib udev${VERSION}-lib-dev udev${VERSION}-extra udev${VERSION}_extras_v4l"
for i in $EXTLIST;do
	TMPDIR=/tmp/$i
	cd $TMPDIR
	cd ..
	mksquashfs $TMPDIR $i.tcz
	cd $TMPDIR
	find * -not -type d > $i.tcz.list
	mv ../$i.tcz .

	# Create md5 file

	md5sum $i.tcz > $i.tcz.md5.txt
	echo $VERSION > $i.tcz.ver

	# Cleanup temp directory

	rm -r -f usr
	rm -r -f lib
	rm -r -r ext
done

cd $TMPBASE
tar zcvf $TMPBASE.tar.gz *
mv $TMPBASE.tar.gz .

rm -rf bin
rm -rf etc
rm -rf sbin
