scripts/image: $RELEASE_DIR removing fix for Amlogic builds and cleanup

This commit is contained in:
Immanuel Klinkenberg 2016-08-15 16:09:45 +02:00
parent 17fb8dbba0
commit e0bdb4a74d

View File

@ -82,118 +82,118 @@ if [ -n "$IMAGE_SUFFIX" ]; then
fi fi
# setup fakeroot # setup fakeroot
rm -rf $FAKEROOT_SCRIPT # remove $FAKEROOT_SCRIPT if it exist rm -rf $FAKEROOT_SCRIPT # remove $FAKEROOT_SCRIPT if it exist
touch $FAKEROOT_SCRIPT # create an empty $FAKEROOT_SCRIPT touch $FAKEROOT_SCRIPT # create an empty $FAKEROOT_SCRIPT
chmod +x $FAKEROOT_SCRIPT # make $FAKEROOT_SCRIPT executable chmod +x $FAKEROOT_SCRIPT # make $FAKEROOT_SCRIPT executable
echo "chown -R 0:0 $INSTALL" >> $FAKEROOT_SCRIPT echo "chown -R 0:0 $INSTALL" >> $FAKEROOT_SCRIPT
# clean old install dirs # clean old install dirs
rm -rf $INSTALL rm -rf $INSTALL
rm -rf $STAMPS_INSTALL rm -rf $STAMPS_INSTALL
mkdir -p $INSTALL mkdir -p $INSTALL
# create baselayout # create baselayout
mkdir -p $INSTALL/bin mkdir -p $INSTALL/bin
mkdir -p $INSTALL/etc mkdir -p $INSTALL/etc
mkdir -p $INSTALL/lib mkdir -p $INSTALL/lib
mkdir -p $INSTALL/sbin mkdir -p $INSTALL/sbin
mkdir -p $INSTALL/dev mkdir -p $INSTALL/dev
mkdir -p $INSTALL/proc mkdir -p $INSTALL/proc
mkdir -p $INSTALL/run mkdir -p $INSTALL/run
mkdir -p $INSTALL/sys mkdir -p $INSTALL/sys
mkdir -p $INSTALL/tmp mkdir -p $INSTALL/tmp
mkdir -p $INSTALL/usr mkdir -p $INSTALL/usr
mkdir -p $INSTALL/var mkdir -p $INSTALL/var
mkdir -p $INSTALL/flash mkdir -p $INSTALL/flash
mkdir -p $INSTALL/storage mkdir -p $INSTALL/storage
ln -sf /var/media $INSTALL/media ln -sf /var/media $INSTALL/media
if [ "$TARGET_ARCH" = "x86_64" -o "$TARGET_ARCH" = "powerpc64" ]; then if [ "$TARGET_ARCH" = "x86_64" -o "$TARGET_ARCH" = "powerpc64" ]; then
ln -s /lib $INSTALL/lib64 ln -s /lib $INSTALL/lib64
ln -s lib $INSTALL/usr/lib64 ln -s lib $INSTALL/usr/lib64
fi fi
echo "$TARGET_VERSION" > $INSTALL/etc/release echo "$TARGET_VERSION" > $INSTALL/etc/release
# create /etc/os-release # create /etc/os-release
echo -e "NAME=\"$DISTRONAME\"" > $INSTALL/etc/os-release echo -e "NAME=\"$DISTRONAME\"" > $INSTALL/etc/os-release
echo -e "VERSION=\"$LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release echo -e "VERSION=\"$LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release
echo -e "ID=\"libreelec\"" >> $INSTALL/etc/os-release echo -e "ID=\"libreelec\"" >> $INSTALL/etc/os-release
echo -e "VERSION_ID=\"$OS_VERSION\"" >> $INSTALL/etc/os-release echo -e "VERSION_ID=\"$OS_VERSION\"" >> $INSTALL/etc/os-release
echo -e "PRETTY_NAME=\"$DISTRONAME ($LIBREELEC_BUILD) - Version: $LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release echo -e "PRETTY_NAME=\"$DISTRONAME ($LIBREELEC_BUILD) - Version: $LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release
echo -e "HOME_URL=\"https://libreelec.tv\"" >> $INSTALL/etc/os-release echo -e "HOME_URL=\"https://libreelec.tv\"" >> $INSTALL/etc/os-release
echo -e "BUG_REPORT_URL=\"$ORIGIN_URL\"" >> $INSTALL/etc/os-release echo -e "BUG_REPORT_URL=\"$ORIGIN_URL\"" >> $INSTALL/etc/os-release
echo -e "BUILD_ID=\"$GIT_HASH\"" >> $INSTALL/etc/os-release echo -e "BUILD_ID=\"$GIT_HASH\"" >> $INSTALL/etc/os-release
echo -e "OPENELEC_ARCH=\"$PROJECT.$TARGET_ARCH\"" >> $INSTALL/etc/os-release echo -e "OPENELEC_ARCH=\"$PROJECT.$TARGET_ARCH\"" >> $INSTALL/etc/os-release
echo -e "LIBREELEC_ARCH=\"$PROJECT.$TARGET_ARCH\"" >> $INSTALL/etc/os-release echo -e "LIBREELEC_ARCH=\"$PROJECT.$TARGET_ARCH\"" >> $INSTALL/etc/os-release
echo -e "LIBREELEC_BUILD=\"$LIBREELEC_BUILD\"" >> $INSTALL/etc/os-release echo -e "LIBREELEC_BUILD=\"$LIBREELEC_BUILD\"" >> $INSTALL/etc/os-release
# create /etc/issue # create /etc/issue
echo "$GREETING0" > $INSTALL/etc/issue echo "$GREETING0" > $INSTALL/etc/issue
echo "$GREETING1" >> $INSTALL/etc/issue echo "$GREETING1" >> $INSTALL/etc/issue
echo "$GREETING2" >> $INSTALL/etc/issue echo "$GREETING2" >> $INSTALL/etc/issue
echo "$GREETING3" >> $INSTALL/etc/issue echo "$GREETING3" >> $INSTALL/etc/issue
echo "$GREETING4" >> $INSTALL/etc/issue echo "$GREETING4" >> $INSTALL/etc/issue
echo "$DISTRONAME ($LIBREELEC_BUILD) Version: $LIBREELEC_VERSION" >> $INSTALL/etc/issue echo "$DISTRONAME ($LIBREELEC_BUILD) Version: $LIBREELEC_VERSION" >> $INSTALL/etc/issue
if [ "$DEVEL_VERSION" = "devel" ] ; then if [ "$DEVEL_VERSION" = "devel" ] ; then
echo "$DISTRONAME git: $GIT_HASH" >> $INSTALL/etc/issue echo "$DISTRONAME git: $GIT_HASH" >> $INSTALL/etc/issue
fi fi
ln -sf /etc/issue $INSTALL/etc/motd ln -sf /etc/issue $INSTALL/etc/motd
# Basissystem... # Basissystem...
$SCRIPTS/install libc $SCRIPTS/install libc
$SCRIPTS/install gcc $SCRIPTS/install gcc
$SCRIPTS/install linux $SCRIPTS/install linux
$SCRIPTS/install linux-drivers $SCRIPTS/install linux-drivers
$SCRIPTS/install linux-firmware $SCRIPTS/install linux-firmware
$SCRIPTS/install $BOOTLOADER $SCRIPTS/install $BOOTLOADER
$SCRIPTS/install busybox $SCRIPTS/install busybox
$SCRIPTS/install util-linux $SCRIPTS/install util-linux
$SCRIPTS/install corefonts $SCRIPTS/install corefonts
$SCRIPTS/install network $SCRIPTS/install network
# Graphic support # Graphic support
[ ! "$DISPLAYSERVER" = "no" ] && $SCRIPTS/install $DISPLAYSERVER [ ! "$DISPLAYSERVER" = "no" ] && $SCRIPTS/install $DISPLAYSERVER
# Multimedia support # Multimedia support
[ ! "$MEDIACENTER" = "no" ] && $SCRIPTS/install mediacenter [ ! "$MEDIACENTER" = "no" ] && $SCRIPTS/install mediacenter
# Sound support # Sound support
[ "$ALSA_SUPPORT" = "yes" ] && $SCRIPTS/install alsa [ "$ALSA_SUPPORT" = "yes" ] && $SCRIPTS/install alsa
# Automounter support # Automounter support
[ "$UDEVIL" = "yes" ] && $SCRIPTS/install udevil [ "$UDEVIL" = "yes" ] && $SCRIPTS/install udevil
# NTFS 3G support # NTFS 3G support
[ "$EXFAT" = "yes" ] && $SCRIPTS/install fuse-exfat [ "$EXFAT" = "yes" ] && $SCRIPTS/install fuse-exfat
# NTFS 3G support # NTFS 3G support
[ "$NTFS3G" = "yes" ] && $SCRIPTS/install ntfs-3g_ntfsprogs [ "$NTFS3G" = "yes" ] && $SCRIPTS/install ntfs-3g_ntfsprogs
# Remote support # Remote support
[ "$REMOTE_SUPPORT" = "yes" ] && $SCRIPTS/install remote [ "$REMOTE_SUPPORT" = "yes" ] && $SCRIPTS/install remote
# LCD support # LCD support
[ ! "$LCD_DRIVER" = "none" ] && $SCRIPTS/install lcdproc [ ! "$LCD_DRIVER" = "none" ] && $SCRIPTS/install lcdproc
# Virtual image creation support # Virtual image creation support
[ "$PROJECT" = Virtual ] && $SCRIPTS/install virtual [ "$PROJECT" = Virtual ] && $SCRIPTS/install virtual
# Installer support # Installer support
[ "$INSTALLER_SUPPORT" = "yes" ] && $SCRIPTS/install installer [ "$INSTALLER_SUPPORT" = "yes" ] && $SCRIPTS/install installer
# Devtools... (not for Release) # Devtools... (not for Release)
[ "$TESTING" = "yes" ] && $SCRIPTS/install testing [ "$TESTING" = "yes" ] && $SCRIPTS/install testing
# Install gdb in all builds, including releases # Install gdb in all builds, including releases
$SCRIPTS/install debug $SCRIPTS/install debug
# OEM packages # OEM packages
[ "$OEM_SUPPORT" = "yes" ] && $SCRIPTS/install oem [ "$OEM_SUPPORT" = "yes" ] && $SCRIPTS/install oem
# copy project related files to filesystem # copy project related files to filesystem
if [ -d "$PROJECT_DIR/$PROJECT/filesystem" ]; then if [ -d "$PROJECT_DIR/$PROJECT/filesystem" ]; then
cp -PR $PROJECT_DIR/$PROJECT/filesystem/* $INSTALL cp -PR $PROJECT_DIR/$PROJECT/filesystem/* $INSTALL
# install project specific systemd services # install project specific systemd services
for service in $PROJECT_DIR/$PROJECT/filesystem/usr/lib/systemd/system/*.service ; do for service in $PROJECT_DIR/$PROJECT/filesystem/usr/lib/systemd/system/*.service ; do
@ -201,10 +201,10 @@ fi
enable_service $(basename $service) enable_service $(basename $service)
fi fi
done done
fi fi
# copy vendor related files to filesystem # copy vendor related files to filesystem
if [ -d "$HOME/.libreelec/filesystem" ]; then if [ -d "$HOME/.libreelec/filesystem" ]; then
cp -PR $HOME/.libreelec/filesystem/* $INSTALL cp -PR $HOME/.libreelec/filesystem/* $INSTALL
# install project specific systemd services # install project specific systemd services
for service in $HOME/.libreelec/filesystem/usr/lib/systemd/system/*.service ; do for service in $HOME/.libreelec/filesystem/usr/lib/systemd/system/*.service ; do
@ -212,10 +212,10 @@ fi
enable_service $(basename $service) enable_service $(basename $service)
fi fi
done done
fi fi
# copy vendor project related files to filesystem # copy vendor project related files to filesystem
if [ -d "$HOME/.libreelec/projects/$PROJECT/filesystem" ]; then if [ -d "$HOME/.libreelec/projects/$PROJECT/filesystem" ]; then
cp -PR $HOME/.libreelec/projects/$PROJECT/filesystem/* $INSTALL cp -PR $HOME/.libreelec/projects/$PROJECT/filesystem/* $INSTALL
# install project specific systemd services # install project specific systemd services
for service in $HOME/.libreelec/projects/$PROJECT/filesystem/usr/lib/systemd/system/*.service ; do for service in $HOME/.libreelec/projects/$PROJECT/filesystem/usr/lib/systemd/system/*.service ; do
@ -223,49 +223,49 @@ fi
enable_service $(basename $service) enable_service $(basename $service)
fi fi
done done
fi fi
# run depmod # run depmod
MODVER=$(basename $(ls -d $INSTALL/lib/modules/*)) MODVER=$(basename $(ls -d $INSTALL/lib/modules/*))
find $INSTALL/lib/modules/$MODVER/ -name *.ko | \ find $INSTALL/lib/modules/$MODVER/ -name *.ko | \
sed -e "s,$INSTALL/lib/modules/$MODVER/,," > $INSTALL/lib/modules/$MODVER/modules.order sed -e "s,$INSTALL/lib/modules/$MODVER/,," > $INSTALL/lib/modules/$MODVER/modules.order
$ROOT/$TOOLCHAIN/bin/depmod -b $INSTALL $MODVER 2> /dev/null $ROOT/$TOOLCHAIN/bin/depmod -b $INSTALL $MODVER 2> /dev/null
# strip kernel modules # strip kernel modules
for MOD in `find $INSTALL/lib/modules/ -type f -name *.ko`; do for MOD in `find $INSTALL/lib/modules/ -type f -name *.ko`; do
$STRIP --strip-debug $MOD $STRIP --strip-debug $MOD
done done
# make target dir # make target dir
mkdir -p $TARGET_IMG mkdir -p $TARGET_IMG
rm -rf $TARGET_IMG/$IMAGE_NAME.kernel rm -rf $TARGET_IMG/$IMAGE_NAME.kernel
# copy kernel to target dir # copy kernel to target dir
if [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then if [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then
echo "injecting DeviceTreeBlobs to kernel..." echo "injecting DeviceTreeBlobs to kernel..."
perl $BUILD/linux-$(kernel_version)/scripts/mkknlimg $BUILD/linux-$(kernel_version)/arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET $TARGET_IMG/$IMAGE_NAME.kernel perl $BUILD/linux-$(kernel_version)/scripts/mkknlimg $BUILD/linux-$(kernel_version)/arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET $TARGET_IMG/$IMAGE_NAME.kernel
echo "...done" echo "...done"
else else
cp -PR $BUILD/linux-$(kernel_version)/arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET $TARGET_IMG/$IMAGE_NAME.kernel cp -PR $BUILD/linux-$(kernel_version)/arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET $TARGET_IMG/$IMAGE_NAME.kernel
fi fi
chmod 0644 $TARGET_IMG/$IMAGE_NAME.kernel chmod 0644 $TARGET_IMG/$IMAGE_NAME.kernel
# create squashfs file # create squashfs file
if [ -z "$SQUASHFS_COMPRESSION" ]; then if [ -z "$SQUASHFS_COMPRESSION" ]; then
SQUASHFS_COMPRESSION="gzip" SQUASHFS_COMPRESSION="gzip"
fi fi
echo "rm -rf $TARGET_IMG/$IMAGE_NAME.system" >> $FAKEROOT_SCRIPT echo "rm -rf $TARGET_IMG/$IMAGE_NAME.system" >> $FAKEROOT_SCRIPT
echo "$ROOT/$TOOLCHAIN/bin/mksquashfs $BUILD/image/system $TARGET_IMG/$IMAGE_NAME.system -noappend -comp $SQUASHFS_COMPRESSION" >> $FAKEROOT_SCRIPT echo "$ROOT/$TOOLCHAIN/bin/mksquashfs $BUILD/image/system $TARGET_IMG/$IMAGE_NAME.system -noappend -comp $SQUASHFS_COMPRESSION" >> $FAKEROOT_SCRIPT
# run fakeroot # run fakeroot
$ROOT/$TOOLCHAIN/bin/fakeroot -- $FAKEROOT_SCRIPT $ROOT/$TOOLCHAIN/bin/fakeroot -- $FAKEROOT_SCRIPT
rm -rf $FAKEROOT_SCRIPT rm -rf $FAKEROOT_SCRIPT
# set permissions # set permissions
chmod 0644 $TARGET_IMG/$IMAGE_NAME.system chmod 0644 $TARGET_IMG/$IMAGE_NAME.system
if [ "$1" = "release" -o "$1" = "mkimage" -o "$1" = "amlpkg" -o "$1" = "noobs" ]; then if [ "$1" = "release" -o "$1" = "mkimage" -o "$1" = "amlpkg" -o "$1" = "noobs" ]; then
RELEASE_DIR="target/$IMAGE_NAME" RELEASE_DIR="target/$IMAGE_NAME"
@ -274,12 +274,12 @@ fi
# create release dir # create release dir
mkdir -p $RELEASE_DIR mkdir -p $RELEASE_DIR
# remove n previous created release image # remove n previous created release image
rm -rf $TARGET_IMG/$IMAGE_NAME.img.gz rm -rf $TARGET_IMG/$IMAGE_NAME.img.gz
if [ -n "$BOOTLOADER" ]; then if [ -n "$BOOTLOADER" ]; then
BOOTLOADER_DIR="" BOOTLOADER_DIR=""
if [ -z "$BOOTLOADER_DIR" -a -d $HOME/.openelec/projects/$PROJECT/packages ]; then if [ -z "$BOOTLOADER_DIR" -a -d $HOME/.openelec/projects/$PROJECT/packages ]; then
BOOTLOADER_DIR=`find $HOME/.openelec/projects/$PROJECT/packages -type d -name $BOOTLOADER 2>/dev/null` BOOTLOADER_DIR=`find $HOME/.openelec/projects/$PROJECT/packages -type d -name $BOOTLOADER 2>/dev/null`
fi fi
@ -315,7 +315,6 @@ fi
# only for matrix system or all? (one tar for all updates?) # only for matrix system or all? (one tar for all updates?)
if [ "$PROJECT" == "imx6" -a "$SYSTEM" == "matrix" ]; then if [ "$PROJECT" == "imx6" -a "$SYSTEM" == "matrix" ]; then
$SCRIPTS/unpack imx6-mfgtool2-tbs-matrix $SCRIPTS/unpack imx6-mfgtool2-tbs-matrix
mkdir -p $RELEASE_DIR/MfgTool2-TBS-Matrix mkdir -p $RELEASE_DIR/MfgTool2-TBS-Matrix
cp -PR $BUILD/imx6-mfgtool2-tbs-matrix-*/* $RELEASE_DIR/MfgTool2-TBS-Matrix cp -PR $BUILD/imx6-mfgtool2-tbs-matrix-*/* $RELEASE_DIR/MfgTool2-TBS-Matrix
fi fi
@ -334,6 +333,7 @@ fi
mkdir -p $RELEASE_DIR/target mkdir -p $RELEASE_DIR/target
cp $TARGET_IMG/$IMAGE_NAME.system $RELEASE_DIR/target/SYSTEM cp $TARGET_IMG/$IMAGE_NAME.system $RELEASE_DIR/target/SYSTEM
cp $TARGET_IMG/$IMAGE_NAME.kernel $RELEASE_DIR/target/KERNEL cp $TARGET_IMG/$IMAGE_NAME.kernel $RELEASE_DIR/target/KERNEL
# create md5sum's # create md5sum's
( cd $RELEASE_DIR; ( cd $RELEASE_DIR;
md5sum -t target/SYSTEM > target/SYSTEM.md5; md5sum -t target/SYSTEM > target/SYSTEM.md5;
@ -377,7 +377,7 @@ fi
IMAGE_NAME="$IMAGE_NAME" \ IMAGE_NAME="$IMAGE_NAME" \
BOOTLOADER="$BOOTLOADER" \ BOOTLOADER="$BOOTLOADER" \
KERNEL_NAME="$KERNEL_NAME" \ KERNEL_NAME="$KERNEL_NAME" \
RELEASE_DIR="$RELEASE_DIR" \ RELEASE_DIR=$RELEASE_DIR \
UUID_SYSTEM="$(uuidgen)" \ UUID_SYSTEM="$(uuidgen)" \
UUID_STORAGE="$(uuidgen)" \ UUID_STORAGE="$(uuidgen)" \
UBOOT_SYSTEM="$UBOOT_SYSTEM" \ UBOOT_SYSTEM="$UBOOT_SYSTEM" \
@ -432,11 +432,12 @@ fi
java -Xmx1024m -jar $SIGNAPK_DIR/signapk.jar -w $SIGNAPK_DIR/testkey.x509.pem $SIGNAPK_DIR/testkey.pk8 update.zip sign/$IMAGE_NAME-update.zip java -Xmx1024m -jar $SIGNAPK_DIR/signapk.jar -w $SIGNAPK_DIR/testkey.x509.pem $SIGNAPK_DIR/testkey.pk8 update.zip sign/$IMAGE_NAME-update.zip
# create the auto-install package # create the auto-install package
if [ -f "$INSTALL_SRC_DIR/files/recovery.img" ]; then
echo "Creating Amlogic ZIP auto-install package" echo "Creating Amlogic ZIP auto-install package"
pushd sign > /dev/null pushd sign > /dev/null
echo --update_package=/sdcard/$IMAGE_NAME-update.zip > factory_update_param.aml echo --update_package=/sdcard/$IMAGE_NAME-update.zip > factory_update_param.aml
if [ -f "$INSTALL_SRC_DIR/files/recovery.img" ]; then
cp $INSTALL_SRC_DIR/files/recovery.img . cp $INSTALL_SRC_DIR/files/recovery.img .
fi
if [ -f $INSTALL_SRC_DIR/files/aml_autoscript ]; then if [ -f $INSTALL_SRC_DIR/files/aml_autoscript ]; then
cp $INSTALL_SRC_DIR/files/aml_autoscript . cp $INSTALL_SRC_DIR/files/aml_autoscript .
@ -448,21 +449,13 @@ fi
fi fi
zip -q $TARGET_IMG/$IMAGE_NAME.zip * zip -q $TARGET_IMG/$IMAGE_NAME.zip *
popd > /dev/null
fi
popd > /dev/null popd > /dev/null
popd > /dev/null
# cleanup release dir
rm -rf $RELEASE_DIR
elif [ "$1" = "noobs" ]; then elif [ "$1" = "noobs" ]; then
RELEASE_DIR="$TARGET_IMG/${IMAGE_NAME}-$1" RELEASE_DIR="$TARGET_IMG/${IMAGE_NAME}-$1"
# cleanup
rm -rf $RELEASE_DIR
# create release dir # create release dir
mkdir -p $RELEASE_DIR/${DISTRONAME}_${PROJECT} mkdir -p $RELEASE_DIR/${DISTRONAME}_${PROJECT}
@ -482,7 +475,6 @@ fi
cp $ROOT/README* $RELEASE_DIR/${DISTRONAME}_${PROJECT} cp $ROOT/README* $RELEASE_DIR/${DISTRONAME}_${PROJECT}
cp $ROOT/CHANGELOG $RELEASE_DIR/${DISTRONAME}_${PROJECT}/release_notes.txt cp $ROOT/CHANGELOG $RELEASE_DIR/${DISTRONAME}_${PROJECT}/release_notes.txt
sed -e "s%@DISTRONAME@%$DISTRONAME%g" \ sed -e "s%@DISTRONAME@%$DISTRONAME%g" \
-e "s%@PROJECT@%$PROJECT%g" \ -e "s%@PROJECT@%$PROJECT%g" \
-e "s%@LIBREELEC_VERSION@%$LIBREELEC_VERSION%g" \ -e "s%@LIBREELEC_VERSION@%$LIBREELEC_VERSION%g" \
@ -561,8 +553,10 @@ fi
# create release tarball # create release tarball
tar cf $TARGET_IMG/${IMAGE_NAME}-$1.tar -C $TARGET ${IMAGE_NAME}-$1 tar cf $TARGET_IMG/${IMAGE_NAME}-$1.tar -C $TARGET ${IMAGE_NAME}-$1
fi
# cleanup noobs dir if [ -d $RELEASE_DIR ]; then
# cleanup release dir
rm -rf $RELEASE_DIR rm -rf $RELEASE_DIR
fi fi
fi fi