152 lines
4.1 KiB
Bash
Executable File

#!/bin/sh
set -e
# Common code used by all bundles. Should be included at the
# top of every *.sh file of each bundle.
export SRC_DIR=`realpath --no-symlinks $PWD`
export MAIN_SRC_DIR=`realpath --no-symlinks $SRC_DIR/../../../`
export WORK_DIR=$MAIN_SRC_DIR/work
export SOURCE_DIR=$MAIN_SRC_DIR/source
export OVERLAY_WORK_DIR=$WORK_DIR/overlay
export OVERLAY_SOURCE_DIR=$SOURCE_DIR/overlay
export OVERLAY_ROOTFS=$WORK_DIR/overlay_rootfs
export BUNDLE_NAME=`basename $SRC_DIR`
export DEST_DIR=$WORK_DIR/overlay/$BUNDLE_NAME/${BUNDLE_NAME}_installed
export CONFIG=$MAIN_SRC_DIR/.config
export SYSROOT=$WORK_DIR/sysroot
# This function reads property from the main '.config' file.
# If there is local '.config' file in the current directory
# the property value is overridden with the value found in
# the local '.config' file, if the property is present there.
#
# Using () instead of {} for the function body is a POSIX
# compliant way to execute subshell and as consequence all
# variables in the function will become effectively in local
# scope. Note that the 'local' keyword is supported by most
# shells but it is not POSIX compliant.
read_property() (
# The property we are looking for.
prop_name=$1
# The value of the property set initially to empty string.
prop_value=
if [ ! "$prop_name" = "" ] ; then
# Search in the main '.config' file.
prop_value="`grep -i ^${prop_name}= $CONFIG | cut -f2- -d'=' | xargs`"
if [ -f $SRC_DIR/.config ] ; then
# Search in the local '.config' file.
prop_value_local="`grep -i ^${prop_name}= $SRC_DIR/.config | cut -f2- -d'=' | xargs`"
if [ ! "$prop_value_local" = "" ] ; then
# Override the original value with the local value.
prop_value="$prop_value_local"
fi
fi
fi
echo "$prop_value"
)
# Read commonly used configuration properties.
export JOB_FACTOR="`read_property JOB_FACTOR`"
export CFLAGS="`read_property CFLAGS`"
export NUM_CORES="$(grep ^processor /proc/cpuinfo | wc -l)"
# Calculate the number of make "jobs"
export NUM_JOBS="$((NUM_CORES * JOB_FACTOR))"
# Ideally we would export MAKE at this point with -j etc to allow programs to just run $(MAKE) and not worry about extra flags that need to be passed
# export MAKE="${MAKE-make} -j $NUM_JOBS"
download_source() (
url=$1 # Download from this URL.
file=$2 # Save the resource in this file.
local=`read_property USE_LOCAL_SOURCE`
if [ "$local" = "true" -a ! -f $file ] ; then
echo "Source file '$file' is missing and will be downloaded."
local=false
fi
if [ ! "$local" = "true" ] ; then
echo "Downloading overlay source file from '$url'."
echo "Saving overlay source file in '$file'".
wget -O $file -c $url
else
echo "Using local overlay source file '$file'."
fi
)
extract_source() (
file=$1
name=$2
# Delete folder with previously extracted source.
echo "Removing overlay work area for '$name'. This may take a while."
rm -rf $OVERLAY_WORK_DIR/$name
mkdir -p $OVERLAY_WORK_DIR/$name
# Extract source to folder 'work/overlay/$source'.
tar -xvf $file -C $OVERLAY_WORK_DIR/$name
)
make_target() (
make -j $NUM_JOBS "$@"
)
make_clean() (
target=$1
if [ "$target" = "" ] ; then
target=clean
fi
if [ -f Makefile ] ; then
echo "Preparing '$BUNDLE_NAME' work area. This may take a while."
make_target $target
else
echo "The clean phase for '$BUNDLE_NAME' has been skipped."
fi
)
reduce_size() (
while [ ! "$1" = "" ] ; do
if [ -d $1 ] ; then
for file in $1/* ; do
reduce_size $file
done
elif [ -f $1 ] ; then
set +e
strip -g $1 2>/dev/null
set -e
fi
shift
done
)
install_to_overlay() (
# With '--remove-destination' all possibly existing soft links in
# $OVERLAY_ROOTFS will be overwritten correctly.
if [ "$#" = "2" ] ; then
cp -r --remove-destination \
$DEST_DIR/$1 \
$OVERLAY_ROOTFS/$2
elif [ "$#" = "1" ] ; then
cp -r --remove-destination \
$DEST_DIR/$1 \
$OVERLAY_ROOTFS
elif [ "$#" = "0" ] ; then
cp -r --remove-destination \
$DEST_DIR/* \
$OVERLAY_ROOTFS
fi
)