From c70efec479f8e39013210b8ca1dfb2f5bb5d1781 Mon Sep 17 00:00:00 2001 From: Scott Little Date: Fri, 5 Jun 2020 00:00:36 -0400 Subject: [PATCH] Add a dependency checker to build-pkgs Builds a single package in a clean environment to detect missing build dependencies. Usage: build-pkgs --dep-test Note: Should only be run after a full 'build-pkgs'. We want the build to fail because a dependency wasn't been listed, not because a dependency hasn't been built yet. Closes-Bug: 1880248 Change-Id: Icf64be37a77de0992647c37ce392fd5a2a458fba Signed-off-by: Scott Little --- build-tools/build-pkgs-parallel | 9 +++++-- build-tools/build-pkgs-serial | 10 ++++++-- build-tools/build-rpms-parallel | 36 ++++++++++++++++++++------- build-tools/build-rpms-serial | 44 +++++++++++++++++++++++---------- 4 files changed, 73 insertions(+), 26 deletions(-) diff --git a/build-tools/build-pkgs-parallel b/build-tools/build-pkgs-parallel index 528b3ad9..03a90cae 100755 --- a/build-tools/build-pkgs-parallel +++ b/build-tools/build-pkgs-parallel @@ -18,7 +18,6 @@ BUILD_PKGS_PARALLEL_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}" )" )" source "${BUILD_PKGS_PARALLEL_DIR}/git-utils.sh" source "${BUILD_PKGS_PARALLEL_DIR}/spec-utils" - usage () { echo "" echo "Usage: " @@ -30,6 +29,10 @@ usage () { echo " i.e. while debugging compilation failures." echo " build-pkgs-parallel [--layer] [--build-avoidance | --no-build-avoidance] [--no-descendants] [--no-required] [--no-build-info] [--no-autoclean] [--careful] [--formal] [ list of package names ]" echo "" + echo " Test build dependencies of a package:" + echo " Note: A full build of all packages should preceed the dependency test build" + echo " build-pkgs-parallel --dep-test " + echo "" echo " Delete source rpms, and the directories associated with it's creation:" echo " Note: does not clean an edit environment" echo " build-pkgs-parallel --clean [--build-avoidance | --no-build-avoidance] [ list of package names ]" @@ -57,12 +60,13 @@ STD_BUILD=1 RT_BUILD=1 INSTALLER_BUILD=0 CONTAINERS_BUILD=0 +DEP_TEST_FLAG=0 export BUILD_AVOIDANCE_URL="" # read the options -TEMP=$(getopt -o h --long parallel,rt,std,installer,containers,layer:,edit,build-avoidance,no-build-avoidance,build-avoidance-dir:,build-avoidance-host:,build-avoidance-user:,build-avoidance-day:,no-meta-patch,no-descendants,no-required,no-build-info,no-autoclean,formal,careful,help,clean,append-log -n 'build-pkgs-parallel' -- "$@") +TEMP=$(getopt -o h --long parallel,rt,std,installer,containers,layer:,edit,build-avoidance,no-build-avoidance,build-avoidance-dir:,build-avoidance-host:,build-avoidance-user:,build-avoidance-day:,no-meta-patch,no-descendants,no-required,no-build-info,no-autoclean,formal,careful,help,clean,dep-test,append-log -n 'build-pkgs-parallel' -- "$@") if [ $? -ne 0 ]; then usage exit 1 @@ -98,6 +102,7 @@ while true ; do --no-meta-patch) EXTRA_ARGS_SRPM+=" --no-meta-patch" ; shift ;; -h|--help) HELP=1 ; shift ;; --clean) CLEAN_FLAG=1 ; shift ;; + --dep-test) DEP_TEST_FLAG=1; EXTRA_ARGS_RPM+=" --dep-test"; shift ;; --edit) EDIT_FLAG=1 ; EXTRA_ARGS_SRPM+=" --edit"; shift ;; --rt) STD_BUILD=0 ; shift ;; --std) RT_BUILD=0 ; shift ;; diff --git a/build-tools/build-pkgs-serial b/build-tools/build-pkgs-serial index be871355..03fec5df 100755 --- a/build-tools/build-pkgs-serial +++ b/build-tools/build-pkgs-serial @@ -30,6 +30,10 @@ usage () { echo " i.e. while debugging compilation failures." echo " build-pkgs-serial [--build-avoidance | --no-build-avoidance] [--no-descendants] [--no-required] [--no-build-info] [--no-autoclean] [--careful] [--formal] [ list of package names ]" echo "" + echo " Test build dependencies of a package:" + echo " Note: A full build of all packages should preceed the dependency test build" + echo " build-pkgs-serial --dep-test " + echo "" echo " Delete source rpms, and the directories associated with it's creation:" echo " Note: does not clean an edit environment" echo " build-pkgs-serial --clean [--build-avoidance | --no-build-avoidance] [ list of package names ]" @@ -57,12 +61,13 @@ STD_BUILD=1 RT_BUILD=1 INSTALLER_BUILD=0 CONTAINERS_BUILD=0 +DEP_TEST_FLAG=0 export BUILD_AVOIDANCE_URL="" # read the options -TEMP=$(getopt -o h --long serial,rt,std,installer,containers,layer:,edit,build-avoidance,no-build-avoidance,build-avoidance-dir:,build-avoidance-host:,build-avoidance-user:,build-avoidance-day:,no-meta-patch,no-descendants,no-required,no-build-info,no-autoclean,formal,careful,help,clean,append-log -n 'build-pkgs-serial' -- "$@") +TEMP=$(getopt -o h --long serial,rt,std,installer,containers,layer:,edit,build-avoidance,no-build-avoidance,build-avoidance-dir:,build-avoidance-host:,build-avoidance-user:,build-avoidance-day:,no-meta-patch,no-descendants,no-required,no-build-info,no-autoclean,formal,careful,help,clean,dep-test,append-log -n 'build-pkgs-serial' -- "$@") if [ $? -ne 0 ]; then usage exit 1 @@ -98,6 +103,7 @@ while true ; do --no-meta-patch) EXTRA_ARGS_SRPM+=" --no-meta-patch" ; shift ;; -h|--help) HELP=1 ; shift ;; --clean) CLEAN_FLAG=1 ; shift ;; + --dep-test) DEP_TEST_FLAG=1; EXTRA_ARGS_RPM+=" --dep-test"; shift ;; --edit) EDIT_FLAG=1 ; EXTRA_ARGS_SRPM+=" --edit"; shift ;; --rt) STD_BUILD=0 ; shift ;; --std) RT_BUILD=0 ; shift ;; @@ -427,7 +433,7 @@ function launch_build() if [ $EDIT_FLAG -ne 1 ]; then echo -e "\n######## $(date): Launching build-rpms-serial --$build_type $EXTRA_ARGS $@\n" | tee --append $logfile - echo "${BUILD_PKGS_SERIAL_DIR}/build-rpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $targets" | tee --append $logfile + echo "${BUILD_PKGS_SERIAL_DIR}/build-rpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $targets" | tee --append $logfile ${BUILD_PKGS_SERIAL_DIR}/build-rpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $targets 2>&1 | tee --append $logfile rc=${PIPESTATUS[0]} if [ $rc -eq 0 ]; then diff --git a/build-tools/build-rpms-parallel b/build-tools/build-rpms-parallel index bdb04ed5..12fa21ad 100755 --- a/build-tools/build-rpms-parallel +++ b/build-tools/build-rpms-parallel @@ -29,7 +29,6 @@ export ME=$(basename "$0") CMDLINE="$ME $@" - # Build for distribution. Currently 'centos' is only supported value. export DISTRO="centos" @@ -98,6 +97,7 @@ usage () { echo "" echo "Usage: " echo " $ME [ [--rt] [--no-required] [--no-descendants] [--no-build-info] [--no-autoclean] [--formal] ]" + echo " $ME --dep-test " echo " $ME --clean [ [--no-descendants] ]" echo " $ME --help" echo "" @@ -1422,9 +1422,10 @@ HELP=0 CLEAN_FLAG=0 FORMAL_FLAG=0 CAREFUL=0 +DEP_TEST_FLAG=0 # read the options -TEMP=$(getopt -o h --long parallel,std,rt,installer,containers,no-required,no-descendants,no-autoclean,no-build-info,clean,tmpfs-clean,formal,careful,help,layer: -n "$ME" -- "$@") +TEMP=$(getopt -o h --long parallel,std,rt,installer,containers,no-required,no-descendants,no-autoclean,no-build-info,dep-test,clean,tmpfs-clean,formal,careful,help,layer: -n "$ME" -- "$@") if [ $? -ne 0 ]; then usage @@ -1451,6 +1452,7 @@ while true ; do --containers) BUILD_TYPE=containers; shift ;; -h|--help) HELP=1 ; shift ;; --clean) CLEAN_FLAG=1 ; shift ;; + --dep-test) DEP_TEST_FLAG=1 ; MAX_WORKERS=1; NO_DESCENDANTS=1; NO_REQUIRED=1; NO_BUILD_INFO=1; shift ;; --tmpfs-clean) if [ -n "$MY_WORKSPACE" ]; then export MY_WORKSPACE=$MY_WORKSPACE/$BUILD_TYPE; exit 0; fi ;; --parallel) shift ;; --layer) export LAYER=$2 ; shift ; shift ;; @@ -1621,12 +1623,23 @@ fi ALL=0 UNRESOLVED_TARGETS=" " -if [ "x$TARGETS" == "x" ]; then - echo "make: all" - ALL=1 + +if [ $DEP_TEST_FLAG -eq 1 ]; then + # we expect exactly one package + if [ $(echo $TARGETS | wc -w) -ne 1 ]; then + echo "ERROR: dependency testing requires exactly one package" + usage + exit 1 + fi else - echo "make: $TARGETS" - UNRESOLVED_TARGETS="$TARGETS" + # we accept a list of packages, and no list implies all + if [ "x$TARGETS" == "x" ]; then + echo "make: all" + ALL=1 + else + echo "make: $TARGETS" + UNRESOLVED_TARGETS="$TARGETS" + fi fi if [ "$BUILD_TYPE" != "std" ]; then @@ -1760,8 +1773,13 @@ clean_list () { \rm -f -v $RESULT_DIR/mockchain.log 2>> /dev/null mock_clean else - # Wipe only traces of what we built - mock_partial_clean "$SRPMS_LIST" "$RPMS_LIST" + # If dependency test + if [ $DEP_TEST_FLAG -eq 1 ]; then + mock_clean + else + # Wipe only traces of what we built + mock_partial_clean "$SRPMS_LIST" "$RPMS_LIST" + fi fi } diff --git a/build-tools/build-rpms-serial b/build-tools/build-rpms-serial index 7eb87fc1..9acd91f9 100755 --- a/build-tools/build-rpms-serial +++ b/build-tools/build-rpms-serial @@ -61,6 +61,7 @@ usage () { echo "" echo "Usage: " echo " $ME [ [--rt] [--no-required] [--no-descendants] [--no-build-info] [--no-autoclean] [--formal] ]" + echo " $ME --dep-test " echo " $ME --clean [ [--no-descendants] ]" echo " $ME --help" echo "" @@ -1191,9 +1192,10 @@ HELP=0 CLEAN_FLAG=0 FORMAL_FLAG=0 CAREFUL=0 +DEP_TEST_FLAG=0 # read the options -TEMP=$(getopt -o h --long serial,std,rt,installer,containers,no-required,no-descendants,no-autoclean,no-build-info,clean,formal,careful,help,layer: -n "$ME" -- "$@") +TEMP=$(getopt -o h --long serial,std,rt,installer,containers,no-required,no-descendants,no-autoclean,no-build-info,dep-test,clean,formal,careful,help,layer: -n "$ME" -- "$@") if [ $? -ne 0 ]; then usage @@ -1220,6 +1222,7 @@ while true ; do --containers) BUILD_TYPE=containers; shift ;; -h|--help) HELP=1 ; shift ;; --clean) CLEAN_FLAG=1 ; shift ;; + --dep-test) DEP_TEST_FLAG=1 ; MAX_WORKERS=1; NO_DESCENDANTS=1; NO_REQUIRED=1; NO_BUILD_INFO=1; shift ;; --serial) shift ;; --layer) export LAYER=$2 ; shift ; shift ;; --) shift ; break ;; @@ -1304,13 +1307,12 @@ RELEASE_INFO_FILE="$(get_release_info)" if [ -f "$RELEASE_INFO_FILE" ]; then source "$RELEASE_INFO_FILE" else - echo "ERROR: failed to find RELEASE_INFO_FILE=$RELEASE_INFO_FILE" - exit 1 + echo "Warning: failed to find RELEASE_INFO_FILE=$RELEASE_INFO_FILE" fi if [ "x$PLATFORM_RELEASE" == "x" ]; then - echo "ERROR: PLATFORM_RELEASE is not defined in $RELEASE_INFO_FILE" - exit 1 + echo "Warning: PLATFORM_RELEASE is not defined in $RELEASE_INFO_FILE" + PLATFORM_RELEASE="00.00" fi export RPM_BUILD_BASE="$RPM_BUILD_ROOT" @@ -1370,7 +1372,7 @@ fi # create temp dir export TMPDIR="$MY_WORKSPACE/tmp" -mkdir -p $TMPDIR +mkdir -p "$TMPDIR" # Create symlinks from /var/... to /localdisk/loadbuild/... if on a build server @@ -1386,12 +1388,23 @@ fi ALL=0 UNRESOLVED_TARGETS=" " -if [ "x$TARGETS" == "x" ]; then - echo "make: all" - ALL=1 + +if [ $DEP_TEST_FLAG -eq 1 ]; then + # we expect exactly one package + if [ $(echo $TARGETS | wc -w) -ne 1 ]; then + echo "ERROR: dependency testing requires exactly one package" + usage + exit 1 + fi else - echo "make: $TARGETS" - UNRESOLVED_TARGETS="$TARGETS" + # we accept a list of packages, and no list implies all + if [ "x$TARGETS" == "x" ]; then + echo "make: all" + ALL=1 + else + echo "make: $TARGETS" + UNRESOLVED_TARGETS="$TARGETS" + fi fi if [ "$BUILD_TYPE" != "std" ]; then @@ -1520,8 +1533,13 @@ clean_list () { \rm -f -v $RESULT_DIR/mockchain.log 2>> /dev/null mock_clean else - # Wipe only traces of what we built - mock_partial_clean "$SRPMS_LIST" "$RPMS_LIST" + # If dependency test + if [ $DEP_TEST_FLAG -eq 1 ]; then + mock_clean + else + # Wipe only traces of what we built + mock_partial_clean "$SRPMS_LIST" "$RPMS_LIST" + fi fi }