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