Initial Makefile, config, upload script and documentation

Create a Makefile that does the lifting of setting up the config
as it is done on the system. Handles the creation of the .ssh/config
for upload.

In the past upstream poned on such master Makefiles but as we
customize our build environment quite a bit it probably makes
sense and reduces the clone+set-up to two calls.
Holger Hans Peter Freyther 6 years ago
commit e3f46e8a74

.gitignore vendored

@ -0,0 +1,4 @@

@ -0,0 +1,155 @@
# makefile to set-up the environment for building...
# This is probably only working with GNU make. The file is structured
# to have variables in the beginning, some helper functions, then so
# implicit rules and in the end targets that invoke them all.
# If you need to change sysmocom release or poky base branch then the
# two variables need to be changed.
# If you add a machine then MACHINES need to be adjusted and a new config
# in cfg/NAME/10_NAME needs to be created.
# Implicit rules: I used WILDCARD-action for the rules and then get the
# name of the rule from $@ in the rule itself or % when still being in
# the dependency list.
# Make everything more verbose by V=1. Taken from kbuild
ifeq ("$(origin V)", "command line")
Q =
Q = @
# Variables
REPOS=poky meta-telephony meta-sysmocom-bsp meta-qt5 meta-sysmocom-bsp meta-smalltalk
MACHINES=sysmobts sysmocom-apu2 sysmocom-alix
# The default targets to pick depending on machine
BUILD_TARGET_sysmobts = "meta-toolchain-osmo task-sysmocom-feed sysmocom-nitb-image sysmocom-nitb-rauc-image image-rauc-rescue-initramfs image-rauc-slot-initramfs image-rauc-ubi"
BUILD_TARGET_sysmocom-apu2 = "core-image-minimal-initramfs meta-toolchain-osmo task-sysmocom-feed sysmocom-nitb-image core-image-minimal-initramfs"
BUILD_TARGET_sysmocom-alix = "core-image-minimal-initramfs meta-toolchain-osmo task-sysmocom-feed sysmocom-nitb-image core-image-minimal-initramfs"
# Pick the one depending on $@. Not sure if .SECONDEXPANSION is more
# approiate here or not.
@echo "Pick a target like help, update or sysmocom-alix-setup"
@echo "Set-up build environment and execute builds. This is intended"
@echo "for customers and employees."
@echo ""
@echo "Available targets:"
@echo " usage - Default target and print usage"
@echo " help - This output"
@echo " update - git pull --rebase and initial git clone"
@echo " setup-all - Set-up all build directories"
@echo " build-all - Build all targets"
@echo " clean-all - Clean all targets after build"
@echo " upload-all - Upload all targets"
@echo ' install-ssh-config - Install Host to $$HOME/.ssh/config'
@echo "Board specific targets:"
@$(foreach machine, $(MACHINES), \
printf " %-16s - Configure build directory\\n" $(machine)-setup;)
@$(foreach machine, $(MACHINES), \
printf " %-16s - Configure build directory\\n" $(machine)-build;)
@$(foreach machine, $(MACHINES), \
printf " %-16s - Configure build directory\\n" $(machine)-upload;)
@echo "Available variables:"
@echo " V=1 - Enable verbose command output"
@echo " SYSMOCOM_RELEASE=name - Pick branch during clone"
@echo " POKY_RELEASE=name - Pick branch during clone"
# Fetch/update all repos... Expand REPOS and append -update to the rule
# e.g. poky-update meta-telephony-update
update: $(foreach repo, $(REPOS), $(repo)-update)
# helper rules
# crazy as I don't know a split()[0]
CUR_MACHINE=$(subst build.,,$(subst -upload,,$(subst -clean,,$(subst -build,,$@))))
## Create a new directory
$(V)mkdir $@
## Clone repositories. The other option is by variable something like BRNACH_poky, REPO_poky
git/poky: | git
$(V)cd git && git clone --branch=$(POKY_RELEASE) --depth=1 git://
git/meta-sysmocom-bsp: | git
cd git && git clone --branch=$(SYSMOCOM_RELEASE) git://
git/meta-telephony: | git
cd git && git clone --branch=$(SYSMOCOM_RELEASE) git://
git/meta-smalltalk: | git
cd git && git clone --branch=$(SYSMOCOM_RELEASE) git://
git/meta-qt5: | git
cd git && git clone --branch=$(SYSMOCOM_RELEASE) git://
## Create a build directory, e.g. build.sysmobts
## Use Poky to set-up the directory and then customize it. Copy files
## around and append to the local.conf and layers.conf
CFG_FILES = $(sort $(wildcard cfg/common/*)) $(sort $(wildcard cfg/$(CUR_MACHINE)/*))
build.%: | git/poky
@echo "Creating build directory for $(CUR_MACHINE)"
$(Q)/bin/bash -c "source git/poky/oe-init-build-env $@"
# Append entries to conf/local.conf. Common first, machine second... filter
$(Q)$(foreach file,$(CFG_FILES), \
cat $(file) | sed s,BASE_DIR,$(PWD), >> $@/conf/local.conf;)
@echo "require conf/distro/include/sysmocom-defaults.conf" >> $@/conf/local.conf
$(Q)cat cfg/bblayers.conf | sed s,BASE_DIR,$(PWD), > $@/conf/bblayers.conf
# generic git pull --rebase rule. Let's assume this is matching poky-update
# then the dependency will be "git/poky" and a clone rule will be built.
%-update: | git/$(subst -update,,%)
@echo "Updating $(subst -update,,$@) ..."
$(Q)cd git/$(subst -update,,$@) && git pull --rebase
# Setup a build directory
%-setup: | build.$(subst -setup,,%) git/poky
@echo "Please place proprietary firmware into the downloads directory."
# Start a build..
%-build: | build.$(subst -build,,%) git/poky
$(Q)/bin/bash -c "source git/poky/oe-init-build-env build.$(CUR_MACHINE) && bitbake $(BUILD_TARGETS)"
%-upload: | build.$(subst -upload,,%) git/poky
$(Q)cd build.$(CUR_MACHINE) && ../scripts/ $(CUR_MACHINE) $(FEED_NAME)
# Create all build directories, build everything, upload everything, clean everything
setup-all: | $(foreach machine, $(MACHINES), $(machine)-setup)
build-all: | $(foreach machine, $(MACHINES), $(machine)-build)
upload-all: | $(foreach machine, $(MACHINES), $(machine)-upload)
clean-all: | $(foreach machine, $(MACHINES), $(machine)-clean)
install-ssh-config: | $(HOME)/.ssh
ifndef SSH_HOST
$(error "Please call with make $@ SSH_HOST=xyz...")
ifndef SSH_PORT
$(error "Please call with make $@ SSH_PORT=abc...")
ifndef SSH_USER
$(error "Please call with make $@ SSH_USER=def...")
@echo "Host = sysmocom-downloads" >> $(HOME)/.ssh/config
@echo " HostName = $(SSH_HOST)" >> $(HOME)/.ssh/config
@echo " Port = $(SSH_PORT)" >> $(HOME)/.ssh/config
@echo " AddressFamily = inet" >> $(HOME)/.ssh/config
@echo " User = $(SSH_USER)" >> $(HOME)/.ssh/config
# Target classification
.PHONY: update setup-all install-ssh-config
.SECONDARY: $(foreach repo, $(REPOS), git/$(repo)) $(foreach machine, $(MACHINES), build.$(machine))

@ -0,0 +1,45 @@
Scripts and documentation for building system images for our target platforms. The
goal is to help anyone checking out the right repositories, configuring a target
and build the images that are built by CI (in fact CI will use these scripts).
The central piece is a Makefile that helps to:
* Git clone the necessary layers
* Update/git pull --rebase all of them
* Set-up the build as used by sysmocom
* Configure .ssh/config for uploading to sysmocom
* Do the upload
* Clean after a build
The bblayers.conf is created from a template located in cfg/ and the local.conf
will be created by using Poky's oe-init-build-env and then files from cfg/common/*
and cfg/BOARD/*. Files will be sorted in their alphabetically sort order and first
come from the common directory and then the board specific one. At the end an include
directive will be issued.
Using the Makefile:
$ make help
Example of building everything
# make install-ssh-config SSH_PORT=2342
$ make setup-all V=1
... git clone
... git pull --rebase
... creating build directories
For the sysmobts firmware needs to be copied to the downloads directory.
As a customer you should have received instructions for doing it and as
an employee it should be mentioned in the wiki
$ make build-all # Build for all boards the default targets
$ make upload-all # Make an upload to testing for all boards
$ make clean-all # Clean the tmp directory for all boards

@ -0,0 +1,16 @@
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
BASE_DIR/git/poky/meta \
BASE_DIR/git/poky/meta-poky \
BASE_DIR/git/poky/meta-yocto-bsp \
BASE_DIR/git/meta-telephony \
BASE_DIR/git/meta-sysmocom-bsp \
BASE_DIR/git/meta-smalltalk \
BASE_DIR/git/meta-qt5 \

@ -0,0 +1,2 @@
# Do not put the sourcecode into the debug packages
PACKAGE_DEBUG_SPLIT_STYLE = "debug-without-src"

@ -0,0 +1,2 @@
INHERIT += "sysmocom-archive-patched-source"

@ -0,0 +1,5 @@
# Enable the prserver host
PRSERV_HOST = "localhost:0"
# legacy and remove it in the future

@ -0,0 +1 @@
PACKAGE_CLASSES = "package_ipk"

@ -0,0 +1,2 @@
# SDK parts

@ -0,0 +1 @@
DL_DIR = "BASE_DIR/downloads"

@ -0,0 +1,3 @@
# Default to systemd
DISTRO_FEATURES_append = " systemd "
VIRTUAL-RUNTIME_init_manager = "systemd"

@ -0,0 +1,11 @@
MACHINE = "sysmobts-v2"
# feed
# HW doesn't have rtc
# Ignore old kernels
BBMASK="recipes-bsp/linux/ recipes-bsp/linux/"
PREFERRED_VERSION_linux-sysmocom = "4.9.14+git%"

@ -0,0 +1,6 @@
MACHINE = "sysmocom-alix"
BBMASK="recipes-bsp/linux/ recipes-bsp/linux/"

@ -0,0 +1,4 @@
MACHINE = "sysmocom-apu2"
BBMASK="recipes-bsp/linux/ recipes-bsp/linux/"

@ -0,0 +1,22 @@
# Upload build results, config and cache to the downloads server. Use
# make install-ssh-config SSH_PORT=XYZ SSH_HOST=abc SSH_USER=foo to
# install the right entry for the .ssh/config.
if [ $# -ne 2 ]; then
echo "Need to pass MACHINE RELEASE as argument for upload"
exit 1
set -ex
rsync --delete -avz tmp/deploy/ipk/ sysmocom-downloads:$1/$2/ipk
rsync --delete -avz tmp/deploy/images/ sysmocom-downloads:$1/$2/images
rsync --delete -avz tmp/deploy/tools/ sysmocom-downloads:$1/$2/tools
rsync --delete -avz tmp/deploy/sdk/ sysmocom-downloads:$1/$2/sdk
rsync --delete -avz tmp/cache/ sysmocom-downloads:$1/$2/cache-state
rsync --delete -avz cache/ sysmocom-downloads:$1/$2/cache
rsync --delete -avz conf/ sysmocom-downloads:$1/$2/conf
rsync -avz tmp/deploy/sources/ sysmocom-downloads:$1/$2/sources