chore: Unify build configuration script into one

Earlier ci/meson-build.sh and ci/ci-build.sh.
The latter we then renamed to the more descriptive build-configuration-matrix.sh.

Both scripts are doing the same thing but for different build systems.
So lets merge them together.

Signed-off-by: Michael Vetter <jubalh@iodoru.org>
This commit is contained in:
Michael Vetter
2026-03-21 00:53:54 +01:00
parent beef714a30
commit a8c7850a97
5 changed files with 171 additions and 195 deletions

View File

@@ -36,13 +36,13 @@ jobs:
buildsystem: meson buildsystem: meson
tests: unit tests: unit
omemo: signal omemo: signal
script: ./ci/ci-meson-build.sh script: ./scripts/build-configuration-matrix.sh meson
omemo_env: libsignal omemo_env: libsignal
- flavor: debian - flavor: debian
buildsystem: meson buildsystem: meson
tests: unit tests: unit
omemo: libomemo omemo: libomemo
script: ./ci/ci-meson-build.sh script: ./scripts/build-configuration-matrix.sh meson
omemo_env: libomemo-c omemo_env: libomemo-c
name: ${{ matrix.flavor }} | ${{ matrix.buildsystem }} | ${{ matrix.tests }} | ${{ matrix.omemo }} name: ${{ matrix.flavor }} | ${{ matrix.buildsystem }} | ${{ matrix.tests }} | ${{ matrix.omemo }}

View File

@@ -214,7 +214,7 @@ In cases where you want to disable automatic formatting for a specific block of
## Verification & Testing ## Verification & Testing
### Running unit tests ### Running unit tests
Run `make check` to run the unit tests with your current configuration or `./scripts/build-configuration-matrix.sh` to check with different switches passed to configure. Run `make check` to run the unit tests with your current configuration or `./scripts/build-configuration-matrix.sh [autotools|meson]` to check with different switches passed to configure.
### Writing unit tests ### Writing unit tests
We use the [cmocka](https://cmocka.org/) testing framework for unit tests. We use the [cmocka](https://cmocka.org/) testing framework for unit tests.

View File

@@ -1,72 +0,0 @@
#!/usr/bin/env bash
# Exit on error
set -e
error_handler()
{
ERR_CODE=$?
echo
echo "Error ${ERR_CODE} with command '${BASH_COMMAND}' on line ${BASH_LINENO[0]}. Exiting."
# Meson logs are stored in the build directory
for log in build_run/meson-logs/testlog.txt build_valgrind/meson-logs/testlog.txt; do
if [ -f "$log" ]; then
echo "--- Meson Test Log ($log) ---"
cat "$log"
fi
done
exit ${ERR_CODE}
}
trap error_handler ERR
tests=(
"-Dnotifications=enabled -Dicons-and-clipboard=enabled -Dotr=enabled -Dpgp=enabled -Domemo=enabled -Dc-plugins=enabled -Dpython-plugins=enabled -Dxscreensaver=enabled -Domemo-qrcode=enabled -Dgdk-pixbuf=enabled"
""
"-Dnotifications=disabled"
"-Dicons-and-clipboard=disabled"
"-Dotr=disabled"
"-Dpgp=disabled"
"-Domemo=disabled -Domemo-qrcode=disabled"
"-Dpgp=disabled -Dotr=disabled"
"-Dpgp=disabled -Dotr=disabled -Domemo=disabled"
"-Dpython-plugins=disabled"
"-Dc-plugins=disabled"
"-Dc-plugins=disabled -Dpython-plugins=disabled"
"-Dxscreensaver=disabled"
"-Dgdk-pixbuf=disabled"
)
BACKEND_OPT=""
if [ -n "${OMEMO_BACKEND}" ]; then
BACKEND_OPT="-Domemo-backend=${OMEMO_BACKEND}"
fi
# Run Valgrind check (Only on Linux, on first/full feature set)
if [[ "$(uname | tr '[:upper:]' '[:lower:]')" == linux* ]]; then
echo "--> Running Valgrind check with full features ${BACKEND_OPT}"
meson setup build_valgrind ${tests[0]} ${BACKEND_OPT} -Dtests=true -Db_sanitize=address,undefined
meson compile -C build_valgrind
meson test -C build_valgrind "unit tests" --print-errorlogs --wrap=valgrind || echo "Valgrind issues detected"
rm -rf build_valgrind
fi
# Iterate through all feature combinations
for features in "${tests[@]}"
do
echo "----------------------------------------------------"
echo "--> Building with: ${features} ${BACKEND_OPT}"
echo "----------------------------------------------------"
rm -rf build_run
meson setup build_run ${features} ${BACKEND_OPT} -Dtests=true
meson compile -C build_run
meson test -C build_run "unit tests" --print-errorlogs
./build_run/profanity -v
done

View File

@@ -14,10 +14,11 @@ Central validation script mainly for local development.
- `--install`: Install the script as a git `pre-commit` hook. - `--install`: Install the script as a git `pre-commit` hook.
## `build-configuration-matrix.sh` ## `build-configuration-matrix.sh`
Exhaustive build configuration matrix testing. It ensures that Profanity compiles and passes unit tests across a variety of feature configurations. Exhaustive build configuration matrix testing. It ensures that Profanity compiles and passes unit tests across a variety of feature configurations for both Autotools and Meson.
- **Purpose:** Verifies architectural compatibility by testing many combinations of build flags. - **Purpose:** Verifies architectural compatibility by testing many combinations of build flags.
- **Usage:** `./scripts/build-configuration-matrix.sh` - **Usage:** `./scripts/build-configuration-matrix.sh [autotools|meson] [extra-args]`
- **Extra Arguments:** Any arguments passed after the build system are forwarded directly to the configuration command (`./configure` or `meson setup`).
- **Environment:** Primarily used in CI (GitHub Actions), but can be run locally to verify all configurations. - **Environment:** Primarily used in CI (GitHub Actions), but can be run locally to verify all configurations.
## `changelog-helper.py` ## `changelog-helper.py`

View File

@@ -1,9 +1,16 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Exhaustive build configuration matrix testing for Profanity # Exhaustive build configuration matrix testing for Profanity
# Supports both Autotools and Meson
log_content() set -e
{
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_content() {
echo echo
if [ -f "$1" ]; then if [ -f "$1" ]; then
echo "Content of $1:" echo "Content of $1:"
@@ -13,144 +20,184 @@ log_content()
fi fi
} }
error_handler() error_handler() {
{
ERR_CODE=$? ERR_CODE=$?
echo -e "${RED}Error ${ERR_CODE} with command '${BASH_COMMAND}' on line ${BASH_LINENO[0]}. Exiting.${NC}"
log_content ./config.log if [ "$BUILD_SYSTEM" == "autotools" ]; then
log_content ./test-suite.log log_content ./config.log
log_content ./test-suite-memcheck.log log_content ./test-suite.log
log_content ./test-suite-memcheck.log
echo else
echo "Error ${ERR_CODE} with command '${BASH_COMMAND}' on line ${BASH_LINENO[0]}. Exiting." for log in build_run/meson-logs/testlog.txt build_valgrind/meson-logs/testlog.txt; do
echo if [ -f "$log" ]; then
echo "--- Meson Test Log ($log) ---"
cat "$log"
fi
done
fi
exit ${ERR_CODE} exit ${ERR_CODE}
} }
trap error_handler ERR trap error_handler ERR
num_cores() num_cores() {
{
# Check for cores, for systems with:
# Line 1. Linux w/ coreutils, or...
# Line 2. OpenBSD, FreeBSD, NetBSD or macOS, or...
# Line 3. Fallback for Linux w/o coreutils (glibc).
nproc \ nproc \
|| sysctl -n hw.ncpu \ || sysctl -n hw.ncpu \
|| getconf _NPROCESSORS_ONLN 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null \
|| echo 2
} }
./bootstrap.sh usage() {
echo "Usage: $0 [autotools|meson] [extra-args]"
echo ""
echo "Run exhaustive build matrix tests for the specified build system."
echo "Default build system is 'autotools'."
echo ""
echo "Extra arguments are passed directly to the configuration command:"
echo " - Autotools: ./configure [extra-args]"
echo " - Meson: meson setup [extra-args]"
exit 0
}
tests=() # Determine build system
MAKE="make --quiet -j$(num_cores)" BUILD_SYSTEM="autotools"
CC="gcc" if [[ "$1" == "autotools" || "$1" == "meson" ]]; then
BUILD_SYSTEM="$1"
shift
fi
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
usage
fi
ARCH="$(uname | tr '[:upper:]' '[:lower:]')" ARCH="$(uname | tr '[:upper:]' '[:lower:]')"
EXTRA_ARGS="$*"
case "$ARCH" in if [ "$BUILD_SYSTEM" == "autotools" ]; then
linux*) echo -e "${YELLOW}---> Starting Autotools build matrix...${NC}"
tests=( ./bootstrap.sh
"--enable-notifications --enable-icons-and-clipboard --enable-otr --enable-pgp
--enable-omemo --enable-plugins --enable-c-plugins
--enable-python-plugins --with-xscreensaver --enable-omemo-qrcode --enable-gdk-pixbuf"
"--disable-notifications --disable-icons-and-clipboard --disable-otr --disable-pgp
--disable-omemo --disable-plugins --disable-c-plugins
--disable-python-plugins --without-xscreensaver"
"--disable-notifications"
"--disable-icons-and-clipboard"
"--disable-otr"
"--disable-pgp"
"--disable-omemo --disable-omemo-qrcode"
"--disable-pgp --disable-otr"
"--disable-pgp --disable-otr --disable-omemo"
"--disable-plugins"
"--disable-python-plugins"
"--disable-c-plugins"
"--disable-c-plugins --disable-python-plugins"
"--without-xscreensaver"
"--disable-gdk-pixbuf"
"")
source /etc/profile.d/debuginfod.sh 2>/dev/null || true
;;
darwin*)
tests=(
"--enable-notifications --enable-icons-and-clipboard --enable-otr --enable-pgp
--enable-omemo --enable-plugins --enable-c-plugins
--enable-python-plugins"
"--disable-notifications --disable-icons-and-clipboard --disable-otr --disable-pgp
--disable-omemo --disable-plugins --disable-c-plugins
--disable-python-plugins"
"--disable-notifications"
"--disable-icons-and-clipboard"
"--disable-otr"
"--disable-pgp"
"--disable-omemo"
"--disable-pgp --disable-otr"
"--disable-pgp --disable-otr --disable-omemo"
"--disable-plugins"
"--disable-python-plugins"
"--disable-c-plugins"
"--disable-c-plugins --disable-python-plugins"
"")
;;
openbsd*)
MAKE="gmake"
# TODO(#1231):
# `-std=gnu99 -fexec-charset=UTF-8` to silence:
# src/event/server_events.c:1453:19: error: universal character names are only valid in C++ and C99
# src/event/server_events.c:1454:19: error: universal character names are only valid in C++ and C99
CC="egcc -std=gnu99 -fexec-charset=UTF-8"
tests=( MAKE="make --quiet -j$(num_cores)"
"--enable-notifications --enable-icons-and-clipboard --enable-otr --enable-pgp CC="gcc"
--enable-omemo --enable-plugins --enable-c-plugins
--enable-python-plugins"
"--disable-notifications --disable-icons-and-clipboard --disable-otr --disable-pgp
--disable-omemo --disable-plugins --disable-c-plugins
--disable-python-plugins"
"--disable-notifications"
"--disable-icons-and-clipboard"
"--disable-otr"
"--disable-pgp"
"--disable-omemo"
"--disable-pgp --disable-otr"
"--disable-pgp --disable-otr --disable-omemo"
"--disable-plugins"
"--disable-python-plugins"
"--disable-c-plugins"
"--disable-c-plugins --disable-python-plugins"
"")
;;
esac
case "$ARCH" in case "$ARCH" in
linux*) linux*)
echo tests=(
echo "--> Building with ./configure ${tests[0]} --enable-valgrind --disable-functional-tests $*" "--enable-notifications --enable-icons-and-clipboard --enable-otr --enable-pgp
echo --enable-omemo --enable-plugins --enable-c-plugins
--enable-python-plugins --with-xscreensaver --enable-omemo-qrcode --enable-gdk-pixbuf"
# shellcheck disable=SC2086 "--disable-notifications --disable-icons-and-clipboard --disable-otr --disable-pgp
./configure ${tests[0]} --enable-valgrind --disable-functional-tests $* --disable-omemo --disable-plugins --disable-c-plugins
--disable-python-plugins --without-xscreensaver"
"--disable-notifications"
"--disable-icons-and-clipboard"
"--disable-otr"
"--disable-pgp"
"--disable-omemo --disable-omemo-qrcode"
"--disable-pgp --disable-otr"
"--disable-pgp --disable-otr --disable-omemo"
"--disable-plugins"
"--disable-python-plugins"
"--disable-c-plugins"
"--disable-c-plugins --disable-python-plugins"
"--without-xscreensaver"
"--disable-gdk-pixbuf"
"")
source /etc/profile.d/debuginfod.sh 2>/dev/null || true
;;
*)
# Darwin, OpenBSD, etc.
if [ "$ARCH" == "openbsd*" ]; then
MAKE="gmake"
CC="egcc -std=gnu99 -fexec-charset=UTF-8"
fi
tests=(
"--enable-notifications --enable-icons-and-clipboard --enable-otr --enable-pgp
--enable-omemo --enable-plugins --enable-c-plugins
--enable-python-plugins"
"--disable-notifications --disable-icons-and-clipboard --disable-otr --disable-pgp
--disable-omemo --disable-plugins --disable-c-plugins
--disable-python-plugins"
"--disable-notifications"
"--disable-icons-and-clipboard"
"--disable-otr"
"--disable-pgp"
"--disable-omemo"
"--disable-pgp --disable-otr"
"--disable-pgp --disable-otr --disable-omemo"
"--disable-plugins"
"--disable-python-plugins"
"--disable-c-plugins"
"--disable-c-plugins --disable-python-plugins"
"")
;;
esac
# Valgrind check (Linux only)
if [[ "$ARCH" == linux* ]]; then
echo -e "${YELLOW}--> Building with ./configure ${tests[0]} --enable-valgrind --disable-functional-tests ${EXTRA_ARGS}${NC}"
./configure ${tests[0]} --enable-valgrind --disable-functional-tests ${EXTRA_ARGS}
$MAKE CC="${CC}" $MAKE CC="${CC}"
$MAKE check-valgrind $MAKE check-valgrind
$MAKE distclean $MAKE distclean
;; fi
esac
for features in "${tests[@]}" for features in "${tests[@]}"
do do
echo echo -e "${YELLOW}--> Building with ./configure ${features} --disable-functional-tests ${EXTRA_ARGS}${NC}"
echo "--> Building with ./configure ${features} --disable-functional-tests $*" ./configure $features --disable-functional-tests ${EXTRA_ARGS}
echo $MAKE CC="${CC}"
$MAKE check-unit
./profanity -v
$MAKE clean
done
# shellcheck disable=SC2086 else
./configure $features --disable-functional-tests $* # Meson Build Matrix
echo -e "${YELLOW}---> Starting Meson build matrix...${NC}"
$MAKE CC="${CC}" tests=(
$MAKE check-unit "-Dnotifications=enabled -Dicons-and-clipboard=enabled -Dotr=enabled -Dpgp=enabled -Domemo=enabled -Dc-plugins=enabled -Dpython-plugins=enabled -Dxscreensaver=enabled -Domemo-qrcode=enabled -Dgdk-pixbuf=enabled"
""
"-Dnotifications=disabled"
"-Dicons-and-clipboard=disabled"
"-Dotr=disabled"
"-Dpgp=disabled"
"-Domemo=disabled -Domemo-qrcode=disabled"
"-Dpgp=disabled -Dotr=disabled"
"-Dpgp=disabled -Dotr=disabled -Domemo=disabled"
"-Dpython-plugins=disabled"
"-Dc-plugins=disabled"
"-Dc-plugins=disabled -Dpython-plugins=disabled"
"-Dxscreensaver=disabled"
"-Dgdk-pixbuf=disabled"
)
./profanity -v BACKEND_OPT=""
$MAKE clean if [ -n "${OMEMO_BACKEND}" ]; then
done BACKEND_OPT="-Domemo-backend=${OMEMO_BACKEND}"
fi
# Valgrind check (Linux only)
if [[ "$ARCH" == linux* ]]; then
echo -e "${YELLOW}--> Running Valgrind check with full features ${BACKEND_OPT} ${EXTRA_ARGS}${NC}"
rm -rf build_valgrind
meson setup build_valgrind ${tests[0]} ${BACKEND_OPT} -Dtests=true -Db_sanitize=address,undefined ${EXTRA_ARGS}
meson compile -C build_valgrind
meson test -C build_valgrind "unit tests" --print-errorlogs --wrap=valgrind || echo "Valgrind issues detected"
rm -rf build_valgrind
fi
for features in "${tests[@]}"
do
echo -e "${YELLOW}--> Building with: ${features} ${BACKEND_OPT} ${EXTRA_ARGS}${NC}"
rm -rf build_run
meson setup build_run ${features} ${BACKEND_OPT} -Dtests=true ${EXTRA_ARGS}
meson compile -C build_run
meson test -C build_run "unit tests" --print-errorlogs
./build_run/profanity -v
done
fi
echo -e "${GREEN}Build configuration matrix testing successful!${NC}"