# The MIT License (MIT)
#
# Copyright (c) 2016 Stéphane Desneux <sdx@iot.bzh>
+# (c) 2016 Jan-Simon Möller <jsmoeller@linuxfoundation.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# turn execute (source) generated instructions back in the parent shell,
# whether it's bash, zsh, or any other supported shell
-VERSION=1.0.0
-AGL_REPOSITORIES="meta-agl meta-agl-extra meta-agl-contrib"
+VERSION=1.1.0
DEFAULT_MACHINE=qemux86-64
DEFAULT_BUILDDIR=./build
VERBOSE=0
info "------------ $SCRIPT: Starting"
+#compute AGL_REPOSITORIES
+AGL_REPOSITORIES=$(for x in $(ls -d $METADIR/*/templates/{machine,feature}); do echo $(basename $(dirname $(dirname $x))); done | sort -u)
+
function list_machines() {
for x in $@; do
for y in $(ls -d $METADIR/$x/templates/machine/* 2>/dev/null); do
- echo -n "$(basename $y) "
+ echo $(basename $y)
done
done
}
function list_all_machines() {
for x in $AGL_REPOSITORIES; do
- [[ ! -d $METADIR/$x ]] && continue
list_machines $x
done
}
+function validate_builddir() {
+ if [[ "$BUILDDIR" =~ [[:space:]] ]]; then
+ error "Build dir '$BUILDDIR' shouldn't contain any space"
+ fi
+ debug "Build dir is valid"
+}
+
+function validate_machines() {
+ list_all_machines | sort | uniq -c | while read cnt machine; do
+ [[ $cnt == 1 ]] && continue
+ info "Machine $machine found in the following repositories:"
+ for x in $(ls -d $METADIR/*/templates/machine/$machine); do
+ info " - $x"
+ done
+ error "Multiple machine templates are not allowed"
+ done
+ debug "Machines list has no duplicate."
+}
+
function list_features() {
for x in $@; do
for y in $(ls -d $METADIR/$x/templates/feature/* 2>/dev/null); do
- echo -n "$(basename $y) "
+ echo $(basename $y)
done
done
}
function list_all_features() {
for x in $AGL_REPOSITORIES; do
- [[ ! -d $METADIR/$x ]] && continue
list_features $x
done
}
+function validate_features() {
+ list_all_features | sort | uniq -c | while read cnt feature; do
+ [[ $cnt == 1 ]] && continue;
+ info "Feature $feature found in the following repositories:"
+ for x in $(ls -d $METADIR/*/templates/feature/$feature); do
+ info " - $x"
+ done
+ error "Multiple feature templates are not allowed"
+ done
+ debug "Features list has no duplicate."
+}
+
function find_machine_dir() {
machine=$1
for x in $AGL_REPOSITORIES; do
- [[ ! -d $METADIR/$x ]] && continue
dir=$METADIR/$x/templates/machine/$machine
[[ -d $dir ]] && { echo $dir; return 0; }
done
function find_feature_dir() {
feature=$1
for x in $AGL_REPOSITORIES; do
- [[ ! -d $METADIR/$x ]] && continue
dir=$METADIR/$x/templates/feature/$feature
[[ -d $dir ]] && { echo $dir; return 0; }
done
get some help
EOF
+ local buf
echo "Available machines:" >&2
for x in $AGL_REPOSITORIES; do
- [[ ! -d $METADIR/$x ]] && continue
+ buf=$(list_machines $x)
+ [[ -z "$buf" ]] && continue
echo " [$x]"
- for y in $(list_machines $x); do
+ for y in $buf; do
[[ $y == $DEFAULT_MACHINE ]] && def="* " || def=" "
echo " $def$y"
done
echo "Available features:" >&2
for x in $AGL_REPOSITORIES; do
- [[ ! -d $METADIR/$x ]] && continue
+ buf=$(list_features $x)
+ [[ -z "$buf" ]] && continue
echo " [$x]"
- for y in $(list_features $x); do
- echo " $y"
+ for feature in $buf; do
+ print_feature="$feature"
+ featuredir=$(find_feature_dir $feature)
+ if [ -e $featuredir/included.dep ];then
+ print_feature="$print_feature :($(find_feature_dependency $feature $feature))"
+ fi;
+ echo " $print_feature"
done
done
echo >&2
return $rc
}
+
# process all fragments
FRAGMENTS_BBLAYERS=""
FRAGMENTS_LOCALCONF=""
done
}
+function containsFeature () {
+ for feature in $1; do
+ [[ "$feature" == "$2" ]] && return 1;
+ done;
+ return 0;
+}
+
+function find_feature_dependency() {
+ res_dep_features=""
+ featuredir=$(find_feature_dir $1)
+ full_feature=$2;
+ if [ -e $featuredir/included.dep ]; then
+ dep_features="$(cat $featuredir/included.dep)"
+ for dep_feature in $dep_features; do
+ full_feature="$full_feature $res_dep_features"
+ res_dep_features="$res_dep_features $dep_feature"
+ if containsFeature $dep_feature $full_feature ; then
+ res_dep_features="$res_dep_features $(find_feature_dependency $dep_feature $full_feature)"
+ fi;
+ done;
+ fi;
+ echo "$res_dep_features";
+ return 0;
+}
+
GLOBAL_ARGS=( "$@" )
debug "Parsing arguments: $@"
TEMP=$(getopt -o m:b:s:fvdh --long machine:,builddir:,script:,force,verbose,debug,help -n $SCRIPT -- "$@")
# the remaining args are the features
FEATURES="$@"
+# validate the machine list
+debug "validating machines list"
+validate_machines
+
# validate the machine
debug "validating machine $MACHINE"
find_machine_dir $MACHINE >/dev/null || error "Machine '$MACHINE' not found in [ $(list_all_machines)]"
+# validate the features list
+debug "validating features list"
+validate_features
+
+TMP_FEATURES="";
+for FEATURE in $FEATURES;do
+ TMP_FEATURES="$TMP_FEATURES $FEATURE"
+ TMP_FEATURES="$TMP_FEATURES $(find_feature_dependency $FEATURE $TMP_FEATURES)"
+done
+# remove duplicate features if any
+FEATURES=$(for x in $TMP_FEATURES; do echo $x; done | sort -u | awk '{printf("%s ",$1);}')
+
# validate the features
for f in $FEATURES; do
debug "validating feature $f"
# validate build dir
debug "validating builddir $BUILDDIR"
-BUILDDIR=$(mkdir -p $BUILDDIR && cd $BUILDDIR && pwd -P)
+BUILDDIR=$(mkdir -p "$BUILDDIR" && cd "$BUILDDIR" && pwd -P)
+validate_builddir
###########################################################################################
function dump_log() {
append_fragment $BUILDDIR/conf/setup.sh "" "echo '--- end of setup script'"
infon " Executing setup script ... "
- execute_setup $BUILDDIR/conf/setup.sh >$BUILDDIR/conf/setup.log 2>&1 \
- && {
- info "OK"
- [[ $VERBOSE == 1 ]] && dump_log $BUILDDIR/conf/setup.log
- rm $BUILDDIR/conf/setup.sh
- } \
- || {
- info "FAIL: please check $BUILDDIR/conf/setup.log"
- dump_log $BUILDDIR/conf/setup.log
- return 1
- }
+ execute_setup $BUILDDIR/conf/setup.sh 2>&1 | tee $BUILDDIR/conf/setup.log
+ [[ ${PIPESTATUS[0]} == 0 ]] && {
+ info "OK"
+ [[ $VERBOSE == 1 ]] && dump_log $BUILDDIR/conf/setup.log
+ rm $BUILDDIR/conf/setup.sh
+ } \
+ || {
+ info "FAIL: please check $BUILDDIR/conf/setup.log"
+ dump_log $BUILDDIR/conf/setup.log
+ return 1
+ }
# NOTE: the setup.sh script is removed if execution succeeded (only the log remains)
}