diff options
Diffstat (limited to 'maintainer/gen-versions.sh')
-rwxr-xr-x | maintainer/gen-versions.sh | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/maintainer/gen-versions.sh b/maintainer/gen-versions.sh new file mode 100755 index 0000000..1d5cb76 --- /dev/null +++ b/maintainer/gen-versions.sh @@ -0,0 +1,253 @@ +#!/bin/bash + +# Where the version configs are generated +config_dir=config/versions +defaults=packages/default.desc + +declare -A forks + +debug() +{ + if [ -n "${DEBUG}" ]; then + echo ":: $@" >&2 + fi +} + +read_files() +{ + local f l + + for f in ${defaults} "$@"; do + [ -r "${f}" ] || continue + while read l; do + case "${l}" in + "#*") continue;; + *) echo "[${l%%=*}]=${l#*=}";; + esac + done < "${f}" + done +} + +derived_package() +{ + info[name]=${p} + info[forks]=${forks[${p}]} + info[master]=${info[master]:-${p}} + # Various kconfig-ized prefixes + tmp=${p^^} + info[pfx]=${tmp//[^0-9A-Z_]/_} + tmp=${info[origin]^^} + info[originpfx]=${tmp//[^0-9A-Z_/_} + tmp=${info[master]^^} + info[masterpfx]=${tmp//[^0-9A-Z_/_} +} + +read_package_desc() +{ + read_files "packages/${1}/package.desc" +} + +read_version_desc() +{ + read_files "packages/${1}/package.desc" "packages/${1}/${2}/version.desc" +} + +for_each_package() +{ + local list="${1}" + local -A info + local p tmp + + debug "Entering: for_each_package $@" + + shift + for p in ${list}; do + eval "info=( `read_package_desc ${p}` )" + derived_package ${p} + debug "Evaluate for ${p}: $@" + eval "$@" + done +} + +for_each_version() +{ + local pkg="${1}" + local -A info prev + local -a versions + local v tmp + + debug "Entering: for_each_version $@" + + shift + versions=( `cd packages/${pkg} && ls */version.desc 2>/dev/null | sed 's,/version.desc$,,' | sort -rV` ) + tmp= + for v in "${versions[@]}"; do + if [ -n "${tmp}" ]; then + prev["${tmp}"]=${v} + fi + tmp="${v}" + done + + if [ -n "${tmp}" ]; then + prev["${tmp}"]= + fi + + for v in "${versions[@]}"; do + eval "info=( `read_version_desc "${pkg}" "${v}"` )" + debug "INFO [[ `read_version_desc "${pkg}" "${v}"` ]]" + derived_package ${pkg} + info[ver]="${v}" + info[kcfg]="${v//[^0-9A-Za-z_]/_}" + info[prev]="${prev[${v}]//[^0-9A-Za-z_]/_}" + debug "Evaluate for ${pkg}/${v}: $@" + eval "$@" + done +} + +# Setup: find master-fork relationships between packages +find_forks() +{ + [ "${info[master]}" != "${info[name]}" ] && forks[${info[master]}]+=" ${info[name]}" +} + +gen_versions() +{ + local cond=$1 + + debug "Entering: gen_versions $@" + + if [ -n "${cond}" ]; then + cat <<EOF +if ${cond} + +EOF + fi + + cat <<EOF +# Versions for ${info[name]} +choice + bool + prompt "Version of ${info[name]}" + +# Defined versions first +EOF + + for_each_version "${info[name]}" echo \"' +config ${info[pfx]}_V_${info[kcfg]} + bool \"${info[ver]}\" + select ${info[pfx]}_V_${info[kcfg]}_or_later${info[obsolete]:+ + depends on OBSOLETE}${info[experimental]:+ + depends on EXPERIMENTAL}'\" + + # TBD devel (from official repository) + # TBD show changeset/revision/branch selection + # TBD custom (local tarball/directory) + # TBD show custom location selection + + cat <<EOF + +endchoice + +# Text string with the version of ${info[name]} +config ${info[pfx]}_VERSION + string +EOF + for_each_version "${info[name]}" echo \ + \"' default \"${info[ver]}\" if ${info[pfx]}_V_${info[kcfg]}'\" + cat <<EOF + default "unknown" + +EOF + + cat <<EOF + +# Flags for all versions indicating "this or later". +# Only produced for master version of the package (which is what +# the build scriptes are tied to); derived versions must +# select the matching master version. +EOF + for_each_version "${info[name]}" echo \"' +config ${info[pfx]}_V_${info[kcfg]}_or_later + bool${info[prev]:+ + select ${info[pfx]}_V_${info[prev]}_or_later}'\" + + if [ -n "${cond}" ]; then + cat <<EOF + +endif + +EOF + fi +} + +# Generate a menu for selecting a fork for a component +gen_selection() +{ + local only_obsolete=yes only_experimental=yes + + for_each_version "${info[name]}" ' +[ -z "${info[experimental]}" ] && only_experimental= +[ -z "${info[obsolete]}" ] && only_obsolete= +' + + debug "${info[name]}: ${only_obsolete:+obsolete} ${only_experimental:+experimental}" + + echo " +config ${info[masterpfx]}_USE_${info[originpfx]} + bool \"${info[origin]}\"${only_obsolete:+ + depends on OBSOLETE}${only_experimental:+ + depends on EXPERIMENTAL} + help" && sed 's/^/\t /' "packages/${info[origin]}.help" +} + +# Generate a single configuration file +gen_one_component() +{ + local cond + + debug "Entering: gen_one_component $@" + + # Non-masters forks: skip, will be generated along with their master version + if [ "${info[master]}" != "${info[name]}" ]; then + debug "Skip '${info[name]}': master '${info[master]}'" + return + fi + + debug "Generating '${info[name]}.in'${info[forks]:+ (includes ${info[forks]}})" + exec >"${config_dir}/${info[name]}.in" + cat <<EOF +# +# DO NOT EDIT! This file is automatically generated. +# + +EOF + + # Generate fork selection, if there is more than one fork + if [ -n "${info[forks]}" ]; then + cat <<EOF +choice + bool "Show ${info[name]} versions from" +EOF + for_each_package "${info[name]} ${info[forks]}" gen_selection + + cat <<EOF + +endchoice + +EOF + for_each_package "${info[name]} ${info[forks]}" \ + gen_versions '${info[masterpfx]}_USE_${info[originpfx]}' + else + for_each_package "${info[name]}" gen_versions + fi +} + +rm -rf "${config_dir}" +mkdir -p "${config_dir}" + +all_packages=`cd packages && ls */package.desc 2>/dev/null | sed 's,/package.desc$,,' | xargs echo` +debug "Generating package version descriptions" +debug "Packages: ${all_packages}" +for_each_package "${all_packages}" find_forks +for_each_package "${all_packages}" gen_one_component +debug "Done!" |