root/build-tools/spec-utils
Scott Little 8744c5f598 Build hangs on macro resolution in spec file
Problem:
Hung on a spec file that contains a seemingly self referential macro ...
   Version: %{_version}

Normally 'Version: x.y.z' has the effect of setting macro %{_version}.
In effect we have 'x=x'.  Not sure how rpm handles this, but we need to
prevent a recursion in our evaluation scripts.

Solution:
1) Test for recursion in spec_evaluate() and fail rather than
entering into a recursion.

2) Record the version from the srpm file name into an environment variable.
If we fail to read the version from the spec file directly, substitute
the one from the environment variable, if defined.

Note: Tripped up on mismatched '`' during testing, so substituted
all occurances with $().  Now a good browser should be able to
highlight an future mismatches.

Story: 2002839
Task: 22778
Change-Id: Ib69f879e531d842ff007d473bd3ad34db46cabf1
Signed-off-by: Scott Little <scott.little@windriver.com>
2018-08-13 13:52:35 -04:00

706 lines
21 KiB
Plaintext

RPM_MACRO_FILE=/usr/lib/rpm/macros
spec_query_with_macros () {
local SPEC_FILE=$1; shift
local BUILD_DIR=$1; shift
local TIS_PATCH_VER=$1; shift
local rc
TMPSPEC=$(mktemp /tmp/spec-utils-XXXXXX)
cat $SPEC_FILE | sed 's/%(rpm.*)/%(echo 0)/' > $TMPSPEC
rpmspec -P \
--define="_tis_build_type ${BUILD_TYPE:-std}" \
--define="_tis_dist .tis" \
--define="tis_patch_ver ${TIS_PATCH_VER:-0}" \
--define="platform_release ${PLATFORM_RELEASE:-00.00}" \
--define="%_topdir $BUILD_DIR" \
"${@}" \
$TMPSPEC 2>> /dev/null
rc=$?
\rm -f $TMPSPEC
return $rc
}
spec_evaluate () {
local RAW_VALUE=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local LAST_SPEC_EVALUATING="$SPEC_EVALUATING"
local MACRO=""
local MACRO_VALUE=""
local RC=0
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
MACRO=$(expr match "$RAW_VALUE" '.*\(%{[^}]*}\)')
if [ $? -ne 0 ]; then
echo "$RAW_VALUE"
return 0
fi
if [ "x$SPEC_EVALUATING" == "x" ]; then
SPEC_EVALUATING=":$MACRO:"
else
echo "$SPEC_EVALUATING" | grep -q ":$MACRO:"
if [ $? -eq 0 ]; then
# Break a recursion
>&2 echo "ERROR: evaluation of macro '$MACRO' failed due to recursion"
return 1
fi
SPEC_EVALUATING="$LAST_SPEC_EVALUATING$MACRO:"
fi
# >&2 echo "spec_evaluate: MACRO=$MACRO"
local MACRO_NAME2=${MACRO#%{}
local MACRO_NAME3=${MACRO_NAME2%\}}
local PREFIX=$(expr match "$MACRO_NAME3" '\([!?]*\)')
local MACRO_NAME=${MACRO_NAME3#${PREFIX}}
# >&2 echo "spec_evaluate: MACRO_NAME=$MACRO_NAME"
MACRO_VALUE=$(spec_find_macro $MACRO_NAME $SPEC_FILE $RPMBUILD_DIR)
if [ $? -ne 0 ]; then
# >&2 echo "CALL: spec_find_global $MACRO_NAME $SPEC_FILE $RPMBUILD_DIR"
MACRO_VALUE=$(spec_find_global $MACRO_NAME $SPEC_FILE $RPMBUILD_DIR)
if [ $? -ne 0 ]; then
MACRO_VALUE=$(spec_find_tag ${MACRO_NAME^} $SPEC_FILE $RPMBUILD_DIR)
if [ $? -ne 0 ]; then
MACRO_VALUE=$(macro_find_macro $MACRO_NAME $SPEC_FILE $RPMBUILD_DIR)
if [ $? -ne 0 ]; then
MACRO_VALUE=$(spec_find_macro_via_rpm $MACRO_NAME $SPEC_FILE $RPMBUILD_DIR)
if [ $? -ne 0 ]; then
case "$MACRO_NAME" in
_tis_build_type) MACRO_VALUE="${BUILD_TYPE}" ;;
_tis_dist) MACRO_VALUE=".tis" ;;
tis_patch_ver) MACRO_VALUE="{TIS_PATCH_VER:-0}" ;;
platform_release) MACRO_VALUE="$PLATFORM_RELEASE" ;;
_topdir) MACRO_VALUE="$BUILD_DIR" ;;
*) ;;
esac
if [ "x$MACRO_VALUE" == "x" ]; then
if [ "$PREFIX" == '?' ]; then
>&2 echo "NOTE: optional macro '$MACRO' not defined"
else
>&2 echo "ERROR: evaluation of macro '$MACRO' failed"
SPEC_EVALUATING="$LAST_SPEC_EVALUATING"
return 1
fi
fi
fi
fi
fi
fi
fi
# >&2 echo "spec_evaluate: MACRO_VALUE=$MACRO_VALUE"
local NEW_VALUE=${RAW_VALUE/"${MACRO}"/${MACRO_VALUE}}
# >&2 echo "spec_evaluate: NEW_VALUE=$NEW_VALUE"
spec_evaluate "$NEW_VALUE" "$SPEC_FILE" "$RPMBUILD_DIR"
RC=$?
SPEC_EVALUATING="$LAST_SPEC_EVALUATING"
return $RC
}
macro_find_macro () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local LINE=""
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
# >&2 echo "grep ^%$TARGET $RPM_MACRO_FILE"
LINE=$(grep "^%$TARGET[[:space:]]" $RPM_MACRO_FILE)
if [ $? -eq 1 ]; then
>&2 echo "macro_find_macro: '%$TARGET' not found in file '$RPM_MACRO_FILE'"
echo ""
return 1
fi
# >&2 echo "macro_find_macro: LINE=$LINE"
local UNSTRIPED_VALUE=${LINE##"%$TARGET"}
# >&2 echo "macro_find_macro: UNSTRIPED_VALUE=$UNSTRIPED_VALUE"
local RAW_VALUE=${UNSTRIPED_VALUE//[[:space:]]/}
# >&2 echo "macro_find_macro: RAW_VALUE=$RAW_VALUE"
spec_evaluate "$RAW_VALUE" "$SPEC_FILE" "$RPMBUILD_DIR"
}
spec_find_macro_via_rpm () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local RC=1
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
# >&2 echo "spec_find_macro_via_rpm: TARGET=$TARGET"
case "$TARGET" in
name|_name) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{NAME}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
version|_version) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{VERSION}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
release|_release) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{RELEASE}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
*) ;;
esac
if [ $RC -ne 0 ]; then
echo ""
fi
return $RC
}
spec_find_macro () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$2
local LINE=""
local UNSTRIPED_VALUE=""
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
# >&2 echo "grep ^%define $TARGET $SPEC_FILE"
LINE=$(grep "^%define $TARGET[[:space:]]" $SPEC_FILE)
if [ $? -eq 1 ]; then
LINE=$(grep "^%$TARGET[[:space:]]" $SPEC_FILE)
if [ $? -eq 1 ]; then
>&2 echo "spec_find_macro: Neither '%define $TARGET' nor '%$TARGET' found in file '$SPEC_FILE'"
echo ""
return 1
else
UNSTRIPED_VALUE=${LINE##"%$TARGET"}
fi
else
UNSTRIPED_VALUE=${LINE##"%define $TARGET"}
fi
# >&2 echo "spec_find_macro: LINE=$LINE"
# >&2 echo "spec_find_macro: UNSTRIPED_VALUE=$UNSTRIPED_VALUE"
local RAW_VALUE=$(echo ${UNSTRIPED_VALUE} | sed -e 's/^ *//g;s/ *$//g')
# >&2 echo "spec_find_macro: RAW_VALUE=$RAW_VALUE"
spec_evaluate "$RAW_VALUE" "$SPEC_FILE" "$RPMBUILD_DIR"
}
spec_find_tag () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local TIS_PATCH_VER=$4
local LINE=""
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
local SPEC_FILE2=$(mktemp /tmp/tmp_spec_XXXXXX.spec)
# Note: ${VAR:-val} is bash syntax for providing a default value.
# ie. if $VAR is not set, use 'val' as default value
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} > $SPEC_FILE2
if [ $? != 0 ]; then
# spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
\cp $SPEC_FILE $SPEC_FILE2
fi
LINE=$(grep "^$TARGET:" $SPEC_FILE2 | head -n 1 ; exit ${PIPESTATUS[0]})
if [ $? -eq 1 ]; then
LINE=$(grep "^${TARGET^}:" $SPEC_FILE2 | head -n 1 ; exit ${PIPESTATUS[0]})
if [ $? -eq 1 ]; then
>&2 echo "spec_find_tag: '$TARGET:' not found in file '$SPEC_FILE'"
echo ""
\rm -f "$SPEC_FILE2"
return 1
else
TARGET=${TARGET^}
fi
fi
\rm -f "$SPEC_FILE2"
# >&2 echo "spec_find_tag: LINE=$LINE"
local UNSTRIPED_VALUE=${LINE##"$TARGET:"}
# >&2 echo "spec_find_tag: UNSTRIPED_VALUE=$UNSTRIPED_VALUE"
local RAW_VALUE=${UNSTRIPED_VALUE//[[:space:]]/}
# >&2 echo "spec_find_tag: RAW_VALUE=$RAW_VALUE"
spec_evaluate "$RAW_VALUE" "$SPEC_FILE" "$RPMBUILD_DIR"
}
spec_find_multi_tag () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$2
local LINE=""
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
while read LINE; do
# >&2 echo "spec_find_multi_tag: LINE=$LINE"
local UNSTRIPED_VALUE=${LINE##"$TARGET:"}
# >&2 echo "spec_find_multi_tag: UNSTRIPED_VALUE=$UNSTRIPED_VALUE"
local RAW_VALUE=${UNSTRIPED_VALUE//[[:space:]]/}
# >&2 echo "spec_find_multi_tag: RAW_VALUE=$RAW_VALUE"
spec_evaluate "$RAW_VALUE" "$SPEC_FILE" "$RPMBUILD_DIR"
done << EOF
$(grep "^$TARGET:" $SPEC_FILE)
EOF
}
spec_find_global () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local LINE=""
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
LINE=$(grep "^%global $TARGET" $SPEC_FILE)
if [ $? -eq 1 ]; then
>&2 echo "spec_find_global: '%global $TARGET' not found in file '$SPEC_FILE'"
echo ""
return 1
fi
# >&2 echo "spec_find_global: LINE=$LINE"
local UNSTRIPED_VALUE=${LINE##"%global $TARGET"}
# >&2 echo "spec_find_global: UNSTRIPED_VALUE=$UNSTRIPED_VALUE"
local RAW_VALUE=${UNSTRIPED_VALUE//[[:space:]]/}
# >&2 echo "spec_find_global: RAW_VALUE=$RAW_VALUE"
spec_evaluate "$RAW_VALUE" "$SPEC_FILE" "$RPMBUILD_DIR"
}
spec_find_patch_args () {
local PATCH_NO="$1"
local SPEC_FILE="$2"
local RPMBUILD_DIR="$3"
local LINE=""
local LINE2=""
local PATCH_LOWER_NO
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
PATCH_LOWER_NO=$(echo $PATCH_NO | tr '[:upper:]' '[:lower:]')
LINE=$(grep "^%$PATCH_LOWER_NO " $SPEC_FILE)
if [ $? -eq 1 ]; then
>&2 echo "pec_find_patch_args: $PATCH_LOWER_NO' not found in file '$SPEC_FILE'"
echo "-p1"
return 1
fi
LINE2=$(spec_evaluate "$LINE" "$SPEC_FILE" "$RPMBUILD_DIR")
echo $LINE2 | cut -d' ' -f2- | sed 's/-b/-b -z/'
return 0
}
spec_list_packages () {
local SPEC_FILE=$1
local RPMBUILD_DIR=$2
local d=$(dirname $SPEC_FILE)
local bd=$(basename $d)
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
if [ "$bd" == "SPECS" ]; then
local dd=$(dirname $d)
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}\n' --define="%_topdir $dd" 2>> /dev/null
else
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}\n' 2>> /dev/null
fi
if [ $? -ne 0 ]; then
# spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
if [ $? -ne 0 ]; then
>&2 echo "ERROR: failed to evaluate 'Name'"
return 1
fi
echo $NAME
grep "^%package" $SPEC_FILE | while read PACKAGE_LINE; do
local PKG_NAME=""
local PKG_NAME_RAW=$(echo $PACKAGE_LINE | awk '{ print $2 }')
# >&2 echo "spec_list_packages: PKG_NAME_RAW=$PKG_NAME_RAW"
local PKG_NAME_TEMP=""
if [ "$PKG_NAME_RAW" == "-n" ]; then
PKG_NAME_TEMP=$(echo $PACKAGE_LINE | awk '{ print $3 }')
else
PKG_NAME_TEMP="$NAME-$PKG_NAME_RAW"
fi
# >&2 echo "spec_list_packages: PKG_NAME_TEMP=$PKG_NAME_TEMP"
PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
if [ $? -ne 0 ]; then
>&2 echo "ERROR: failed to evaluate package '$PACKAGE_LINE'"
return 1
fi
# >&2 echo "spec_list_packages: PKG_NAME=$PKG_NAME"
echo $PKG_NAME
done
fi
}
spec_list_versioned_packages () {
local SPEC_FILE=$1
local RPMBUILD_DIR=$2
local d=$(dirname $SPEC_FILE)
local bd=$(basename $d)
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
if [ "$bd" == "SPECS" ]; then
local dd=$(dirname $d)
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}\n' --define="%_topdir $dd" 2>> /dev/null
else
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}\n' 2>> /dev/null
fi
if [ $? -ne 0 ]; then
# spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
if [ $? -ne 0 ]; then
>&2 echo "ERROR: failed to evaluate 'Name'"
return 1
fi
local VERSION=$(spec_find_tag Version "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
echo "$NAME-$VERSION"
grep "^%package" $SPEC_FILE | while read PACKAGE_LINE; do
local PKG_NAME=""
local PKG_NAME_RAW=$(echo $PACKAGE_LINE | awk '{ print $2 }')
# >&2 echo "spec_list_packages: PKG_NAME_RAW=$PKG_NAME_RAW"
local PKG_NAME_TEMP=""
if [ "$PKG_NAME_RAW" == "-n" ]; then
PKG_NAME_TEMP=$(echo $PACKAGE_LINE | awk '{ print $3 }')
else
PKG_NAME_TEMP="$NAME-$PKG_NAME_RAW"
fi
# >&2 echo "spec_list_packages: PKG_NAME_TEMP=$PKG_NAME_TEMP"
PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
if [ $? -ne 0 ]; then
>&2 echo "ERROR: failed to evaluate package '$PACKAGE_LINE'"
return 1
fi
# >&2 echo "spec_list_packages: PKG_NAME=$PKG_NAME"
echo "$PKG_NAME-$VERSION"
done
fi
}
spec_name_ver_rel () {
local SPEC_FILE=$1
local RPMBUILD_DIR=$2
local NAME=""
local d=$(dirname $SPEC_FILE)
local bd=$(basename $d)
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
NAME=$(spec_find_tag Name $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
VERSION=$(spec_find_tag Version $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
RELEASE=$(spec_find_tag Release $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
echo "$NAME-$VERSION-$RELEASE"
}
spec_list_ver_rel_packages () {
local SPEC_FILE=$1
local RPMBUILD_DIR=$2
local d=$(dirname $SPEC_FILE)
local bd=$(basename $d)
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
if [ "$bd" == "SPECS" ]; then
local dd=$(dirname $d)
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}\n' --define="%_topdir $dd" 2>> /dev/null
else
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}\n' 2>> /dev/null
fi
if [ $? -ne 0 ]; then
# spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
if [ $? -ne 0 ]; then
>&2 echo "ERROR: failed to evaluate 'Name'"
return 1
fi
local VERSION=$(spec_find_tag Version "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
local RELEASE=$(spec_find_tag Release "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
echo "$NAME-$VERSION-$RELEASE"
grep "^%package" $SPEC_FILE | while read PACKAGE_LINE; do
local PKG_NAME=""
local PKG_NAME_RAW=$(echo $PACKAGE_LINE | awk '{ print $2 }')
# >&2 echo "spec_list_packages: PKG_NAME_RAW=$PKG_NAME_RAW"
local PKG_NAME_TEMP=""
if [ "$PKG_NAME_RAW" == "-n" ]; then
PKG_NAME_TEMP=$(echo $PACKAGE_LINE | awk '{ print $3 }')
else
PKG_NAME_TEMP="$NAME-$PKG_NAME_RAW"
fi
# >&2 echo "spec_list_packages: PKG_NAME_TEMP=$PKG_NAME_TEMP"
PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
if [ $? -ne 0 ]; then
>&2 echo "ERROR: failed to evaluate package '$PACKAGE_LINE'"
return 1
fi
# >&2 echo "spec_list_packages: PKG_NAME=$PKG_NAME"
echo "$PKG_NAME-$VERSION-$RELEASE"
done
fi
}
spec_list_ver_rel_arch_packages () {
local SPEC_FILE=$1
local RPMBUILD_DIR=$2
local d=$(dirname $SPEC_FILE)
local bd=$(basename $d)
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
if [ "$bd" == "SPECS" ]; then
local dd=$(dirname $d)
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}.%{arch}\n' --define="%_topdir $dd" 2>> /dev/null
else
spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}.%{arch}\n' 2>> /dev/null
fi
}
spec_match_package_list () {
local Aname=$1[@]
local TARGET_LIST=("${!Aname}")
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local TARGET
local PKG_NAME
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
for PKG_NAME in $(spec_list_packages "$SPEC_FILE" "$RPMBUILD_DIR"); do
for TARGET in "${TARGET_LIST[@]}"; do
if [ "$PKG_NAME" == "$TARGET" ]; then
echo $TARGET
return 0
fi
if [ $BUILD_TYPE == "rt" ] && [ "$PKG_NAME" == "${TARGET}-rt" ]; then
echo $TARGET
return 0
fi
done
done
return 1
}
spec_match_package () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local PKG_NAME
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
for PKG_NAME in $(spec_list_packages "$SPEC_FILE" "$RPMBUILD_DIR"); do
if [ "$PKG_NAME" == "$TARGET" ]; then
echo "found target '$TARGET' in file '$SPEC_FILE' as a package name"
return 0
fi
done
return 1
}
spec_match_target_list () {
local Aname=$1[@]
local TARGET_LIST=("${!Aname}")
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local TARGET
local NAME
local SERVICE
local PKG_NAME
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
NAME=$(spec_find_tag Name "$SPEC_FILE" "$RPMBUILD_DIR")
if [ $? -eq 0 ]; then
for TARGET in "${TARGET_LIST[@]}"; do
if [ "$NAME" == "$TARGET" ]; then
echo $TARGET
return 0
fi
if [ $BUILD_TYPE == "rt" ] && [ "$NAME" == "${TARGET}-rt" ]; then
echo $TARGET
return 0
fi
done
fi
SERVICE=$(spec_find_global service "$SPEC_FILE" "$RPMBUILD_DIR")
if [ $? -eq 0 ]; then
for TARGET in "${TARGET_LIST[@]}"; do
if [ "$SERVICE" == "$TARGET" ]; then
echo $TARGET
return 0
fi
if [ $BUILD_TYPE == "rt" ] && [ "$SERVICE" == "${TARGET}-rt" ]; then
echo $TARGET
return 0
fi
done
fi
spec_match_package_list TARGET_LIST "$SPEC_FILE" "$RPMBUILD_DIR"
if [ $? -eq 0 ]; then
return 0
fi
return 1
}
spec_match_target () {
local TARGET=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
local NAME
local SERVICE
local PKG_NAME
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
NAME=$(spec_find_tag Name "$SPEC_FILE" "$RPMBUILD_DIR")
if [ $? -eq 0 ]; then
if [ "$NAME" == "$TARGET" ]; then
echo "found target '$TARGET' in file '$SPEC_FILE' as a name"
return 0
fi
fi
SERVICE=$(spec_find_global service "$SPEC_FILE" "$RPMBUILD_DIR")
if [ $? -eq 0 ]; then
if [ "$SERVICE" == "$TARGET" ]; then
echo "found target '$TARGET' in file '$SPEC_FILE' as a service"
return 0
fi
fi
spec_match_package "$TARGET" "$SPEC_FILE" "$RPMBUILD_DIR"
if [ $? -eq 0 ]; then
return 0
fi
return 1
}
spec_build_requires () {
local SPEC_FILE=$1
local RPMBUILD_DIR=$2
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
spec_find_multi_tag BuildRequires $SPEC_FILE $RPMBUILD_DIR
}
spec_untar_path () {
local SOURCE_NO=$1
local SPEC_FILE=$2
local RPMBUILD_DIR=$3
>&2 echo "spec_untar_path SOURCE_NO=$SOURCE_NO SPEC_FILE=$SPEC_FILE"
local UNTAR_PATH="."
local AFTER=""
if [ "x$RPMBUILD_DIR" == "x" ];then
RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
fi
local SETUP=$(spec_find_macro setup $SPEC_FILE $RPMBUILD_DIR)
AFTER=$(echo "$SETUP " | grep -o -e "[-]a[[:space:]]$SOURCE_NO[[:space:]]")
if [ $? -eq 0 ]; then
UNTAR_PATH=$(echo "$SETUP " | grep -o -e '[-]n[[:space:]][^[:space:]]*[[:space:]]' | awk '{ print $2}'; exit ${PIPESTATUS[1]})
if [ $? -ne 0 ]; then
NAME=$( spec_find_tag Name $SPEC_FILE $RPMBUILD_DIR)
VERSION=$(spec_find_tag Version $SPEC_FILE $RPMBUILD_DIR)
UNTAR_PATH="$NAME-$VERSION"
fi
fi
echo "$UNTAR_PATH"
return 0
}
spec_validate_tis_release () {
local SPEC_FILE=$1
# TIS Release value must include either %{?_tis_dist}.%{tis_patch_ver} or %{tis_patch_ver}%{?_tis_dist}
# Because spec_query_with_macros defines tis_patch_ver, we're using rpmspec directly here
rpmspec --define='_tis_dist .tis' -P $SPEC_FILE 2>/dev/null | grep '^Release:' \
| grep -qvE '\.tis\.%{tis_patch_ver}|%{tis_patch_ver}\.tis'
if [ $? -eq 0 ]; then
>&2 echo "ERROR: $SPEC_FILE: 'Release' must use %{?_tis_dist}.%{tis_patch_ver} or %{tis_patch_ver}%{?_tis_dist}"
>&2 grep 'Release:' $SPEC_FILE
return 1
fi
return 0
}