--- /dev/null
+include Makefile.dirs
+
+all $(MAKECMDGOALS): Makefile.dirs $(BUILD_DIRS)
+
+Makefile.dirs:
+ ./create-build-tree.sh
+
+define subdir
+.PHONY: $1
+$1:
+ $$(MAKE) -C $1 $(MAKECMDGOALS)
+endef
+
+$(foreach d,$(BUILD_DIRS),$(eval $(call subdir,$d)))
--- /dev/null
+#!/bin/bash
+
+set -e
+
+cat <<EOF > Makefile.dirs
+# Automatically generated - do not edit
+BUILD_DIRS = \\
+EOF
+
+find ../board -name 'config.*' | while read config; do
+ ext=${config##*.}
+ dir=${config%/*}
+ dir=${dir%/config}
+ board=${dir#../board/}
+ name=${board#*/}
+
+ if [ x$name = x$ext -o x$ext = xtarget ]; then
+ build=board/$board
+ else
+ build=board/$board-$ext
+ fi
+ mkdir -p ${build}
+
+ back=$(echo $build|sed -e 's|[^/]\+|..|g')
+
+ (
+ cd $build
+ ln -s $back/../{app,arch,board,doc,libs4c,Makefile,Makefile.omk,Makefile.rules} .
+ ln -s $back/$config config.target
+ )
+
+ echo " $build \\" >> Makefile.dirs
+done