mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-01 04:20:09 +08:00
61894e17cd
For the following reasons: - Native windows links are rarely used in general. - Require elevated privileges even if the current user has administrator privileges (needs further "run as administrator"). - Most/all windows shell environments capable of running configure already support ln (msys[1], msys2, most probably cygwin too). - If cross building tcc on linux for windows then native mklink is not available, as well as 'cmd' (in this scenario the build later fails for other reasons, but at least configures succeeds now). - cp is good enough as fallback since we only copy 5 makefiles anyway. - The only environment I'm aware of which doesn't support ln -s is busybox for windows, and with this patch it falls back to cp and completes configure successfully (and the build later succeeds, assuming valid $CC and $AR).
566 lines
14 KiB
Bash
Executable File
566 lines
14 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"
|
|
prefix=""
|
|
execprefix=""
|
|
bindir=""
|
|
libdir=""
|
|
tccdir=""
|
|
includedir=""
|
|
mandir=""
|
|
infodir=""
|
|
sysroot=""
|
|
cross_prefix=""
|
|
cc="gcc"
|
|
ar="ar"
|
|
strip="strip"
|
|
cygwin="no"
|
|
gprof="no"
|
|
bigendian="no"
|
|
mingw32="no"
|
|
LIBSUF=".a"
|
|
EXESUF=""
|
|
tcc_sysincludepaths=""
|
|
tcc_libpaths=""
|
|
tcc_crtprefix=""
|
|
tcc_elfinterp=""
|
|
tcc_lddir=
|
|
confvars=
|
|
cpu=
|
|
|
|
# OS specific
|
|
targetos=`uname`
|
|
case $targetos in
|
|
MINGW32*) mingw32=yes;;
|
|
MSYS*) mingw32=yes;;
|
|
DragonFly) noldl=yes;;
|
|
OpenBSD) noldl=yes;;
|
|
FreeBSD) noldl=yes;;
|
|
NetBSD) 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
|
|
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`
|
|
;;
|
|
--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: 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)
|
|
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 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"
|
|
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
|
|
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
|
|
--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-cygwin build windows version on windows with cygwin
|
|
--enable-cross build cross compilers
|
|
--with-selinux use mmap for exec mem [needs writable /tmp]
|
|
--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
|
|
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 test -z "$cross_prefix" ; then
|
|
if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then
|
|
echo "configure: error: '$cc' failed to compile conftest.c."
|
|
else
|
|
bigendian="$($CONFTEST bigendian)"
|
|
gcc_major="$($CONFTEST version)"
|
|
gcc_minor="$($CONFTEST minor)"
|
|
if test "$mingw32" = "no" ; then
|
|
triplet="$($CONFTEST triplet)"
|
|
if test -f "/usr/lib/$triplet/crti.o" ; then
|
|
tcc_lddir="lib"
|
|
multiarch_triplet="$triplet"
|
|
elif test "$cpu" != "x86" -a -f "/usr/lib64/crti.o" ; then
|
|
tcc_lddir="lib64"
|
|
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
|
|
|
|
# multiarch_triplet=${libc_dir#*/}
|
|
# multiarch_triplet=${multiarch_triplet%/}
|
|
# tcc_lddir="${libc_dir%%/*}"
|
|
# if test -n "$multiarch_triplet" ; then
|
|
# tcc_lddir="$tcc_lddir/$multiarch_triplet"
|
|
# fi
|
|
|
|
if test -f "/lib/ld-uClibc.so.0" ; then
|
|
confvars="$confvars uClibc"
|
|
fi
|
|
|
|
# if test -z "$tcc_elfinterp" ; then
|
|
# tcc_elfinterp="$(ldd $CONFTEST | grep '/ld-.*.so' | sed 's,\s*\(\S\+\).*,\1,')"
|
|
# fi
|
|
|
|
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"
|
|
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="deprecated-declarations strict-aliasing pointer-sign sign-compare unused-result uninitialized"
|
|
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
|
|
|
|
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"
|
|
|
|
cat >config.mak <<EOF
|
|
# Automatically generated by configure - do not modify
|
|
prefix=$prefix
|
|
bindir=\$(DESTDIR)$bindir
|
|
tccdir=\$(DESTDIR)$tccdir
|
|
libdir=\$(DESTDIR)$libdir
|
|
ln_libdir=$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
|
|
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_MULTIARCHDIR "$multiarch_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 "$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
|
|
|
|
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
|
|
|
|
# ---------------------------------------------------------------------------
|