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}")'" bsl_logfe "failed to change directory to '$(realpath -Lm "${d}")'"
return 2 return 2
} }
bsl_logi "directory: '${PWD}'" bsl_logi "enter directory: '${PWD}'"
} }
#D# Logged popd. #D# Logged popd.
ossbuild-popd() { ossbuild-popd() {
bsl_run_cmd_quiet popd || return 0 local dirstack_size
bsl_logi "directory: '${PWD}'" 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. #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 # The first of the following steps which has a non-empty result is used as
# version string: # version string:
# #
# 1. get value of project variable VERSION # 1. get value of project variable <PRJ>_VERSION
# 2. get value of project variable DEFAULT_VERSION # 2. get value of project variable <PRJ>_DEFAULT_VERSION
# 3. value returned by ``ossbuild-gh-version-latest`` #d# # 3. value returned by ``ossbuild-gh-version-latest`` #d#
# shellcheck disable=SC2120 # shellcheck disable=SC2120
ossbuild-project-version() { ossbuild-project-version() {
@ -375,19 +382,20 @@ ossbuild-run-tests-p() {
[ "$(ossbuild-project-var-get BUILD_TESTS "${BUILD_TESTS:-0}")" -gt 0 ] [ "$(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() { ossbuild-project-build-step-fn() {
local step_fn="ossbuild-${OSSBUILD_PROJECT}-${1}" local step="${1}"
bsl_run_cmd_nostdout declare -F "${step_fn}" || return 1 local step_fn="ossbuild-${step}-${OSSBUILD_PROJECT}"
bsl_run_cmd_nostdout declare -F "${step_fn}" || return 2
printf '%s' "${step_fn}" printf '%s' "${step_fn}"
} }
#D# Run project build step function (if it exists). #D# Run project build step function (if it exists).
ossbuild-project-build-step-run() { ossbuild-project-build-step-run() {
local step_fn local step="${1}" step_fn
step_fn="$(ossbuild-project-build-step-fn "${@}")" || return 1 step_fn="$(ossbuild-project-build-step-fn "${step}")" || return "${?}"
shift shift
bsl_logi "${OSSBUILD_STEP} '${OSSBUILD_PROJECT}'" bsl_logi "${step} '${OSSBUILD_PROJECT}'"
"${step_fn}" "${@}" "${step_fn}" "${@}"
} }
@ -402,6 +410,7 @@ ossbuild-project-init() {
trap ossbuild-report-error ERR trap ossbuild-report-error ERR
[ -v OSSBUILD_PROJECT ] || { [ -v OSSBUILD_PROJECT ] || {
# use global var for error reporting
declare -g OSSBUILD_STEP='init' declare -g OSSBUILD_STEP='init'
OSSBUILD_PROJECT="$(basename "$(dirname "${BASH_SOURCE[-1]}")")" OSSBUILD_PROJECT="$(basename "$(dirname "${BASH_SOURCE[-1]}")")"
} }
@ -431,7 +440,7 @@ ossbuild-project-build-in-tree-p() {
= "${ossbuild-project-var-get BUILD_TREE}" ] = "${ossbuild-project-var-get BUILD_TREE}" ]
} }
ossbuild-archive-generic-prepare() { ossbuild-archive-prepare() {
local archive_url="${1}" src_tree="${2:-}" archive="${3:-}" local archive_url="${1}" src_tree="${2:-}" archive="${3:-}"
[ -n "${src_tree}" ] || \ [ -n "${src_tree}" ] || \
@ -459,7 +468,7 @@ ossbuild-archive-gnu-prepare() {
src_tree="$(ossbuild-src-base)/$(basename "${archive}" .tar.gz)" src_tree="$(ossbuild-src-base)/$(basename "${archive}" .tar.gz)"
archive_url="${archive_base_url}/${archive}" archive_url="${archive_base_url}/${archive}"
ossbuild-archive-generic-prepare \ ossbuild-archive-prepare \
"${archive_url}" \ "${archive_url}" \
"${src_tree}" \ "${src_tree}" \
"${archive}" "${archive}"
@ -467,15 +476,20 @@ ossbuild-archive-gnu-prepare() {
#D# ... #D# ...
ossbuild-autotools-configure-ok-p() { 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 [ -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# ... #D# ...
ossbuild-autotools-generic-build() { ossbuild-autotools-build() {
local configure_extra_opts=(${@}) local configure_extra_opts=(${@})
local src_tree build_tree local src_tree build_tree
@ -488,9 +502,10 @@ ossbuild-autotools-generic-build() {
[ -d "${build_tree}" ] || mkdir -p "${build_tree}" [ -d "${build_tree}" ] || mkdir -p "${build_tree}"
ossbuild-pushd "${build_tree}" ossbuild-pushd "${build_tree}"
if ossbuild-autotools-configure-ok-p "${build_tree}"; then local configure_ok_p_fn
bsl_logi "skip configure (found config.status)" configure_ok_p_fn="$(ossbuild-project-build-step-fn "configure-ok-p")" \
else || configure_ok_p_fn='ossbuild-autotools-configure-ok-p'
if ! "${configure_ok_p_fn}" "${build_tree}"; then
bsl_logi "run configure ..." bsl_logi "run configure ..."
local configure=( local configure=(
"${src_tree}/configure" "${src_tree}/configure"
@ -505,7 +520,7 @@ ossbuild-autotools-generic-build() {
} }
#D# ... #D# ...
ossbuild-autotools-generic-install() { ossbuild-autotools-install() {
local build_tree local build_tree
ossbuild-project-var-get -v build_tree BUILD_tree ossbuild-project-var-get -v build_tree BUILD_tree
@ -530,6 +545,10 @@ ossbuild-project-build-steps-all() {
declare -g OSSBUILD_STEP declare -g OSSBUILD_STEP
for OSSBUILD_STEP in prepare build install; do 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}" "${@}" ossbuild-project-build-step-run "${OSSBUILD_STEP}" "${@}"
done done
} }

View File

@ -10,7 +10,7 @@ source "${LIB_DIR}/ossbuild-common.bash"
ABSEIL_CPP_DEFAULT_VERSION='20230125.3' ABSEIL_CPP_DEFAULT_VERSION='20230125.3'
#https://github.com/abseil/abseil-cpp/archive/refs/tags/20230125.3.tar.gz #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 local version gh_url archive archive_url src_tree
ossbuild-project-var-get -v version VERSION ossbuild-project-var-get -v version VERSION
ossbuild-project-var-get -v gh_url GH_URL 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 local src_tree build_tree
ossbuild-project-var-get -v src_tree SRC_TREE ossbuild-project-var-get -v src_tree SRC_TREE
build_tree="${src_tree}/ossbuild" build_tree="${src_tree}/ossbuild"
@ -65,9 +65,10 @@ ossbuild-abseil-cpp-build() {
ossbuild-cmd cmake "${generate_opts[@]}" "${src_tree}" ossbuild-cmd cmake "${generate_opts[@]}" "${src_tree}"
ossbuild-cmd cmake --build "${build_tree}" ossbuild-cmd cmake --build "${build_tree}"
return 1
} }
ossbuild-abseil-cpp-install() { ossbuild-install-abseil-cpp() {
local build_tree local build_tree
ossbuild-project-var-get -v build_tree BUILD_TREE ossbuild-project-var-get -v build_tree BUILD_TREE
@ -80,9 +81,12 @@ ossbuild-abseil-cpp-install() {
ossbuild-cmd "${cmd[@]}" ossbuild-cmd "${cmd[@]}"
} }
_main_() { ossbuild-abseil-cpp() {
ossbuild-project-gh-init 'abseil' 'abseil-cpp' ossbuild-project-gh-init 'abseil' 'abseil-cpp'
ossbuild-project-build-steps-all "${@}" 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" LIB_DIR="$(dirname "$(realpath "${BASH_SOURCE[0]}")")/../../lib"
source "${LIB_DIR}/ossbuild-common.bash" source "${LIB_DIR}/ossbuild-common.bash"
llvm-source-workon() { ossbuild-prepare-llvm() {
echo "[INF] ${FUNCNAME[0]} ..." echo "[INF] ${FUNCNAME[0]} ..."
local version="${1}" local version="${1}"
@ -22,7 +22,7 @@ llvm-source-workon() {
pushd "${src_dir}" &> /dev/null pushd "${src_dir}" &> /dev/null
} }
llvm-cmake-generate() { ossbuild-generate-llvm() {
echo "[INF] ${FUNCNAME[0]} ..." echo "[INF] ${FUNCNAME[0]} ..."
local build_type="${1:-Release}" local build_type="${1:-Release}"
local projects="${2:-}" local projects="${2:-}"
@ -190,7 +190,7 @@ llvm-cmake-generate() {
} }
# shellcheck disable=SC2120 # shellcheck disable=SC2120
llvm-cmake-build() { ossbuild-build-llvm() {
echo "[INF] ${FUNCNAME[0]} ..." echo "[INF] ${FUNCNAME[0]} ..."
local build_type="${1:-Release}" local build_type="${1:-Release}"
local build_args="${2:-}" local build_args="${2:-}"
@ -222,7 +222,7 @@ llvm-cmake-build() {
"${cmd[@]}" "${cmd[@]}"
} }
llvm-cmake-install() { ossbuild-install-llvm() {
echo "[INF] ${FUNCNAME[0]} ..." echo "[INF] ${FUNCNAME[0]} ..."
local build_type="${1:-Release}" local build_type="${1:-Release}"
local build_dir="${2:-build-${build_type,,}}" local build_dir="${2:-build-${build_type,,}}"
@ -235,7 +235,7 @@ llvm-cmake-install() {
"${cmd[@]}" "${cmd[@]}"
} }
llvm-cmake-generate-fallback() { ossbuild-generate-llvm-fallback() {
echo "[INF] ${FUNCNAME[0]} ..." echo "[INF] ${FUNCNAME[0]} ..."
local build_type="${1:-Release}" local build_type="${1:-Release}"
local build_dir="${2:-build-${build_type,,}}" local build_dir="${2:-build-${build_type,,}}"
@ -247,14 +247,14 @@ llvm-cmake-generate-fallback() {
lld lld
) )
local IFS=';' local IFS=';'
llvm-cmake-generate "${build_type}" "${llvm_projects[*]}" ossbuild-generate-llvm "${build_type}" "${llvm_projects[*]}"
# Fallback 2: Generate build systems for individual projects # Fallback 2: Generate build systems for individual projects
IFS=';' read -a LLVM_PROJECTS \ IFS=';' read -a LLVM_PROJECTS \
<<< $(grep 'set(LLVM_ALL_PROJECTS ' llvm/CMakeLists.txt | cut -d\" -f2) <<< $(grep 'set(LLVM_ALL_PROJECTS ' llvm/CMakeLists.txt | cut -d\" -f2)
local project local project
for project in "${llvm_projects[@]}"; do for project in "${llvm_projects[@]}"; do
llvm-cmake-generate "${build_type}" "${project}" ossbuild-generate-llvm "${build_type}" "${project}"
done done
} }
@ -262,15 +262,15 @@ ossbuild-llvm() {
local version="${1:-15.0.5}" local version="${1:-15.0.5}"
local build_type="${2:-Release}" # or 'RelWithDebInfo', but beware of the huge binaries local build_type="${2:-Release}" # or 'RelWithDebInfo', but beware of the huge binaries
llvm-source-workon "${version}" ossbuild-prepare-llvm "${version}"
llvm-cmake-generate "${build_type}" ossbuild-generate-llvm "${build_type}"
# Ideally, llcm-cmake-build should build the most LLVM projects. However, if # Ideally, llcm-cmake-build should build the most LLVM projects. However, if
# it doesn't, it might make sense to build projects individually (see # it doesn't, it might make sense to build projects individually (see
# `llvm-cmake-generate-fallback` above). # `ossbuild-generate-llvm-fallback` above).
llvm-cmake-build "${build_type}" ossbuild-build-llvm "${build_type}"
# Install the toolchain # Install the toolchain
llvm-cmake-install "${build_type}" ossbuild-install-llvm "${build_type}"
return $? return $?
} }

View File

@ -12,7 +12,7 @@ source "${LIB_DIR}/ossbuild-common.bash"
#PROTOBUF_DEFAULT_VERSION='23.3' #PROTOBUF_DEFAULT_VERSION='23.3'
#https://github.com/protocolbuffers/protobuf/releases/download/v23.3/protobuf-23.3.tar.gz #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 local version gh_url archive archive_url src_tree
ossbuild-project-var-get -v version VERSION ossbuild-project-var-get -v version VERSION
ossbuild-project-var-get -v gh_url GH_URL 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 local src_tree build_tree
ossbuild-project-var-get -v src_tree SRC_TREE ossbuild-project-var-get -v src_tree SRC_TREE
build_tree="${src_tree}/ossbuild" build_tree="${src_tree}/ossbuild"
@ -62,7 +62,7 @@ ossbuild-protobuf-build() {
ossbuild-cmd cmake --build "${build_tree}" ossbuild-cmd cmake --build "${build_tree}"
} }
ossbuild-protobuf-install() { ossbuild-install-protobuf() {
local build_tree local build_tree
ossbuild-project-var-get -v build_tree BUILD_TREE ossbuild-project-var-get -v build_tree BUILD_TREE
@ -75,9 +75,12 @@ ossbuild-protobuf-install() {
ossbuild-cmd "${cmd[@]}" ossbuild-cmd "${cmd[@]}"
} }
_main_() { ossbuild-protobuf() {
ossbuild-project-gh-init 'protocolbuffers' 'protobuf' ossbuild-project-gh-init 'protocolbuffers' 'protobuf'
ossbuild-project-build-steps-all "${@}" 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 # shellcheck disable=SC2034
QUILT_DEFAULT_VERSION='0.67' QUILT_DEFAULT_VERSION='0.67'
ossbuild-quilt-prepare() { ossbuild-prepare-quilt() {
# download URL example: # download URL example:
# http://download.savannah.gnu.org/releases/quilt/quilt-0.67.tar.gz # http://download.savannah.gnu.org/releases/quilt/quilt-0.67.tar.gz
ossbuild-archive-gnu-prepare \ ossbuild-archive-gnu-prepare \
"http://download.savannah.gnu.org/releases/quilt" "http://download.savannah.gnu.org/releases/quilt"
} }
ossbuild-quilt-build() { ossbuild-build-quilt() {
# quilt does not support a separate build tree # quilt does not support a separate build tree
ossbuild-project-var-set BUILD_TREE "$(ossbuild-project-var-get SRC_TREE)" ossbuild-project-var-set BUILD_TREE "$(ossbuild-project-var-get SRC_TREE)"
ossbuild-autotools-generic-build ossbuild-autotools-build
} }
ossbuild-quilt-install() { ossbuild-install-quilt() {
ossbuild-autotools-generic-install ossbuild-autotools-install
} }
_main_() { ossbuild-quilt() {
ossbuild-project-build-steps-all "${@}" ossbuild-project-build-steps-all "${@}"
} }
_main_ "${@}" #
# run script, skip if sourced (while avoiding shellcheck issues)
#
(return 0 2>/dev/null) || ossbuild-quilt "${@}"