Merge pull request #22 from FreifunkBremen/build.sh-rewrite
Rewrite build.sh
This commit is contained in:
commit
0b16a7def6
27
README.md
27
README.md
|
@ -2,23 +2,32 @@
|
||||||
|
|
||||||
Um die Bremer Firmware zu bauen sind folgende Vorbereitungen notwendig:
|
Um die Bremer Firmware zu bauen sind folgende Vorbereitungen notwendig:
|
||||||
```sh
|
```sh
|
||||||
# Build-Dependencies installieren (Debian)
|
# Build-Dependencies installieren (Debian/Ubuntu)
|
||||||
sudo apt-get install coreutils build-essential subversion git libncurses5-dev zlib1g-dev unzip gawk libssl-dev
|
sudo apt-get install coreutils schedtool build-essential subversion git libncurses5-dev zlib1g-dev unzip gawk libssl-dev
|
||||||
# Dieses und das Gluon-Repository clonen
|
# Dieses und das Gluon-Repository clonen
|
||||||
git clone --recursive https://github.com/FreifunkBremen/gluon-site-ffhb.git
|
git clone --recursive https://github.com/FreifunkBremen/gluon-site-ffhb.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Um eine neue Testing-Version der Bremer Firmware zu bauen sind folgende Befehle nötig:
|
Um eine bestimmte Version der Bremer Firmware zu bauen sind folgende Befehle nötig:
|
||||||
```sh
|
```sh
|
||||||
# In das Verzeichnis wechseln
|
# In das Verzeichnis wechseln
|
||||||
cd gluon-site-ffhb/
|
cd gluon-site-ffhb/
|
||||||
# Gluon auf die gewünschte Version bringen ($tag ist z.B. v2015.1.1)
|
# Die gewünschte Version auschecken ($tag ist z.B. v2016.2.3+bremen2)
|
||||||
git -C gluon checkout $tag
|
git checkout $tag
|
||||||
|
# Gluon auf die passende Version bringen
|
||||||
|
git submodule update
|
||||||
# Build-Prozess anstoßen
|
# Build-Prozess anstoßen
|
||||||
./build.sh testing
|
./build.sh
|
||||||
```
|
```
|
||||||
Das Script `build.sh` versucht die richtige Versionsnummer automatisch aus dem gewählten Gluon-Tag und der letzten veröffentlichten Testing-Version zu bestimmen, sie kann aber auch manuell eingegeben werden. Will man stattdessen eine Stable bauen, ändert man einfach nur das `testing` in der letzten Zeile zu `stable`.
|
Lief der Build-Prozess erfolgreich durch, liegen in `gluon/output/images/` die fertigen Images inklusive eines Manifests für den Autoupdater, das schon mit dem eigenen ECDSA-Key signiert wurde falls dieser unter `~/.ecdsakey` liegt. In `gluon/output/modules/` liegen außerdem per `opkg` auf dem Knoten nachinstallierbare Kernel-Module.
|
||||||
|
|
||||||
Lief der Build-Prozess erfolgreich durch, liegen in `gluon/images/` die fertigen Images inklusive eines Manifests für den Autoupdater, das schon mit dem eigenen ECDSA-Key signiert wurde falls dieser unter `~/.ecdsakey` liegt.
|
Will man ohne `build.sh` manuell `make` im Verzeichnis gluon aufrufen, wie in der [offiziellen Gluon-Doku](https://gluon.readthedocs.org/en/stable/user/getting_started.html#building-the-images), muss man *jedem* Aufruf von `make` den Parameter `GLUON_SITEDIR=$PWD/../` nachstellen (oder wie in `build.sh` einmal per `export GLUON_SITEDIR=$PWD/../` setzen), damit Gluon das site-Repository findet. Alternativ kann man einen Symlink anlegen, indem man während man im site-Repository ist den Befehl `ln -s $PWD gluon/site` ausführt.
|
||||||
|
|
||||||
Will man ohne `build.sh` manuell `make` im Verzeichnis gluon aufrufen, wie in der [offiziellen Gluon-Doku](https://gluon.readthedocs.org/en/v2015.1.1/user/getting_started.html#building-the-images), muss man *jedem* Aufruf von `make` den Parameter `GLUON_SITEDIR=$PWD/../` nachstellen (oder wie in `build.sh` einmal per `export GLUON_SITEDIR=$PWD/../` setzen).
|
In jedem Fall wird der Gluon-Release-Name automatisch aus dem ausgecheckten Tag generiert - auch falls kein Tag, sondern z.B. der master-Branch ausgecheckt wurde! Falls das nicht gewünscht ist lässt sich durch folgenden Aufruf *vor* dem entsprechenden Build-Befehl (`./build.sh` oder `make`) ein eigener Release-Name festlegen:
|
||||||
|
```
|
||||||
|
export GLUON_RELEASE="v2016.2.3+bremen3+my_cool_extension"
|
||||||
|
```
|
||||||
|
Analog lassen sich alle anderen `GLUON_*`-Variablen überschreiben, außerdem die folgenden `build.sh`-spezifischen Variablen:
|
||||||
|
|
||||||
|
* `GLUON_TARGETS`: Welche Architekturen werden von `build.sh` gebaut
|
||||||
|
* `KEYFILE`: Der Ort des Schlüssels, mit dem das testing/nightly-Manifest automatisch unterschrieben werden soll
|
||||||
|
|
170
build.sh
170
build.sh
|
@ -1,153 +1,45 @@
|
||||||
#! /usr/bin/env sh
|
#! /usr/bin/env sh
|
||||||
|
|
||||||
FIRMWARE_URL="http://downloads.bremen.freifunk.net/firmware/"
|
# environmental and build settings
|
||||||
LOCAL_SUFFIX="bremen"
|
KEYFILE="${KEYFILE:-"$HOME/.ecdsakey"}"
|
||||||
GLUON_DIR="gluon/"
|
GLUON_TARGETS="${GLUON_TARGETS:-"ar71xx-generic ar71xx-nand mpc85xx-generic x86-generic"}"
|
||||||
KEYFILE="$HOME/.ecdsakey"
|
GLUON_PRIORITY="${GLUON_PRIORITY:-7}"
|
||||||
|
|
||||||
|
# start of script
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
|
# determine absolute path of site repository
|
||||||
if which realpath > /dev/null; then
|
if which realpath > /dev/null; then
|
||||||
GLUON_SITEDIR="$(dirname "$(realpath "$0")")"
|
export GLUON_SITEDIR="$(dirname "$(realpath "$0")")"
|
||||||
else
|
else
|
||||||
GLUON_SITEDIR="$(dirname "$(readlink -f "$0")")"
|
export GLUON_SITEDIR="$(dirname "$(readlink -f "$0")")"
|
||||||
fi
|
fi
|
||||||
export GLUON_SITEDIR
|
GLUON_DIR="${GLUON_SITEDIR}/gluon/"
|
||||||
|
|
||||||
get_GLUON_TAG() {
|
# start building
|
||||||
if ! git --git-dir="${GLUON_DIR}/.git" describe --exact-match; then
|
cd "${GLUON_DIR}"
|
||||||
echo 'The gluon tree is not checked out at a tag.'
|
make update V=s
|
||||||
echo 'Please use `git checkout <tagname>` to use an official gluon release'
|
|
||||||
echo 'or build it manually. Only with at a tag we can autogenerate the'
|
|
||||||
echo 'release string!'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_last_release() {
|
for target in $GLUON_TARGETS; do
|
||||||
branch="$1"
|
echo "Building target ${target}"
|
||||||
wget -q -O- "${FIRMWARE_URL}/${branch}/sysupgrade/${branch}.manifest" | \
|
make clean GLUON_TARGET="$target" V=s
|
||||||
awk 'parse == 1 { print $2; exit } /^$/ { parse=1 }'
|
schedtool -B -e \
|
||||||
}
|
make --jobs=$(grep -c '^processor' /proc/cpuinfo) --output-sync=recurse \
|
||||||
|
GLUON_TARGET="$target" V=s
|
||||||
is_based_on() {
|
|
||||||
[ "${1#$2}" != "${1}" ]
|
|
||||||
return $?
|
|
||||||
}
|
|
||||||
|
|
||||||
extract_local_version() {
|
|
||||||
local_version_tmp="${1#*+${LOCAL_SUFFIX}}"
|
|
||||||
echo "${local_version_tmp%~testing}"
|
|
||||||
}
|
|
||||||
|
|
||||||
debug=
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
if [ "$1" = '-h' -o "$1" = '--help' ]; then
|
|
||||||
cat <<USAGE
|
|
||||||
Usage: $(basename $0) [--debug]
|
|
||||||
|
|
||||||
This script tries to autodetermine the correct release name, builds gluon for
|
|
||||||
all supported platforms (excluding x86*), and optionally signs it if an
|
|
||||||
ecdsutils keyfile is found (standard path: ~/.ecdsakey)
|
|
||||||
USAGE
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "--debug" ]; then
|
|
||||||
debug=1
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
GLUON_BRANCH="stable"
|
|
||||||
GLUON_TAG="$(get_GLUON_TAG)"
|
|
||||||
# remove prefixed "v"
|
|
||||||
GLUON_TAG="${GLUON_TAG#v}"
|
|
||||||
|
|
||||||
statefile="${GLUON_SITEDIR}/.build.${GLUON_BRANCH}.${GLUON_TAG}"
|
|
||||||
cont=false
|
|
||||||
|
|
||||||
if [ -f "$statefile" ]; then
|
|
||||||
echo "A previous build for this version was aborted."
|
|
||||||
echo "These were the parameters:"
|
|
||||||
cat "$statefile"
|
|
||||||
echo "You can now either continue the previous build or begin a new one"
|
|
||||||
echo "and overwrite the old state file."
|
|
||||||
read -p "Do you want to continue the previous build? [Yn] " answer
|
|
||||||
case "${answer:-y}" in
|
|
||||||
[yY]*)
|
|
||||||
. "$statefile"
|
|
||||||
cont=true
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
rm "$statefile"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if ! $cont; then
|
|
||||||
echo "Building Gluon ${GLUON_TAG} as ${GLUON_BRANCH}"
|
|
||||||
last_release_testing="$(get_last_release testing)"
|
|
||||||
last_release_stable="$(get_last_release stable)"
|
|
||||||
last_release="$(echo "${last_release_testing}\n${last_release_stable}" | sort -V | tail -n1)"
|
|
||||||
echo "Last release was ${last_release}"
|
|
||||||
if is_based_on "$last_release" "$GLUON_TAG"; then
|
|
||||||
local_version="$(extract_local_version "$last_release")"
|
|
||||||
local_version="$(($local_version + 1))"
|
|
||||||
else
|
|
||||||
# new gluon version => reset local version number
|
|
||||||
local_version=1
|
|
||||||
fi
|
|
||||||
auto_determined_release="${GLUON_TAG}+${LOCAL_SUFFIX}${local_version}"
|
|
||||||
read -p "Release name for this build [default: ${auto_determined_release}]: " GLUON_RELEASE
|
|
||||||
GLUON_RELEASE="${GLUON_RELEASE:-$auto_determined_release}"
|
|
||||||
|
|
||||||
cat > "$statefile" <<EOF
|
|
||||||
GLUON_TAG="${GLUON_TAG}"
|
|
||||||
GLUON_BRANCH="${GLUON_BRANCH}"
|
|
||||||
GLUON_RELEASE="${GLUON_RELEASE}"
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$GLUON_BRANCH" = "stable" ]; then
|
|
||||||
export GLUON_PRIORITY=7
|
|
||||||
fi
|
|
||||||
|
|
||||||
# calculate number of threads
|
|
||||||
if [ -z "$debug" ]; then
|
|
||||||
proc_num="$(($(grep -c '^processor\s' /proc/cpuinfo) + 1))"
|
|
||||||
else
|
|
||||||
proc_num=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$GLUON_DIR"
|
|
||||||
export GLUON_BRANCH GLUON_RELEASE
|
|
||||||
if ! $cont; then
|
|
||||||
make update ${debug:+V=s}
|
|
||||||
fi
|
|
||||||
|
|
||||||
for target in ar71xx-generic ar71xx-nand mpc85xx-generic x86-generic; do
|
|
||||||
env_target="$(echo "$target" | tr '-' '_')"
|
|
||||||
set +u
|
|
||||||
if eval "[ \"\$TARGET_${env_target}_DONE\" = 1 ]"; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
set -u
|
|
||||||
echo "Building target ${target}"
|
|
||||||
if $cont; then
|
|
||||||
cont=false
|
|
||||||
else
|
|
||||||
make clean GLUON_TARGET="$target" ${debug:+V=s}
|
|
||||||
fi
|
|
||||||
make -j${proc_num} GLUON_TARGET="$target" ${debug:+V=s}
|
|
||||||
echo "TARGET_${env_target}_DONE=1" >> "$statefile"
|
|
||||||
done
|
done
|
||||||
make manifest
|
|
||||||
make manifest GLUON_BRANCH=testing GLUON_PRIORITY=0
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
if [ -n "$KEYFILE" -a -r "$KEYFILE" ]; then
|
# generate manifests
|
||||||
sed -i -e "/^BRANCH=testing/ a BRANCH=nightly" "${GLUON_DIR}/output/images/sysupgrade/testing.manifest"
|
make manifest
|
||||||
"${GLUON_DIR}/contrib/sign.sh" "$KEYFILE" "${GLUON_DIR}/output/images/sysupgrade/testing.manifest"
|
|
||||||
|
if [ -z "${GLUON_BRANCH:-}" ]; then
|
||||||
|
make manifest GLUON_BRANCH=testing GLUON_PRIORITY=0
|
||||||
|
# add BRANCH=nightly line below BRANCH=testing line
|
||||||
|
sed -i -e "/^BRANCH=testing/ a BRANCH=nightly" \
|
||||||
|
"${GLUON_DIR}/output/images/sysupgrade/testing.manifest"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm "$statefile"
|
# sign testing/nightly manifest if key is present
|
||||||
|
if [ -n "$KEYFILE" -a -r "$KEYFILE" ]; then
|
||||||
|
"${GLUON_DIR}/contrib/sign.sh" "$KEYFILE" \
|
||||||
|
"${GLUON_DIR}/output/images/sysupgrade/testing.manifest"
|
||||||
|
fi
|
||||||
|
|
1
site.mk
1
site.mk
|
@ -33,6 +33,7 @@ GLUON_SITE_PACKAGES := \
|
||||||
|
|
||||||
# Allow overriding the these variables from the command line
|
# Allow overriding the these variables from the command line
|
||||||
GLUON_RELEASE ?= $(patsubst v%,%,$(shell git -C $(GLUON_SITEDIR) describe --tags --dirty=+))
|
GLUON_RELEASE ?= $(patsubst v%,%,$(shell git -C $(GLUON_SITEDIR) describe --tags --dirty=+))
|
||||||
|
GLUON_BRANCH ?= stable
|
||||||
GLUON_PRIORITY ?= 0
|
GLUON_PRIORITY ?= 0
|
||||||
GLUON_LANGS ?= en de
|
GLUON_LANGS ?= en de
|
||||||
GLUON_REGION ?= eu
|
GLUON_REGION ?= eu
|
||||||
|
|
Loading…
Reference in New Issue