summaryrefslogtreecommitdiff
path: root/maintainer
diff options
context:
space:
mode:
authorAlexey Neyman <stilor@att.net>2017-05-07 22:12:08 (GMT)
committerAlexey Neyman <stilor@att.net>2017-07-08 17:56:29 (GMT)
commit0a654319f9a1d0ebaacb5572139f72c7f236b100 (patch)
tree476bcec92e75d294e4189d45725569c91dbc766d /maintainer
parent8f8e131d566af1f577d8fb6e62e6f121b7955472 (diff)
First stab at gen-versions.sh
Signed-off-by: Alexey Neyman <stilor@att.net>
Diffstat (limited to 'maintainer')
-rwxr-xr-xmaintainer/gen-versions.sh253
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!"