Skip to content
Snippets Groups Projects
configure 147 KiB
Newer Older
  • Learn to ignore specific revisions
  • mpeg2_vdpau_hwaccel_deps="vdpau"
    mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
    mpeg4_vaapi_hwaccel_deps="vaapi"
    mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
    mpeg4_vdpau_hwaccel_deps="vdpau"
    mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
    
    vc1_dxva2_hwaccel_deps="dxva2"
    vc1_dxva2_hwaccel_select="vc1_decoder"
    
    vc1_vaapi_hwaccel_deps="vaapi"
    vc1_vaapi_hwaccel_select="vc1_decoder"
    vc1_vdpau_hwaccel_deps="vdpau"
    vc1_vdpau_hwaccel_select="vc1_decoder"
    
    wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
    wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
    
    wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
    
    h264_parser_select="h264_decoder"
    
    mpegvideo_parser_select="mpegvideo"
    
    mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
    
    vc1_parser_select="mpegvideo startcode vc1_decoder"
    
    # bitstream_filters
    mjpeg2jpeg_bsf_select="jpegtables"
    
    
    # external libraries
    
    libdcadec_decoder_deps="libdcadec"
    
    libfaac_encoder_select="audio_frame_queue"
    
    libfdk_aac_decoder_deps="libfdk_aac"
    
    libfdk_aac_encoder_deps="libfdk_aac"
    
    libfdk_aac_encoder_select="audio_frame_queue"
    
    libgsm_decoder_deps="libgsm"
    libgsm_encoder_deps="libgsm"
    
    libgsm_ms_decoder_deps="libgsm"
    libgsm_ms_encoder_deps="libgsm"
    
    libilbc_decoder_deps="libilbc"
    libilbc_encoder_deps="libilbc"
    
    libmp3lame_encoder_select="audio_frame_queue"
    
    libopencore_amrnb_decoder_deps="libopencore_amrnb"
    libopencore_amrnb_encoder_deps="libopencore_amrnb"
    
    libopencore_amrnb_encoder_select="audio_frame_queue"
    
    libopencore_amrwb_decoder_deps="libopencore_amrwb"
    
    libopenh264_encoder_deps="libopenh264"
    
    libopenjpeg_decoder_deps="libopenjpeg"
    
    libopenjpeg_encoder_deps="libopenjpeg"
    
    libopus_decoder_deps="libopus"
    
    libopus_encoder_deps="libopus"
    
    libopus_encoder_select="audio_frame_queue"
    
    libschroedinger_decoder_deps="libschroedinger"
    libschroedinger_encoder_deps="libschroedinger"
    
    libspeex_decoder_deps="libspeex"
    
    libspeex_encoder_deps="libspeex"
    
    libspeex_encoder_select="audio_frame_queue"
    
    libtheora_encoder_deps="libtheora"
    
    libtwolame_encoder_deps="libtwolame"
    
    libvo_aacenc_encoder_deps="libvo_aacenc"
    
    libvo_aacenc_encoder_select="audio_frame_queue"
    
    libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
    
    libvorbis_encoder_deps="libvorbis"
    
    libvorbis_encoder_select="audio_frame_queue"
    
    libvpx_vp8_decoder_deps="libvpx"
    libvpx_vp8_encoder_deps="libvpx"
    libvpx_vp9_decoder_deps="libvpx"
    libvpx_vp9_encoder_deps="libvpx"
    
    libwavpack_encoder_deps="libwavpack"
    
    Justin Ruggles's avatar
    Justin Ruggles committed
    libwebp_encoder_deps="libwebp"
    
    Derek Buitenhuis's avatar
    Derek Buitenhuis committed
    libx265_encoder_deps="libx265"
    
    libxavs_encoder_deps="libxavs"
    
    # demuxers / muxers
    
    ac3_demuxer_select="ac3_parser"
    
    asf_demuxer_select="riffdec"
    
    asf_muxer_select="riffenc"
    
    asf_stream_muxer_select="asf_muxer"
    
    avi_demuxer_select="riffdec"
    
    avi_muxer_select="riffenc"
    
    avisynth_demuxer_deps="avisynth"
    
    avisynth_demuxer_select="riffdec"
    caf_demuxer_select="riffdec"
    
    dash_muxer_select="mp4_muxer"
    
    dirac_demuxer_select="dirac_parser"
    
    dv_demuxer_select="dvprofile"
    dv_muxer_select="dvprofile"
    
    dxa_demuxer_select="riffdec"
    
    f4v_muxer_select="mov_muxer"
    
    flac_demuxer_select="flac_parser"
    
    hds_muxer_select="flv_muxer"
    
    hls_muxer_select="mpegts_muxer"
    
    ismv_muxer_select="mov_muxer"
    
    matroska_audio_muxer_select="matroska_muxer"
    
    matroska_demuxer_select="riffdec"
    
    matroska_demuxer_suggest="bzlib lzo zlib"
    
    matroska_muxer_select="riffenc"
    mmf_muxer_select="riffenc"
    
    mov_demuxer_select="riffdec"
    
    mov_demuxer_suggest="zlib"
    
    mov_muxer_select="riffenc rtpenc_chain"
    
    mp3_demuxer_select="mpegaudio_parser"
    
    mpegts_muxer_select="adts_muxer latm_muxer"
    
    mpegtsraw_demuxer_select="mpegts_demuxer"
    mxf_d10_muxer_select="mxf_muxer"
    
    nut_muxer_select="riffenc"
    
    nuv_demuxer_select="riffdec"
    
    oga_muxer_select="ogg_muxer"
    
    ogg_demuxer_select="golomb"
    
    opus_muxer_select="ogg_muxer"
    
    rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol"
    
    rtsp_demuxer_select="http_protocol rtpdec"
    
    rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
    
    Martin Storsjö's avatar
    Martin Storsjö committed
    sap_demuxer_select="sdp_demuxer"
    
    sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
    
    smoothstreaming_muxer_select="ismv_muxer"
    
    spdif_muxer_select="aac_parser"
    
    spx_muxer_select="ogg_muxer"
    
    tak_demuxer_select="tak_parser"
    
    tg2_muxer_select="mov_muxer"
    tgp_muxer_select="mov_muxer"
    
    wav_demuxer_select="riffdec"
    
    wav_muxer_select="riffenc"
    webm_muxer_select="riffenc"
    
    wtv_demuxer_select="riffdec"
    xmv_demuxer_select="riffdec"
    xwma_demuxer_select="riffdec"
    
    alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
    alsa_outdev_deps="alsa_asoundlib_h"
    bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
    
    dv1394_indev_deps="dv1394"
    dv1394_indev_select="dv_demuxer"
    
    fbdev_indev_deps="linux_fb_h"
    
    jack_indev_deps="jack_jack_h pthreads"
    
    libcdio_indev_deps="libcdio"
    
    libdc1394_indev_deps="libdc1394"
    oss_indev_deps_any="soundcard_h sys_soundcard_h"
    oss_outdev_deps_any="soundcard_h sys_soundcard_h"
    
    pulse_indev_deps="libpulse"
    
    sndio_indev_deps="sndio_h"
    sndio_outdev_deps="sndio_h"
    
    v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
    
    vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
    
    vfwcap_indev_extralibs="-lavicap32"
    
    x11grab_indev_deps="x11grab"
    x11grab_xcb_indev_deps="libxcb"
    
    # protocols
    
    Samuel Pitoiset's avatar
    Samuel Pitoiset committed
    ffrtmpcrypt_protocol_deps="!librtmp_protocol"
    ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
    ffrtmpcrypt_protocol_select="tcp_protocol"
    
    ffrtmphttp_protocol_deps="!librtmp_protocol"
    ffrtmphttp_protocol_select="http_protocol"
    
    http_protocol_select="tcp_protocol"
    
    httpproxy_protocol_select="tcp_protocol"
    
    https_protocol_select="tls_protocol"
    
    Marvin Scholz's avatar
    Marvin Scholz committed
    icecast_protocol_select="http_protocol"
    
    librtmp_protocol_deps="librtmp"
    librtmpe_protocol_deps="librtmp"
    librtmps_protocol_deps="librtmp"
    librtmpt_protocol_deps="librtmp"
    librtmpte_protocol_deps="librtmp"
    
    Måns Rullgård's avatar
    Måns Rullgård committed
    mmsh_protocol_select="http_protocol"
    
    rtmp_protocol_deps="!librtmp_protocol"
    
    rtmp_protocol_select="tcp_protocol"
    
    Samuel Pitoiset's avatar
    Samuel Pitoiset committed
    rtmpe_protocol_select="ffrtmpcrypt_protocol"
    
    Samuel Pitoiset's avatar
    Samuel Pitoiset committed
    rtmps_protocol_deps="!librtmp_protocol"
    rtmps_protocol_select="tls_protocol"
    
    rtmpt_protocol_select="ffrtmphttp_protocol"
    
    Samuel Pitoiset's avatar
    Samuel Pitoiset committed
    rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
    
    rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
    
    rtp_protocol_select="udp_protocol"
    
    sctp_protocol_deps="struct_sctp_event_subscribe"
    sctp_protocol_select="network"
    
    srtp_protocol_select="rtp_protocol"
    
    tls_protocol_deps_any="openssl gnutls"
    tls_protocol_select="tcp_protocol"
    
    Luca Barbato's avatar
    Luca Barbato committed
    unix_protocol_deps="sys_un_h"
    unix_protocol_select="network"
    
    blackframe_filter_deps="gpl"
    
    boxblur_filter_deps="gpl"
    
    bs2b_filter_deps="libbs2b"
    
    cropdetect_filter_deps="gpl"
    
    delogo_filter_deps="gpl"
    
    frei0r_filter_deps="frei0r dlopen"
    
    frei0r_filter_extralibs='$ldl'
    
    frei0r_src_filter_deps="frei0r dlopen"
    
    frei0r_src_filter_extralibs='$ldl'
    
    hqdn3d_filter_deps="gpl"
    
    interlace_filter_deps="gpl"
    
    resample_filter_deps="avresample"
    
    scale_filter_deps="swscale"
    
    avcodec_example_deps="avcodec avutil"
    
    filter_audio_example_deps="avfilter avutil"
    
    metadata_example_deps="avformat avutil"
    
    output_example_deps="avcodec avformat avutil swscale"
    
    qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder vaapi_x11"
    
    transcode_aac_example_deps="avcodec avformat avresample"
    
    # libraries, in linking order
    
    avdevice_deps="avformat avcodec avutil"
    
    avformat_deps="avcodec avutil"
    
    avresample_deps="avutil"
    swscale_deps="avutil"
    
    # programs
    
    avconv_deps="avcodec avfilter avformat avresample swscale"
    
    avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
    
                   fps_filter null_filter resample_filter scale_filter
    
                   setpts_filter trim_filter"
    
    avplay_deps="avcodec avformat avresample swscale sdl"
    
    avplay_select="rdft transpose_filter hflip_filter vflip_filter"
    
    avprobe_deps="avcodec avformat"
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    # default parameters
    
    
    # installation paths
    
    prefix_default="/usr/local"
    bindir_default='${prefix}/bin'
    
    datadir_default='${prefix}/share/avconv'
    
    docdir_default='${prefix}/share/doc/libav'
    
    incdir_default='${prefix}/include'
    libdir_default='${prefix}/lib'
    mandir_default='${prefix}/share/man'
    shlibdir_default="$libdir_default"
    
    ar_default="ar"
    
    host_cc_default="gcc"
    
    Mans Rullgard's avatar
    Mans Rullgard committed
    cp_f="cp -f"
    
    nm_default="nm -g"
    
    objformat="elf"
    
    pkg_config_default=pkg-config
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    ranlib="ranlib"
    
    strip="strip"
    
    yasmexe="yasm"
    
    intrinsics="none"
    
    target_os_default=$(tolower $(uname -s))
    host_os=$target_os_default
    
    
    # configurable options
    
    enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
    
    enable faan faandct faanidct
    
    enable safe_bitstream_reader
    
    enable static
    
    # By default, enable only those hwaccels that have no external dependencies.
    
    enable dxva2 vda vdpau
    
    # build settings
    
    SHFLAGS='-shared -Wl,-soname,$$(@F)'
    
    FULLNAME='$(NAME)$(BUILDSUF)'
    LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
    
    SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
    
    SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    
    Måns Rullgård's avatar
    Måns Rullgård committed
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    
    asflags_filter=echo
    cflags_filter=echo
    
    ldflags_filter=echo
    
    
    HOSTCC_E='-E -o $@'
    
    HOSTLD_O='-o $@'
    
    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-ldexeflags=*)
                add_ldexeflags $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)
            ;;
    
    Anton Khirnov's avatar
    Anton Khirnov committed
            --enable-avserver|--disable-avserver*)
                warn "avserver has been removed, the ${opt} option is only"\
                     "provided for compatibility and will be removed in the future"
            ;;
    
            --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
    
    
    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
    
        clang-usan)
            cc_default="clang"
    
            add_ldflags -fsanitize=undefined
        ;;
    
        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
        ;;
    
        gcc-usan)
            cc_default="gcc"
            add_cflags  -fsanitize=undefined
            add_ldflags -fsanitize=undefined
        ;;
    
        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"
        ;;
    
            # Check whether the current MSVC version needs the C99 converter.
            # From MSVC 2013 (compiler major version 18) onwards, it does actually
    
            # support enough of C99 to build libav. Default to the new
    
            # behaviour if the regexp was unable to match anything, since this
            # successfully parses the version number of existing supported
            # versions that require the converter (MSVC 2010 and 2012).
            cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
            if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
    
            nm_default="dumpbin -symbols"
    
            target_os_default="win32"
    
            # Use a relative path for TMPDIR. This makes sure all the
            # ffconf temp files are written with a relative path, avoiding
            # issues with msys/win32 path conversion for MSVC parameters
            # such as -Fo<file> or -out:<file>.
            TMPDIR=.
    
            nm_default="dumpbin -symbols"
            ar_default="xilib"
            target_os_default="win32"
    
        gcov)
            add_cflags  -fprofile-arcs -ftest-coverage
            add_ldflags -fprofile-arcs -ftest-coverage
        ;;
    
            add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
            add_cflags   -fno-strict-overflow -fstack-protector-all
            add_ldflags  -Wl,-z,relro -Wl,-z,now
    
        ?*)
            die "Unknown toolchain $toolchain"
        ;;
    esac
    
    
    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}"
    nm_default="${cross_prefix}${nm_default}"
    pkg_config_default="${cross_prefix}${pkg_config_default}"
    ranlib="${cross_prefix}${ranlib}"
    strip="${cross_prefix}${strip}"
    
    sysinclude_default="${sysroot}/usr/include"
    
    
    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
    
    
    armasm_flags(){
        for flag; do
            case $flag in
                # Filter out MSVC cl.exe options from cflags that shouldn't
                # be passed to gas-preprocessor
                -M[TD]*)                                            ;;
                *)                  echo $flag                      ;;
            esac
       done
    }
    
    
    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
    }
    
    
    Luca Barbato's avatar
    Luca Barbato committed
    cparser_flags(){
        for flag; do
            case $flag in
                -Wno-switch)             echo -Wno-switch-enum ;;
                -Wno-format-zero-length) ;;
                -Wdisabled-optimization) ;;
                -Wno-pointer-sign)       echo -Wno-other ;;
                *)                       echo $flag ;;
            esac
        done
    }
    
    
        for flag; do
            case $flag in
    
                # In addition to specifying certain flags under the compiler
                # specific filters, they must be specified here as well or else the
                # generic catch all at the bottom will print the original flag.
                -Wall)                ;;
                -std=c99)             ;;
                # Common flags
    
                -fomit-frame-pointer) ;;
    
                -g)                   echo -Z7 ;;
                -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 ;;
    
                -L*)                  echo -libpath:${flag#-L} ;;
    
    msvc_flags(){
        msvc_common_flags "$@"
        for flag; do
            case $flag in
    
                -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
    
                                           -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                           -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
    
            esac
        done
    }
    
    icl_flags(){
        msvc_common_flags "$@"
        for flag; do
            case $flag in
                # Despite what Intel's documentation says -Wall, which is supported
                # on Windows, does enable remarks so disable them here.
                -Wall)                echo $flag -Qdiag-disable:remark ;;
                -std=c99)             echo -Qstd=c99 ;;
            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 -Eq "ARM (C/C\+\+ )?Compiler"; then
    
            test -d "$sysroot" || die "No valid sysroot specified."
            _type=armcc
    
            _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
    
            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 -MF $(@:.o=.d) -MT $@'
    
            _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.*ARM.*Assembler'; then
            _type=armasm
            _ident=$($_cc | head -n1)
            # 4509: "This form of conditional instruction is deprecated"
            _flags="-nologo -ignore 4509"
    
        elif $_cc 2>&1 | grep -q Microsoft; then
            _type=msvc
    
            _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"
            if $_cc 2>&1 | grep -q Linker; then
    
            _flags_filter=msvc_flags
            _ld_lib='lib%.a'
            _ld_path='-libpath:'
            _flags='-nologo'
    
            _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
    
            if [ $pfx = hostcc ]; then
    
                append _cflags -Dsnprintf=_snprintf
    
        elif $_cc 2>&1 | grep -q Intel; then
            _type=icl
    
            _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
    
            # Not only is O3 broken on 13.x+ but it is slower on all previous
            # versions (tested) as well.
    
            _cflags_speed="-O2"
            _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff