firmware/buildscript
Adrian Schmutzler 157ddf2bc9 buildscript: copy all squashfs images for one device
So far, we are selecting specific squashfs images to be copied
from openwrt bin folder to our "final" bin directory. This has
the disadvantage that additional image types/names have to be
added explicitly, bloating the relevant code in buildscript.

With this patch, this behavior is changed in order to copy all
squashfs images for a particular device. To achieve that, the
image names in the bsp files are changed to contain a wildcard
that will be evaluated in buildscript.

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Reviewed-by: Fabian Bläse <fabian@blaese.de>
2020-04-15 15:59:28 +02:00

532 lines
14 KiB
Bash
Executable File

#!/bin/bash
# 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.
#
builddir=./build
OPENWRTREV="v19.07.2"
OPENWRTURL="https://git.openwrt.org/openwrt/openwrt.git"
PACKAGEREV="99efce0cd27adfcc53384fba93f37e5ee2e517de" # openwrt-19.07.2
PACKAGEURL="https://git.openwrt.org/feed/packages.git"
## Feed definition [0]: name aka directory, [1]: url, [2]: revision, [3..n]: patches
#official openwrt packages
OPENWRT=(openwrt
$PACKAGEURL
$PACKAGEREV)
OPENWRT_PKGS="gpioctl-sysfs libugpio fastd haserl"
## Be careful: FFF uses COMPAT_VERSION 15 as default at the moment.
## See http://www.open-mesh.org/projects/batman-adv/wiki/Compatversion
GLUON=(gluon
https://github.com/freifunk-gluon/packages.git
8b65619f59c3bdce743c2f2fb2588fdd7079355a)
GLUON_PKGS="kmod-batman-adv-legacy micrond simple-tc uradvd"
#official openwrt routing packages
ROUTING=(routing
https://git.openwrt.org/feed/routing.git
efa6e5445adda9c6545f551808829ec927cbade8) # openwrt-19.07.2
ROUTING_PKGS="kmod-batman-adv batctl alfred babeld"
FFF=(fff)
FFF_PKGS="-a"
FEEDS=(OPENWRT ROUTING GLUON FFF)
# Disable dnsmasq and other useless stuff
export DEVICE_TYPE=
checkout_git(){
local DIRECTORY=$1
local REPO_URL=$2
local COMMITID=$3
local MYGIT="git -C $DIRECTORY"
echo "checking out $REPO_URL to $DIRECTORY in version $COMMITID"
if [ -d "$DIRECTORY" ]; then
if $MYGIT remote -v | grep -q "$REPO_URL" ; then
echo "Right remote detected"
if ! $MYGIT checkout "$COMMITID" ; then
echo "commitid not found trying to fetch new commits"
$MYGIT pull && $MYGIT checkout "$COMMITID"
fi
else
echo "wrong remote or not an git repo at all -> deleting whole directory"
/bin/rm -rf "$DIRECTORY"
#needs to be without -C!!!
git clone "$REPO_URL" "$DIRECTORY"
$MYGIT checkout "$COMMITID"
fi
else
echo "We need to do a fresh checkout"
#needs to be without -C!!!
git clone "$REPO_URL" "$DIRECTORY"
$MYGIT checkout "$COMMITID"
fi
}
get_source() {
test -d src || mkdir src
cd src
#Get the OpenWrt Core Source for Firmware
checkout_git openwrt $OPENWRTURL $OPENWRTREV
test -d packages || mkdir packages
cd packages
#checkout needed package feeds
for FEEDVAR in "${FEEDS[@]}" ; do
FEED="${FEEDVAR}[@]"
FEED=("${!FEED}")
local NAME=${FEED[0]}
local URL=${FEED[1]}
local REV=${FEED[2]}
if [ -n "$URL" ] && [ -n "$REV" ]; then
checkout_git "$NAME" "$URL" "$REV"
# Patches for feeds are stored in known directories like feed_patches/$NAME/
for PATCH in $(ls ../../feed_patches/${NAME}/*.patch 2>/dev/null); do
if [ -s "$PATCH" ] ; then
echo "Applying $PATCH"
git -C "$NAME" am --whitespace=nowarn "../$PATCH"
else
echo "Empty patch $PATCH ignored."
fi
done
fi
done
cd .. # packages
cd .. # src
}
patch_target() {
for patch in $(ls "$PWD"/build_patches/openwrt/*.patch 2>/dev/null); do
echo "Applying $patch:"
patch --no-backup-if-mismatch -p1 -d "$builddir" -i "$patch"
done
}
prepare() {
get_source
test -d $builddir || mkdir $builddir
/bin/rm -rf "$builddir"
cp -a src/openwrt "$builddir"
patch_target
# apply variant to ensure the included file "variant.mk"
# exists in builddir.
apply_variant
#saves ~200MB for each build
test -d ./src/dl || mkdir ./src/dl
ln -s ../src/dl "$builddir"/dl
update_feeds
}
apply_variant() {
# set the variant for this build
cp "./src/packages/fff/fff/variant-$(cat selected_variant).mk" "$builddir"/variant.mk
# force the reevaluation of this Makefile to make note of the new variant
touch ./src/packages/fff/fff/Makefile
}
update_feeds() {
## generate own feeds.conf
#this local variable should be globally configure variable used in get_source and here
local PACKAGEBASE=${PWD}/src/packages
rm -f "$builddir"/feeds.conf
for FEEDVAR in "${FEEDS[@]}" ; do
FEED="${FEEDVAR}[@]"
FEED=("${!FEED}")
local NAME=${FEED[0]}
echo "adding $NAME to package feeds"
echo src-link "$NAME" "$PACKAGEBASE"/"$NAME" >> "$builddir"/feeds.conf
done
echo "cleaning feeds"
/bin/rm -rf "$builddir"/feeds
"$builddir"/scripts/feeds update
for FEEDVAR in "${FEEDS[@]}" ; do
FEED="${FEEDVAR}[@]"
FEED=("${!FEED}")
local NAME=${FEED[0]}
local PACKAGESVAR="${FEEDVAR}_PKGS"
PACKAGESVAR="${PACKAGESVAR}[@]"
PACKAGESVAR=(${!PACKAGESVAR})
if [[ -n "${PACKAGESVAR[@]}" ]] ; then
echo "adding ${PACKAGESVAR[*]} from feed $NAME to available packages"
"$builddir"/scripts/feeds install -p "$NAME" "${PACKAGESVAR[@]}"
fi
done
}
prebuild() {
apply_variant
#create filesdir for our config
/bin/rm -rf "$builddir"/files
mkdir "$builddir"/files
cp -r ./bsp/default/root_file_system/* "$builddir"/files/
cp ./bsp/"$machine"/.config "$builddir"/.config
while IFS= read -r -d '' template
do
echo "Translating $template .."
$tpl_translate "$template" > "$(dirname "$template")"/"$(basename "$template" .tpl)"
/bin/rm "$template"
done < <(find "${builddir}/files" -name '*.tpl' -print0)
#insert actual firware version informations into release file
variant=$(cat selected_variant)
version=$(git describe --tags --dirty)
if [ 0 -ne $? ]; then
version=$(git log -1 --pretty=format:%h)
fi
if [ -n "$variant" ]; then
version="$variant-$version"
fi
{
echo "FIRMWARE_VERSION=\"$version\""
echo "VARIANT=\"$variant\""
echo "BUILD_DATE=\"build date: $(date)\""
echo "OPENWRT_CORE_REVISION=\"${OPENWRTREV}\""
echo "OPENWRT_FEEDS_PACKAGES_REVISION=\"${PACKAGEREV}\""
} > "$builddir"/files/etc/firmware_release
opath=$(pwd)
cd "$builddir"
make defconfig
cd "$opath"
}
build() {
prebuild
rm_firmware
opath=$(pwd)
cd "$builddir"
cpus=$(grep -c processor /proc/cpuinfo)
case "$1" in
"debug")
make V=99
;;
"fast")
ionice -c 2 -- nice -n 1 -- make -j $((cpus*2))
;;
*)
ionice -c 3 -- nice -n 10 -- make -j $((cpus+1))
;;
esac
cd "$opath"
cp_firmware
}
config() {
prebuild
opath=$(pwd)
cd "$builddir"
case "$1" in
"openwrt")
make menuconfig
;;
esac
save=""
until [ "$save" = "y" -o "$save" = "n" ]; do
echo "Do you want to save the generated config? (y/n)"
read save
done
if [ "$save" = "y" ]; then
case "$1" in
"openwrt")
echo "# Generated using \"./buildscript config openwrt\"." > "$opath"/bsp/"$machine"/.config
echo "# Do no edit manually" >> "$opath"/bsp/"$machine"/.config
echo "#" >> "$opath"/bsp/"$machine"/.config
./scripts/diffconfig.sh >> "$opath"/bsp/"$machine"/.config
;;
esac
fi
cd "$opath"
}
rm_firmware() {
[ -n "$subtarget" ] || subtarget="generic"
rm -rf $builddir/bin/targets/${chipset}/${subtarget}
}
cp_firmware() {
[ -n "$subtarget" ] || subtarget="generic"
mkdir -p "bin/$variant"
imagesrcpath="$builddir/bin/targets/${chipset}/${subtarget}"
imagedestpath="./bin/$variant"
for image in ${images[@]}; do
# This assumes the set of images names is given with a wildcard
fullsrcpattern=$imagesrcpath/$image
if ! ls $fullsrcpattern >/dev/null 2>/dev/null; then
echo "Warning: $image not found."
continue
fi
for f in $fullsrcpattern; do
filename_build=${f##*/}
filename_build=${filename_build//openwrt/fff-${version}}
filename_build=${filename_build//squashfs-/}
filename_build=${filename_build//${chipset}-${subtarget}-/}
cp "$f" "$imagedestpath/$filename_build"
done
done
}
buildrelease() {
if [ "$1" = "all" ];then
all=true
elif [ "$1" = "fast" ];then
fast=fast
fi
if [ "$2" = "all" ];then
all=true
elif [ "$2" = "fast" ];then
fast=fast
fi
if [ $all ]; then
buildall $fast
else
build $fast
fi
cd bin/$variant
for binary in *.bin; do
md5sum "$binary" > ./"$binary".md5
sha256sum "$binary" > ./"$binary".sha256
done
echo -e "VERSION:$version" > release.nfo
cd ../..
}
clean() {
/bin/rm -rf bin $builddir src/openwrt
# remove downloaded package feeds
for FEEDVAR in "${FEEDS[@]}" ; do
FEED="${FEEDVAR}[@]"
FEED=("${!FEED}")
local NAME=${FEED[0]}
local URL=${FEED[1]}
local REV=${FEED[2]}
if [ -n "$URL" ] && [ -n "$REV" ]; then
/bin/rm -rf src/packages/"$NAME"
fi
done
}
loadBSP()
{
echo "Working with $(/bin/ls -l selected_bsp | awk '{ print $11 }')"
. selected_bsp
}
loadVariant()
{
echo "Working with build variant \"$(cat selected_variant)\""
}
setVariant()
{
echo "$1" > selected_variant
}
setBSP()
{
/bin/rm -rf selected_bsp
/bin/ln -s "$1" selected_bsp
loadBSP
}
buildall() {
for bsp in $(/bin/ls bsp/*.bsp); do
setBSP "$bsp"
build "$1"
done
}
if [ "$(/usr/bin/id -u)" -eq 0 ]; then
echo "don't run buildscript as root"
exit 1
fi
if [ "$1" != "selectbsp" -a "$1" != "selectvariant" ]; then
if [ ! -h selected_bsp ]; then
echo "Please select a Board-Support-Package using:"
echo "$0 selectbsp"
exit
fi
if [ ! -f selected_variant ]; then
echo "Please select a build variant using:"
echo "$0 selectvariant"
exit
fi
loadBSP
loadVariant
echo
fi
case "$1" in
"selectbsp")
if [ "$2" = "help" ] || [ "$2" = "" ]; then
echo "Select a Board-Support-Package:"
echo
echo "Usage: $0 $1 <bsp-file>"
echo "available packages:"
/bin/ls bsp/*.bsp
echo
else
if [ ! -f "$2" ]; then
echo "Could not find $2"
else
setBSP "$2"
fi
fi
;;
"selectvariant")
if [ "$2" = "help" ] || [ "$2" = "" ]; then
echo "Select a build varaint:"
echo
echo "Usage: $0 $1 <name of variant>"
echo "available variants: "
/bin/ls src/packages/fff/fff/variant-*.mk | sed 's#.*/variant-\(.*\)\.mk#\1#g'
echo
else
if [ ! -f "src/packages/fff/fff/variant-$2.mk" ]; then
echo "Could not find variant $2"
else
setVariant $2
fi
fi
;;
"prepare")
if [ "$2" = "help" ] || [ "$2" = "x" ]; then
echo "This option fetches the sources for the images and configurates the build so that it can be compiled"
echo
echo "Usage: $0 $1"
echo
else
prepare
fi
;;
"updatefeeds")
update_feeds
;;
"build")
if [ "$2" = "help" ] || [ "$2" = "x" ]; then
echo "This option compiles the firmware"
echo "Normaly the build uses lower IO and System priorities, "
echo "you can append \"fast\" option, to use normal user priorities"
echo
echo "Usage: $0 $1 [fast|debug]"
echo
else
build "$2"
fi
;;
"config")
case "$2" in
openwrt)
config openwrt
;;
*)
echo "This open the OpenWrt menuconfig dialog"
echo
echo "Usage: $0 $1 openwrt"
echo
;;
esac
;;
"clean")
if [ "$2" = "help" ] || [ "$2" = "x" ]; then
echo "This option cleans all build files."
echo
echo "Usage: $0 $1"
echo
else
clean
fi
;;
"buildall")
if [ "$2" = "help" ]; then
echo "This option builds the firmware for all routers."
echo
echo "Usage: $0 $1 [fast]"
echo
else
buildall "$2"
fi
;;
"release")
if [ "$2" = help ]; then
echo "This option builds the firmware for a given board. It also creates hash sums and a the file release.nfo"
echo
echo "Usage: $0 $1 [all] [fast]"
echo
else
buildrelease "$2" "$3"
fi
;;
*)
echo "This is the Build Environment Script of the Freifunk Community Franken."
echo
echo "Usage: $0 command"
echo "command:"
echo " selectbsp <bsp-file>"
echo " selectvariant <name of variant>"
echo " prepare"
echo " updatefeeds"
echo " config openwrt"
echo " build [fast|debug]"
echo " buildall [fast]"
echo " release [all] [fast]"
echo " clean"
echo ""
echo "If you need help to one of these options just type: $0 <command> help"
echo
;;
esac