1#!/bin/sh
2##
3##  configure
4##
5##  This script is the front-end to the build system. It provides a similar
6##  interface to standard configure scripts with some extra bits for dealing
7##  with toolchains that differ from the standard POSIX interface and
8##  for extracting subsets of the source tree. In theory, reusable parts
9##  of this script were intended to live in build/make/configure.sh,
10##  but in practice, the line is pretty blurry.
11##
12##  This build system is based in part on the FFmpeg configure script.
13##
14
15#source_path="`dirname \"$0\"`"
16source_path=${0%/*}
17. "${source_path}/build/make/configure.sh"
18
19show_help(){
20    show_help_pre
21    cat << EOF
22Advanced options:
23  ${toggle_libs}                  libraries
24  ${toggle_examples}              examples
25  ${toggle_docs}                  documentation
26  ${toggle_unit_tests}            unit tests
27  ${toggle_decode_perf_tests}     build decoder perf tests with unit tests
28  --libc=PATH                     path to alternate libc
29  --as={yasm|nasm|auto}           use specified assembler [auto, yasm preferred]
30  --sdk-path=PATH                 path to root of sdk (android builds only)
31  ${toggle_fast_unaligned}        don't use unaligned accesses, even when
32                                  supported by hardware [auto]
33  ${toggle_codec_srcs}            in/exclude codec library source code
34  ${toggle_debug_libs}            in/exclude debug version of libraries
35  ${toggle_static_msvcrt}         use static MSVCRT (VS builds only)
36  ${toggle_vp8}                   VP8 codec support
37  ${toggle_vp9}                   VP9 codec support
38  ${toggle_internal_stats}        output of encoder internal stats for debug, if supported (encoders)
39  ${toggle_mem_tracker}           track memory usage
40  ${toggle_postproc}              postprocessing
41  ${toggle_vp9_postproc}          vp9 specific postprocessing
42  ${toggle_multithread}           multithreaded encoding and decoding
43  ${toggle_spatial_resampling}    spatial sampling (scaling) support
44  ${toggle_realtime_only}         enable this option while building for real-time encoding
45  ${toggle_onthefly_bitpacking}   enable on-the-fly bitpacking in real-time encoding
46  ${toggle_error_concealment}     enable this option to get a decoder which is able to conceal losses
47  ${toggle_runtime_cpu_detect}    runtime cpu detection
48  ${toggle_shared}                shared library support
49  ${toggle_static}                static library support
50  ${toggle_small}                 favor smaller size over speed
51  ${toggle_postproc_visualizer}   macro block / block level visualizers
52  ${toggle_multi_res_encoding}    enable multiple-resolution encoding
53  ${toggle_temporal_denoising}    enable temporal denoising and disable the spatial denoiser
54  ${toggle_webm_io}               enable input from and output to WebM container
55
56Codecs:
57  Codecs can be selectively enabled or disabled individually, or by family:
58      --disable-<codec>
59  is equivalent to:
60      --disable-<codec>-encoder
61      --disable-<codec>-decoder
62
63  Codecs available in this distribution:
64EOF
65#restore editor state '
66
67    local family;
68    local last_family;
69    local c;
70    local str;
71    for c in ${CODECS}; do
72        family=${c%_*}
73        if [ "${family}" != "${last_family}" ]; then
74            [ -z "${str}" ] || echo "${str}"
75            str="$(printf '    %10s:' ${family})"
76        fi
77        str="${str} $(printf '%10s' ${c#*_})"
78        last_family=${family}
79    done
80    echo "${str}"
81    show_help_post
82}
83
84##
85## BEGIN APPLICATION SPECIFIC CONFIGURATION
86##
87
88# all_platforms is a list of all supported target platforms. Maintain
89# alphabetically by architecture, generic-gnu last.
90all_platforms="${all_platforms} armv5te-android-gcc"
91all_platforms="${all_platforms} armv5te-linux-rvct"
92all_platforms="${all_platforms} armv5te-linux-gcc"
93all_platforms="${all_platforms} armv5te-none-rvct"
94all_platforms="${all_platforms} armv6-darwin-gcc"
95all_platforms="${all_platforms} armv6-linux-rvct"
96all_platforms="${all_platforms} armv6-linux-gcc"
97all_platforms="${all_platforms} armv6-none-rvct"
98all_platforms="${all_platforms} armv7-android-gcc"   #neon Cortex-A8
99all_platforms="${all_platforms} armv7-darwin-gcc"    #neon Cortex-A8
100all_platforms="${all_platforms} armv7-linux-rvct"    #neon Cortex-A8
101all_platforms="${all_platforms} armv7-linux-gcc"     #neon Cortex-A8
102all_platforms="${all_platforms} armv7-none-rvct"     #neon Cortex-A8
103all_platforms="${all_platforms} armv7-win32-vs11"
104all_platforms="${all_platforms} armv7-win32-vs12"
105all_platforms="${all_platforms} mips32-linux-gcc"
106all_platforms="${all_platforms} ppc32-darwin8-gcc"
107all_platforms="${all_platforms} ppc32-darwin9-gcc"
108all_platforms="${all_platforms} ppc32-linux-gcc"
109all_platforms="${all_platforms} ppc64-darwin8-gcc"
110all_platforms="${all_platforms} ppc64-darwin9-gcc"
111all_platforms="${all_platforms} ppc64-linux-gcc"
112all_platforms="${all_platforms} sparc-solaris-gcc"
113all_platforms="${all_platforms} x86-android-gcc"
114all_platforms="${all_platforms} x86-darwin8-gcc"
115all_platforms="${all_platforms} x86-darwin8-icc"
116all_platforms="${all_platforms} x86-darwin9-gcc"
117all_platforms="${all_platforms} x86-darwin9-icc"
118all_platforms="${all_platforms} x86-darwin10-gcc"
119all_platforms="${all_platforms} x86-darwin11-gcc"
120all_platforms="${all_platforms} x86-darwin12-gcc"
121all_platforms="${all_platforms} x86-darwin13-gcc"
122all_platforms="${all_platforms} x86-linux-gcc"
123all_platforms="${all_platforms} x86-linux-icc"
124all_platforms="${all_platforms} x86-os2-gcc"
125all_platforms="${all_platforms} x86-solaris-gcc"
126all_platforms="${all_platforms} x86-win32-gcc"
127all_platforms="${all_platforms} x86-win32-vs7"
128all_platforms="${all_platforms} x86-win32-vs8"
129all_platforms="${all_platforms} x86-win32-vs9"
130all_platforms="${all_platforms} x86-win32-vs10"
131all_platforms="${all_platforms} x86-win32-vs11"
132all_platforms="${all_platforms} x86-win32-vs12"
133all_platforms="${all_platforms} x86_64-darwin9-gcc"
134all_platforms="${all_platforms} x86_64-darwin10-gcc"
135all_platforms="${all_platforms} x86_64-darwin11-gcc"
136all_platforms="${all_platforms} x86_64-darwin12-gcc"
137all_platforms="${all_platforms} x86_64-darwin13-gcc"
138all_platforms="${all_platforms} x86_64-linux-gcc"
139all_platforms="${all_platforms} x86_64-linux-icc"
140all_platforms="${all_platforms} x86_64-solaris-gcc"
141all_platforms="${all_platforms} x86_64-win64-gcc"
142all_platforms="${all_platforms} x86_64-win64-vs8"
143all_platforms="${all_platforms} x86_64-win64-vs9"
144all_platforms="${all_platforms} x86_64-win64-vs10"
145all_platforms="${all_platforms} x86_64-win64-vs11"
146all_platforms="${all_platforms} x86_64-win64-vs12"
147all_platforms="${all_platforms} universal-darwin8-gcc"
148all_platforms="${all_platforms} universal-darwin9-gcc"
149all_platforms="${all_platforms} universal-darwin10-gcc"
150all_platforms="${all_platforms} universal-darwin11-gcc"
151all_platforms="${all_platforms} universal-darwin12-gcc"
152all_platforms="${all_platforms} universal-darwin13-gcc"
153all_platforms="${all_platforms} generic-gnu"
154
155# all_targets is a list of all targets that can be configured
156# note that these should be in dependency order for now.
157all_targets="libs examples docs"
158
159# all targets available are enabled, by default.
160for t in ${all_targets}; do
161    [ -f ${source_path}/${t}.mk ] && enable_feature ${t}
162done
163
164if ! perl --version >/dev/null; then
165    die "Perl is required to build"
166fi
167
168
169if [ "`cd ${source_path} && pwd`" != "`pwd`" ]; then
170  # test to see if source_path already configured
171  if [ -f ${source_path}/vpx_config.h ]; then
172    die "source directory already configured; run 'make distclean' there first"
173  fi
174fi
175
176# check installed doxygen version
177doxy_version=$(doxygen --version 2>/dev/null)
178doxy_major=${doxy_version%%.*}
179if [ ${doxy_major:-0} -ge 1 ]; then
180    doxy_version=${doxy_version#*.}
181    doxy_minor=${doxy_version%%.*}
182    doxy_patch=${doxy_version##*.}
183
184    [ $doxy_major -gt 1 ] && enable_feature doxygen
185    [ $doxy_minor -gt 5 ] && enable_feature doxygen
186    [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable_feature doxygen
187fi
188
189# install everything except the sources, by default. sources will have
190# to be enabled when doing dist builds, since that's no longer a common
191# case.
192enabled doxygen && php -v >/dev/null 2>&1 && enable_feature install_docs
193enable_feature install_bins
194enable_feature install_libs
195
196enable_feature static
197enable_feature optimizations
198enable_feature fast_unaligned #allow unaligned accesses, if supported by hw
199enable_feature spatial_resampling
200enable_feature multithread
201enable_feature os_support
202enable_feature temporal_denoising
203
204[ -d ${source_path}/../include ] && enable_feature alt_tree_layout
205for d in vp8 vp9; do
206    [ -d ${source_path}/${d} ] && disable_feature alt_tree_layout;
207done
208
209if ! enabled alt_tree_layout; then
210# development environment
211[ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder"
212[ -d ${source_path}/vp9 ] && CODECS="${CODECS} vp9_encoder vp9_decoder"
213else
214# customer environment
215[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
216[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
217[ -f ${source_path}/../include/vpx/vp9cx.h ] && CODECS="${CODECS} vp9_encoder"
218[ -f ${source_path}/../include/vpx/vp9dx.h ] && CODECS="${CODECS} vp9_decoder"
219[ -f ${source_path}/../include/vpx/vp8cx.h ] || disable_feature vp8_encoder
220[ -f ${source_path}/../include/vpx/vp8dx.h ] || disable_feature vp8_decoder
221[ -f ${source_path}/../include/vpx/vp9cx.h ] || disable_feature vp9_encoder
222[ -f ${source_path}/../include/vpx/vp9dx.h ] || disable_feature vp9_decoder
223
224[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
225fi
226
227CODECS="$(echo ${CODECS} | tr ' ' '\n')"
228CODEC_FAMILIES="$(for c in ${CODECS}; do echo ${c%_*}; done | sort | uniq)"
229
230ARCH_LIST="
231    arm
232    mips
233    x86
234    x86_64
235    ppc32
236    ppc64
237"
238ARCH_EXT_LIST="
239    edsp
240    media
241    neon
242
243    mips32
244    dspr2
245
246    mmx
247    sse
248    sse2
249    sse3
250    ssse3
251    sse4_1
252    avx
253    avx2
254
255    altivec
256"
257HAVE_LIST="
258    ${ARCH_EXT_LIST}
259    vpx_ports
260    stdint_h
261    alt_tree_layout
262    pthread_h
263    sys_mman_h
264    unistd_h
265"
266EXPERIMENT_LIST="
267    multiple_arf
268    alpha
269"
270CONFIG_LIST="
271    external_build
272    install_docs
273    install_bins
274    install_libs
275    install_srcs
276    use_x86inc
277    debug
278    gprof
279    gcov
280    rvct
281    gcc
282    msvs
283    pic
284    big_endian
285
286    codec_srcs
287    debug_libs
288    fast_unaligned
289    mem_manager
290    mem_tracker
291    mem_checks
292
293    dequant_tokens
294    dc_recon
295    runtime_cpu_detect
296    postproc
297    vp9_postproc
298    multithread
299    internal_stats
300    ${CODECS}
301    ${CODEC_FAMILIES}
302    encoders
303    decoders
304    static_msvcrt
305    spatial_resampling
306    realtime_only
307    onthefly_bitpacking
308    error_concealment
309    shared
310    static
311    small
312    postproc_visualizer
313    os_support
314    unit_tests
315    webm_io
316    decode_perf_tests
317    multi_res_encoding
318    temporal_denoising
319    experimental
320    decrypt
321    ${EXPERIMENT_LIST}
322"
323CMDLINE_SELECT="
324    external_build
325    extra_warnings
326    werror
327    install_docs
328    install_bins
329    install_libs
330    install_srcs
331    debug
332    gprof
333    gcov
334    pic
335    use_x86inc
336    optimizations
337    ccache
338    runtime_cpu_detect
339    thumb
340
341    libs
342    examples
343    docs
344    libc
345    as
346    fast_unaligned
347    codec_srcs
348    debug_libs
349
350    dequant_tokens
351    dc_recon
352    postproc
353    vp9_postproc
354    multithread
355    internal_stats
356    ${CODECS}
357    ${CODEC_FAMILIES}
358    static_msvcrt
359    mem_tracker
360    spatial_resampling
361    realtime_only
362    onthefly_bitpacking
363    error_concealment
364    shared
365    static
366    small
367    postproc_visualizer
368    unit_tests
369    webm_io
370    decode_perf_tests
371    multi_res_encoding
372    temporal_denoising
373    experimental
374    decrypt
375"
376
377process_cmdline() {
378    for opt do
379        optval="${opt#*=}"
380        case "$opt" in
381        --disable-codecs) for c in ${CODECS}; do disable_feature $c; done ;;
382        --enable-?*|--disable-?*)
383        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
384        if echo "${EXPERIMENT_LIST}" | grep "^ *$option\$" >/dev/null; then
385            if enabled experimental; then
386                ${action}_feature $option
387            else
388                log_echo "Ignoring $opt -- not in experimental mode."
389            fi
390        else
391            process_common_cmdline $opt
392        fi
393        ;;
394        *) process_common_cmdline "$opt"
395        ;;
396        esac
397    done
398}
399
400post_process_cmdline() {
401    local c
402
403    # If the codec family is disabled, disable all components of that family.
404    # If the codec family is enabled, enable all components of that family.
405    log_echo "Configuring selected codecs"
406    for c in ${CODECS}; do
407        disabled ${c%%_*} && disable_feature ${c}
408        enabled ${c%%_*} && enable_feature ${c}
409    done
410
411    # Enable all detected codecs, if they haven't been disabled
412    for c in ${CODECS}; do soft_enable $c; done
413
414    # Enable the codec family if any component of that family is enabled
415    for c in ${CODECS}; do
416        enabled $c && enable_feature ${c%_*}
417    done
418
419    # Set the {en,de}coders variable if any algorithm in that class is enabled
420    for c in ${CODECS}; do
421        enabled ${c} && enable_feature ${c##*_}s
422    done
423}
424
425
426process_targets() {
427    enabled child || write_common_config_banner
428    enabled universal || write_common_target_config_h  ${BUILD_PFX}vpx_config.h
429
430    # TODO: add host tools target (obj_int_extract, etc)
431
432    # For fat binaries, call configure recursively to configure for each
433    # binary architecture to be included.
434    if enabled universal; then
435        # Call configure (ourselves) for each subarchitecture
436        for arch in $fat_bin_archs; do
437            BUILD_PFX=${arch}/ toolchain=${arch} $self --child $cmdline_args || exit $?
438        done
439    fi
440
441    # The write_common_config (config.mk) logic is deferred until after the
442    # recursive calls to configure complete, because we want our universal
443    # targets to be executed last.
444    write_common_config_targets
445    enabled universal && echo "FAT_ARCHS=${fat_bin_archs}" >> config.mk
446
447    # Calculate the default distribution name, based on the enabled features
448    local cf
449    local DIST_DIR=vpx
450    for cf in $CODEC_FAMILIES; do
451        if enabled ${cf}_encoder && enabled ${cf}_decoder; then
452            DIST_DIR="${DIST_DIR}-${cf}"
453        elif enabled ${cf}_encoder; then
454            DIST_DIR="${DIST_DIR}-${cf}cx"
455        elif enabled ${cf}_decoder; then
456            DIST_DIR="${DIST_DIR}-${cf}dx"
457        fi
458    done
459    enabled debug_libs && DIST_DIR="${DIST_DIR}-debug"
460    enabled codec_srcs && DIST_DIR="${DIST_DIR}-src"
461    ! enabled postproc && ! enabled vp9_postproc && DIST_DIR="${DIST_DIR}-nopost"
462    ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt"
463    ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs"
464    DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}"
465    case "${tgt_os}" in
466    win*) enabled static_msvcrt && DIST_DIR="${DIST_DIR}mt" || DIST_DIR="${DIST_DIR}md"
467          DIST_DIR="${DIST_DIR}-${tgt_cc}"
468          ;;
469    esac
470    if [ -f "${source_path}/build/make/version.sh" ]; then
471        local ver=`"$source_path/build/make/version.sh" --bare $source_path`
472        DIST_DIR="${DIST_DIR}-${ver}"
473        VERSION_STRING=${ver}
474        ver=${ver%%-*}
475        VERSION_PATCH=${ver##*.}
476        ver=${ver%.*}
477        VERSION_MINOR=${ver##*.}
478        ver=${ver#v}
479        VERSION_MAJOR=${ver%.*}
480    fi
481    enabled child || cat <<EOF >> config.mk
482
483PREFIX=${prefix}
484ifeq (\$(MAKECMDGOALS),dist)
485DIST_DIR?=${DIST_DIR}
486else
487DIST_DIR?=\$(DESTDIR)${prefix}
488endif
489LIBSUBDIR=${libdir##${prefix}/}
490
491VERSION_STRING=${VERSION_STRING}
492
493VERSION_MAJOR=${VERSION_MAJOR}
494VERSION_MINOR=${VERSION_MINOR}
495VERSION_PATCH=${VERSION_PATCH}
496
497CONFIGURE_ARGS=${CONFIGURE_ARGS}
498EOF
499    enabled child || echo "CONFIGURE_ARGS?=${CONFIGURE_ARGS}" >> config.mk
500
501    #
502    # Write makefiles for all enabled targets
503    #
504    for tgt in libs examples docs solution; do
505        local tgt_fn="$tgt-$toolchain.mk"
506
507        if enabled $tgt; then
508            echo "Creating makefiles for ${toolchain} ${tgt}"
509            write_common_target_config_mk $tgt_fn ${BUILD_PFX}vpx_config.h
510            #write_${tgt}_config
511        fi
512    done
513
514}
515
516process_detect() {
517    if enabled shared; then
518        # Can only build shared libs on a subset of platforms. Doing this check
519        # here rather than at option parse time because the target auto-detect
520        # magic happens after the command line has been parsed.
521        if ! enabled linux; then
522            if enabled gnu; then
523                echo "--enable-shared is only supported on ELF; assuming this is OK"
524            else
525                die "--enable-shared only supported on ELF for now"
526            fi
527        fi
528    fi
529    if [ -z "$CC" ] || enabled external_build; then
530        echo "Bypassing toolchain for environment detection."
531        enable_feature external_build
532        check_header() {
533            log fake_check_header "$@"
534            header=$1
535            shift
536            var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
537            disable_feature $var
538            # Headers common to all environments
539            case $header in
540                stdio.h)
541                    true;
542                ;;
543                *)
544                    local result=false
545                    for d in "$@"; do
546                        [ -f "${d##-I}/$header" ] && result=true && break
547                    done
548                    ${result:-true}
549            esac && enable_feature $var
550
551            # Specialize windows and POSIX environments.
552            case $toolchain in
553                *-win*-*)
554                    case $header-$toolchain in
555                        stdint*-gcc) true;;
556                        *) false;;
557                    esac && enable_feature $var
558                    ;;
559                *)
560                    case $header in
561                        stdint.h) true;;
562                        pthread.h) true;;
563                        sys/mman.h) true;;
564                        unistd.h) true;;
565                        *) false;;
566                    esac && enable_feature $var
567            esac
568            enabled $var
569        }
570        check_ld() {
571            true
572        }
573    fi
574    check_header stdio.h || die "Unable to invoke compiler: ${CC} ${CFLAGS}"
575    check_ld <<EOF || die "Toolchain is unable to link executables"
576int main(void) {return 0;}
577EOF
578    # check system headers
579    check_header stdint.h
580    check_header pthread.h
581    check_header sys/mman.h
582    check_header unistd.h # for sysconf(3) and friends.
583
584    check_header vpx/vpx_integer.h -I${source_path} && enable_feature vpx_ports
585}
586
587process_toolchain() {
588    process_common_toolchain
589
590    # Handle universal binaries for this architecture
591    case $toolchain in
592        universal-darwin*)
593            local darwin_ver=${tgt_os##darwin}
594
595            # Snow Leopard (10.6/darwin10) dropped support for PPC
596            # Include PPC support for all prior versions
597            if [ $darwin_ver -lt 10 ]; then
598                fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
599            fi
600
601            # Tiger (10.4/darwin8) brought support for x86
602            if [ $darwin_ver -ge 8 ]; then
603                fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
604            fi
605
606            # Leopard (10.5/darwin9) brought 64 bit support
607            if [ $darwin_ver -ge 9 ]; then
608                fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
609            fi
610            ;;
611    esac
612
613
614    # Enable some useful compiler flags
615    if enabled gcc; then
616        enabled werror && check_add_cflags -Werror
617        check_add_cflags -Wall
618        check_add_cflags -Wdeclaration-after-statement
619        check_add_cflags -Wdisabled-optimization
620        check_add_cflags -Wpointer-arith
621        check_add_cflags -Wtype-limits
622        check_add_cflags -Wcast-qual
623        check_add_cflags -Wvla
624        check_add_cflags -Wimplicit-function-declaration
625        check_add_cflags -Wuninitialized
626        check_add_cflags -Wunused-variable
627        case ${CC} in
628          *clang*)
629              # libvpx and/or clang have issues with aliasing:
630              # https://code.google.com/p/webm/issues/detail?id=603
631              # work around them until they are fixed
632              check_add_cflags -fno-strict-aliasing
633          ;;
634          *) check_add_cflags -Wunused-but-set-variable ;;
635        esac
636        enabled extra_warnings || check_add_cflags -Wno-unused-function
637    fi
638
639    if enabled icc; then
640        enabled werror && check_add_cflags -Werror
641        check_add_cflags -Wall
642        check_add_cflags -Wpointer-arith
643
644        # ICC has a number of floating point optimizations that we disable
645        # in favor of deterministic output WRT to other compilers
646        add_cflags -fp-model precise
647    fi
648
649    # Enable extra, harmless warnings. These might provide additional insight
650    # to what the compiler is doing and why, but in general, but they shouldn't
651    # be treated as fatal, even if we're treating warnings as errors.
652    GCC_EXTRA_WARNINGS="
653        -Wdisabled-optimization
654        -Winline
655    "
656    enabled gcc && EXTRA_WARNINGS="${GCC_EXTRA_WARNINGS}"
657    RVCT_EXTRA_WARNINGS="
658        --remarks
659    "
660    enabled rvct && EXTRA_WARNINGS="${RVCT_EXTRA_WARNINGS}"
661    if enabled extra_warnings; then
662        for w in ${EXTRA_WARNINGS}; do
663            check_add_cflags ${w}
664            enabled gcc && enabled werror && check_add_cflags -Wno-error=${w}
665        done
666    fi
667
668    # ccache only really works on gcc toolchains
669    enabled gcc || soft_disable ccache
670    if enabled mips; then
671        enable_feature dequant_tokens
672        enable_feature dc_recon
673    fi
674
675    if enabled internal_stats; then
676        enable_feature vp9_postproc
677    fi
678
679    # Enable the postbuild target if building for visual studio.
680    case "$tgt_cc" in
681        vs*) enable_feature msvs
682             enable_feature solution
683             vs_version=${tgt_cc##vs}
684             case $vs_version in
685             [789])
686                 VCPROJ_SFX=vcproj
687                 gen_vcproj_cmd=${source_path}/build/make/gen_msvs_proj.sh
688                 ;;
689             10|11|12)
690                 VCPROJ_SFX=vcxproj
691                 gen_vcproj_cmd=${source_path}/build/make/gen_msvs_vcxproj.sh
692                 enabled werror && gen_vcproj_cmd="${gen_vcproj_cmd} --enable-werror"
693                 ;;
694             esac
695             all_targets="${all_targets} solution"
696             INLINE="__forceinline"
697        ;;
698    esac
699
700    # Other toolchain specific defaults
701    case $toolchain in x86*|ppc*|universal*) soft_enable postproc;; esac
702
703    if enabled postproc_visualizer; then
704        enabled postproc || die "postproc_visualizer requires postproc to be enabled"
705    fi
706
707    # Enable WebM IO by default.
708    soft_enable webm_io
709
710    # Enable unit tests by default if we have a working C++ compiler.
711    case "$toolchain" in
712        *-vs*)
713            soft_enable unit_tests
714        ;;
715        *-android-*)
716            # GTestLog must be modified to use Android logging utilities.
717        ;;
718        *-darwin-*)
719            # iOS/ARM builds do not work with gtest. This does not match
720            # x86 targets.
721        ;;
722        *-win*)
723            # Some mingw toolchains don't have pthread available by default.
724            # Treat these more like visual studio where threading in gtest
725            # would be disabled for the same reason.
726            check_cxx "$@" <<EOF && soft_enable unit_tests
727int z;
728EOF
729        ;;
730        *)
731            enabled pthread_h && check_cxx "$@" <<EOF && soft_enable unit_tests
732int z;
733EOF
734        ;;
735    esac
736}
737
738
739##
740## END APPLICATION SPECIFIC CONFIGURATION
741##
742CONFIGURE_ARGS="$@"
743process "$@"
744print_webm_license ${BUILD_PFX}vpx_config.c "/*" " */"
745cat <<EOF >> ${BUILD_PFX}vpx_config.c
746static const char* const cfg = "$CONFIGURE_ARGS";
747const char *vpx_codec_build_config(void) {return cfg;}
748EOF
749