Bug 31933

Summary: fixup-binconfig: a mode for verifying complex /usr/bin/*-config scripts (not modifying)
Product: Sisyphus Reporter: Ivan Zakharyaschev <imz>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: enhancement    
Priority: P3 CC: arseny, glebfm, imz, ldv, placeholder, vt
Version: unstable   
Hardware: all   
OS: Linux   

Description Ivan Zakharyaschev 2016-03-31 03:27:53 MSK
rpm-4.0.4-alt100.90

Example: python3-3.5 installs a complex python3.5m-config shell script (unlike python3-3.3 which implemented it in Python).

Certainly, fixup-binconfig doesn't expect such a complex script and tries to do stupid things with it by extracting some lines with assignments (but the assigned values are computed from other stuff defined elsewhere in the script).

It's not critical, because ultimately fixup-binconfig has no effect in this case, but errors are reported during its work. And it's not quite clear for the maintainer of such a package what fixup-binconfig tries to prevent, and whether something should be done with his /usr/bin/*-config.

If fixup-binconfig had a verifying-only mode, which would actually run /usr/bin/*-config with certain options (instead of trying to process its source code) and report whether the output has some deficiencies. If the output is OK, it could silently return successfully, if it is not OK, it could try to fix it up or fail with an error.

How the errors look like when building python3-3.5 (I've added "set -x" to fixup-binconfig) -- they come from "sed" invoked in /usr/bin/python3.5m-config:

+++ mktemp -dt fixup-binconfig.XXXXXXXX
++ tmpdir=/usr/src/tmp/fixup-binconfig.sEUnGVSt
++ trap 'remove_tmpdir $?' EXIT
+ TMPFILE=/usr/src/tmp/fixup-binconfig.sEUnGVSt/tmp
+ f_saved=/usr/src/tmp/fixup-binconfig.sEUnGVSt/sav
+ f_new=/usr/src/tmp/fixup-binconfig.sEUnGVSt/new
+ :
+ rc=0
+ for f in '"$@"'
+ '[' '!' -f ./usr/bin/python3.5m-config ']'
+ fname=./usr/bin/python3.5m-config
+ fname=/usr/bin/python3.5m-config
+ '[' -n '' ']'
++ file -b ./usr/bin/python3.5m-config
+ t='Bourne shell script text executable'
+ '[' -z '' ']'
+ fix
+ local includedir=
+ local libdir=
+ local prefix=
+ local exec_prefix=
+ sed -ne 's/^\(\([a-z_A-Z]*\)\(prefix\|dir\|path\)\)=\(.*\)$/local \1=\4/pg' ./usr/bin/python3.5m-config
+ '[' '!' -s /usr/src/tmp/fixup-binconfig.sEUnGVSt/tmp ']'
+ . /usr/src/tmp/fixup-binconfig.sEUnGVSt/tmp
+++ echo ''
+++ sed s###
sed: -e expression #1, char 0: no previous regular expression
++ local prefix=
+++ echo ''
+++ sed s###
sed: -e expression #1, char 0: no previous regular expression
++ local exec_prefix=
+++ echo /usr/include
+++ sed s###
sed: -e expression #1, char 0: no previous regular expression
++ local includedir=
+++ echo /usr/lib64
+++ sed s###
sed: -e expression #1, char 0: no previous regular expression
++ local libdir=
++ printf %s ''
++ tr -s /
+ prefix=
++ printf %s ''
++ tr -s /
+ exec_prefix=
++ printf %s ''
++ tr -s /
+ includedir=
++ printf %s ''
++ tr -s /
+ libdir=
+ cat ./usr/bin/python3.5m-config
+ cmp -s /usr/src/tmp/fixup-binconfig.sEUnGVSt/new /usr/src/tmp/fixup-binconfig.sEUnGVSt/sav

The script's source code -- for example, $prefix is computed from other values (which get lost by fixup-binconfig):

#!/bin/sh

# Keep this script in sync with python-config.in

exit_with_usage ()
{
    echo "Usage: $0 --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--help|--abiflags|--configdir"
    exit $1
}

if [ "$1" = "" ] ; then
    exit_with_usage 1
fi

# Returns the actual prefix where this script was installed to.
installed_prefix ()
{
    RESULT=$(dirname $(cd $(dirname "$1") && pwd -P))
    if which readlink >/dev/null 2>&1 ; then
        if readlink -f "$RESULT" >/dev/null 2>&1; then
          RESULT=$(readlink -f "$RESULT")
        fi
    fi
    echo $RESULT
}

prefix_build="/usr"
prefix_real=$(installed_prefix "$0")

# Use sed to fix paths from their built-to locations to their installed-to
# locations.
prefix=$(echo "$prefix_build" | sed "s#$prefix_build#$prefix_real#")
exec_prefix_build="/usr"
exec_prefix=$(echo "$exec_prefix_build" | sed "s#$exec_prefix_build#$prefix_real#")
includedir=$(echo "/usr/include" | sed "s#$prefix_build#$prefix_real#")
libdir=$(echo "/usr/lib64" | sed "s#$prefix_build#$prefix_real#")
CFLAGS=$(echo "-pipe -Wall -g -O3" | sed "s#$prefix_build#$prefix_real#")
VERSION="3.5"
LIBM="-lm"
LIBC=""
SYSLIBS="$LIBM $LIBC"
ABIFLAGS="m"
LIBS="-lpython${VERSION}${ABIFLAGS} -lpthread -ldl  -lutil $SYSLIBS"
BASECFLAGS=" -Wno-unused-result -Wsign-compare -Wunreachable-code"
LDLIBRARY="libpython${VERSION}${ABIFLAGS}.a"
LINKFORSHARED="-Xlinker -export-dynamic"
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes"
PY_ENABLE_SHARED="0"
LDVERSION="${VERSION}${ABIFLAGS}"
LIBDEST=${prefix}/lib/python${VERSION}
LIBPL=$(echo "${prefix}/lib/python3.5/config-${VERSION}${ABIFLAGS}" | sed "s#$prefix_build#$prefix_real#")
SO=".cpython-35m.so"
PYTHONFRAMEWORK=""
INCDIR="-I$includedir/python${VERSION}${ABIFLAGS}"
PLATINCDIR="-I$includedir/python${VERSION}${ABIFLAGS}"

# Scan for --help or unknown argument.
for ARG in $*
do
    case $ARG in
        --help)
            exit_with_usage 0
        ;;
        --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--abiflags|--configdir)
        ;;
        *)
            exit_with_usage 1
        ;;
    esac
done

for ARG in "$@"
do
    case "$ARG" in
        --prefix)
            echo "$prefix"
        ;;
        --exec-prefix)
            echo "$exec_prefix"
        ;;
        --includes)
            echo "$INCDIR $PLATINCDIR"
        ;;
        --cflags)
            echo "$INCDIR $PLATINCDIR $BASECFLAGS $CFLAGS $OPT"
        ;;
        --libs)
            echo "$LIBS"
        ;;
        --ldflags)
            LINKFORSHAREDUSED=
            if [ -z "$PYTHONFRAMEWORK" ] ; then
                LINKFORSHAREDUSED=$LINKFORSHARED
            fi
            LIBPLUSED=
            if [ "$PY_ENABLE_SHARED" = "0" ] ; then
                LIBPLUSED="-L$LIBPL"
            fi
            echo "$LIBPLUSED -L$libdir $LIBS $LINKFORSHAREDUSED"
        ;;
        --extension-suffix)
            echo "$SO"
        ;;
        --abiflags)
            echo "$ABIFLAGS"
        ;;
        --configdir)
            echo "$LIBPL"
        ;;
esac
done