forked from freifunk-franken/firmware
Adrian Schmutzler
157ddf2bc9
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>
532 lines
14 KiB
Bash
Executable File
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
|