Blame src/set_mcpp.sh

Packit Service 8bf002
#!/bin/sh
Packit Service 8bf002
# script to set MCPP to be called from gcc
Packit Service 8bf002
# ./set_mcpp.sh $gcc_path $gcc_maj_ver $gcc_min_ver $cpp_call $CC
Packit Service 8bf002
#       $CXX x$CPPFLAGS x$EXEEXT $LN_S $inc_dir $host_system $cpu $target_cc
Packit Service 8bf002
Packit Service 8bf002
gcc_maj_ver=$2
Packit Service 8bf002
gcc_min_ver=$3
Packit Service 8bf002
cpp_call=$4
Packit Service 8bf002
CC=$5
Packit Service 8bf002
CXX=$6
Packit Service 8bf002
CPPFLAGS=`echo $7 | sed 's/^x//'`
Packit Service 8bf002
LN_S=$9
Packit Service 8bf002
inc_dir=${10}
Packit Service 8bf002
host_system=${11}
Packit Service 8bf002
cpu=${12}
Packit Service 8bf002
if test $host_system = SYS_MAC; then
Packit Service 8bf002
    target_cc=${13}
Packit Service 8bf002
    target=`echo $target_cc | sed 's/-gcc.*$//'`
Packit Service 8bf002
fi
Packit Service 8bf002
cpp_name=`echo $cpp_call | sed 's,.*/,,'`
Packit Service 8bf002
cpp_path=`echo $cpp_call | sed "s,/$cpp_name,,"`
Packit Service 8bf002
gcc_path=`echo $1 | sed "s,/${CC}\$,,"`
Packit Service 8bf002
Packit Service 8bf002
# remove ".exe" or such
Packit Service 8bf002
EXEEXT=`echo $8 | sed 's/^x//'`
Packit Service 8bf002
if test x$EXEEXT != x; then
Packit Service 8bf002
    cpp_base=`echo $cpp_name | sed "s/${EXEEXT}//"`
Packit Service 8bf002
else
Packit Service 8bf002
    cpp_base=$cpp_name
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
if test $host_system = SYS_MINGW && test ! -f cc1$EXEEXT; then
Packit Service 8bf002
    ## cc1.exe has not yet compiled
Packit Service 8bf002
    echo "  first do 'make COMPILER=GNUC mcpp cc1'; then do 'make COMPILER=GNUC install'"
Packit Service 8bf002
    exit 1
Packit Service 8bf002
fi
Packit Service 8bf002
if test x$cpp_base = xcc1; then
Packit Service 8bf002
    # for GCC V.3.3 and later
Packit Service 8bf002
    no_m64=0
Packit Service 8bf002
else
Packit Service 8bf002
    no_m64=1
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
gen_headers() {
Packit Service 8bf002
    echo "  mkdir -p $hdir"
Packit Service 8bf002
    mkdir -p $hdir
Packit Service 8bf002
    if test ! -f $hdir/gcc$gcc_maj_ver${gcc_min_ver}_predef_std.h; then
Packit Service 8bf002
        echo "  generating g*.h header files"
Packit Service 8bf002
        $CC $CPPFLAGS -E -xc $arg -dM /dev/null | sort |        \
Packit Service 8bf002
                grep ' *#define *_'                             \
Packit Service 8bf002
                > $hdir/gcc$gcc_maj_ver${gcc_min_ver}_predef_std.h
Packit Service 8bf002
        $CC $CPPFLAGS -E -xc $arg -dM /dev/null | sort |        \
Packit Service 8bf002
                grep -E ' *#define *[A-Za-z]+'                  \
Packit Service 8bf002
                > $hdir/gcc$gcc_maj_ver${gcc_min_ver}_predef_old.h
Packit Service 8bf002
        $CXX $CPPFLAGS -E -xc++ $arg -dM /dev/null | sort |     \
Packit Service 8bf002
                grep ' *#define *_'                             \
Packit Service 8bf002
                > $hdir/gxx$gcc_maj_ver${gcc_min_ver}_predef_std.h
Packit Service 8bf002
        $CXX $CPPFLAGS -E -xc++ $arg -dM /dev/null | sort |     \
Packit Service 8bf002
                grep -E ' *#define *[A-Za-z]+'                  \
Packit Service 8bf002
                > $hdir/gxx$gcc_maj_ver${gcc_min_ver}_predef_old.h
Packit Service 8bf002
    fi
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
cwd=`pwd`
Packit Service 8bf002
echo "  cd $inc_dir"
Packit Service 8bf002
cd $inc_dir
Packit Service 8bf002
Packit Service 8bf002
if test $cpu = i386 || test $cpu = x86_64; then
Packit Service 8bf002
    cpu32=i386
Packit Service 8bf002
    cpu64=x86_64
Packit Service 8bf002
else 
Packit Service 8bf002
    if test $cpu = ppc || $cpu = ppc64; then
Packit Service 8bf002
        cpu32=ppc
Packit Service 8bf002
        cpu64=ppc64
Packit Service 8bf002
    fi
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
arch_headers() {
Packit Service 8bf002
    for arch in $cpu32 $cpu64
Packit Service 8bf002
    do                              ## generate headers for 2 architectures
Packit Service 8bf002
        hdir=${idir}-$arch
Packit Service 8bf002
        if test $host_system = SYS_MAC; then
Packit Service 8bf002
            arg="-arch $arch"
Packit Service 8bf002
        else
Packit Service 8bf002
            if test $arch = $cpu; then
Packit Service 8bf002
                arg="$ar"
Packit Service 8bf002
            else
Packit Service 8bf002
                if test $host_system = SYS_MINGW || test $no_m64; then
Packit Service 8bf002
                    continue;
Packit Service 8bf002
                fi
Packit Service 8bf002
                if test $cpu = $cpu64; then
Packit Service 8bf002
                    arg="$ar -m32"
Packit Service 8bf002
                else
Packit Service 8bf002
                    arg="$ar -m64"
Packit Service 8bf002
                fi
Packit Service 8bf002
                # Test if the architecture is supported.
Packit Service 8bf002
                $CC -E -xc $arg /dev/null > /dev/null
Packit Service 8bf002
                if test $? != 0; then
Packit Service 8bf002
                    continue
Packit Service 8bf002
                fi
Packit Service 8bf002
            fi
Packit Service 8bf002
        fi
Packit Service 8bf002
        gen_headers
Packit Service 8bf002
    done
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
idir=mcpp-gcc
Packit Service 8bf002
ar=
Packit Service 8bf002
arch_headers
Packit Service 8bf002
Packit Service 8bf002
if test $host_system = SYS_CYGWIN; then
Packit Service 8bf002
    ## CYGWIN has 'mingw' include directory for '-mno-cygwin' option
Packit Service 8bf002
    idir=mingw/mcpp-gcc
Packit Service 8bf002
    ar="-mno-cygwin"
Packit Service 8bf002
    arch_headers
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
# write shell-script so that call of 'cpp0', 'cc1 -E' or so is replaced to
Packit Service 8bf002
# call of mcpp
Packit Service 8bf002
echo "  cd $cpp_path"
Packit Service 8bf002
cd $cpp_path
Packit Service 8bf002
Packit Service 8bf002
# other than MinGW
Packit Service 8bf002
if test $host_system != SYS_MINGW; then
Packit Service 8bf002
    echo '#!/bin/sh'                    >  mcpp.sh
Packit Service 8bf002
    # for GCC V.3.3 and later
Packit Service 8bf002
    if test x$cpp_base = xcc1; then
Packit Service 8bf002
        for cpp in cc1 cc1plus
Packit Service 8bf002
        do
Packit Service 8bf002
            if test $cpp = cc1; then
Packit Service 8bf002
                shname=mcpp
Packit Service 8bf002
            else
Packit Service 8bf002
                shname=mcpp_plus
Packit Service 8bf002
            fi
Packit Service 8bf002
            if test $cpp = cc1plus; then
Packit Service 8bf002
                echo '#!/bin/sh'        >  mcpp_plus.sh
Packit Service 8bf002
            fi
Packit Service 8bf002
            cat >> $shname.sh <<_EOF
Packit Service 8bf002
for i in \$@
Packit Service 8bf002
do
Packit Service 8bf002
    case \$i in
Packit Service 8bf002
        -fpreprocessed|-traditional*)
Packit Service 8bf002
            $cpp_path/${cpp}_gnuc "\$@"
Packit Service 8bf002
            exit ;;
Packit Service 8bf002
    esac
Packit Service 8bf002
done
Packit Service 8bf002
_EOF
Packit Service 8bf002
        done
Packit Service 8bf002
    fi
Packit Service 8bf002
    
Packit Service 8bf002
    # for GCC V.2, V.3 and V.4
Packit Service 8bf002
    mcpp_name=mcpp
Packit Service 8bf002
    if test $host_system = SYS_MAC && test -f ${target}-mcpp; then
Packit Service 8bf002
        mcpp_name=${target}-mcpp    ## long name of Mac OS X cross-compiler
Packit Service 8bf002
    fi
Packit Service 8bf002
    echo $cpp_path/$mcpp_name '"$@"'    >>  mcpp.sh
Packit Service 8bf002
    chmod a+x mcpp.sh
Packit Service 8bf002
    if test x$cpp_base = xcc1; then
Packit Service 8bf002
        echo $cpp_path/$mcpp_name -+ '"$@"' >> mcpp_plus.sh
Packit Service 8bf002
        chmod a+x mcpp_plus.sh
Packit Service 8bf002
    fi
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
# backup GCC / cpp or cc1, cc1plus
Packit Service 8bf002
mcpp_installed=`$cpp_call -v /dev/null 2>&1 | grep "MCPP"`
Packit Service 8bf002
if test "x$mcpp_installed" = x; then            # mcpp has not installed
Packit Service 8bf002
    sym_link=
Packit Service 8bf002
    if test $host_system = SYS_MINGW; then
Packit Service 8bf002
        if test -f cc1_gnuc$EXEEXT; then
Packit Service 8bf002
            sym_link=l          ## cc1.exe already moved to cc1_gnuc.exe
Packit Service 8bf002
        fi
Packit Service 8bf002
    else
Packit Service 8bf002
        if test -h $cpp_name; then
Packit Service 8bf002
            sym_link=l
Packit Service 8bf002
        fi
Packit Service 8bf002
    fi
Packit Service 8bf002
    if test x$sym_link != xl; then
Packit Service 8bf002
        echo "  mv $cpp_name ${cpp_base}_gnuc$EXEEXT"
Packit Service 8bf002
        mv -f $cpp_name ${cpp_base}_gnuc$EXEEXT
Packit Service 8bf002
        if test x$cpp_base = xcc1; then
Packit Service 8bf002
            echo "  mv cc1plus$EXEEXT cc1plus_gnuc$EXEEXT"
Packit Service 8bf002
            mv -f cc1plus$EXEEXT cc1plus_gnuc$EXEEXT
Packit Service 8bf002
        fi
Packit Service 8bf002
    fi
Packit Service 8bf002
fi
Packit Service 8bf002
if test -f $cpp_name; then
Packit Service 8bf002
    rm -f $cpp_name
Packit Service 8bf002
    if test x$cpp_base = xcc1; then
Packit Service 8bf002
        rm -f cc1plus$EXEEXT
Packit Service 8bf002
    fi
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
# make symbolic link of mcpp.sh to 'cpp0' or 'cc1', 'cc1plus'
Packit Service 8bf002
if test $host_system = SYS_MINGW; then
Packit Service 8bf002
    echo "  cp $cwd/cc1$EXEEXT"
Packit Service 8bf002
    cp $cwd/cc1$EXEEXT .
Packit Service 8bf002
    strip cc1$EXEEXT
Packit Service 8bf002
else
Packit Service 8bf002
    echo "  $LN_S mcpp.sh $cpp_name"
Packit Service 8bf002
    $LN_S mcpp.sh $cpp_name
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
if test x$cpp_base = xcc1; then
Packit Service 8bf002
    if test $host_system = SYS_MINGW; then
Packit Service 8bf002
        echo "  cp cc1$EXEEXT cc1plus$EXEEXT"
Packit Service 8bf002
        cp cc1$EXEEXT cc1plus$EXEEXT
Packit Service 8bf002
    else
Packit Service 8bf002
        echo "  $LN_S mcpp_plus.sh cc1plus$EXEEXT"
Packit Service 8bf002
        $LN_S mcpp_plus.sh cc1plus$EXEEXT
Packit Service 8bf002
    fi
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
if test x$gcc_maj_ver = x2; then
Packit Service 8bf002
    exit 0
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
# for GCC V.3 or V.4 make ${CC}.sh and ${CXX}.sh to add -no-integrated-cpp
Packit Service 8bf002
# option
Packit Service 8bf002
echo "  cd $gcc_path"
Packit Service 8bf002
cd $gcc_path
Packit Service 8bf002
Packit Service 8bf002
if test $host_system = SYS_MAC && test x${target_cc} != x; then
Packit Service 8bf002
    # cross-compiler on Mac OS X 
Packit Service 8bf002
    CC_=$target_cc
Packit Service 8bf002
    CXX_=`echo $target_cc | sed 's/gcc/g++/'`
Packit Service 8bf002
else
Packit Service 8bf002
    CC_=$CC
Packit Service 8bf002
    CXX_=$CXX
Packit Service 8bf002
fi
Packit Service 8bf002
Packit Service 8bf002
for cc in $CC_ $CXX_
Packit Service 8bf002
do
Packit Service 8bf002
    entity=$cc$EXEEXT
Packit Service 8bf002
    if test $host_system != SYS_MINGW; then
Packit Service 8bf002
        ref=$cc$EXEEXT
Packit Service 8bf002
        while ref=`readlink $ref`
Packit Service 8bf002
        do
Packit Service 8bf002
            entity=$ref;
Packit Service 8bf002
        done
Packit Service 8bf002
        if test $entity = $cc.sh; then          # gcc.sh already installed
Packit Service 8bf002
            exit 0
Packit Service 8bf002
        fi
Packit Service 8bf002
    fi
Packit Service 8bf002
    ccache=`echo $entity | grep ccache`
Packit Service 8bf002
    if test x$ccache != x; then
Packit Service 8bf002
        ## CC (CXX) is a symbolic link to ccache
Packit Service 8bf002
        ## search the real $cc in $PATH
Packit Service 8bf002
        for path in `echo $PATH | sed 's/:/ /g'`
Packit Service 8bf002
        do
Packit Service 8bf002
            if test -f $path/$cc$EXEEXT && test $gcc_path != $path; then
Packit Service 8bf002
                break;
Packit Service 8bf002
            fi
Packit Service 8bf002
        done
Packit Service 8bf002
        gcc_path=$path
Packit Service 8bf002
        echo "  cd $gcc_path"
Packit Service 8bf002
        cd $gcc_path
Packit Service 8bf002
        entity=$cc
Packit Service 8bf002
        ref=$cc
Packit Service 8bf002
        while ref=`readlink $ref`
Packit Service 8bf002
        do
Packit Service 8bf002
            entity=$ref;
Packit Service 8bf002
        done
Packit Service 8bf002
        if test $entity = $cc.sh; then
Packit Service 8bf002
            exit 0
Packit Service 8bf002
        fi
Packit Service 8bf002
    fi
Packit Service 8bf002
    if test x$EXEEXT != x; then
Packit Service 8bf002
        entity_base=`echo $entity | sed "s/$EXEEXT//"`
Packit Service 8bf002
    else
Packit Service 8bf002
        entity_base=$entity
Packit Service 8bf002
    fi
Packit Service 8bf002
    if test $host_system != SYS_MINGW     \
Packit Service 8bf002
            || test ! -f ${entity_base}_proper$EXEEXT; then
Packit Service 8bf002
        echo "  mv $entity ${entity_base}_proper$EXEEXT"
Packit Service 8bf002
        mv -f $entity ${entity_base}_proper$EXEEXT
Packit Service 8bf002
    fi
Packit Service 8bf002
    if test x"`echo $entity | grep '^/'`" = x; then     # not absolute path
Packit Service 8bf002
        prefix_dir=$gcc_path/
Packit Service 8bf002
    else                                # absolute path
Packit Service 8bf002
        prefix_dir=
Packit Service 8bf002
    fi
Packit Service 8bf002
    echo '#! /bin/sh' > $cc.sh
Packit Service 8bf002
    echo $prefix_dir${entity_base}_proper -no-integrated-cpp '"$@"' >> $cc.sh
Packit Service 8bf002
    chmod a+x $cc.sh
Packit Service 8bf002
    echo "  $LN_S $cc.sh $cc"
Packit Service 8bf002
    $LN_S -f $cc.sh $cc
Packit Service 8bf002
    if test $cc != $entity; then
Packit Service 8bf002
        $LN_S -f $cc.sh $entity
Packit Service 8bf002
    fi
Packit Service 8bf002
done
Packit Service 8bf002