diff --git a/lib/ossbuild-common.bash b/lib/ossbuild-common.bash old mode 100755 new mode 100644 index bac6906..eb1f66d --- a/lib/ossbuild-common.bash +++ b/lib/ossbuild-common.bash @@ -38,13 +38,20 @@ ossbuild-pushd() { bsl_logfe "failed to change directory to '$(realpath -Lm "${d}")'" return 2 } - bsl_logi "directory: '${PWD}'" + bsl_logi "enter directory: '${PWD}'" } #D# Logged popd. ossbuild-popd() { - bsl_run_cmd_quiet popd || return 0 - bsl_logi "directory: '${PWD}'" + local dirstack_size + dirstack_size="$(dirs -p | wc -l)" + [ "${dirstack_size}" -gt 1 ] || { + # directory stack is empty (the current directory is always present) + return 0 + } + bsl_logi "leave directory: '${PWD}'" + bsl_run_cmd_quiet popd + [ "${dirstack_size}" -le 2 ] || bsl_logi "directory: '${PWD}'" } #D# Run a shell command. @@ -194,8 +201,8 @@ ossbuild-gh-version-latest() { # The first of the following steps which has a non-empty result is used as # version string: # -# 1. get value of project variable VERSION -# 2. get value of project variable DEFAULT_VERSION +# 1. get value of project variable _VERSION +# 2. get value of project variable _DEFAULT_VERSION # 3. value returned by ``ossbuild-gh-version-latest`` #d# # shellcheck disable=SC2120 ossbuild-project-version() { @@ -375,19 +382,20 @@ ossbuild-run-tests-p() { [ "$(ossbuild-project-var-get BUILD_TESTS "${BUILD_TESTS:-0}")" -gt 0 ] } -#D# Write name of project build step function to stdoutif (it exists). +#D# Write name of project build step function to stdout (if it exists). ossbuild-project-build-step-fn() { - local step_fn="ossbuild-${OSSBUILD_PROJECT}-${1}" - bsl_run_cmd_nostdout declare -F "${step_fn}" || return 1 + local step="${1}" + local step_fn="ossbuild-${step}-${OSSBUILD_PROJECT}" + bsl_run_cmd_nostdout declare -F "${step_fn}" || return 2 printf '%s' "${step_fn}" } #D# Run project build step function (if it exists). ossbuild-project-build-step-run() { - local step_fn - step_fn="$(ossbuild-project-build-step-fn "${@}")" || return 1 + local step="${1}" step_fn + step_fn="$(ossbuild-project-build-step-fn "${step}")" || return "${?}" shift - bsl_logi "${OSSBUILD_STEP} '${OSSBUILD_PROJECT}'" + bsl_logi "${step} '${OSSBUILD_PROJECT}'" "${step_fn}" "${@}" } @@ -402,6 +410,7 @@ ossbuild-project-init() { trap ossbuild-report-error ERR [ -v OSSBUILD_PROJECT ] || { + # use global var for error reporting declare -g OSSBUILD_STEP='init' OSSBUILD_PROJECT="$(basename "$(dirname "${BASH_SOURCE[-1]}")")" } @@ -431,7 +440,7 @@ ossbuild-project-build-in-tree-p() { = "${ossbuild-project-var-get BUILD_TREE}" ] } -ossbuild-archive-generic-prepare() { +ossbuild-archive-prepare() { local archive_url="${1}" src_tree="${2:-}" archive="${3:-}" [ -n "${src_tree}" ] || \ @@ -459,7 +468,7 @@ ossbuild-archive-gnu-prepare() { src_tree="$(ossbuild-src-base)/$(basename "${archive}" .tar.gz)" archive_url="${archive_base_url}/${archive}" - ossbuild-archive-generic-prepare \ + ossbuild-archive-prepare \ "${archive_url}" \ "${src_tree}" \ "${archive}" @@ -467,15 +476,20 @@ ossbuild-archive-gnu-prepare() { #D# ... ossbuild-autotools-configure-ok-p() { - local build_tree="${1}" + local build_tree="${1}" \ + configlog="${2:-config.log}" \ + regexp="${3:-^configure: exit 0$}" [ -n "${build_tree}" ] || ossbuild-project-var-get -v build_tree BUILD_TREE - local config_log="${build_tree}/config.log" + configlog="${build_tree}/${configlog}" - [ -e "${config_log}" ] && grep -qE '^configure: exit 0$' "${config_log}" + [ -e "${configlog}" ] || return 2 + grep -qE "${regexp}" "${configlog}" || return 3 + bsl_logi "${OSSBUILD_PROJECT}: reuse previous configure results" \ + "(found 'configure: exit 0' in '${configlog}')" } #D# ... -ossbuild-autotools-generic-build() { +ossbuild-autotools-build() { local configure_extra_opts=(${@}) local src_tree build_tree @@ -488,9 +502,10 @@ ossbuild-autotools-generic-build() { [ -d "${build_tree}" ] || mkdir -p "${build_tree}" ossbuild-pushd "${build_tree}" - if ossbuild-autotools-configure-ok-p "${build_tree}"; then - bsl_logi "skip configure (found config.status)" - else + local configure_ok_p_fn + configure_ok_p_fn="$(ossbuild-project-build-step-fn "configure-ok-p")" \ + || configure_ok_p_fn='ossbuild-autotools-configure-ok-p' + if ! "${configure_ok_p_fn}" "${build_tree}"; then bsl_logi "run configure ..." local configure=( "${src_tree}/configure" @@ -505,7 +520,7 @@ ossbuild-autotools-generic-build() { } #D# ... -ossbuild-autotools-generic-install() { +ossbuild-autotools-install() { local build_tree ossbuild-project-var-get -v build_tree BUILD_tree @@ -530,6 +545,10 @@ ossbuild-project-build-steps-all() { declare -g OSSBUILD_STEP for OSSBUILD_STEP in prepare build install; do + [[ ! "${OSSBUILD_SKIP:=}" =~ (^|,)${OSSBUILD_STEP}(,|$) ]] || { + bsl_logi "${OSSBUILD_PROJECT}: skip ${OSSBUILD_SKIP}" + continue + } ossbuild-project-build-step-run "${OSSBUILD_STEP}" "${@}" done } diff --git a/projects/abseil-cpp/ossbuild-abseil-cpp.bash b/projects/abseil-cpp/ossbuild-abseil-cpp.bash index db40872..5ea2d5f 100755 --- a/projects/abseil-cpp/ossbuild-abseil-cpp.bash +++ b/projects/abseil-cpp/ossbuild-abseil-cpp.bash @@ -10,7 +10,7 @@ source "${LIB_DIR}/ossbuild-common.bash" ABSEIL_CPP_DEFAULT_VERSION='20230125.3' #https://github.com/abseil/abseil-cpp/archive/refs/tags/20230125.3.tar.gz -ossbuild-abseil-cpp-prepare() { +ossbuild-prepare-abseil-cpp() { local version gh_url archive archive_url src_tree ossbuild-project-var-get -v version VERSION ossbuild-project-var-get -v gh_url GH_URL @@ -31,7 +31,7 @@ ossbuild-abseil-cpp-prepare() { } } -ossbuild-abseil-cpp-build() { +ossbuild-build-abseil-cpp() { local src_tree build_tree ossbuild-project-var-get -v src_tree SRC_TREE build_tree="${src_tree}/ossbuild" @@ -65,9 +65,10 @@ ossbuild-abseil-cpp-build() { ossbuild-cmd cmake "${generate_opts[@]}" "${src_tree}" ossbuild-cmd cmake --build "${build_tree}" + return 1 } -ossbuild-abseil-cpp-install() { +ossbuild-install-abseil-cpp() { local build_tree ossbuild-project-var-get -v build_tree BUILD_TREE @@ -80,9 +81,12 @@ ossbuild-abseil-cpp-install() { ossbuild-cmd "${cmd[@]}" } -_main_() { +ossbuild-abseil-cpp() { ossbuild-project-gh-init 'abseil' 'abseil-cpp' ossbuild-project-build-steps-all "${@}" } -_main_ "${@}" +# +# run script, skip if sourced (while avoiding shellcheck issues) +# +(return 0 2>/dev/null) || ossbuild-abseil-cpp "${@}" diff --git a/projects/llvm/ossbuild-llvm.bash b/projects/llvm/ossbuild-llvm.bash index 406c53b..e984ab1 100755 --- a/projects/llvm/ossbuild-llvm.bash +++ b/projects/llvm/ossbuild-llvm.bash @@ -3,7 +3,7 @@ LIB_DIR="$(dirname "$(realpath "${BASH_SOURCE[0]}")")/../../lib" source "${LIB_DIR}/ossbuild-common.bash" -llvm-source-workon() { +ossbuild-prepare-llvm() { echo "[INF] ${FUNCNAME[0]} ..." local version="${1}" @@ -22,7 +22,7 @@ llvm-source-workon() { pushd "${src_dir}" &> /dev/null } -llvm-cmake-generate() { +ossbuild-generate-llvm() { echo "[INF] ${FUNCNAME[0]} ..." local build_type="${1:-Release}" local projects="${2:-}" @@ -190,7 +190,7 @@ llvm-cmake-generate() { } # shellcheck disable=SC2120 -llvm-cmake-build() { +ossbuild-build-llvm() { echo "[INF] ${FUNCNAME[0]} ..." local build_type="${1:-Release}" local build_args="${2:-}" @@ -222,7 +222,7 @@ llvm-cmake-build() { "${cmd[@]}" } -llvm-cmake-install() { +ossbuild-install-llvm() { echo "[INF] ${FUNCNAME[0]} ..." local build_type="${1:-Release}" local build_dir="${2:-build-${build_type,,}}" @@ -235,7 +235,7 @@ llvm-cmake-install() { "${cmd[@]}" } -llvm-cmake-generate-fallback() { +ossbuild-generate-llvm-fallback() { echo "[INF] ${FUNCNAME[0]} ..." local build_type="${1:-Release}" local build_dir="${2:-build-${build_type,,}}" @@ -247,14 +247,14 @@ llvm-cmake-generate-fallback() { lld ) local IFS=';' - llvm-cmake-generate "${build_type}" "${llvm_projects[*]}" + ossbuild-generate-llvm "${build_type}" "${llvm_projects[*]}" # Fallback 2: Generate build systems for individual projects IFS=';' read -a LLVM_PROJECTS \ <<< $(grep 'set(LLVM_ALL_PROJECTS ' llvm/CMakeLists.txt | cut -d\" -f2) local project for project in "${llvm_projects[@]}"; do - llvm-cmake-generate "${build_type}" "${project}" + ossbuild-generate-llvm "${build_type}" "${project}" done } @@ -262,15 +262,15 @@ ossbuild-llvm() { local version="${1:-15.0.5}" local build_type="${2:-Release}" # or 'RelWithDebInfo', but beware of the huge binaries - llvm-source-workon "${version}" - llvm-cmake-generate "${build_type}" + ossbuild-prepare-llvm "${version}" + ossbuild-generate-llvm "${build_type}" # Ideally, llcm-cmake-build should build the most LLVM projects. However, if # it doesn't, it might make sense to build projects individually (see - # `llvm-cmake-generate-fallback` above). - llvm-cmake-build "${build_type}" + # `ossbuild-generate-llvm-fallback` above). + ossbuild-build-llvm "${build_type}" # Install the toolchain - llvm-cmake-install "${build_type}" + ossbuild-install-llvm "${build_type}" return $? } diff --git a/projects/protobuf/ossbuild-protobuf.bash b/projects/protobuf/ossbuild-protobuf.bash index f1b9784..87f547a 100755 --- a/projects/protobuf/ossbuild-protobuf.bash +++ b/projects/protobuf/ossbuild-protobuf.bash @@ -12,7 +12,7 @@ source "${LIB_DIR}/ossbuild-common.bash" #PROTOBUF_DEFAULT_VERSION='23.3' #https://github.com/protocolbuffers/protobuf/releases/download/v23.3/protobuf-23.3.tar.gz -ossbuild-protobuf-prepare() { +ossbuild-prepare-protobuf() { local version gh_url archive archive_url src_tree ossbuild-project-var-get -v version VERSION ossbuild-project-var-get -v gh_url GH_URL @@ -33,7 +33,7 @@ ossbuild-protobuf-prepare() { } } -ossbuild-protobuf-build() { +ossbuild-build-protobuf() { local src_tree build_tree ossbuild-project-var-get -v src_tree SRC_TREE build_tree="${src_tree}/ossbuild" @@ -62,7 +62,7 @@ ossbuild-protobuf-build() { ossbuild-cmd cmake --build "${build_tree}" } -ossbuild-protobuf-install() { +ossbuild-install-protobuf() { local build_tree ossbuild-project-var-get -v build_tree BUILD_TREE @@ -75,9 +75,12 @@ ossbuild-protobuf-install() { ossbuild-cmd "${cmd[@]}" } -_main_() { +ossbuild-protobuf() { ossbuild-project-gh-init 'protocolbuffers' 'protobuf' ossbuild-project-build-steps-all "${@}" } -_main_ "${@}" +# +# run script, skip if sourced (while avoiding shellcheck issues) +# +(return 0 2>/dev/null) || ossbuild-protobuf "${@}" diff --git a/projects/quilt/ossbuild-quilt.bash b/projects/quilt/ossbuild-quilt.bash index 602face..fdfa546 100755 --- a/projects/quilt/ossbuild-quilt.bash +++ b/projects/quilt/ossbuild-quilt.bash @@ -10,25 +10,28 @@ source "${LIB_DIR}/ossbuild-common.bash" # shellcheck disable=SC2034 QUILT_DEFAULT_VERSION='0.67' -ossbuild-quilt-prepare() { +ossbuild-prepare-quilt() { # download URL example: # http://download.savannah.gnu.org/releases/quilt/quilt-0.67.tar.gz ossbuild-archive-gnu-prepare \ "http://download.savannah.gnu.org/releases/quilt" } -ossbuild-quilt-build() { +ossbuild-build-quilt() { # quilt does not support a separate build tree ossbuild-project-var-set BUILD_TREE "$(ossbuild-project-var-get SRC_TREE)" - ossbuild-autotools-generic-build + ossbuild-autotools-build } -ossbuild-quilt-install() { - ossbuild-autotools-generic-install +ossbuild-install-quilt() { + ossbuild-autotools-install } -_main_() { +ossbuild-quilt() { ossbuild-project-build-steps-all "${@}" } -_main_ "${@}" +# +# run script, skip if sourced (while avoiding shellcheck issues) +# +(return 0 2>/dev/null) || ossbuild-quilt "${@}"