mirror of
https://github.com/frida/tinycc
synced 2025-01-13 15:19:16 +03:00
8ca8b08890
Applied patch found on stackoverflow (link below). I also found some related changes that looked like logically needed. The stackoverflow changes addressed only two registers which were breaking a compile. However reading the code in the same file shows two other register accesses that, while not breaking the build, should have the same fix. http://stackoverflow.com/questions/3712902/problems-compiling-tcc-on-os-x/3713144#3713144 The test driver was changed by changing 'cp -u' into 'cp' as '-u' is not supported on mac osx. I found that osx build required the WITHOUT_LIBTCC define. I suspect the reason for this is tcc unability to handle mach-o files. In order to properly address this I had to change 'configure' to propagate target os name to Makefile. Current state is that simple tests work, but not the whole 'make test' suite runs. To the best of my knowledge, these changes should not impact other platforms.
497 lines
13 KiB
Bash
Executable File
497 lines
13 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# tcc configure script (c) 2003 Fabrice Bellard
|
|
|
|
# set temporary file name
|
|
if test ! -z "$TMPDIR" ; then
|
|
TMPDIR1="${TMPDIR}"
|
|
elif test ! -z "$TEMPDIR" ; then
|
|
TMPDIR1="${TEMPDIR}"
|
|
else
|
|
TMPDIR1="/tmp"
|
|
fi
|
|
|
|
# bashism: TMPN="${TMPDIR1}/tcc-conf-${RANDOM}-$$-${RANDOM}.c"
|
|
TMPN="./conftest-$$"
|
|
|
|
TMPC=$TMPN.c
|
|
TMPH=$TMPN.h
|
|
TMPO=$TMPN.o
|
|
TMPE=$TMPN
|
|
|
|
# default parameters
|
|
build_cross="no"
|
|
use_libgcc="no"
|
|
prefix=""
|
|
execprefix=""
|
|
bindir=""
|
|
libdir=""
|
|
tccdir=""
|
|
includedir=""
|
|
mandir=""
|
|
infodir=""
|
|
sysroot=""
|
|
cross_prefix=""
|
|
cc="gcc"
|
|
host_cc="gcc"
|
|
ar="ar"
|
|
strip="strip"
|
|
cygwin="no"
|
|
cpu=`uname -m`
|
|
|
|
tcc_sysincludepaths=""
|
|
tcc_libpaths=""
|
|
tcc_crtprefix=""
|
|
tcc_elfinterp=""
|
|
|
|
case "$cpu" in
|
|
i386|i486|i586|i686|i86pc|BePC|i686-AT386)
|
|
cpu="x86"
|
|
;;
|
|
x86_64)
|
|
cpu="x86-64"
|
|
;;
|
|
arm|armv4l|armv5tel|armv5tejl|armv6j|armv7a|armv7l)
|
|
cpu="armv4l"
|
|
;;
|
|
alpha)
|
|
cpu="alpha"
|
|
;;
|
|
"Power Macintosh"|ppc|ppc64)
|
|
cpu="powerpc"
|
|
;;
|
|
mips)
|
|
cpu="mips"
|
|
;;
|
|
s390)
|
|
cpu="s390"
|
|
;;
|
|
*)
|
|
cpu="unknown"
|
|
;;
|
|
esac
|
|
gprof="no"
|
|
bigendian="no"
|
|
mingw32="no"
|
|
LIBSUF=".a"
|
|
EXESUF=""
|
|
|
|
# OS specific
|
|
targetos=`uname -s`
|
|
case $targetos in
|
|
MINGW32*)
|
|
mingw32="yes"
|
|
;;
|
|
DragonFly)
|
|
noldl="yes"
|
|
;;
|
|
OpenBSD)
|
|
noldl="yes"
|
|
;;
|
|
*) ;;
|
|
esac
|
|
|
|
# find source path
|
|
# XXX: we assume an absolute path is given when launching configure,
|
|
# except in './configure' case.
|
|
source_path=${0%configure}
|
|
source_path=${source_path%/}
|
|
source_path_used="yes"
|
|
if test -z "$source_path" -o "$source_path" = "." ; then
|
|
source_path=`pwd`
|
|
source_path_used="no"
|
|
fi
|
|
|
|
for opt do
|
|
case "$opt" in
|
|
--prefix=*) prefix=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--exec-prefix=*) execprefix=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--tccdir=*) tccdir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--bindir=*) bindir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--libdir=*) libdir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--includedir=*) includedir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--sharedir=*) sharedir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--mandir=*) mandir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--infodir=*) infodir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--docdir=*) docdir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--sysroot=*) sysroot=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--source-path=*) source_path=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--cross-prefix=*) cross_prefix=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--cc=*) cc=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--extra-cflags=*) CFLAGS="${opt#--extra-cflags=}"
|
|
;;
|
|
--extra-ldflags=*) LDFLAGS="${opt#--extra-ldflags=}"
|
|
;;
|
|
--extra-libs=*) extralibs=${opt#--extra-libs=}
|
|
;;
|
|
--sysincludepaths=*) tcc_sysincludepaths=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--libpaths=*) tcc_libpaths=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--crtprefix=*) tcc_crtprefix=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--elfinterp=*) tcc_elfinterp=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--cpu=*) cpu=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--enable-gprof) gprof="yes"
|
|
;;
|
|
--enable-mingw32) mingw32="yes" ; cross_prefix="i686-pc-mingw32-" ; cpu=x86
|
|
;;
|
|
--enable-cygwin) mingw32="yes" ; cygwin="yes" ; cross_prefix="mingw32-" ; cpu=x86
|
|
;;
|
|
--enable-cross) build_cross="yes"
|
|
;;
|
|
--disable-static) disable_static="yes"
|
|
;;
|
|
--disable-rpath) disable_rpath="yes"
|
|
;;
|
|
--strip-binaries) strip_binaries="yes"
|
|
;;
|
|
--with-libgcc) use_libgcc="yes"
|
|
;;
|
|
--with-selinux) have_selinux="yes"
|
|
;;
|
|
--help|-h) show_help="yes"
|
|
;;
|
|
*) echo "configure: unrecognized option $opt"; exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Checking for CFLAGS
|
|
if test -z "$CFLAGS"; then
|
|
CFLAGS="-Wall -g -O2"
|
|
fi
|
|
|
|
cc="${cross_prefix}${cc}"
|
|
ar="${cross_prefix}${ar}"
|
|
strip="${cross_prefix}${strip}"
|
|
|
|
if test "$mingw32" = "yes" ; then
|
|
LIBSUF=".lib"
|
|
EXESUF=".exe"
|
|
fi
|
|
|
|
if test -z "$cross_prefix" ; then
|
|
|
|
# ---
|
|
# big/little endian test
|
|
cat > $TMPC << EOF
|
|
#include <inttypes.h>
|
|
int main(int argc, char ** argv){
|
|
volatile uint32_t i=0x01234567;
|
|
return (*((uint8_t*)(&i))) == 0x67;
|
|
}
|
|
EOF
|
|
|
|
if $cc -o $TMPE $TMPC 2>/dev/null ; then
|
|
$TMPE && bigendian="yes"
|
|
else
|
|
echo big/little test failed
|
|
fi
|
|
|
|
else
|
|
|
|
# if cross compiling, cannot launch a program, so make a static guess
|
|
if test "$cpu" = "powerpc" -o "$cpu" = "mips" -o "$cpu" = "s390" ; then
|
|
bigendian="yes"
|
|
fi
|
|
|
|
fi
|
|
|
|
# check gcc version
|
|
cat > $TMPC <<EOF
|
|
int main(void) {
|
|
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
|
|
return 0;
|
|
#else
|
|
#error gcc < 3.2
|
|
#endif
|
|
}
|
|
EOF
|
|
|
|
gcc_major="2"
|
|
if $cc -o $TMPO $TMPC 2> /dev/null ; then
|
|
gcc_major="3"
|
|
fi
|
|
cat > $TMPC <<EOF
|
|
int main(void) {
|
|
#if __GNUC__ >= 4
|
|
return 0;
|
|
#else
|
|
#error gcc < 4
|
|
#endif
|
|
}
|
|
EOF
|
|
|
|
if $cc -o $TMPO $TMPC 2> /dev/null ; then
|
|
gcc_major="4"
|
|
fi
|
|
|
|
if test x"$show_help" = "xyes" ; then
|
|
cat << EOF
|
|
|
|
Usage: configure [options]
|
|
Options: [defaults in brackets after descriptions]
|
|
|
|
EOF
|
|
echo "Standard options:"
|
|
echo " --help print this message"
|
|
echo " --prefix=PREFIX install in PREFIX [$prefix]"
|
|
echo " --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX"
|
|
echo " [same as prefix]"
|
|
echo " --bindir=DIR user executables in DIR [EPREFIX/bin]"
|
|
echo " --libdir=DIR object code libraries in DIR [EPREFIX/lib]"
|
|
echo " --tccdir=DIR installation directory [EPREFIX/lib/tcc]"
|
|
echo " --includedir=DIR C header files in DIR [PREFIX/include]"
|
|
echo " --sharedir=DIR documentation root DIR [PREFIX]/share"
|
|
echo " --docdir=DIR documentation in DIR [SHAREDIR/doc/tcc]"
|
|
echo " --mandir=DIR man documentation in DIR [SHAREDIR/man]"
|
|
echo " --infodir=DIR info documentation in DIR [SHAREDIR/info]"
|
|
echo ""
|
|
echo "Advanced options (experts only):"
|
|
echo " --source-path=PATH path of source code [$source_path]"
|
|
echo " --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]"
|
|
echo " --sysroot=PREFIX prepend PREFIX to library/include paths []"
|
|
echo " --cc=CC use C compiler CC [$cc]"
|
|
echo " --disable-static make libtcc.so instead of libtcc.a"
|
|
echo " --disable-rpath disable use of -rpath with the above"
|
|
echo " --strip-binaries strip symbol tables from resulting binaries"
|
|
echo " --with-libgcc use /lib/libgcc_s.so.1 instead of libtcc.a"
|
|
echo " --enable-mingw32 build windows version on linux with mingw32"
|
|
echo " --enable-cygwin build windows version on windows with cygwin"
|
|
echo " [requires cygwin and mingw32-make]"
|
|
echo " --enable-cross build cross compilers"
|
|
echo " --extra-cflags= extra compiler flags"
|
|
echo " --extra-ldflags= extra linker options"
|
|
echo " --with-selinux use mmap instead of exec mem"
|
|
echo " [requires write access to /tmp]"
|
|
echo " --sysincludepaths=... specify system include paths, colon separated"
|
|
echo " --libpaths=... specify system library paths, colon separated"
|
|
echo " --crtprefix=... specify locations of crt?.o, colon separated"
|
|
echo " --elfinterp=... specify elf interpreter"
|
|
echo ""
|
|
#echo "NOTE: The object files are build at the place where configure is launched"
|
|
exit 1
|
|
fi
|
|
|
|
if test "$mingw32" = "yes" ; then
|
|
if test x"$tccdir" = x""; then
|
|
tccdir="tcc"
|
|
fi
|
|
if test -z "$prefix" ; then
|
|
prefix="C:/Program Files/${tccdir}"
|
|
fi
|
|
if test -z "$sharedir" ; then
|
|
sharedir="${prefix}"
|
|
fi
|
|
execprefix="$prefix"
|
|
bindir="${prefix}"
|
|
tccdir="${prefix}"
|
|
libdir="${prefix}/lib"
|
|
docdir="${sharedir}/doc"
|
|
mandir="${sharedir}/man"
|
|
infodir="${sharedir}/info"
|
|
else
|
|
if test -z "$prefix" ; then
|
|
prefix="/usr/local"
|
|
fi
|
|
if test -z "$sharedir" ; then
|
|
sharedir="${prefix}/share"
|
|
fi
|
|
if test x"$execprefix" = x""; then
|
|
execprefix="${prefix}"
|
|
fi
|
|
if test x"$libdir" = x""; then
|
|
libdir="${execprefix}/lib"
|
|
fi
|
|
if test x"$bindir" = x""; then
|
|
bindir="${execprefix}/bin"
|
|
fi
|
|
if test x"$tccdir" = x""; then
|
|
tccdir="tcc"
|
|
fi
|
|
if test x"$docdir" = x""; then
|
|
docdir="${sharedir}/doc/${tccdir}"
|
|
fi
|
|
if test x"$mandir" = x""; then
|
|
mandir="${sharedir}/man"
|
|
fi
|
|
if test x"$infodir" = x""; then
|
|
infodir="${sharedir}/info"
|
|
fi
|
|
tccdir="${libdir}/${tccdir}"
|
|
fi # mingw32
|
|
|
|
if test x"$includedir" = x""; then
|
|
includedir="${prefix}/include"
|
|
fi
|
|
|
|
echo "Binary directory $bindir"
|
|
echo "TinyCC directory $tccdir"
|
|
echo "Library directory $libdir"
|
|
echo "Include directory $includedir"
|
|
echo "Manual directory $mandir"
|
|
echo "Info directory $infodir"
|
|
echo "Doc directory $docdir"
|
|
echo "Target root prefix $sysroot"
|
|
echo "Source path $source_path"
|
|
echo "C compiler $cc"
|
|
echo "Target OS $targetos"
|
|
echo "CPU $cpu"
|
|
echo "Big Endian $bigendian"
|
|
echo "gprof enabled $gprof"
|
|
echo "cross compilers $build_cross"
|
|
echo "use libgcc $use_libgcc"
|
|
|
|
echo "Creating config.mak and config.h"
|
|
|
|
echo "# Automatically generated by configure - do not modify" > config.mak
|
|
echo "/* Automatically generated by configure - do not modify */" > $TMPH
|
|
|
|
echo "prefix=$prefix" >> config.mak
|
|
echo "bindir=\$(DESTDIR)$bindir" >> config.mak
|
|
echo "tccdir=\$(DESTDIR)$tccdir" >> config.mak
|
|
echo "libdir=\$(DESTDIR)$libdir" >> config.mak
|
|
echo "ln_libdir=$libdir" >> config.mak
|
|
echo "includedir=\$(DESTDIR)$includedir" >> config.mak
|
|
echo "mandir=\$(DESTDIR)$mandir" >> config.mak
|
|
echo "infodir=\$(DESTDIR)$infodir" >> config.mak
|
|
echo "docdir=\$(DESTDIR)$docdir" >> config.mak
|
|
print_var1()
|
|
{
|
|
echo "#ifndef $1" >> $TMPH
|
|
echo "# define $1 \"$2\"" >> $TMPH
|
|
echo "#endif" >> $TMPH
|
|
}
|
|
print_var2()
|
|
{
|
|
if test -n "$2"; then print_var1 $1 "$2"; fi
|
|
}
|
|
print_var2 CONFIG_SYSROOT "$sysroot"
|
|
print_var1 CONFIG_TCCDIR "$tccdir"
|
|
print_var2 CONFIG_TCC_SYSINCLUDEPATHS "$tcc_sysincludepaths"
|
|
print_var2 CONFIG_TCC_LIBPATHS "$tcc_libpaths"
|
|
print_var2 CONFIG_TCC_CRTPREFIX "$tcc_crtprefix"
|
|
print_var2 CONFIG_TCC_ELFINTERP "$tcc_elfinterp"
|
|
|
|
echo "CC=$cc" >> config.mak
|
|
echo "GCC_MAJOR=$gcc_major" >> config.mak
|
|
echo "#define GCC_MAJOR $gcc_major" >> $TMPH
|
|
echo "HOST_CC=$host_cc" >> config.mak
|
|
echo "AR=$ar" >> config.mak
|
|
echo "STRIP=$strip -s -R .comment -R .note" >> config.mak
|
|
echo "CFLAGS=$CFLAGS" >> config.mak
|
|
echo "LDFLAGS=$LDFLAGS" >> config.mak
|
|
echo "LIBSUF=$LIBSUF" >> config.mak
|
|
echo "EXESUF=$EXESUF" >> config.mak
|
|
|
|
if test "$cpu" = "x86" ; then
|
|
echo "ARCH=i386" >> config.mak
|
|
echo "#define HOST_I386 1" >> $TMPH
|
|
elif test "$cpu" = "x86-64" ; then
|
|
echo "ARCH=x86-64" >> config.mak
|
|
echo "#define HOST_X86_64 1" >> $TMPH
|
|
elif test "$cpu" = "armv4l" ; then
|
|
echo "ARCH=arm" >> config.mak
|
|
echo "#define HOST_ARM 1" >> $TMPH
|
|
elif test "$cpu" = "powerpc" ; then
|
|
echo "ARCH=ppc" >> config.mak
|
|
echo "#define HOST_PPC 1" >> $TMPH
|
|
elif test "$cpu" = "mips" ; then
|
|
echo "ARCH=mips" >> config.mak
|
|
echo "#define HOST_MIPS 1" >> $TMPH
|
|
elif test "$cpu" = "s390" ; then
|
|
echo "ARCH=s390" >> config.mak
|
|
echo "#define HOST_S390 1" >> $TMPH
|
|
elif test "$cpu" = "alpha" ; then
|
|
echo "ARCH=alpha" >> config.mak
|
|
echo "#define HOST_ALPHA 1" >> $TMPH
|
|
else
|
|
echo "Unsupported CPU"
|
|
exit 1
|
|
fi
|
|
echo "TARGETOS=$targetos" >> config.mak
|
|
if test "$noldl" = "yes" ; then
|
|
echo "CONFIG_NOLDL=yes" >> config.mak
|
|
fi
|
|
if test "$mingw32" = "yes" ; then
|
|
echo "CONFIG_WIN32=yes" >> config.mak
|
|
echo "#define CONFIG_WIN32 1" >> $TMPH
|
|
fi
|
|
if test "$cygwin" = "yes" ; then
|
|
echo "#ifndef _WIN32" >> $TMPH
|
|
echo "#define _WIN32" >> $TMPH
|
|
echo "#endif" >> $TMPH
|
|
echo "AR=ar" >> config.mak
|
|
fi
|
|
if test "$bigendian" = "yes" ; then
|
|
echo "WORDS_BIGENDIAN=yes" >> config.mak
|
|
echo "#define WORDS_BIGENDIAN 1" >> $TMPH
|
|
fi
|
|
if test "$gprof" = "yes" ; then
|
|
echo "TARGET_GPROF=yes" >> config.mak
|
|
echo "#define HAVE_GPROF 1" >> $TMPH
|
|
fi
|
|
if test "$build_cross" = "yes" ; then
|
|
echo "CONFIG_CROSS=yes" >> config.mak
|
|
fi
|
|
if test "$disable_static" = "yes" ; then
|
|
echo "DISABLE_STATIC=yes" >> config.mak
|
|
fi
|
|
if test "$disable_rpath" = "yes" ; then
|
|
echo "DISABLE_RPATH=yes" >> config.mak
|
|
fi
|
|
if test "$strip_binaries" = "yes" ; then
|
|
echo "STRIP_BINARIES=yes" >> config.mak
|
|
fi
|
|
if test "$use_libgcc" = "yes" ; then
|
|
echo "#define CONFIG_USE_LIBGCC" >> $TMPH
|
|
echo "CONFIG_USE_LIBGCC=yes" >> config.mak
|
|
fi
|
|
if test "$have_selinux" = "yes" ; then
|
|
echo "#define HAVE_SELINUX" >> $TMPH
|
|
echo "HAVE_SELINUX=yes" >> config.mak
|
|
fi
|
|
version=`head $source_path/VERSION`
|
|
echo "VERSION=$version" >>config.mak
|
|
echo "#define TCC_VERSION \"$version\"" >> $TMPH
|
|
echo "@set VERSION $version" > config.texi
|
|
|
|
# build tree in object directory if source path is different from current one
|
|
if test "$source_path_used" = "yes" ; then
|
|
DIRS="tests"
|
|
FILES="Makefile tests/Makefile"
|
|
for dir in $DIRS ; do
|
|
mkdir -p $dir
|
|
done
|
|
for f in $FILES ; do
|
|
ln -sf $source_path/$f $f
|
|
done
|
|
fi
|
|
echo "SRC_PATH=$source_path" >> config.mak
|
|
|
|
diff $TMPH config.h >/dev/null 2>&1
|
|
if test $? -ne 0 ; then
|
|
mv -f $TMPH config.h
|
|
else
|
|
echo "config.h is unchanged"
|
|
fi
|
|
|
|
rm -f $TMPN*
|