mirror of
https://github.com/frida/tinycc
synced 2024-11-28 18:43:07 +03:00
27988c5e66
Fix the $RANDOM bashism properly by using mktemp. mktemp is part of MSYS so this should work on UNIXes and Windows
402 lines
9.5 KiB
Bash
Executable File
402 lines
9.5 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
|
|
|
|
TMPN="$(mktemp --tmpdir=${TMPDIR1} tcc-conf-XXXXXXXXXX-$$-XXXXXXXXXX)"
|
|
|
|
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=""
|
|
sysroot=""
|
|
cross_prefix=""
|
|
cc="gcc"
|
|
host_cc="gcc"
|
|
ar="ar"
|
|
strip="strip"
|
|
cpu=`uname -m`
|
|
case "$cpu" in
|
|
i386|i486|i586|i686|i86pc|BePC)
|
|
cpu="x86"
|
|
;;
|
|
x86_64)
|
|
cpu="x86-64"
|
|
;;
|
|
armv4l|armv5tel|armv6j|armv7a)
|
|
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`
|
|
;;
|
|
--bindir=*) bindir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--libdir=*) libdir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--includedir=*) includedir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--mandir=*) mandir=`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=}
|
|
;;
|
|
--cpu=*) cpu=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--enable-gprof) gprof="yes"
|
|
;;
|
|
--enable-mingw32) mingw32="yes" ; cross_prefix="i386-mingw32-"
|
|
;;
|
|
--enable-cross) build_cross="yes"
|
|
;;
|
|
--disable-static) disable_static="yes"
|
|
;;
|
|
--with-libgcc) use_libgcc="yes"
|
|
;;
|
|
--with-selinux) have_selinux="yes"
|
|
;;
|
|
--help|-h) show_help="yes"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Checking for CFLAGS
|
|
if test -z "$CFLAGS"; then
|
|
CFLAGS="-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 " --includedir=DIR C header files in DIR [PREFIX/include]"
|
|
echo " --mandir=DIR man documentation in DIR [PREFIX/man]"
|
|
echo " --enable-cross build cross compilers"
|
|
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 " --with-libgcc use /lib/libgcc_s.so.1 instead of libtcc1.a"
|
|
echo " --with-selinux use mmap instead of exec mem"
|
|
echo " [requires write access to /tmp]"
|
|
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 -z "$prefix" ; then
|
|
prefix="C:/Program Files/tcc"
|
|
fi
|
|
execprefix="$prefix"
|
|
bindir="$prefix"
|
|
tccdir="$prefix"
|
|
docdir="$prefix/doc"
|
|
else
|
|
if test -z "$prefix" ; then
|
|
prefix="/usr/local"
|
|
fi
|
|
if test x"$execprefix" = x""; then
|
|
execprefix="${prefix}"
|
|
fi
|
|
if test x"$bindir" = x""; then
|
|
bindir="${execprefix}/bin"
|
|
fi
|
|
if test x"$docdir" = x""; then
|
|
docdir="$prefix/share/doc/tcc"
|
|
fi
|
|
fi # mingw32
|
|
|
|
if test x"$libdir" = x""; then
|
|
libdir="${execprefix}/lib"
|
|
fi
|
|
if test x"$tccdir" = x""; then
|
|
tccdir="${libdir}/tcc"
|
|
fi
|
|
if test x"$mandir" = x""; then
|
|
mandir="${prefix}/man"
|
|
fi
|
|
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 "Doc directory $docdir"
|
|
echo "Target root prefix $sysroot"
|
|
echo "Source path $source_path"
|
|
echo "C compiler $cc"
|
|
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 "docdir=\$(DESTDIR)$docdir" >> config.mak
|
|
|
|
echo "#define CONFIG_SYSROOT \"$sysroot\"" >> $TMPH
|
|
echo "#define CONFIG_TCCDIR \"$tccdir\"" >> $TMPH
|
|
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
|
|
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 "$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 "$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*
|