mirror of
https://github.com/frida/tinycc
synced 2024-12-19 03:42:33 +03:00
1094891e67
Do not enable musl or uclibc native support if a GNU linker is already present. This avoids interference for example on a Debian platform with musl-dev installed. More work is required to select musl libc in that case, with additional configure flags.
590 lines
15 KiB
Bash
Executable File
590 lines
15 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-$$"
|
|
TMPH=$TMPN.h
|
|
|
|
# default parameters
|
|
build_cross="no"
|
|
use_libgcc="no"
|
|
disable_static=""
|
|
prefix=""
|
|
execprefix=""
|
|
bindir=""
|
|
libdir=""
|
|
tccdir=""
|
|
includedir=""
|
|
mandir=""
|
|
infodir=""
|
|
sysroot=""
|
|
cross_prefix=""
|
|
cc="gcc"
|
|
ar="ar"
|
|
strip="strip"
|
|
noldl="no"
|
|
gprof="no"
|
|
bigendian="no"
|
|
mingw32="no"
|
|
osx="no"
|
|
LIBSUF=".a"
|
|
EXESUF=""
|
|
DLLSUF=".so"
|
|
tcc_sysincludepaths=""
|
|
tcc_libpaths=""
|
|
tcc_crtprefix=""
|
|
tcc_elfinterp=""
|
|
triplet=
|
|
tcc_lddir=
|
|
confvars=
|
|
cpu=
|
|
|
|
# OS specific
|
|
targetos=`uname`
|
|
case $targetos in
|
|
Darwin)
|
|
osx=yes
|
|
;;
|
|
MINGW*|MSYS*|CYGWIN*)
|
|
mingw32=yes
|
|
;;
|
|
DragonFly|OpenBSD|FreeBSD|NetBSD)
|
|
noldl=yes
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
# find source path
|
|
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
|
|
eval opt=\"$opt\"
|
|
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`
|
|
;;
|
|
--ar=*) ar=`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`
|
|
;;
|
|
--triplet=*) triplet=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--cpu=*) cpu=`echo $opt | cut -d '=' -f 2`
|
|
;;
|
|
--enable-gprof) gprof="yes"
|
|
;;
|
|
--enable-mingw32) mingw32="yes"
|
|
;;
|
|
--enable-cross) build_cross="yes"
|
|
;;
|
|
--disable-static) disable_static="yes"
|
|
;;
|
|
--enable-static) disable_static="no"
|
|
;;
|
|
--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: WARNING: unrecognized option $opt"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if test -z "$cpu" ; then
|
|
if test -n "$ARCH" ; then
|
|
cpu="$ARCH"
|
|
else
|
|
cpu=`uname -m`
|
|
fi
|
|
fi
|
|
|
|
case "$cpu" in
|
|
x86|i386|i486|i586|i686|i86pc|BePC|i686-AT386)
|
|
cpu="x86"
|
|
;;
|
|
x86_64|amd64|x86-64)
|
|
cpu="x86_64"
|
|
;;
|
|
arm*)
|
|
case "$cpu" in
|
|
arm|armv4l)
|
|
cpuver=4
|
|
;;
|
|
armv5tel|armv5tejl)
|
|
cpuver=5
|
|
;;
|
|
armv6j|armv6l)
|
|
cpuver=6
|
|
;;
|
|
armv7a|armv7l)
|
|
cpuver=7
|
|
;;
|
|
esac
|
|
cpu="armv4l"
|
|
;;
|
|
aarch64)
|
|
cpu="aarch64"
|
|
;;
|
|
alpha)
|
|
cpu="alpha"
|
|
;;
|
|
"Power Macintosh"|ppc|ppc64)
|
|
cpu="powerpc"
|
|
;;
|
|
mips)
|
|
cpu="mips"
|
|
;;
|
|
s390)
|
|
cpu="s390"
|
|
;;
|
|
*)
|
|
cpu="unknown"
|
|
;;
|
|
esac
|
|
|
|
# Checking for CFLAGS
|
|
if test -z "$CFLAGS"; then
|
|
CFLAGS="-Wall -g -O2"
|
|
fi
|
|
|
|
if test "$mingw32" = "yes" ; then
|
|
if test "$source_path_used" = "no"; then
|
|
source_path="."
|
|
fi
|
|
if test "$cc" = gcc; then
|
|
test -z "$LDFLAGS" && LDFLAGS="-static"
|
|
fi
|
|
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"
|
|
LIBSUF=".lib"
|
|
EXESUF=".exe"
|
|
DLLSUF=".dll"
|
|
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"$docdir" = x""; then
|
|
docdir="${sharedir}/doc"
|
|
fi
|
|
if test x"$mandir" = x""; then
|
|
mandir="${sharedir}/man"
|
|
fi
|
|
if test x"$infodir" = x""; then
|
|
infodir="${sharedir}/info"
|
|
fi
|
|
if test x"$tccdir" = x""; then
|
|
tccdir="${libdir}/tcc"
|
|
fi
|
|
if test "$osx" = "yes" ; then
|
|
DLLSUF=".dylib"
|
|
fi
|
|
fi # mingw32
|
|
|
|
if test x"$includedir" = x""; then
|
|
includedir="${prefix}/include"
|
|
fi
|
|
|
|
if test x"$show_help" = "xyes" ; then
|
|
cat << EOF
|
|
Usage: configure [options]
|
|
Options: [defaults in brackets after descriptions]
|
|
|
|
Standard options:
|
|
--help print this message
|
|
--prefix=PREFIX install in PREFIX [$prefix]
|
|
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
|
|
[same as prefix]
|
|
--bindir=DIR user executables in DIR [EPREFIX/bin]
|
|
--libdir=DIR object code libraries in DIR [EPREFIX/lib]
|
|
--tccdir=DIR installation directory [EPREFIX/lib/tcc]
|
|
--includedir=DIR C header files in DIR [PREFIX/include]
|
|
--sharedir=DIR documentation root DIR [PREFIX/share]
|
|
--docdir=DIR documentation in DIR [SHAREDIR/doc/tcc]
|
|
--mandir=DIR man documentation in DIR [SHAREDIR/man]
|
|
--infodir=DIR info documentation in DIR [SHAREDIR/info]
|
|
|
|
Advanced options (experts only):
|
|
--source-path=PATH path of source code [$source_path]
|
|
--cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]
|
|
--sysroot=PREFIX prepend PREFIX to library/include paths []
|
|
--cc=CC use C compiler CC [$cc]
|
|
--ar=AR create archives using AR [$ar]
|
|
--extra-cflags= specify compiler flags [$CFLAGS]
|
|
--extra-ldflags= specify linker options []
|
|
--cpu=CPU CPU [$cpu]
|
|
--strip-binaries strip symbol tables from resulting binaries
|
|
--disable-static make libtcc.so instead of libtcc.a
|
|
--enable-static make libtcc.a instead of libtcc.dll (win32)
|
|
--disable-rpath disable use of -rpath with the above
|
|
--with-libgcc use libgcc_s.so.1 instead of libtcc1.a in dynamic link
|
|
--enable-mingw32 build windows version on linux with mingw32
|
|
--enable-cross build cross compilers
|
|
--with-selinux use mmap for executable memory (with tcc -run)
|
|
--sysincludepaths=... specify system include paths, colon separated
|
|
--libpaths=... specify system library paths, colon separated
|
|
--crtprefix=... specify locations of crt?.o, colon separated
|
|
--elfinterp=... specify elf interpreter
|
|
--triplet=... specify system library/include directory triplet
|
|
EOF
|
|
#echo "NOTE: The object files are build at the place where configure is launched"
|
|
exit 1
|
|
fi
|
|
|
|
cc="${cross_prefix}${cc}"
|
|
ar="${cross_prefix}${ar}"
|
|
strip="${cross_prefix}${strip}"
|
|
|
|
CONFTEST=./conftest$EXESUF
|
|
if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then
|
|
echo "configure: error: '$cc' failed to compile conftest.c."
|
|
else
|
|
gcc_major="$($CONFTEST version)"
|
|
gcc_minor="$($CONFTEST minor)"
|
|
fi
|
|
|
|
if test -z "$cross_prefix" ; then
|
|
bigendian="$($CONFTEST bigendian)"
|
|
if test "$mingw32" = "no" ; then
|
|
|
|
if test -z "$triplet"; then
|
|
tt="$($CONFTEST triplet)"
|
|
if test -n "$tt" -a -f "/usr/lib/$tt/crti.o" ; then
|
|
triplet="$tt"
|
|
fi
|
|
fi
|
|
|
|
if test -z "$triplet"; then
|
|
if test $cpu = "x86_64" -o $cpu = "aarch64" ; then
|
|
if test -f "/usr/lib64/crti.o" ; then
|
|
tcc_lddir="lib64"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if test "$cpu" = "armv4l" ; then
|
|
if test "${triplet%eabihf}" != "$triplet" ; then
|
|
confvars="$confvars arm_eabihf"
|
|
elif test "${triplet%eabi}" != "$triplet" ; then
|
|
confvars="$confvars arm_eabi"
|
|
fi
|
|
if grep -s -q "^Features.* \(vfp\|iwmmxt\) " /proc/cpuinfo ; then
|
|
confvars="$confvars arm_vfp"
|
|
fi
|
|
fi
|
|
|
|
# Enable uClibc or musl native support only if GNU ld is not already present
|
|
if test -f "/lib/ld-linux.so.2"; then
|
|
:
|
|
elif test -f "/lib64/ld-linux-x86-64.so.2"; then
|
|
:
|
|
elif test -f "/lib64/ld-linux-aarch64.so.1"; then
|
|
:
|
|
elif test -f "/lib/ld-uClibc.so.0" ; then
|
|
confvars="$confvars uClibc"
|
|
elif test -f "/lib/ld-musl-$cpu.so.1"; then
|
|
confvars="$confvars musl"
|
|
fi
|
|
fi
|
|
else
|
|
# if cross compiling, cannot launch a program, so make a static guess
|
|
case $cpu in
|
|
powerpc|mips|s390) bigendian=yes;;
|
|
esac
|
|
fi
|
|
|
|
# a final configuration tuning
|
|
$cc -v --help > cc_help.txt 2>&1
|
|
W_OPTIONS="declaration-after-statement undef strict-prototypes write-strings"
|
|
for i in $W_OPTIONS; do
|
|
O_PRESENT="$(grep -- -W$i cc_help.txt)"
|
|
if test -n "$O_PRESENT"; then CFLAGS="$CFLAGS -W$i"; fi
|
|
done
|
|
W_OPTIONS="pointer-sign sign-compare unused-result"
|
|
for i in $W_OPTIONS; do
|
|
O_PRESENT="$(grep -- -W$i cc_help.txt)"
|
|
if test -n "$O_PRESENT"; then CFLAGS="$CFLAGS -Wno-$i"; fi
|
|
done
|
|
F_OPTIONS="strict-aliasing"
|
|
for i in $F_OPTIONS; do
|
|
O_PRESENT="$(grep -- -f$i cc_help.txt)"
|
|
if test -n "$O_PRESENT"; then CFLAGS="$CFLAGS -fno-$i"; fi
|
|
done
|
|
rm -f cc_help.txt
|
|
|
|
fcho() { if test -n "$2"; then echo "$1$2"; else echo "$1-"; 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"
|
|
fcho "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 "Profiling $gprof"
|
|
echo "Cross compilers $build_cross"
|
|
echo "Use libgcc $use_libgcc"
|
|
fcho "Triplet " "$triplet"
|
|
|
|
echo "Creating config.mak and config.h"
|
|
|
|
cat >config.mak <<EOF
|
|
# Automatically generated by configure - do not modify
|
|
prefix=$prefix
|
|
bindir=\$(DESTDIR)$bindir
|
|
tccdir=\$(DESTDIR)$tccdir
|
|
libdir=\$(DESTDIR)$libdir
|
|
includedir=\$(DESTDIR)$includedir
|
|
mandir=\$(DESTDIR)$mandir
|
|
infodir=\$(DESTDIR)$infodir
|
|
docdir=\$(DESTDIR)$docdir
|
|
CC=$cc
|
|
GCC_MAJOR=$gcc_major
|
|
GCC_MINOR=$gcc_minor
|
|
AR=$ar
|
|
STRIP=$strip -s -R .comment -R .note
|
|
CFLAGS=$CFLAGS
|
|
LDFLAGS=$LDFLAGS
|
|
LIBSUF=$LIBSUF
|
|
EXESUF=$EXESUF
|
|
DLLSUF=$DLLSUF
|
|
EOF
|
|
|
|
print_inc() {
|
|
if test -n "$2"; then
|
|
echo "#ifndef $1" >> $TMPH
|
|
echo "# define $1 \"$2\"" >> $TMPH
|
|
echo "#endif" >> $TMPH
|
|
fi
|
|
}
|
|
print_mak() {
|
|
if test -n "$2"; then
|
|
echo "NATIVE_DEFINES+=-D$1=\"\\\"$2\\\"\"" >> config.mak
|
|
fi
|
|
}
|
|
|
|
echo "/* Automatically generated by configure - do not modify */" > $TMPH
|
|
|
|
print_inc CONFIG_SYSROOT "$sysroot"
|
|
print_inc CONFIG_TCCDIR "$tccdir"
|
|
print_mak CONFIG_TCC_SYSINCLUDEPATHS "$tcc_sysincludepaths"
|
|
print_mak CONFIG_TCC_LIBPATHS "$tcc_libpaths"
|
|
print_mak CONFIG_TCC_CRTPREFIX "$tcc_crtprefix"
|
|
print_mak CONFIG_TCC_ELFINTERP "$tcc_elfinterp"
|
|
print_mak CONFIG_LDDIR "$tcc_lddir"
|
|
print_mak CONFIG_TRIPLET "$triplet"
|
|
|
|
echo "#define GCC_MAJOR $gcc_major" >> $TMPH
|
|
echo "#define GCC_MINOR $gcc_minor" >> $TMPH
|
|
|
|
if test "$cpu" = "x86" ; then
|
|
echo "ARCH=i386" >> config.mak
|
|
elif test "$cpu" = "x86_64" ; then
|
|
echo "ARCH=x86_64" >> config.mak
|
|
elif test "$cpu" = "armv4l" ; then
|
|
echo "ARCH=arm" >> config.mak
|
|
echo "#define TCC_ARM_VERSION $cpuver" >> $TMPH
|
|
elif test "$cpu" = "aarch64" ; then
|
|
echo "ARCH=arm64" >> config.mak
|
|
elif test "$cpu" = "powerpc" ; then
|
|
echo "ARCH=ppc" >> config.mak
|
|
elif test "$cpu" = "mips" ; then
|
|
echo "ARCH=mips" >> config.mak
|
|
elif test "$cpu" = "s390" ; then
|
|
echo "ARCH=s390" >> config.mak
|
|
elif test "$cpu" = "alpha" ; then
|
|
echo "ARCH=alpha" >> config.mak
|
|
else
|
|
echo "Unsupported CPU"
|
|
exit 1
|
|
fi
|
|
|
|
echo "TARGETOS=$targetos" >> config.mak
|
|
|
|
for v in $confvars ; do
|
|
echo "CONFIG_$v=yes" >> config.mak
|
|
done
|
|
if test "$noldl" = "yes" ; then
|
|
echo "CONFIG_NOLDL=yes" >> config.mak
|
|
fi
|
|
if test "$mingw32" = "yes" ; then
|
|
echo "CONFIG_WIN32=yes" >> config.mak
|
|
fi
|
|
if test "$osx" = "yes" ; then
|
|
echo "CONFIG_OSX=yes" >> 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 -n "$disable_static" ; then
|
|
echo "DISABLE_STATIC=$disable_static" >> 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
|
|
|
|
if test "$source_path_used" = "yes" ; then
|
|
case $source_path in
|
|
/*) echo "TOPSRC=$source_path";;
|
|
*) echo "TOPSRC=\$(TOP)/$source_path";;
|
|
esac >>config.mak
|
|
else
|
|
echo 'TOPSRC=$(TOP)' >>config.mak
|
|
fi
|
|
|
|
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* $CONFTEST
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# build tree in object directory if source path is different from current one
|
|
|
|
fn_makelink()
|
|
{
|
|
tgt=$1/$2
|
|
case $2 in
|
|
*/*) dn=${2%/*}
|
|
test -d $dn || mkdir -p $dn
|
|
case $1 in
|
|
/*) ;;
|
|
*) while test $dn ; do
|
|
tgt=../$tgt; dn=${dn#${dn%%/*}}; dn=${dn#/}
|
|
done
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
ln -sfn $tgt $2 || ( echo "ln failed. Using cp instead."; cp -f $1/$2 $2 )
|
|
}
|
|
|
|
if test "$source_path_used" = "yes" ; then
|
|
FILES="Makefile lib/Makefile tests/Makefile tests/tests2/Makefile tests/pp/Makefile"
|
|
for f in $FILES ; do
|
|
fn_makelink $source_path $f
|
|
done
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|