mirror of
https://github.com/frida/tinycc
synced 2024-11-25 09:10:53 +03:00
31ca000d72
By default, tcc search libraries in /lib and /usr/local/lib while crt*.o files are searched in /usr/lib and ld.so is searched in /lib. Unfortunetely the path are hardcoded in source code. This patch allow tcc to look in an other directory and also to look in extra directories. It's then possible to make tcc search libraries in /lib/x86_64-linux-gnu and /usr/local/lib/x86_64-linux-gnu while crt*.o files are searched in /usr/lib/x86_64-linux-gnu and ld.so is searched in /lib/x86_64-linux-gnu.
474 lines
12 KiB
Bash
Executable File
474 lines
12 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=""
|
|
lddir=""
|
|
extralddir=""
|
|
tccdir=""
|
|
includedir=""
|
|
mandir=""
|
|
infodir=""
|
|
sysroot=""
|
|
cross_prefix=""
|
|
cc="gcc"
|
|
host_cc="gcc"
|
|
ar="ar"
|
|
strip="strip"
|
|
cygwin="no"
|
|
cpu=`uname -m`
|
|
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`
|
|
;;
|
|
--lddir=*) lddir=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--extralddir=*) extralddir="$extralddir:`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=}
|
|
;;
|
|
--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"
|
|
;;
|
|
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 " --lddir=DIR loader library search path in DIR [/lib]"
|
|
echo " --extralddir=DIR extra loader library search path in DIR []"
|
|
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 ""
|
|
#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 "Loader library search directory ${lddir:-default value (see tcc.h)}"
|
|
echo "Extra loader library search directory ${extralddir:-(none)}"
|
|
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 "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
|
|
|
|
echo "#define CONFIG_SYSROOT \"$sysroot\"" >> $TMPH
|
|
echo "#ifndef CONFIG_TCCDIR" >> $TMPH
|
|
echo "#define CONFIG_TCCDIR \"$tccdir\"" >> $TMPH
|
|
echo "#define CONFIG_TCC_LDDIR \"$lddir\"" >> $TMPH
|
|
echo "#define CONFIG_TCC_EXTRA_LDDIR \"$extralddir\"" >> $TMPH
|
|
echo "#endif" >> $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 "$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*
|