Refactor lib/ossbuild-common.bash and adapt projects to changes

* Use common prefixes for project specific build step functions:
  - ossbuild-prepare-<prjname>
  - ossbuild-build-<prjname>
  - ossbuild-install-<prjname>
* New project specific build step function: ossbuild-configure-ok-p-<prjname>
* New environment variable OSSBUILD_SKIP. Allows users to skip listed
  (comma separated) build steps.
* Remove `-generic` from common function names.
* Improve ossbuild-pushd/popd functions.
* Improve doc comments.
* Adapt projects to renamed functions
This commit is contained in:
Kai Tetzlaff (kai+qnas) 2024-05-18 01:21:02 +02:00
parent a8403e744f
commit 99a79e2218
5 changed files with 79 additions and 50 deletions

61
lib/ossbuild-common.bash Executable file → Normal file
View File

@ -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 <PRJ>_VERSION
# 2. get value of project variable <PRJ>_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
}

View File

@ -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 "${@}"

View File

@ -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 $?
}

View File

@ -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 "${@}"

View File

@ -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 "${@}"