#!/bin/bash

if test x"$1" = x"-h" -o x"$1" = x"--help" ; then

echo "Usage: ./configure [options]"
echo ""
echo "available options:"
echo ""
echo "  --help                   print this message"
echo "  --disable-avs            disables avisynth support (windows only)"
echo "  --disable-lavf           disables libavformat support"
echo "  --disable-ffms           disables ffmpegsource support"
echo "  --disable-gpac           disables gpac support"
echo "  --disable-pthread        disables multithreaded encoding"
echo "  --disable-swscale        disables swscale support"
echo "  --disable-asm            disables platform-specific assembly optimizations"
echo "  --enable-debug           adds -g, doesn't strip"
echo "  --enable-gprof           adds -pg, doesn't strip"
echo "  --enable-visualize       enables visualization (X11 only)"
echo "  --enable-pic             build position-independent code"
echo "  --enable-shared          build libx264.so"
echo "  --bit-depth=BIT_DEPTH    sets output bit depth (8-10), default 8"
echo "  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS"
echo "  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS"
echo "  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS"
echo "  --host=HOST              build programs to run on HOST"
echo "  --cross-prefix=PREFIX    use PREFIX for compilation tools"
echo "  --sysroot=SYSROOT        root of cross-build tree"
echo ""
exit 1
fi

log_check() {
    echo -n "checking $1... " >> config.log
}

log_ok() {
    echo "yes" >> config.log
}

log_fail() {
    echo "no" >> config.log
}

log_msg() {
    echo "$1" >> config.log
}

cc_check() {
    if [ -z "$3" ]; then
        if [ -z "$1$2" ]; then
            log_check "whether $CC works"
        elif [ -z "$1" ]; then
            log_check "for $2"
        else
            log_check "for $1"
        fi
    elif [ -z "$1" ]; then
        log_check "whether $CC supports $3"
    else
        log_check "for $3 in $1";
    fi
    rm -f conftest.c
    [ -n "$1" ] && echo "#include <$1>" > conftest.c
    echo "int main () { $3 return 0; }" >> conftest.c
    if $CC conftest.c $CFLAGS $2 $LDFLAGSCLI $LDFLAGS -o conftest >conftest.log 2>&1; then
        res=$?
        log_ok
    else
        res=$?
        log_fail
        log_msg "Failed commandline was:"
        log_msg "--------------------------------------------------"
        log_msg "$CC conftest.c $CFLAGS $2 $LDFLAGSCLI $LDFLAGS"
        cat conftest.log >> config.log
        log_msg "--------------------------------------------------"
    fi
    return $res
}

cpp_check() {
    log_check "whether $3 is true"
    rm -f conftest.c
    [ -n "$1" ] && echo "#include <$1>" > conftest.c
    echo -e "#if !($3) \n#error $4 \n#endif " >> conftest.c

    if $CC conftest.c $CFLAGS $2 -E -o conftest >conftest.log 2>&1; then
        res=$?
        log_ok
    else
        res=$?
        log_fail
        log_msg "--------------------------------------------------"
        cat conftest.log >> config.log
        log_msg "--------------------------------------------------"
    fi
    return $res
}

as_check() {
    log_check "whether $AS supports $1"
    echo "$1" > conftest.asm
    if $AS conftest.asm $ASFLAGS $2 -o conftest.o >conftest.log 2>&1; then
        res=$?
        log_ok
    else
        res=$?
        log_fail
        log_msg "Failed commandline was:"
        log_msg "--------------------------------------------------"
        log_msg "$AS conftest.asm $ASFLAGS $2 -o conftest.o"
        cat conftest.log >> config.log
        log_msg "--------------------------------------------------"
    fi
    return $res
}

define() {
    echo "#define $1$([ -n "$2" ] && echo " $2" || echo " 1")" >> config.h
}

die() {
    log_msg "DIED: $@"
    echo "$@"
    exit 1
}

rm -f config.h config.mak config.log x264.pc conftest*

prefix='/usr/local'
exec_prefix='${prefix}'
bindir='${exec_prefix}/bin'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
DEVNULL='/dev/null'

avs="auto"
lavf="auto"
ffms="auto"
gpac="auto"
pthread="auto"
swscale="auto"
asm="auto"
debug="no"
gprof="no"
pic="no"
vis="no"
shared="no"
bit_depth="8"

CFLAGS="$CFLAGS -Wall -I."
LDFLAGS="$LDFLAGS"
LDFLAGSCLI="$LDFLAGSCLI"
ASFLAGS="$ASFLAGS"
HAVE_GETOPT_LONG=1
cross_prefix=""

EXE=""

# parse options

for opt do
    optarg="${opt#*=}"
    case "$opt" in
        --prefix=*)
            prefix="$optarg"
            ;;
        --exec-prefix=*)
            exec_prefix="$optarg"
            ;;
        --bindir=*)
            bindir="$optarg"
            ;;
        --libdir=*)
            libdir="$optarg"
            ;;
        --includedir=*)
            includedir="$optarg"
            ;;
        --disable-asm)
            asm="no"
            ;;
        --disable-avs)
            avs="no"
            ;;
        --disable-lavf)
            lavf="no"
            ;;
        --disable-ffms)
            ffms="no"
            ;;
        --disable-gpac)
            gpac="no"
            ;;
        --extra-asflags=*)
            ASFLAGS="$ASFLAGS ${opt#--extra-asflags=}"
            ;;
        --extra-cflags=*)
            CFLAGS="$CFLAGS ${opt#--extra-cflags=}"
            ;;
        --extra-ldflags=*)
            LDFLAGS="$LDFLAGS ${opt#--extra-ldflags=}"
            ;;
        --disable-pthread)
            pthread="no"
            ;;
        --disable-swscale)
            swscale="no"
            ;;
        --enable-debug)
            debug="yes"
            ;;
        --enable-gprof)
            CFLAGS="$CFLAGS -pg"
            LDFLAGS="$LDFLAGS -pg"
            gprof="yes"
            ;;
        --enable-pic)
            pic="yes"
            ;;
        --enable-shared)
            shared="yes"
            ;;
        --enable-visualize)
            vis="yes"
            ;;
        --host=*)
            host="${opt#--host=}"
            ;;
        --cross-prefix=*)
            cross_prefix="${opt#--cross-prefix=}"
            ;;
        --sysroot=*)
            CFLAGS="$CFLAGS --sysroot=${opt#--sysroot=}"
            LDFLAGS="$LDFLAGS --sysroot=${opt#--sysroot=}"
            ;;
        --bit-depth=*)
            bit_depth="${opt#--bit-depth=}"
            if [ "$bit_depth" -lt "8" -o "$bit_depth" -gt "10" ]; then
                echo "Supplied bit depth must be in range [8,10]."
                exit 1
            fi
            bit_depth=`expr $bit_depth + 0`
            ;;
        *)
            echo "Unknown option $opt, ignored"
            ;;
    esac
done

CC="${CC-${cross_prefix}gcc}"
AR="${AR-${cross_prefix}ar}"
RANLIB="${RANLIB-${cross_prefix}ranlib}"
STRIP="${STRIP-${cross_prefix}strip}"

if [ "x$host" = x ]; then
    host=`./config.guess`
fi
# normalize a triplet into a quadruplet
host=`./config.sub $host`

# split $host
host_cpu="${host%%-*}"
host="${host#*-}"
host_vendor="${host%%-*}"
host_os="${host#*-}"

case $host_os in
  beos*)
    SYS="BEOS"
    define HAVE_MALLOC_H
    ;;
  darwin*)
    SYS="MACOSX"
    CFLAGS="$CFLAGS -falign-loops=16"
    LDFLAGS="$LDFLAGS -lm"
    if [ "$pic" = "no" ]; then
        cc_check "" -mdynamic-no-pic && CFLAGS="$CFLAGS -mdynamic-no-pic"
    fi
    ;;
  freebsd*)
    SYS="FREEBSD"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  kfreebsd*-gnu)
    SYS="FREEBSD"
    define HAVE_MALLOC_H
    LDFLAGS="$LDFLAGS -lm"
    ;;
  netbsd*)
    SYS="NETBSD"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  openbsd*)
    SYS="OPENBSD"
    CFLAGS="$CFLAGS -I/usr/X11R6/include"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  *linux*)
    SYS="LINUX"
    define HAVE_MALLOC_H
    LDFLAGS="$LDFLAGS -lm"
    ;;
  cygwin*)
    SYS="MINGW"
    EXE=".exe"
    DEVNULL="NUL"
    if cc_check "" -mno-cygwin; then
        CFLAGS="$CFLAGS -mno-cygwin"
        LDFLAGS="$LDFLAGS -mno-cygwin"
    fi
    ;;
  mingw*)
    SYS="MINGW"
    EXE=".exe"
    DEVNULL="NUL"
    ;;
  sunos*|solaris*)
    SYS="SunOS"
    define HAVE_MALLOC_H
    LDFLAGS="$LDFLAGS -lm"
    HAVE_GETOPT_LONG=0
    ;;
  *)
    die "Unknown system $host, edit the configure"
    ;;
esac

case $host_cpu in
  i*86)
    ARCH="X86"
    AS="yasm"
    ASFLAGS="$ASFLAGS -O2"
    if [[ "$asm" == auto && "$CFLAGS" != *-march* ]]; then
      CFLAGS="$CFLAGS -march=i686"
    fi
    if [[ "$asm" == auto && "$CFLAGS" != *-mfpmath* ]]; then
      CFLAGS="$CFLAGS -mfpmath=sse -msse"
    fi
    if [ "$SYS" = MACOSX ]; then
      ASFLAGS="$ASFLAGS -f macho -DPREFIX"
    elif [ "$SYS" = MINGW ]; then
      ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
      LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
    else
      ASFLAGS="$ASFLAGS -f elf"
    fi
    ;;
  x86_64)
    ARCH="X86_64"
    AS="yasm"
    if [ "$SYS" = MACOSX ];then
      ASFLAGS="$ASFLAGS -f macho64 -m amd64 -DPIC -DPREFIX"
      if cc_check '' "-arch x86_64"; then
        CFLAGS="$CFLAGS -arch x86_64"
        LDFLAGS="$LDFLAGS -arch x86_64"
      fi
    elif [ "$SYS" = MINGW ]; then
      ASFLAGS="$ASFLAGS -f win32 -m amd64 -DPREFIX"
    else
      ASFLAGS="$ASFLAGS -f elf -m amd64"
    fi
    ;;
  powerpc|powerpc64)
    ARCH="PPC"
    if [ $asm = auto ] ; then
      define HAVE_ALTIVEC
      AS="${AS-${cross_prefix}gcc}"
      if [ $SYS = MACOSX ] ; then
        CFLAGS="$CFLAGS -faltivec -fastf -mcpu=G4"
      else
        CFLAGS="$CFLAGS -maltivec -mabi=altivec"
        define HAVE_ALTIVEC_H
      fi
    fi
    ;;
  sparc)
    if [ $asm = auto ] && test "$(uname -m)" = "sun4u"; then
      ARCH="UltraSparc"
      CFLAGS="$CFLAGS -mcpu=ultrasparc"
      LDFLAGS="$LDFLAGS -mcpu=ultrasparc"
      AS="${AS-${cross_prefix}as}"
      ASFLAGS="$ASFLAGS -xarch=v8plusa"
    else
      ARCH="Sparc"
    fi
    ;;
  mips|mipsel|mips64|mips64el)
    ARCH="MIPS"
    ;;
  arm*)
    ARCH="ARM"
    if [ "$SYS" = MACOSX ] ; then
      AS="${AS-extras/gas-preprocessor.pl $CC}"
      ASFLAGS="$ASFLAGS -DPREFIX -DPIC"  # apple's ld doesn't support movw/movt relocations at all
      # build for armv7 by default
      if ! echo $CFLAGS | grep -Eq '\-arch' ; then
        CFLAGS="$CFLAGS -arch armv7"
        LDFLAGS="$LDFLAGS -arch armv7"
      fi
    else
      AS="${AS-${cross_prefix}gcc}"
    fi
    ;;
  s390|s390x)
    ARCH="S390"
    ;;
  parisc|parisc64)
    ARCH="PARISC"
    ;;
  ia64)
    ARCH="IA64"
    ;;
  *)
    ARCH="$(echo $host_cpu | tr a-z A-Z)"
    ;;
esac

log_msg "x264 configure script"
if [ -n "$*" ]; then
    msg="Command line options:"
    for i in $@; do
        msg="$msg \"$i\""
    done
    log_msg "$msg"
fi
log_msg ""

# check requirements

cc_check || die "No working C compiler found."

if cc_check '' -std=gnu99 ; then
    CFLAGS="$CFLAGS -std=gnu99"
elif cc_check '' -std=c99 ; then
    CFLAGS="$CFLAGS -std=c99 -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE"
fi

if [ $shared = yes -a \( $ARCH = "X86_64" -o $ARCH = "PPC" -o $ARCH = "ALPHA" -o $ARCH = "ARM" -o $ARCH = "IA64" \) ] ; then
    pic="yes"
fi

if [ $asm = auto -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then
    if ! as_check "lzcnt eax, eax" ; then
        VER=`($AS --version || echo no assembler) 2>$DEVNULL | head -n 1`
        echo "Found $VER"
        echo "Minimum version is yasm-0.6.2"
        echo "If you really want to compile without asm, configure with --disable-asm."
        exit 1
    fi
    if ! cc_check '' '' '__asm__("pabsw %xmm0, %xmm0");' ; then
        VER=`(as --version || echo no gnu as) 2>$DEVNULL | head -n 1`
        echo "Found $VER"
        echo "Minimum version is binutils-2.17"
        echo "Your compiler can't handle inline SSSE3 asm."
        echo "If you really want to compile without asm, configure with --disable-asm."
        exit 1
    fi
    define HAVE_MMX
fi

if [ $asm = auto -a $ARCH = ARM ] ; then
    # set flags so neon is built by default
    echo $CFLAGS | grep -Eq '(-mcpu|-march|-mfpu|-mfloat-abi)' || CFLAGS="$CFLAGS -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp"

    if  cc_check '' '' '__asm__("rev ip, ip");' ; then      define HAVE_ARMV6
        cc_check '' '' '__asm__("movt r0, #0");'         && define HAVE_ARMV6T2
        cc_check '' '' '__asm__("vadd.i16 q0, q0, q0");' && define HAVE_NEON
        ASFLAGS="$ASFLAGS $CFLAGS -c"
    else
        echo "You specified a pre-ARMv6 or Thumb-1 CPU in your CFLAGS."
        echo "If you really want to run on such a CPU, configure with --disable-asm."
        exit 1
    fi
fi

[ $asm = no ] && AS=""
[ "x$AS" = x ] && asm="no" || asm="yes"

define ARCH_$ARCH
define SYS_$SYS

echo "int i = 0x42494745; double f = 0x1.0656e6469616ep+102;" > conftest.c
$CC $CFLAGS conftest.c -c -o conftest.o 2>$DEVNULL || die "endian test failed"
if grep -q BIGE conftest.o && grep -q FPendian conftest.o ; then
    define WORDS_BIGENDIAN
elif !(grep -q EGIB conftest.o && grep -q naidnePF conftest.o) ; then
    die "endian test failed"
fi

# autodetect options that weren't forced nor disabled

libpthread=""
if test "$pthread" = "auto" ; then
    pthread="no"
    case $SYS in
        BEOS)
            pthread="yes"
            ;;
        MINGW)
            if cc_check pthread.h -lpthread "pthread_create(0,0,0,0);" ; then
                pthread="yes"
                libpthread="-lpthread"
            elif cc_check pthread.h -lpthreadGC2 "pthread_create(0,0,0,0);" ; then
                pthread="yes"
                libpthread="-lpthreadGC2"
            elif cc_check pthread.h "-lpthreadGC2 -lwsock32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
                pthread="yes"
                libpthread="-lpthreadGC2 -lwsock32"
                define PTW32_STATIC_LIB
            elif cc_check pthread.h "-lpthreadGC2 -lws2_32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
                pthread="yes"
                libpthread="-lpthreadGC2 -lws2_32"
                define PTW32_STATIC_LIB
            fi
            ;;
        OPENBSD)
            cc_check pthread.h -pthread && pthread="yes" && libpthread="-pthread"
            ;;
        *)
            cc_check pthread.h -lpthread && pthread="yes" && libpthread="-lpthread"
            ;;
    esac
fi
if test "$pthread" = "yes" ; then
    define HAVE_PTHREAD
    LDFLAGS="$LDFLAGS $libpthread"
fi

if cc_check "math.h" "-Werror" "return log2f(2);" ; then
    define HAVE_LOG2F
fi

if [ "$vis" = "yes" ] && cc_check "X11/Xlib.h" "-L/usr/X11R6/lib -lX11" "XOpenDisplay( 0 );" ; then
    LDFLAGS="-L/usr/X11R6/lib -lX11 $LDFLAGS"
    define HAVE_VISUALIZE
else
    vis="no"
fi

if [ "$swscale" = "auto" ] ; then
    swscale="no"
    if ${cross_prefix}pkg-config --exists libswscale 2>$DEVNULL; then
        SWSCALE_LIBS="$SWSCALE_LIBS $(${cross_prefix}pkg-config --libs libswscale)"
        SWSCALE_CFLAGS="$SWSCALE_CFLAGS $(${cross_prefix}pkg-config --cflags libswscale)"
    fi
    [ -z "$SWSCALE_LIBS" ] && SWSCALE_LIBS="-lswscale -lavutil"

    error="swscale must be at least version 0.9.0"
    if cc_check "libswscale/swscale.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "sws_getContext(0,0,0,0,0,0,0,0,0,0);" ; then
        if cpp_check "libswscale/swscale.h" "$SWSCALE_CFLAGS" "LIBSWSCALE_VERSION_INT >= AV_VERSION_INT(0,9,0)" "$error"; then
            # we use colorspaces that were defined in libavutil r19775
            if cc_check "libavutil/pixfmt.h" "$SWSCALE_CFLAGS" "enum PixelFormat pixfmt = PIX_FMT_YUV422P16LE;" ; then
                define HAVE_SWSCALE
                swscale="yes"
            else
                echo "Warning: libavutil is too old, update to ffmpeg r19775+"
            fi
        else
            echo "Warning: ${error}"
        fi
    fi
fi

if [ "$lavf" = "auto" ] ; then
    lavf="no"
    if ${cross_prefix}pkg-config --exists libavformat libavcodec libswscale 2>$DEVNULL; then
        LAVF_LIBS="$LAVF_LIBS $(${cross_prefix}pkg-config --libs libavformat libavcodec libavutil libswscale)"
        LAVF_CFLAGS="$LAVF_CFLAGS $(${cross_prefix}pkg-config --cflags libavformat libavcodec libavutil libswscale)"
    fi
    if [ -z "$LAVF_LIBS" -a -z "$LAVF_CFLAGS" ]; then
        LAVF_LIBS="-lavformat"
        for lib in -lpostproc -lavcodec -lswscale -lavutil -lm -lz -lbz2 $libpthread -lavifil32; do
            cc_check "" $lib && LAVF_LIBS="$LAVF_LIBS $lib"
        done
    fi
    LAVF_LIBS="-L. $LAVF_LIBS"
    if cc_check libavformat/avformat.h "$LAVF_CFLAGS $LAVF_LIBS" "avcodec_decode_video2(0,0,0,0);" ; then
        # libvautil/pixdesc.h included the private header intreadwrite.h until r21854
        if cc_check libavutil/pixdesc.h "$LAVF_CFLAGS $LAVF_LIBS" ; then
            if [ "$swscale" = "yes" ]; then
                lavf="yes"
                define HAVE_LAVF
            else
                echo "Warning: libavformat is not supported without swscale support"
            fi
        else
            echo "Warning: libavutil is too old, update to ffmpeg r21854+"
        fi
    fi
fi

if [ "$ffms" = "auto" ] ; then
    ffms_major="2"; ffms_minor="13"; ffms_micro="1"; ffms_bump="0"
    ffms="no"

    if ${cross_prefix}pkg-config --exists ffms2 2>$DEVNULL; then
        FFMS2_LIBS="$FFMS2_LIBS $(${cross_prefix}pkg-config --libs ffms2)"
        FFMS2_CFLAGS="$FFMS2_CFLAGS $(${cross_prefix}pkg-config --cflags ffms2)"
    fi
    [ -z "$FFMS2_LIBS" ] && FFMS2_LIBS="-lffms2"

    if cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS" "FFMS_DestroyVideoSource(0);" ; then
        ffms="yes"
    elif cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS -lstdc++ $LAVF_LIBS" "FFMS_DestroyVideoSource(0);" ; then
        ffms="yes"
        FFMS2_LIBS="$FFMS2_LIBS -lstdc++ $LAVF_LIBS"
    fi

    error="ffms must be at least version $ffms_major.$ffms_minor.$ffms_micro.$ffms_bump"
    if [ $ffms = "yes" ] && ! cpp_check "ffms.h" "$FFMS2_CFLAGS" "FFMS_VERSION >= (($ffms_major << 24) | ($ffms_minor << 16) | ($ffms_micro << 8) | $ffms_bump)" "$error"; then
       ffms="no"
       echo "Warning: $error"
    fi
    if [ "$ffms" = "yes" -a "$swscale" = "no" ]; then
        echo "Warning: ffms is not supported without swscale support"
        ffms="no"
    fi
fi

if [ "$ffms" = "yes" ]; then
    LDFLAGSCLI="$FFMS2_LIBS $LDFLAGSCLI"
    CFLAGS="$CFLAGS $FFMS2_CFLAGS"
    define HAVE_FFMS
elif [ "$lavf" = "yes" ]; then
    LDFLAGSCLI="$LAVF_LIBS $LDFLAGSCLI"
    CFLAGS="$CFLAGS $LAVF_CFLAGS"
elif [ "$swscale" = "yes" ]; then
    LDFLAGSCLI="$SWSCALE_LIBS $LDFLAGSCLI"
    CFLAGS="$CFLAGS $SWSCALE_CFLAGS"
fi

GPAC_LIBS="-lgpac_static"
if [ $SYS = MINGW ]; then
    GPAC_LIBS="$GPAC_LIBS -lwinmm"
fi
if [ "$gpac" = "auto" ] ; then
    gpac="no"
    if cc_check gpac/isomedia.h "$GPAC_LIBS" ; then
        if cc_check gpac/isomedia.h "$GPAC_LIBS" "gf_isom_set_pixel_aspect_ratio(0,0,0,0,0);" ; then
            gpac="yes"
        else
            echo "Warning: gpac is too old, update to 2007-06-21 UTC or later"
        fi
    fi
fi
if [ "$gpac" = "yes" ] ; then
    define HAVE_GPAC
    if cc_check gpac/isomedia.h "-Werror $GPAC_LIBS" "gf_malloc(1); gf_free(NULL);" ; then
        define HAVE_GF_MALLOC
    fi
    LDFLAGSCLI="$GPAC_LIBS $LDFLAGSCLI"
fi

if [ "$avs" = "auto" ] ; then
    avs="no"
    if [ $SYS = MINGW ] && cc_check extras/avisynth_c.h ; then
        avs="yes"
        define HAVE_AVS
    fi
fi

if [ "$pic" = "yes" ] ; then
    CFLAGS="$CFLAGS -fPIC"
    ASFLAGS="$ASFLAGS -DPIC"
    # resolve textrels in the x86 asm
    cc_check stdio.h -Wl,-Bsymbolic && LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
fi

if [ "$debug" != "yes" -a "$gprof" != "yes" ]; then
    CFLAGS="$CFLAGS -s -fomit-frame-pointer"
    LDFLAGS="$LDFLAGS -s"
fi

if [ "$debug" = "yes" ]; then
    CFLAGS="-O1 -g $CFLAGS"
elif [ $ARCH = ARM ]; then
    # arm-gcc-4.2 produces incorrect output with -ffast-math
    # and it doesn't save any speed anyway on 4.4, so disable it
    CFLAGS="-O3 -fno-fast-math $CFLAGS"
else
    CFLAGS="-O3 -ffast-math $CFLAGS"
fi

if cc_check '' -fno-tree-vectorize ; then
    CFLAGS="$CFLAGS -fno-tree-vectorize"
fi

if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then
    define fseek fseeko
    define ftell ftello
elif cc_check "stdio.h" "" "fseeko64(stdin,0,0);" ; then
    define fseek fseeko64
    define ftell ftello64
fi

if cc_check '' -Wshadow ; then
    CFLAGS="-Wshadow $CFLAGS"
fi

if [ "$bit_depth" -gt "8" ]; then
    define X264_HIGH_BIT_DEPTH
fi

define BIT_DEPTH $bit_depth

rm -f conftest*

# generate config files

cat > config.mak << EOF
prefix=$prefix
exec_prefix=$exec_prefix
bindir=$bindir
libdir=$libdir
includedir=$includedir
ARCH=$ARCH
SYS=$SYS
CC=$CC
CFLAGS=$CFLAGS
LDFLAGS=$LDFLAGS
LDFLAGSCLI=$LDFLAGSCLI
AR=$AR
RANLIB=$RANLIB
STRIP=$STRIP
AS=$AS
ASFLAGS=$ASFLAGS
EXE=$EXE
VIS=$vis
HAVE_GETOPT_LONG=$HAVE_GETOPT_LONG
DEVNULL=$DEVNULL
EOF

if [ "$shared" = "yes" ]; then
    API=$(grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' ')
    if [ "$SYS" = "MINGW" ]; then
        echo "SONAME=libx264-$API.dll" >> config.mak
        echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
        echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
    elif [ "$SYS" = "MACOSX" ]; then
        echo "SOSUFFIX=dylib" >> config.mak
        echo "SONAME=libx264.$API.dylib" >> config.mak
        echo 'SOFLAGS=-dynamiclib -Wl,-single_module -Wl,-read_only_relocs,suppress -install_name $(DESTDIR)$(libdir)/$(SONAME)' >> config.mak
    elif [ "$SYS" = "SunOS" ]; then
        echo "SOSUFFIX=so" >> config.mak
        echo "SONAME=libx264.so.$API" >> config.mak
        echo 'SOFLAGS=-Wl,-h,$(SONAME)' >> config.mak
    else
        echo "SOSUFFIX=so" >> config.mak
        echo "SONAME=libx264.so.$API" >> config.mak
        echo 'SOFLAGS=-Wl,-soname,$(SONAME)' >> config.mak
    fi
    echo 'default: $(SONAME)' >> config.mak
fi

./version.sh >> config.h

pclibs="-L$libdir -lx264 $libpthread"

cat > x264.pc << EOF
prefix=$prefix
exec_prefix=$exec_prefix
libdir=$libdir
includedir=$includedir

Name: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: $(grep POINTVER < config.h | sed -e 's/.* "//; s/".*//')
Libs: $pclibs
Cflags: -I$includedir
EOF

filters="crop select_every"
[ $swscale = yes ] && filters="resize $filters"

cat > conftest.log <<EOF
Platform:   $ARCH
System:     $SYS
asm:        $asm
avs:        $avs
lavf:       $lavf
ffms:       $ffms
gpac:       $gpac
pthread:    $pthread
filters:    $filters
debug:      $debug
gprof:      $gprof
PIC:        $pic
shared:     $shared
visualize:  $vis
bit depth:  $bit_depth
EOF

echo >> config.log
cat conftest.log >> config.log
cat conftest.log
rm conftest.log

echo
echo "You can run 'make' or 'make fprofiled' now."

