Skip to content
Snippets Groups Projects
configure 125 KiB
Newer Older
host_cflags='-O3 -g'
host_cppflags='-D_ISOC99_SOURCE -D_XOPEN_SOURCE=600'
host_libs='-lm'
host_cflags_filter=echo
host_ldflags_filter=echo
target_path='$(CURDIR)'
# since the object filename is not given with the -MM flag, the compiler
# is only able to print the basename, and we must add the path ourselves
DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
DEPFLAGS='-MM'
if test -f configure; then
    source_path=.
    source_path=$(cd $(dirname "$0"); pwd)
    echo "$source_path" | grep -q '[[:blank:]]' &&
        die "Out of tree builds are impossible with whitespace in source path."
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
    LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
}

ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

enable $ARCH_EXT_LIST

die_unknown(){
    echo "Unknown option \"$1\"."
    echo "See $0 --help for available options."
    exit 1
}

print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

Ramiro Polla's avatar
Ramiro Polla committed
    suffix=_$1
    shift
    echo $* | sed s/$suffix//g | print_3_columns
rand_list(){
    IFS=', '
    set -- $*
    unset IFS
    for thing; do
        comp=${thing%:*}
        prob=${thing#$comp}
        prob=${prob#:}
        is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
        echo "prob ${prob:-0.5}"
        printf '%s\n' $comp
    done
}

do_random(){
    action=$1
    shift
    random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
    $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
}

        --extra-ldflags=*)
            add_ldflags $optval
        --extra-libs=*)
            add_extralibs $optval
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
        --enable-debug=*)
            debuglevel="$optval"
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
        --enable-random|--disable-random)
            action=${opt%%-random}
            do_random ${action#--} $COMPONENT_LIST
        ;;
        --enable-random=*|--disable-random=*)
            action=${opt%%-random=*}
            do_random ${action#--} $optval
        ;;
        --enable-*=*|--disable-*=*)
            eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
            is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
            eval list=\$$(toupper $thing)_LIST
            name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
            $action $(filter "$name" $list)
        ;;
        --enable-?*|--disable-?*)
            eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
            if is_in $option $COMPONENT_LIST; then
                test $action = disable && action=unset
                eval $action \$$(toupper ${option%s})_LIST
            elif is_in $option $CMDLINE_SELECT; then
                $action $option
            else
                die_unknown $opt
            fi
        ;;
        --list-*)
            NAME="${opt#--list-}"
            is_in $NAME $COMPONENT_LIST || die_unknown $opt
            NAME=${NAME%s}
            eval show_list $NAME \$$(toupper $NAME)_LIST
        ;;
        --help|-h) show_help
        ;;
        *)
            optname="${opt%%=*}"
            optname="${optname#--}"
            optname=$(echo "$optname" | sed 's/-/_/g')
            if is_in $optname $CMDLINE_SET; then
                eval $optname='$optval'
            elif is_in $optname $CMDLINE_APPEND; then
                append $optname "$optval"
            else
                die_unknown $opt
            fi
        ;;
Måns Rullgård's avatar
Måns Rullgård committed
disabled logging && logfile=/dev/null

echo "# $0 $LIBAV_CONFIGURATION" > $logfile
Måns Rullgård's avatar
Måns Rullgård committed
set >> $logfile

test -n "$cross_prefix" && enable cross_compile

if enabled cross_compile; then
    test -n "$arch" && test -n "$target_os" ||
        die "Must specify target arch and OS when cross-compiling"
fi

ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
Måns Rullgård's avatar
Måns Rullgård committed
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
ranlib="${cross_prefix}${ranlib}"

sysinclude_default="${sysroot}/usr/include"

case "$toolchain" in
    clang-asan)
        cc_default="clang"
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
    ;;
    clang-tsan)
        cc_default="clang"
        add_cflags  -fsanitize=thread -pie
        add_ldflags -fsanitize=thread -pie
    gcc-asan)
        cc_default="gcc"
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
    ;;
    gcc-tsan)
        cc_default="gcc"
        add_cflags  -fsanitize=thread -pie -fPIC
        add_ldflags -fsanitize=thread -pie -fPIC
    ;;
    valgrind-massif)
        target_exec_default="valgrind"
        target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
    ;;
    valgrind-memcheck)
        target_exec_default="valgrind"
        target_exec_args="--track-origins=yes --leak-check=full"
    ;;
    msvc)
        cc_default="c99wrap cl"
        ld_default="c99wrap link"
        nm_default="dumpbin -symbols"
        target_os_default="win32"
    icl)
        cc_default="c99wrap -noconv icl"
        ld_default="c99wrap xilink"
        nm_default="dumpbin -symbols"
        ar_default="xilib"
        target_os_default="win32"
    ;;
    gcov)
        add_cflags  -fprofile-arcs -ftest-coverage
        add_ldflags -fprofile-arcs -ftest-coverage
    ;;
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

set_default arch cc pkg_config sysinclude target_exec target_os
enabled cross_compile || host_cc_default=$cc
set_default host_cc
if ! $pkg_config --version >/dev/null 2>&1; then
    warn "$pkg_config not found, library detection may fail."
    pkg_config=false
fi

        mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
    esac
}

EXESUF=$(exesuf $target_os)
HOSTEXESUF=$(exesuf $host_os)
# set temporary file name
: ${TMPDIR:=$TEMPDIR}
: ${TMPDIR:=/tmp}
if ! check_cmd mktemp -u XXXXXX; then
    # simple replacement for missing mktemp
    # NOT SAFE FOR GENERAL USE
    mktemp(){
        echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
    }
fi

tmpfile(){
    tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
        (set -C; exec > $tmp) 2>/dev/null ||
        die "Unable to create temporary file in $TMPDIR."
    append TMPFILES $tmp
    eval $1=$tmp
}

trap 'rm -f -- $TMPFILES' EXIT

tmpfile TMPASM .asm
tmpfile TMPC   .c
tmpfile TMPE   $EXESUF
tmpfile TMPH   .h
tmpfile TMPO   .o
tmpfile TMPS   .S
tmpfile TMPSH  .sh
tmpfile TMPV   .ver
chmod +x $TMPE

# make sure we can execute files in $TMPDIR
cat > $TMPSH 2>> $logfile <<EOF
#! /bin/sh
EOF
chmod +x $TMPSH >> $logfile 2>&1
if ! $TMPSH >> $logfile 2>&1; then
    cat <<EOF
Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
variable to another directory and make sure that it is not mounted noexec.
EOF
    die "Sanity test failed."
fi

ccc_flags(){
    for flag; do
        case $flag in
            -std=c99)           echo -c99                       ;;
            -mcpu=*)            echo -arch ${flag#*=}           ;;
            -mieee)             echo -ieee                      ;;
            -O*|-fast)          echo $flag                      ;;
            -fno-math-errno)    echo -assume nomath_errno       ;;
            -g)                 echo -g3                        ;;
            -Wall)              echo -msg_enable level2         ;;
            -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
            -Wl,*)              echo $flag                      ;;
            -f*|-W*)                                            ;;
            *)                  echo $flag                      ;;
        esac
   done
}

msvc_flags(){
    for flag; do
        case $flag in
            -fomit-frame-pointer) echo -Oy ;;
            -g)                   echo -Z7 ;;
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389 \
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
            -std=c99)             ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
            -lz)                  echo zlib.lib ;;
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
            -l*)                  echo ${flag#-l}.lib ;;
            *)                    echo $flag ;;
        esac
    done
}

pgi_flags(){
    for flag; do
        case $flag in
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
            -fomit-frame-pointer) echo -Mnoframe ;;
            -g)                   echo -gopt ;;
            *)                    echo $flag ;;
        esac
    done
}

suncc_flags(){
    for flag; do
        case $flag in
            -march=*|-mcpu=*)
                case "${flag#*=}" in
                    native)                   echo -xtarget=native       ;;
                    v9|niagara)               echo -xarch=sparc          ;;
                    ultrasparc)               echo -xarch=sparcvis       ;;
                    ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
                    i586|pentium)             echo -xchip=pentium        ;;
                    i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
                    pentium3*|c3-2)           echo -xtarget=pentium3     ;;
                    pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
                    pentium4*)          echo -xtarget=pentium4           ;;
                    prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
                    *-sse3)             echo -xarch=sse3                 ;;
                    core2)              echo -xarch=ssse3 -xchip=core2   ;;
                    corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
                    corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
                    amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
                    athlon-4|athlon-[mx]p)    echo -xarch=ssea           ;;
                    k8|opteron|athlon64|athlon-fx)
                                              echo -xarch=sse2a          ;;
                    athlon*)                  echo -xarch=pentium_proa   ;;
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
            *)                    echo $flag              ;;
        esac
    done
}

tms470_flags(){
    for flag; do
        case $flag in
            -march=*|-mcpu=*)
                case "${flag#*=}" in
                    armv7-a|cortex-a*)      echo -mv=7a8 ;;
                    armv7-r|cortex-r*)      echo -mv=7r4 ;;
                    armv7-m|cortex-m*)      echo -mv=7m3 ;;
                    armv6*|arm11*)          echo -mv=6   ;;
                    armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
                                            echo -mv=5e  ;;
                    armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
                esac
                ;;
            -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
            -mfpu=vfp)      echo --float_support=vfpv2        ;;
            -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
    unset _depflags _DEPCMD _DEPFLAGS
    _flags_filter=echo

    if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
        _type=llvm_gcc
        gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
        _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -v 2>&1 | grep -qi ^gcc; then
        _type=gcc
        gcc_version=$($_cc --version | head -n1)
        gcc_basever=$($_cc -dumpversion)
        gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
        gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
        _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
        if ! $_cc -dumpversion | grep -q '^2\.'; then
            _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        fi
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
        _type=icc
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
        _cflags_noopt='-O1'
    elif $_cc -v 2>&1 | grep -q xlc; then
        _type=xlc
        _ident=$($_cc -qversion 2>/dev/null | head -n1)
        _cflags_speed='-O5'
        _cflags_size='-O5 -qcompact'
    elif $_cc -V 2>/dev/null | grep -q Compaq; then
        _type=ccc
        _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
        _DEPFLAGS='-M'
        _cflags_speed='-fast'
        _cflags_size='-O1'
        _flags_filter=ccc_flags
    elif $_cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
        _ident=$($_cc --vsn | head -n1)
        armcc_conf="$PWD/armcc.conf"
        $_cc --arm_linux_configure                 \
             --arm_linux_config_file="$armcc_conf" \
             --configure_sysroot="$sysroot"        \
             --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
             die "Error creating armcc configuration file."
        $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
        _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
        as_default="${cross_prefix}gcc"
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
        _cc_o='-fe=$@'
        _depflags='-ppa -ppd=$(@:.o=.d)'
        _cflags_speed='-O3 -mf=5'
        _cflags_size='-O3 -mf=2'
        _flags_filter=tms470_flags
    elif $_cc -v 2>&1 | grep -q clang; then
        _type=clang
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -V 2>&1 | grep -q Sun; then
        _type=suncc
        _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
        _ldflags='-std=c99'
        _cflags_speed='-O5'
        _cflags_size='-O5 -xspace'
        _flags_filter=suncc_flags
    elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
        _type=pathscale
        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O2'
        _cflags_size='-Os'
        _flags_filter='filter_out -Wdisabled-optimization'
    elif $_cc -v 2>&1 | grep -q Open64; then
        _type=open64
        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O2'
        _cflags_size='-Os'
        _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
    elif $_cc -V 2>&1 | grep -q Portland; then
        _type=pgi
        _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
        _cflags_noopt="-O1"
        _flags_filter=pgi_flags
    elif $_cc 2>&1 | grep -q Microsoft; then
        _type=msvc
        _ident=$($cc 2>&1 | head -n1)
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
        _cflags_speed="-O2"
        _cflags_size="-O1"
        # Nonstandard output options, to avoid msys path conversion issues, relies on wrapper to remap it
        if $_cc 2>&1 | grep -q Linker; then
            _ld_o='-out $@'
        else
            _ld_o='-Fe$@'
        fi
        _cc_o='-Fo $@'
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
        _cflags='-D_USE_MATH_DEFINES -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
    elif $_cc 2>&1 | grep -q Intel; then
        _type=icl
        _ident=$($cc 2>&1 | head -n1)
        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
        # Not only is O3 broken on 13.x+ but it's slower on all previous versions (tested) as well
        _cflags_speed="-O2"
        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
        # Nonstandard output options, to avoid msys path conversion issues, relies on wrapper to remap it
        if $_cc 2>&1 | grep -q Linker; then
            _ld_o='-out $@'
        else
            _ld_o='-Fe$@'
        fi
        _cc_o='-Fo $@'
        _cc_e='-P'
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        # -Qdiag-error to make icl error when presented with certain unknown arguments
        _flags='-nologo -Qdiag-error:10157 -Qdiag-error:4044'
        # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency with msvc which enables it by default
        _cflags='-D_USE_MATH_DEFINES -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64 -Qstd=c99 -Qms0 -Qvec- -Qsimd- -GS'
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
        fi

    eval ${pfx}_type=\$_type
    eval ${pfx}_ident=\$_ident
}

set_ccvars(){
    eval ${1}_C=\${_cc_c-\${${1}_C}}
    eval ${1}_E=\${_cc_e-\${${1}_E}}
    eval ${1}_O=\${_cc_o-\${${1}_O}}

    if [ -n "$_depflags" ]; then
        eval ${1}_DEPFLAGS=\$_depflags
    else
        eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
        eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
        eval DEP${1}FLAGS=\$_flags
    fi
}

probe_cc cc "$cc"
cflags_filter=$_flags_filter
cflags_speed=$_cflags_speed
cflags_size=$_cflags_size
cflags_noopt=$_cflags_noopt
add_cflags $_flags $_cflags
cc_ldflags=$_ldflags
set_ccvars CC

probe_cc hostcc "$host_cc"
host_cflags_filter=$_flags_filter
add_host_cflags  $_flags $_cflags
set_ccvars HOSTCC
test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
: ${dep_cc_default:=$cc}
: ${ld_default:=$cc}
: ${host_ld_default:=$host_cc}
set_default ar as dep_cc ld host_ld
probe_cc as "$as"
asflags_filter=$_flags_filter
add_asflags $_flags $_cflags
set_ccvars AS

probe_cc ld "$ld"
ldflags_filter=$_flags_filter
add_ldflags $_flags $_ldflags
test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}
probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}

if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
    probe_cc depcc "$dep_cc"
    CCDEP=${_DEPCMD:-$DEPCMD}
    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
    DEPCCFLAGS=$_flags
fi
if $ar 2>&1 | grep -q Microsoft; then
    arflags="-nologo"
    ar_o='-out:$@'
elif $ar 2>&1 | grep -q 'Texas Instruments'; then
    arflags="rq"
    ar_o='$@'
else
    arflags="rc"
    ar_o='$@'
fi

add_asflags $extra_cflags
if test -n "$sysroot"; then
    case "$cc_type" in
        gcc|llvm_gcc|clang)
            add_cppflags --sysroot="$sysroot"
            add_ldflags --sysroot="$sysroot"
        ;;
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
        ;;
if test "$cpu" = host; then
    enabled cross_compile && die "--cpu=host makes no sense when cross-compiling."

    case "$cc_type" in
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
                sed -n "/cc1.*$1=/{
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

    test "${cpu:-host}" = host && die "--cpu=host not supported with compiler $cc"
fi

# Deal with common $arch aliases
case "$arch" in
    aarch64|arm64)
        arch="aarch64"
    ;;
    parisc*|hppa*)
        arch="parisc"
    ;;
    "Power Macintosh"|ppc*|powerpc*)
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
    sun4u|sparc*)
    tilegx|tile-gx)
        arch="tilegx"
    ;;
    i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
# Add processor-specific flags

    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
        ;;
        *)
            cpuflags="-mcpu=$cpu"
        ;;
    esac

elif enabled alpha; then

    cpuflags="-mcpu=$cpu"

elif enabled arm; then

    check_arm_arch() {
        check_cpp_condition stddef.h \
            "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
            $cpuflags
    }

    probe_arm_arch() {
        if   check_arm_arch 4;        then echo armv4;
        elif check_arm_arch 4T;       then echo armv4t;
        elif check_arm_arch 5;        then echo armv5;
        elif check_arm_arch 5E;       then echo armv5e;
        elif check_arm_arch 5T;       then echo armv5t;
        elif check_arm_arch 5TE;      then echo armv5te;
        elif check_arm_arch 5TEJ;     then echo armv5te;
        elif check_arm_arch 6;        then echo armv6;
        elif check_arm_arch 6J;       then echo armv6j;
        elif check_arm_arch 6K;       then echo armv6k;
        elif check_arm_arch 6Z;       then echo armv6z;
        elif check_arm_arch 6ZK;      then echo armv6zk;
        elif check_arm_arch 6T2;      then echo armv6t2;
        elif check_arm_arch 7;        then echo armv7;
        elif check_arm_arch 7A  7_A;  then echo armv7-a;
        elif check_arm_arch 7R  7_R;  then echo armv7-r;
        elif check_arm_arch 7M  7_M;  then echo armv7-m;
        elif check_arm_arch 7EM 7E_M; then echo armv7-m;
        elif check_arm_arch 8A  8_A;  then echo armv8-a;
        fi
    }

    [ "$cpu" = generic ] && cpu=$(probe_arm_arch)

    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
        ;;
        *)
            cpuflags="-mcpu=$cpu"
            case $cpu in
                cortex-a*)                               subarch=armv7a  ;;
                cortex-r*)                               subarch=armv7r  ;;
                cortex-m*)                 enable thumb; subarch=armv7m  ;;
                arm11*)                                  subarch=armv6   ;;
                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
                *)                             subarch=$(probe_arm_arch) ;;
    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
        armv[6-8]*) enable fast_clz fast_unaligned ;;
    esac

elif enabled avr32; then

    case $cpu in
        ap7[02]0[0-2])
            subarch="avr32_ap"
            cpuflags="-mpart=$cpu"
        ;;
        ap)
            subarch="avr32_ap"
            cpuflags="-march=$cpu"
        ;;
        uc3[ab]*)
            subarch="avr32_uc"
            cpuflags="-mcpu=$cpu"
        ;;
        uc)
            subarch="avr32_uc"
            cpuflags="-march=$cpu"
        ;;
    esac

elif enabled bfin; then

    cpuflags="-mcpu=$cpu"

elif enabled mips; then

    cpuflags="-march=$cpu"

elif enabled ppc; then
    case $(tolower $cpu) in
        601|ppc601|powerpc601)
Måns Rullgård's avatar
Måns Rullgård committed
            cpuflags="-mcpu=601"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        603*|ppc603*|powerpc603*)
Måns Rullgård's avatar
Måns Rullgård committed
            cpuflags="-mcpu=603"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        604*|ppc604*|powerpc604*)
Måns Rullgård's avatar
Måns Rullgård committed
            cpuflags="-mcpu=604"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        g3|75*|ppc75*|powerpc75*)
            cpuflags="-mcpu=750"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        g4|745*|ppc745*|powerpc745*)
            cpuflags="-mcpu=7450"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        74*|ppc74*|powerpc74*)
            cpuflags="-mcpu=7400"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        g5|970|ppc970|powerpc970)
            cpuflags="-mcpu=970"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        power[3-7]*)
            cpuflags="-mcpu=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
            cpuflags="-mcpu=cell"
            enable ldbrx
        ;;
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
        ;;
Måns Rullgård's avatar
Måns Rullgård committed
    esac
elif enabled sparc; then

    case $cpu in
        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
            cpuflags="-mcpu=$cpu"
            disable vis
        ;;
        ultrasparc*|niagara[234])
            cpuflags="-mcpu=$cpu"
        ;;
    esac

elif enabled x86; then

Måns Rullgård's avatar
Måns Rullgård committed
    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
            disable mmx
        ;;
        # targets that do NOT support nopl and conditional mov (cmov)
Måns Rullgård's avatar
Måns Rullgård committed
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
        ;;
        # targets that do support nopl and conditional mov (cmov)
        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*)
Måns Rullgård's avatar
Måns Rullgård committed
            cpuflags="-march=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
            disable fast_cmov
        ;;
    esac
if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
fi
# compiler sanity check
check_exec <<EOF
int main(void){ return 0; }
EOF
if test "$?" != 0; then
    echo "$cc is unable to create an executable file."
    if test -z "$cross_prefix" && ! enabled cross_compile ; then
        echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
        echo "Only do this if you know what cross compiling means."
    fi
    die "C compiler test failed."
fi

check_cflags -std=c99
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
check_host_cflags -std=c99
check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

case "$arch" in
        spic=$shared
    ;;
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
        spic=$shared
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'