From 5d9497364e625595fe824999d48dba9cdeded357 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Tue, 1 Dec 2020 16:05:36 +0100 Subject: [PATCH 1/4] version specific build targets implemented --- Pmodules/libpbuild.bash | 129 +++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 20 deletions(-) diff --git a/Pmodules/libpbuild.bash b/Pmodules/libpbuild.bash index 48eda4c..3add4c5 100644 --- a/Pmodules/libpbuild.bash +++ b/Pmodules/libpbuild.bash @@ -49,6 +49,62 @@ trap "error_handler" ERR declare configure_with='undef' +#.............................................................................. +# +# compare two version numbers +# +# original implementation found on stackoverflow: +# https://stackoverflow.com/questions/4023830/how-to-compare-two-strings-in-dot-separated-version-format-in-bash +# +pbuild::version_compare () { + is_uint() { + [[ $1 =~ ^[0-9]+$ ]] + } + + [[ $1 == $2 ]] && return 0 + local IFS=. + local i ver1=($1) ver2=($2) + + # fill empty fields in ver1 with zeros + for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do + ver1[i]=0 + done + for ((i=0; i<${#ver1[@]}; i++)); do + [[ -z ${ver2[i]} ]] && ver2[i]=0 + if is_uint ${ver1[i]} && is_uint ${ver2[i]}; then + ((10#${ver1[i]} > 10#${ver2[i]})) && return 1 + ((10#${ver1[i]} < 10#${ver2[i]})) && return 2 + else + [[ ${ver1[i]} > ${ver2[i]} ]] && return 1 + [[ ${ver1[i]} < ${ver2[i]} ]] && return 2 + fi + done + return 0 +} + +pbuild::version_lt() { + pbuild::version_compare "$1" "$2" + (( $? == 2 )) +} + +pbuild::version_le() { + pbuild::version_compare "$1" "$2" + local -i exit_code=$? + (( exit_code == 0 || exit_code = 2 )) +} + + +pbuild::version_gt() { + pbuild::version_compare "$1" "$2" + (( $? == 1 )) + local -i exit_code=$? + (( exit_code == 0 || exit_code = 1 )) +} + +pbuild::version_eq() { + pbuild::version_compare "$1" "$2" +} + #.............................................................................. # # The following variables are available in build-blocks and set read-only @@ -468,7 +524,14 @@ pbuild::prep() { patch -p${strip_val} < "${BUILDBLOCK_DIR}/${PATCH_FILES[_i]}" done } - + if [[ -z "${SOURCE_URLS}" ]]; then + for fname in ${VERSIONS[@]/#/pbuild::set_download_url_}; do + if typeset -F ${fname} 2>/dev/null; then + $f + break + fi + done + fi [[ -z "${SOURCE_URLS}" ]] && \ std::die 3 \ "%s " "${module_name}/${module_version}:" \ @@ -722,14 +785,9 @@ pbuild::make_all() { #...................................................................... find_modulefile() { local "$1" - local fnames=() - fnames+=( "modulefile-${V_MAJOR}.${V_MINOR}.${V_PATCHLVL}" ) - fnames+=( "modulefile-${V_MAJOR}.${V_MINOR}" ) - fnames+=( "modulefile-${V_MAJOR}" ) - fnames+=( "modulefile" ) local fname='' local modulefile='' - for fname in "${fnames[@]}"; do + for fname in "${VERSIONS[@]/#/modulefile-}"; do if [[ -r "${BUILDBLOCK_DIR}/${fname}" ]]; then modulefile="${BUILDBLOCK_DIR}/${fname}" break; @@ -746,7 +804,16 @@ pbuild::make_all() { # install the doc-files specified in the build-script # install_doc() { - test -n "${MODULE_DOCFILES}" || return 0 + if [[ -z "${MODULE_DOCFILES}" ]]; then + for f in ${VERSIONS[@]/#/pbuild::install_docfiles_}; do + if typeset -F "$f" 2>/dev/null; then + $f + break + fi + done + + fi + [[ -n "${MODULE_DOCFILES}" ]] || return 0 local -r docdir="${PREFIX}/${_DOCDIR}/${module_name}" std::info \ @@ -965,15 +1032,23 @@ pbuild::make_all() { return 0 fi local targets=() - targets+=( "pre_${target}_${system}" "pre_${target}_${OS}" "pre_${target}" ) - if typeset -F pbuild::${target}_${system} 1>/dev/null 2>&1; then - targets+=( "${target}_${system}" ) - elif typeset -F pbuild::${target}_${OS} 1>/dev/null 2>&1; then - targets+=( "${target}_${OS}" ) - else - targets+=( "${target}" ) - fi - targets+=( "post_${target}_${system}" "post_${target}_${OS}" "post_${target}" ) + targets+=( ${VERSIONS[@]/#/pbuild::pre_${target}_${system}_} ) + targets+=( pbuild::pre_${target}_${system} ) + targets+=( ${VERSIONS[@]/#/pbuild::pre_${target}_${OS}_} ) + targets+=( pbuild::pre_${target}_${OS} ) + targets+=( pbuild::pre_${target} ) + + targets+=( ${VERSIONS[@]/#/pbuild::${target}_${system}_} ) + targets+=( pbuild::${target}_${system} ) + targets+=( ${VERSIONS[@]/#/pbuild::${target}_${OS}_} ) + targets+=( pbuild::${target}_${OS} ) + targets+=( pbuild::${target} ) + + targets+=( ${VERSIONS[@]/#/pbuild::post_${target}_${system}_} ) + targets+=( pbuild::post_${target}_${system} ) + targets+=( ${VERSIONS[@]/#/pbuild::post_${target}_${OS}_} ) + targets+=( pbuild::post_${target}_${OS} ) + targets+=( pbuild::post_${target} ) for t in "${targets[@]}"; do # We cd into the dir before calling the function - @@ -984,7 +1059,7 @@ pbuild::make_all() { # might/need to be set. # cd "${dir}" - "pbuild::$t" + typeset -F "$t" 2>/dev/null && "$t" || : done touch "${BUILD_DIR}/.${target}" } @@ -1129,8 +1204,11 @@ pbuild.init_env() { v="${v%%_*}" fi V_PKG="${v%%-*}" # version without the release number - V_RELEASE="${v#*-}" # release number - + if [[ $v == *-* ]]; then + V_RELEASE="${v#*-}" # release number + else + V_RELEASE='' + fi case "${V_PKG}" in *.*.* ) V_MAJOR="${V_PKG%%.*}" @@ -1146,6 +1224,17 @@ pbuild.init_env() { V_MAJOR="${V_PKG}" ;; esac + + VERSIONS=( ${V_MAJOR} ) + if [[ -n ${V_MINOR} ]]; then + VERSIONS=( ${V_MAJOR}.${V_MINOR} ${VERSIONS[@]} ) + fi + if [[ -n ${V_PATCHLVL} ]]; then + VERSIONS=( ${V_MAJOR}.${V_MINOR}.${V_PATCHLVL} ${VERSIONS[@]} ) + fi + if [[ -n ${V_RELEASE} ]]; then + VERSIONS=( ${V_MAJOR}.${V_MINOR}.${V_PATCHLVL}-${V_RELEASE} ${VERSIONS[@]} ) + fi } local -r module_name="$1" From f6e64492505a93f70083480316dc32470c0d7905 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 3 Dec 2020 08:53:55 +0100 Subject: [PATCH 2/4] bugfix in find_modulefile() --- Pmodules/libpbuild.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pmodules/libpbuild.bash b/Pmodules/libpbuild.bash index 3add4c5..7d6e94d 100644 --- a/Pmodules/libpbuild.bash +++ b/Pmodules/libpbuild.bash @@ -787,7 +787,7 @@ pbuild::make_all() { local "$1" local fname='' local modulefile='' - for fname in "${VERSIONS[@]/#/modulefile-}"; do + for fname in "${VERSIONS[@]/#/modulefile-}" 'modulefile'; do if [[ -r "${BUILDBLOCK_DIR}/${fname}" ]]; then modulefile="${BUILDBLOCK_DIR}/${fname}" break; From 22b6c62dbc19e00f88976b4e7f3b955281c58997 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 17 Dec 2020 10:12:19 +0100 Subject: [PATCH 3/4] missing versioned functions for build target added --- Pmodules/libpbuild.bash | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Pmodules/libpbuild.bash b/Pmodules/libpbuild.bash index 7d6e94d..fab72b6 100644 --- a/Pmodules/libpbuild.bash +++ b/Pmodules/libpbuild.bash @@ -1036,18 +1036,21 @@ pbuild::make_all() { targets+=( pbuild::pre_${target}_${system} ) targets+=( ${VERSIONS[@]/#/pbuild::pre_${target}_${OS}_} ) targets+=( pbuild::pre_${target}_${OS} ) + targets+=( ${VERSIONS[@]/#/pbuild::pre_${target}_} ) targets+=( pbuild::pre_${target} ) targets+=( ${VERSIONS[@]/#/pbuild::${target}_${system}_} ) targets+=( pbuild::${target}_${system} ) targets+=( ${VERSIONS[@]/#/pbuild::${target}_${OS}_} ) targets+=( pbuild::${target}_${OS} ) + targets+=( ${VERSIONS[@]/#/pbuild::${target}_} ) targets+=( pbuild::${target} ) targets+=( ${VERSIONS[@]/#/pbuild::post_${target}_${system}_} ) targets+=( pbuild::post_${target}_${system} ) targets+=( ${VERSIONS[@]/#/pbuild::post_${target}_${OS}_} ) targets+=( pbuild::post_${target}_${OS} ) + targets+=( ${VERSIONS[@]/#/pbuild::post_${target}_} ) targets+=( pbuild::post_${target} ) for t in "${targets[@]}"; do From 19ce2b117a1e17a2894d1dcdb0de242be81ba1ba Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 17 Dec 2020 10:21:04 +0100 Subject: [PATCH 4/4] bugfix: Use modbuild.in in Pmodules build script --- build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build b/build index 1e83ca1..d85440e 100755 --- a/build +++ b/build @@ -276,7 +276,7 @@ pmodules::compile() { local -r version=$(get_version "${name}") shift - "${BOOTSTRAP_DIR}/Pmodules/modbuild" \ + "${BOOTSTRAP_DIR}/Pmodules/modbuild.in" \ "--config=${config_file}" \ "--enable-cleanup" \ "--force-rebuild" \