From fb28efc834625b05bee45bb7426ae9b29a9f7025 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 19 Jul 2019 17:01:15 +0200 Subject: [PATCH 1/2] function to get OS releases for Linux and macOS added to libstd --- Pmodules/libstd.bash | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Pmodules/libstd.bash b/Pmodules/libstd.bash index 846484d..b3e5e1b 100644 --- a/Pmodules/libstd.bash +++ b/Pmodules/libstd.bash @@ -271,6 +271,31 @@ There is NO WARRANTY, to the extent permitted by law." done } +std.get_os_release_linux() { + source /etc/os-release + case "${ID}" in + science | rhel | centos | fedora ) + echo "rhel${VERSION_ID%.*}" + ;; + * ) + echo "Unknown" + exit 1 + ;; + esac +} +std.get_os_release_macos() { + VERSION_ID=$(sw_vers -productVersion) + echo "macOS${VERSION_ID%.*}" +} + +std::get_os_release() { + local -r OS=$(uname -s) + local -A func_map; + func_map['Linux']=std.get_os_release_linux + func_map['Darwin']=std.get_os_release_macos + ${func_map[${OS}]} +} + # Local Variables: # mode: sh # sh-basic-offset: 8 From 58359b837e764ae3002e6f04ee95718c25fff1ca Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 19 Jul 2019 17:17:23 +0200 Subject: [PATCH 2/2] review 'system' feature - 'system' and 'OS' have different meaning now 'system' defaults to a string derived from the Linux distribution (like rhel7) or on Mac to the macOS version (like macOS10.14) - OS is equivalent to the output of 'uname -s' - move dynamically created functions to new library libpbuild_dyn.bash - do not set defaults in libpbuild.bash - use the string returned by std::get_os_release() as system string if not passed as argument - --- Pmodules/libpbuild.bash | 52 ++++++-------------- Pmodules/libpbuild_dyn.bash | 24 +++++++++ Pmodules/modbuild.in | 98 ++++++++++++++++++++++++------------- build | 1 + 4 files changed, 104 insertions(+), 71 deletions(-) create mode 100644 Pmodules/libpbuild_dyn.bash diff --git a/Pmodules/libpbuild.bash b/Pmodules/libpbuild.bash index 9f33653..83562ad 100644 --- a/Pmodules/libpbuild.bash +++ b/Pmodules/libpbuild.bash @@ -76,59 +76,48 @@ declare bootstrap='no' #.............................................................................. # global variables -declare force_rebuild='no' pbuild.force_rebuild() { - force_rebuild="$1" + declare -gr force_rebuild="$1" } -declare dry_run='no' pbuild.dry_run() { - dry_run="$1" + declare -gr dry_run="$1" } -declare enable_cleanup_build='yes' pbuild.enable_cleanup_build() { - enable_cleanup_build="$1" + declare -gr enable_cleanup_build="$1" } -declare enable_cleanup_src='yes' pbuild.enable_cleanup_src() { - enable_cleanup_src="$1" + declare -gr enable_cleanup_src="$1" } -declare build_target='all' pbuild.build_target() { - build_target="$1" + declare -gr build_target="$1" } -declare opt_update_modulefiles='no' pbuild.update_modulefiles() { - opt_update_modulefiles="$1" + declare -gr opt_update_modulefiles="$1" } # number of parallel make jobs -declare -i JOBS=3 pbuild.jobs() { - JOBS="$1" + declare -gr JOBS="$1" } -declare system=$(uname -s) pbuild.system() { - system="$1" + declare -gr system="$1" } -declare TEMP_DIR="${PMODULES_TMPDIR:-/var/tmp/${USER}}" pbuild.temp_dir() { - TEMP_DIR="$1" + declare -gr TEMP_DIR="$1" } -declare PMODULES_DISTFILESDIR="${PMODULES_ROOT}/var/distfiles" pbuild.pmodules_distfilesdir() { - PMODULES_DISTFILESDIR="$1" + declare -gr PMODULES_DISTFILESDIR="$1" } -declare verbose='no' pbuild.verbose() { - verbose='yes' + declare -gr verbose="$1" } # module name including path in hierarchy and version @@ -156,10 +145,7 @@ declare -r _DOCDIR='share/doc' # install prefix of module. declare -x PREFIX='' -# :FIXME: -# OS is still used in some build-scripts. We have to implement a getter -# and use this getter in the build-scripts. -declare -r OS="${system}" +declare -r OS=$(uname -s) ############################################################################## @@ -206,7 +192,9 @@ set_full_module_name_and_prefix() { echo "$*" } - [[ -n ${GROUP} ]] || std::die 1 "${module_name}/${module_version}: group not set." + [[ -n ${GROUP} ]] || std::die 1 \ + "${module_name}/${module_version}:" \ + "group not set." # build module name # :FIXME: this should be read from a configuration file @@ -327,12 +315,10 @@ pbuild::use_cc() { pbuild::pre_prep() { : } -eval "pbuild::pre_prep_${system}() { :; }" pbuild::post_prep() { : } -eval "pbuild::post_prep_${system}() { :; }" ############################################################################### # @@ -488,7 +474,6 @@ pbuild::add_patch() { PATCH_FILES+=( "$1" ) PATCH_STRIPS+=( "$2" ) } -eval "pbuild::add_patch_${system}() { pbuild::add_patch \"\$@\"; }" pbuild::set_default_patch_strip() { [[ -n "$1" ]] || \ @@ -509,7 +494,6 @@ pbuild::use_flag() { pbuild::pre_configure() { : } -eval "pbuild::pre_configure_${system}() { :; }" pbuild::set_configure_args() { CONFIGURE_ARGS+=( "$@" ) @@ -575,12 +559,10 @@ pbuild::configure() { pbuild::post_configure() { : } -eval "pbuild::post_configure_${system}() { :; }" pbuild::pre_compile() { : } -eval "pbuild::pre_compile_${system}() { :; }" pbuild::compile() { make -j${JOBS} @@ -589,12 +571,10 @@ pbuild::compile() { pbuild::post_compile() { : } -eval "pbuild::post_compile_${system}() { :; }" pbuild::pre_install() { : } -eval "pbuild::pre_install_${system}() { :; }" pbuild::install() { make install @@ -636,8 +616,6 @@ pbuild::install_shared_libs() { pbuild::post_install() { : } -eval "pbuild::post_install_${system}() { :; }" - # # The 'do it all' function. diff --git a/Pmodules/libpbuild_dyn.bash b/Pmodules/libpbuild_dyn.bash new file mode 100644 index 0000000..85f1d76 --- /dev/null +++ b/Pmodules/libpbuild_dyn.bash @@ -0,0 +1,24 @@ +#!/bin/bash + +eval "pbuild::pre_prep_${system}() { :; }" +eval "pbuild::pre_prep_${OS}() { :; }" +eval "pbuild::post_prep_${system}() { :; }" +eval "pbuild::post_prep_${OS}() { :; }" + +eval "pbuild::add_patch_${system}() { pbuild::add_patch \"\$@\"; }" +eval "pbuild::add_patch_${OD}() { pbuild::add_patch \"\$@\"; }" + +eval "pbuild::pre_configure_${system}() { :; }" +eval "pbuild::pre_configure_${OS}() { :; }" +eval "pbuild::post_configure_${system}() { :; }" +eval "pbuild::post_configure_${OS}() { :; }" + +eval "pbuild::pre_compile_${system}() { :; }" +eval "pbuild::pre_compile_${OS}() { :; }" +eval "pbuild::post_compile_${system}() { :; }" +eval "pbuild::post_compile_${OS}() { :; }" + +eval "pbuild::pre_install_${system}() { :; }" +eval "pbuild::pre_install_${OS}() { :; }" +eval "pbuild::post_install_${system}() { :; }" +eval "pbuild::post_install_${OS}() { :; }" diff --git a/Pmodules/modbuild.in b/Pmodules/modbuild.in index b231656..e13b498 100755 --- a/Pmodules/modbuild.in +++ b/Pmodules/modbuild.in @@ -1,4 +1,4 @@ -#!/usr/bin/env bash -- +#!/usr/bin/env bash # # The following build specific variables are set and used in libpbuild.bash: # ARGS @@ -21,11 +21,11 @@ PATH+=":${mydir}" PATH+=":${mydir}/../lib:${mydir}/../config" source libstd.bash || { - echo "Oops: library '$_' cannot be loaded!" 1>&2; exit 3; + echo "Oops: cannot source library -- '$_'" 1>&2; exit 3; } source libpbuild.bash || \ - std::die 3 "Oops: Cannot source library -- '$_'" + std::die 3 "Oops: cannot source library -- '$_'" # save arguments, (still) required for building dependencies declare -r ARGS="$@" @@ -127,30 +127,40 @@ MISCELLANEOUS OPTIONS: declare -a versions=() declare opt_all_variants='no' declare opt_bootstrap='no' +declare opt_build_config='modbuild.conf' +declare opt_build_target='all' +declare opt_distfiles_dir="${PMODULES_ROOT}/var/distfiles" +declare opt_dry_run='no' +declare opt_enable_cleanup_build='yes' +declare opt_enable_cleanup_src='yes' +declare opt_force_rebuild='no' +declare -i opt_jobs=3 +declare opt_update_modulefiles='no' +declare opt_system='' +declare opt_temp_dir="${PMODULES_TMPDIR:-/var/tmp/${USER}}" +declare opt_verbose='no' # array collecting all modules specified on the command line via '--with=module' declare -a opt_with_modules=() -declare build_config='modbuild.conf' -declare system="$(uname -s)" parse_args() { while (( $# > 0 )); do case $1 in -j ) - pbuild.jobs "$2" + opt_jobs="$2" shift ;; --jobs=[0-9]* ) - pbuild.jobs "${1/--jobs=}" + opt_jobs="${1/--jobs=}" ;; -v | --verbose ) trap 'echo "$BASH_COMMAND"' DEBUG - pbuild.verbose 'yes' + opt_verbose='yes' ;; --debug ) set -x ;; -f | --force-rebuild ) - pbuild.force_rebuild 'yes' + opt_force_rebuild='yes' ;; -\? | -h | --help ) usage @@ -159,57 +169,55 @@ parse_args() { std::die 0 "\nPmodules version ${VERSION}\nCopyright GNU GPL v2\n" ;; --dry-run ) - pbuild.dry_run 'yes' + opt_dry_run='yes' ;; --config ) - build_config="$2" + opt_build_config="$2" shift 1 ;; --config=* ) - build_config="${1#*=}" + opt_build_config="${1#*=}" ;; --enable-cleanup ) - pbuild.enable_cleanup_build 'yes' - pbuild.enable_cleanup_src 'yes' + opt_enable_cleanup_build 'yes' + opt_enable_cleanup_src 'yes' ;; --disable-cleanup ) - pbuild.enable_cleanup_build 'no' - pbuild.enable_cleanup_src 'no' + opt_enable_cleanup_build 'no' + opt_enable_cleanup_src 'no' ;; --enable-cleanup-build ) - pbuild.enable_cleanup_build 'yes' + opt_enable_cleanup_build 'yes' ;; --disable-cleanup-build ) - pbuild.enable_cleanup_build 'no' + opt_enable_cleanup_build 'no' ;; --enable-cleanup-src ) - pbuild.enable_cleanup_src 'yes' + opt_enable_cleanup_src 'yes' ;; --disable-cleanup-src ) - pbuild.enable_cleanup_src 'no' + opt_enable_cleanup_src 'no' ;; --distdir ) - pbuild.pmodules_distfilesdir "$2" + opt_distfiles_dir "$2" shift ;; --distdir=* ) - pbuild.pmodules_distfilesdir "${1/--distdir=}" + opt_distfiles_dir "${1/--distdir=}" ;; --tmpdir ) - pbuild.temp_dir "$2" + opt_temp_dir="$2" shift ;; --tmpdir=* ) - pbuilf.temp_dir "${1/--tmpdir=}" + opt_temp_dir="${1/--tmpdir=}" ;; --system ) - system=".$2" - pbuild.system "${system}" + opt_system="$2" shift ;; --system=* ) - system=".${1/*=}" - pbuild.system "${system}" + opt_system="${1/*=}" ;; --with ) opt_with_modules+=( "$2" ) @@ -220,13 +228,13 @@ parse_args() { opt_with_modules+=( ${m} ) ;; --prep | --configure | --compile | --install | --all ) - pbuild.build_target ${1:2} + opt_build_target=${1:2} ;; --bootstrap ) opt_bootstrap='yes' ;; --update-modulefiles ) - pbuild.update_modulefiles 'yes' + opt_update_modulefiles='yes' ;; -- ) : @@ -263,10 +271,13 @@ find_variants_files(){ shopt -q nullglob || : local -i nullglob_set=$? shopt -s nullglob - local files=( "${BUILDBLOCK_DIR}"/*/variants.${system} ) + local files=( "${BUILDBLOCK_DIR}"/*/variants.${opt_system} ) + files+=( "${BUILDBLOCK_DIR}"/*/variants.$(uname -s) ) local f for f in "${BUILDBLOCK_DIR}"/*/variants; do - [[ -e "${f}.${system}" ]] || files+=( "$f" ) + [[ -e "${f}.${opt_system}" ]] \ + || [[ -e "${f}.$(uname -s)" ]] \ + || files+=( "$f" ) done (( nullglob_set == 1 )) && shopt -u nullglob std::upvar "$1" "${files[@]}" @@ -373,6 +384,25 @@ build_modules() { parse_args "$@" +if [[ -z "${opt_system}" ]]; then + opt_system=$(std::get_os_release) +fi + +pbuild.jobs "${opt_jobs}" +pbuild.force_rebuild "${opt_force_rebuild}" +pbuild.build_target "${opt_build_target}" +pbuild.dry_run "${opt_dry_run}" +pbuild.enable_cleanup_build "${opt_enable_cleanup_build}" +pbuild.enable_cleanup_src "${opt_enable_cleanup_src}" +pbuild.pmodules_distfilesdir "${opt_distfiles_dir}" +pbuild.update_modulefiles "${opt_update_modulefiles}" +pbuild.temp_dir "${opt_temp_dir}" +pbuild.system "${opt_system}" +pbuild.verbose "${opt_verbose}" + +source libpbuild_dyn.bash || \ + std::die 3 "Oops: cannot source library -- '$_'" + # source build configuration, # must be done before sourcing libpbuild! if [[ "${opt_bootstrap}" == 'yes' ]]; then @@ -380,8 +410,8 @@ if [[ "${opt_bootstrap}" == 'yes' ]]; then else test -d "${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}" && PATH+=":$_" fi -source "${build_config}" || \ - std::die 3 "Oops: Cannot source configuration file -- '${build_config}'" +source "${opt_build_config}" || \ + std::die 3 "Oops: Cannot source configuration file -- '$_'" declare -r BUILD_SCRIPT declare -r BUILDBLOCK_DIR diff --git a/build b/build index a858aef..c34dd90 100755 --- a/build +++ b/build @@ -313,6 +313,7 @@ pmodules::install() { install -m 0644 "${SRC_DIR}/libpmodules.bash" "${PMODULES_HOME}/lib" install -m 0644 "${SRC_DIR}/libpbuild.bash" "${PMODULES_HOME}/lib" + install -m 0644 "${SRC_DIR}/libpbuild_dyn.bash" "${PMODULES_HOME}/lib" install -m 0644 "${SRC_DIR}/libstd.bash" "${PMODULES_HOME}/lib" install -m 0755 -d "${PMODULES_HOME}/lib/Pmodules" install -m 0644 "${SRC_DIR}/libmodules.tcl" "${PMODULES_HOME}/lib/Pmodules"