root/build-tools/build_minimal_iso/cgts_deps.sh
Scott Little 77576b7207 Add support CentOS-8/dnf/mock-2.6 based builds
This update will retain support for CentOS-7/yum/mock-1.4 based builds.
The build environment will be queried to discover which environment
it is building in, and modify the commands we issue accordingly.

In CentOS 8, DNF replaces both YUM and REPOQUERY.
While DNF tries to be a transparent replacement of the old tools,
there are also subtle changes to the supported arguments.

I will provide independent mock.cfg.prototypes for centos7 vs centos8.
Changes in generate-centos-repo.sh under stx-tools will be required to
select the correct prototype.

Add support for mock 2.6. Mock 2.6 is python 3, and it processes the
'root' and 'rootdir' arguments slightly differently.

Also change the order of arguments to tar within default_build_srpm.
The latest tar only honors '--exclude' if it precedes other arguments.

Story: 2006729
Depends-On: https://review.opendev.org/762700
Signed-off-by: Scott Little <scott.little@windriver.com>
Change-Id: I826be2051e535e6a4c08ad17124f453b04210668
2020-12-08 14:13:28 -05:00

266 lines
8.7 KiB
Bash
Executable File

#!/bin/env bash
#
# Copyright (c) 2018-2020 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
CGTS_DEPS_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}" )" )"
# Set REPOQUERY, REPOQUERY_SUB_COMMAND, REPOQUERY_RESOLVE and
# REPOQUERY_WHATPROVIDES_DELIM for our build environment.
source ${CGTS_DEPS_DIR}/../pkg-manager-utils.sh
function generate_dep_list {
TMP_RPM_DB=$(mktemp -d $(pwd)/tmp_rpm_db_XXXXXX)
mkdir -p $TMP_RPM_DB
rpm --initdb --dbpath $TMP_RPM_DB
rpm --dbpath $TMP_RPM_DB --test -Uvh --replacefiles '*.rpm' > $DEPLISTFILE_NEW 2>&1
cat $DEPLISTFILE_NEW >> $DEPDETAILLISTFILE
cat $DEPLISTFILE_NEW \
| grep -v -e "error:" -e "warning:" -e "Preparing..." \
-e "Verifying..." -e "installing package" \
| sed -e "s/ is needed by.*$//" -e "s/ [<=>].*$//" \
| sort -u > $DEPLISTFILE
\rm -rf $TMP_RPM_DB
}
join_array() {
local IFS="$1"
shift
echo "$*"
}
function install_deps {
local DEP_LIST=""
local DEP_LIST_ARRAY=()
local DEP_LIST_FILE="$1"
rm -f $TMPFILE
while read DEP
do
DEP_LIST_ARRAY+=( "${DEP}" )
done < $DEP_LIST_FILE
if [ "${REPOQUERY_WHATPROVIDES_DELIM}" != " " ]; then
DEP_LIST_ARRAY=( "$(join_array "${REPOQUERY_WHATPROVIDES_DELIM}" "${DEP_LIST_ARRAY[@]}" )" )
fi
echo "Debug: List of deps to resolve: ${DEP_LIST_ARRAY[@]}"
if [ ${#DEP_LIST_ARRAY[@]} -gt 0 ]; then
return 0
fi
# go through each repo and convert deps to packages
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
echo "TMPDIR=${TMP_DIR}"\
"${REPOQUERY} --config=${YUM} --repoid=${REPOID}"\
"${REPOQUERY_SUB_COMMAND} --arch=x86_64,noarch"\
"--qf='%{name}' --whatprovides ${DEP_LIST_ARRAY[@]}"
TMPDIR=${TMP_DIR} \
${REPOQUERY} --config=${YUM} --repoid=${REPOID} \
${REPOQUERY_SUB_COMMAND} --arch=x86_64,noarch \
--qf='%{name}' --whatprovides ${DEP_LIST_ARRAY[@]} \
| sed "s/kernel-debug/kernel/g" >> $TMPFILE
\rm -rf $TMP_DIR/yum-$USER-*
done
sort $TMPFILE -u > $TMPFILE1
rm $TMPFILE
DEP_LIST=""
while read DEP
do
DEP_LIST+="${DEP} "
done < $TMPFILE1
rm $TMPFILE1
# next go through each repo and install packages
local TARGETS="${DEP_LIST}"
echo "Debug: Resolved list of deps to install: ${TARGETS}"
local UNRESOLVED
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
UNRESOLVED=" $TARGETS "
if [[ ! -z "${TARGETS// }" ]]; then
REPO_PATH=$(cat $YUM | sed -n "/^\[$REPOID\]\$/,\$p" | grep '^baseurl=' | head -n 1 | awk -F 'file://' '{print $2}' | sed 's:/$::')
>&2 echo "TMPDIR=${TMP_DIR}"\
"${REPOQUERY} --config=${YUM} --repoid=${REPOID}"\
"${REPOQUERY_SUB_COMMAND} --arch=x86_64,noarch"\
"--qf='%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}'"\
"${REPOQUERY_RESOLVE} ${TARGETS}"
TMPDIR=${TMP_DIR} \
${REPOQUERY} --config=${YUM} --repoid=${REPOID} \
${REPOQUERY_SUB_COMMAND} --arch=x86_64,noarch \
--qf="%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}" \
${REPOQUERY_RESOLVE} ${TARGETS} \
| sort -r -V >> $TMPFILE
\rm -rf $TMP_DIR/yum-$USER-*
while read STR
do
>&2 echo "STR=$STR"
if [ "x$STR" == "x" ]; then
continue
fi
PKG=`echo $STR | cut -d " " -f 1`
PKG_FILE=`echo $STR | cut -d " " -f 2`
PKG_REL_PATH=`echo $STR | cut -d " " -f 3`
PKG_PATH="${REPO_PATH}/${PKG_REL_PATH}"
>&2 echo "Installing PKG=$PKG PKG_FILE=$PKG_FILE PKG_REL_PATH=$PKG_REL_PATH PKG_PATH=$PKG_PATH from repo $REPOID"
cp $PKG_PATH .
if [ $? -ne 0 ]; then
>&2 echo " Here's what I have to work with..."
>&2 echo " TMPDIR=${TMP_DIR}"\
"${REPOQUERY} -c ${YUM} --repoid=${REPOID}"\
"${REPOQUERY_SUB_COMMAND} --arch=x86_64,noarch"\
"--qf=\"%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}\""\
"${REPOQUERY_RESOLVE} ${PKG}"
>&2 echo " PKG=$PKG PKG_FILE=$PKG_FILE REPO_PATH=$REPO_PATH PKG_REL_PATH=$PKG_REL_PATH PKG_PATH=$PKG_PATH"
fi
echo $UNRESOLVED | grep $PKG
echo $UNRESOLVED | grep $PKG >> /dev/null
if [ $? -eq 0 ]; then
echo "$PKG found in $REPOID as $PKG" >> $BUILT_REPORT
echo "$PKG_PATH" >> $BUILT_REPORT
UNRESOLVED=$(echo "$UNRESOLVED" | sed "s# $PKG # #g")
else
echo "$PKG satisfies unknown target in $REPOID" >> $BUILT_REPORT
echo " but it doesn't match targets, $UNRESOLVED" >> $BUILT_REPORT
echo " path $PKG_PATH" >> $BUILT_REPORT
FOUND_UNKNOWN=1
fi
done < $TMPFILE
\rm -rf $TMP_DIR/yum-$USER-*
TARGETS="$UNRESOLVED"
fi
done
>&2 echo "Debug: Packages still unresolved: $UNRESOLVED"
echo "Debug: Packages still unresolved: $UNRESOLVED" >> $WARNINGS_REPORT
echo "Debug: Packages still unresolved: $UNRESOLVED" >> $BUILT_REPORT
>&2 echo ""
}
function check_all_explicit_deps_installed {
PKGS_TO_CHECK=" "
while read PKG_TO_ADD
do
PKGS_TO_CHECK="$PKGS_TO_CHECK ${PKG_TO_ADD}"
done < $DEPLISTFILE
rpm -qp ${INSTALLDIR}/*.rpm --qf="%{name}\n" > $TMPFILE
echo "checking... $PKGS_TO_CHECK vs ${INSTALLED_PACKAGE}"
while read INSTALLED_PACKAGE
do
echo $PKGS_TO_CHECK | grep -q "${INSTALLED_PACKAGE}"
if [ $? -eq 0 ]; then
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/^${INSTALLED_PACKAGE} //"`
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/ ${INSTALLED_PACKAGE} / /"`
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/ ${INSTALLED_PACKAGE}\$//"`
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/^${INSTALLED_PACKAGE}\$//"`
fi
done < $TMPFILE
if [ -z "$PKGS_TO_CHECK" ]; then
>&2 echo "All explicitly specified packages resolved!"
else
>&2 echo "Could not resolve packages: $PKGS_TO_CHECK"
return 1
fi
return 0
}
if [ "x${ROOT}" == "x" ]; then
ROOT=/localdisk/loadbuild/centos
fi
ATTEMPTED=0
DISCOVERED=0
OUTPUT_DIR=${ROOT}/newDisk
YUM=${ROOT}/yum.conf
TMP_DIR=${ROOT}/tmp
DEPLISTFILE=${ROOT}/deps.txt
DEPLISTFILE_NEW=${ROOT}/deps_new.txt
DEPDETAILLISTFILE=${ROOT}/deps_detail.txt
INSTALLDIR=${ROOT}/newDisk/isolinux/Packages
BUILT_REPORT=${ROOT}/local.txt
WARNINGS_REPORT=${ROOT}/warnings.txt
LAST_TEST=${ROOT}/last_test.txt
TMPFILE=${ROOT}/cgts_deps_tmp.txt
TMPFILE1=${ROOT}/cgts_deps_tmp1.txt
touch "$BUILT_REPORT"
touch "$WARNINGS_REPORT"
for i in "$@"
do
case $i in
-d=*|--deps=*)
DEPS="${i#*=}"
shift # past argument=value
;;
esac
done
mkdir -p $TMP_DIR
rm -f "$DEPDETAILLISTFILE"
# FIRST PASS we are being given a list of REQUIRED dependencies
if [ "${DEPS}x" != "x" ]; then
cat $DEPS | grep -v "^#" > $DEPLISTFILE
install_deps $DEPLISTFILE
if [ $? -ne 0 ]; then
exit 1
fi
fi
# check that we resolved them all
check_all_explicit_deps_installed
if [ $? -ne 0 ]; then
>&2 echo "Error -- could not install all explicitly listed packages"
exit 1
fi
ALL_RESOLVED=0
while [ $ALL_RESOLVED -eq 0 ]; do
cp $DEPLISTFILE $DEPLISTFILE.old
generate_dep_list
if [ ! -s $DEPLISTFILE ]; then
# no more dependencies!
ALL_RESOLVED=1
else
DIFFLINES=`diff $DEPLISTFILE.old $DEPLISTFILE | wc -l`
if [ $DIFFLINES -eq 0 ]; then
>&2 echo "Warning: Infinite loop detected in dependency resolution. See $DEPLISTFILE for details -- exiting"
>&2 echo "These RPMS had problems (likely version conflicts)"
>&2 cat $DEPLISTFILE
echo "Warning: Infinite loop detected in dependency resolution See $DEPLISTFILE for details -- exiting" >> $WARNINGS_REPORT
echo "These RPMS had problems (likely version conflicts)" >> $WARNINGS_REPORT
cat $DEPLISTFILE >> $WARNINGS_REPORT
date > $LAST_TEST
rm -f $DEPLISTFILE.old
exit 1 # nothing fixed
fi
install_deps $DEPLISTFILE
if [ $? -ne 0 ]; then
exit 1
fi
fi
done
exit 0