From 492362be0308f962f2b005f38cf6205488e70463 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Fri, 20 Jul 2018 11:43:42 +0200 Subject: ptxdist: find config files in multiple layers This is the first step to support layers in PTXdist. A layer is just a subdirectory (or symlink) named 'base' in the BSP workspace. Each layer looks just like another BSP. The first layer is implicitly or explicitly PTXdist itself. Automatic config file detection works as before in the last layer. If no config file is found, then the previous tlayer is checked the same way, and so on. Signed-off-by: Michael Olbrich --- bin/ptxdist | 113 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 25 deletions(-) (limited to 'bin/ptxdist') diff --git a/bin/ptxdist b/bin/ptxdist index af98896d6..4153a8964 100755 --- a/bin/ptxdist +++ b/bin/ptxdist @@ -12,9 +12,7 @@ PTXDIST_LOG_PROMPT="ptxdist: " # defaults # PTXDIST_PTXCONFIG_DEFAULT='${PTXDIST_WORKSPACE}/selected_ptxconfig' -PTXDIST_PTXCONFIG_FALLBACK='${PTXDIST_WORKSPACE}/configs/ptxconfig' PTXDIST_PLATFORMCONFIG_DEFAULT='${PTXDIST_WORKSPACE}/selected_platformconfig' -PTXDIST_PLATFORMCONFIG_FALLBACK='${PTXDIST_WORKSPACE}/configs/*/platformconfig' PTXDIST_COLLECTIONCONFIG_DEFAULT='${PTXDIST_WORKSPACE}/selected_collectionconfig' PTXDIST_TOOLCHAIN_DEFAULT='${PTXDIST_WORKSPACE}/selected_toolchain' PTXDIST_PTXRC_DEFAULT=${PTXDIST_PTXRC:-'${HOME}/.ptxdist/ptxdistrc-${PTXDIST_VERSION_PTXRC}'} @@ -1206,10 +1204,10 @@ parse_first() # # sane defaults # - PTXDIST_TOOLCHAIN="${PTXDIST_TOOLCHAIN_DEFAULT}" - PTXDIST_PLATFORMCONFIG="${PTXDIST_PLATFORMCONFIG_DEFAULT}" - PTXDIST_COLLECTIONCONFIG="${PTXDIST_COLLECTIONCONFIG_DEFAULT}" - PTXDIST_PTXCONFIG="${PTXDIST_PTXCONFIG_DEFAULT}" + PTXDIST_TOOLCHAIN= + PTXDIST_PLATFORMCONFIG= + PTXDIST_COLLECTIONCONFIG= + PTXDIST_PTXCONFIG= PTXDIST_VERBOSE=0 # @@ -1331,21 +1329,79 @@ parse_first() ;; esac || return done +} + +setup_layers() +{ + export -a PTXDIST_LAYERS + local layer="${PTXDIST_WORKSPACE}" - if [ "${PTX_ptxconfig_SET}" = "false" -a \ - \! -e "${PTXDIST_PTXCONFIG}" -a -e "${PTXDIST_PTXCONFIG_FALLBACK}" ]; then - PTXDIST_PTXCONFIG="${PTXDIST_PTXCONFIG_FALLBACK}" + while [ -e "${layer}" -o -h "${layer}" ]; do + if [ ! -d "${layer}" ]; then + echo + echo "${PTXDIST_LOG_PROMPT}error: Layer '${layer}' does not exist!" + echo + exit 1 + fi + if [ -z "${PTXDIST_AUTOVERSION}" -a -e "${layer}/bin/ptxdist" -a \ + "${layer}" != "${PTXDIST_TOPDIR}" ]; then + echo + echo "${PTXDIST_LOG_PROMPT}error: PTXdist layer '${layer}' does not match the current PTXDIST_TOPDIR='${PTXDIST_TOPDIR}'" + echo + exit 1 + fi + PTXDIST_LAYERS[${#PTXDIST_LAYERS[@]}]="${layer}" + layer="${layer}/base" + done + if [ "${PTXDIST_LAYERS[(${#PTXDIST_LAYERS[@]}-1)]}" != "${PTXDIST_TOPDIR}" ]; then + PTXDIST_LAYERS[${#PTXDIST_LAYERS[@]}]="${PTXDIST_TOPDIR}" fi - if [ "${PTX_platformconfig_SET}" = "false" -a \ - \! -e "${PTXDIST_PLATFORMCONFIG}" -a -e "${PTXDIST_PLATFORMCONFIG_FALLBACK}" ]; then - PTXDIST_PLATFORMCONFIG="${PTXDIST_PLATFORMCONFIG_FALLBACK}" + if [ "${PTX_ptxconfig_SET}" = "false" ]; then + local -a cfgs=( "selected_ptxconfig" "configs/ptxconfig" ) + for layer in "${PTXDIST_LAYERS[@]}"; do + local -a ptxd_reply + ptxd_get_path "${cfgs[@]/#/${layer}/}" || continue + PTXDIST_PTXCONFIG="${ptxd_reply[0]}" + break + done fi - if [ "${PTX_toolchain_SET}" = "false" -a \! -e "${PTXDIST_TOOLCHAIN_DEFAULT}" ]; then - local -a toolchain - if do_select_toolchain_guess 2>/dev/null; then - PTXDIST_TOOLCHAIN="${toolchain}" + if [ "${PTX_platformconfig_SET}" = "false" ]; then + local -a cfgs=( "selected_platformconfig" "configs/*/platformconfig" ) + for layer in "${PTXDIST_LAYERS[@]}"; do + local tmp=( ${cfgs[@]/#/${layer}/} ) + if [ "${#tmp[@]}" -gt 2 ]; then + tmp=( "${tmp[0]}" ) + fi + local -a ptxd_reply + ptxd_get_path "${tmp[@]}" || continue + PTXDIST_PLATFORMCONFIG="${ptxd_reply[0]}" + break + done + fi + + if [ "${PTX_collectionconfig_SET}" = "false" ]; then + for layer in "${PTXDIST_LAYERS[@]}"; do + local -a ptxd_reply + ptxd_get_path "${layer}/selected_collectionconfig" || continue + PTXDIST_COLLECTIONCONFIG="${ptxd_reply[0]}" + break + done + fi + + if [ "${PTX_toolchain_SET}" = "false" ]; then + for layer in "${PTXDIST_LAYERS[@]}"; do + local -a ptxd_reply + ptxd_get_path "${layer}/selected_toolchain" || continue + PTXDIST_TOOLCHAIN="${ptxd_reply[0]}" + break + done + if [ -z "${PTXDIST_TOOLCHAIN}" ]; then + local -a toolchain + if do_select_toolchain_guess 2>/dev/null; then + PTXDIST_TOOLCHAIN="${toolchain}" + fi fi fi } @@ -2092,17 +2148,9 @@ setup_topdir() { PTXDIST_WORKSPACE="$(pwd)" eval PTXDIST_PTXCONFIG_DEFAULT="${PTXDIST_PTXCONFIG_DEFAULT}" - eval PTXDIST_PTXCONFIG_FALLBACK="${PTXDIST_PTXCONFIG_FALLBACK}" eval PTXDIST_PLATFORMCONFIG_DEFAULT="${PTXDIST_PLATFORMCONFIG_DEFAULT}" - eval PTXDIST_PLATFORMCONFIG_FALLBACK="${PTXDIST_PLATFORMCONFIG_FALLBACK}" eval PTXDIST_COLLECTIONCONFIG_DEFAULT="${PTXDIST_COLLECTIONCONFIG_DEFAULT}" eval PTXDIST_TOOLCHAIN_DEFAULT="${PTXDIST_TOOLCHAIN_DEFAULT}" - - # platformconfig is a bit more sophisticated - PTXDIST_PLATFORMCONFIG_FALLBACK=($(echo ${PTXDIST_PLATFORMCONFIG_FALLBACK} 2>/dev/null)) - if [ ${#PTXDIST_PLATFORMCONFIG_FALLBACK[@]} -ne 1 ]; then - unset PTXDIST_PLATFORMCONFIG_FALLBACK - fi } @@ -2424,6 +2472,7 @@ setup_platform_continue_with_broken_config() # out: PTXDIST_PLATFORMDIR # PTXDIST_PLATFORMSUFFIX # PTXDIST_PLATFORMCONFIGDIR +# PTXDIST_PLATFORMCONFIG_SUBDIR # "*DIR" correct directory definitions # setup_platform() { @@ -2456,11 +2505,22 @@ setup_platform() { cfg_file="$(readlink -f "${cfg_file}")" || return cfg_dir="$(dirname "${cfg_file}")" - cfg_dir="${cfg_dir/#$(readlink -f "${PTXDIST_WORKSPACE}")/${PTXDIST_WORKSPACE}}" + for layer in "${PTXDIST_LAYERS[@]}"; do + cfg_dir="${cfg_dir/#$(readlink -f ${layer})\//${layer}/}" + done break done PTXDIST_PLATFORMCONFIGDIR="${cfg_dir:-${PTXDIST_WORKSPACE}}" + PTXDIST_PLATFORMCONFIG_SUBDIR= + if [ "${PTXDIST_WORKSPACE}" != "${PTXDIST_PLATFORMCONFIGDIR}" ]; then + local tmp=${PTXDIST_PLATFORMCONFIGDIR#${PTXDIST_WORKSPACE}/} + while [ "${tmp}" != "${tmp#base/}" ]; do + tmp=${tmp#base/} + done + PTXDIST_PLATFORMCONFIG_SUBDIR="${tmp}" + fi + PTXDIST_BOARDSETUP="${HOME}/.ptxdist/boardsetup.${project}${project_version}.${platform}" } @@ -2613,6 +2673,7 @@ setup_export() { PTXDIST_PLATFORMDIR \ PTXDIST_PLATFORMSUFFIX \ PTXDIST_PLATFORMCONFIGDIR \ + PTXDIST_PLATFORMCONFIG_SUBDIR \ \ PTXDIST_PARALLELMFLAGS \ PTXDIST_PARALLELMFLAGS_INTERN \ @@ -2647,6 +2708,8 @@ main() { # --- errexit feature may be active --- parse_first && + + setup_layers && # --- vars to config files are setup --- setup_parallel && -- cgit v1.2.3