• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2##
3##  configure.sh
4##
5##  This script is sourced by the main configure script and contains
6##  utility functions and other common bits that aren't strictly libvpx
7##  related.
8##
9##  This build system is based in part on the FFmpeg configure script.
10##
11
12
13#
14# Logging / Output Functions
15#
16die_unknown(){
17  echo "Unknown option \"$1\"."
18  echo "See $0 --help for available options."
19  clean_temp_files
20  exit 1
21}
22
23die() {
24  echo "$@"
25  echo
26  echo "Configuration failed. This could reflect a misconfiguration of your"
27  echo "toolchains, improper options selected, or another problem. If you"
28  echo "don't see any useful error messages above, the next step is to look"
29  echo "at the configure error log file ($logfile) to determine what"
30  echo "configure was trying to do when it died."
31  clean_temp_files
32  exit 1
33}
34
35log(){
36  echo "$@" >>$logfile
37}
38
39log_file(){
40  log BEGIN $1
41  cat -n $1 >>$logfile
42  log END $1
43}
44
45log_echo() {
46  echo "$@"
47  log "$@"
48}
49
50fwrite () {
51  outfile=$1
52  shift
53  echo "$@" >> ${outfile}
54}
55
56show_help_pre(){
57  for opt in ${CMDLINE_SELECT}; do
58    opt2=`echo $opt | sed -e 's;_;-;g'`
59    if enabled $opt; then
60      eval "toggle_${opt}=\"--disable-${opt2}\""
61    else
62      eval "toggle_${opt}=\"--enable-${opt2} \""
63    fi
64  done
65
66  cat <<EOF
67Usage: configure [options]
68Options:
69
70Build options:
71  --help                      print this message
72  --log=yes|no|FILE           file configure log is written to [config.log]
73  --target=TARGET             target platform tuple [generic-gnu]
74  --cpu=CPU                   optimize for a specific cpu rather than a family
75  --extra-cflags=ECFLAGS      add ECFLAGS to CFLAGS [$CFLAGS]
76  --extra-cxxflags=ECXXFLAGS  add ECXXFLAGS to CXXFLAGS [$CXXFLAGS]
77  ${toggle_extra_warnings}    emit harmless warnings (always non-fatal)
78  ${toggle_werror}            treat warnings as errors, if possible
79                              (not available with all compilers)
80  ${toggle_optimizations}     turn on/off compiler optimization flags
81  ${toggle_pic}               turn on/off Position Independent Code
82  ${toggle_ccache}            turn on/off compiler cache
83  ${toggle_debug}             enable/disable debug mode
84  ${toggle_gprof}             enable/disable gprof profiling instrumentation
85  ${toggle_gcov}              enable/disable gcov coverage instrumentation
86  ${toggle_thumb}             enable/disable building arm assembly in thumb mode
87  ${toggle_dependency_tracking}
88                              disable to speed up one-time build
89
90Install options:
91  ${toggle_install_docs}      control whether docs are installed
92  ${toggle_install_bins}      control whether binaries are installed
93  ${toggle_install_libs}      control whether libraries are installed
94  ${toggle_install_srcs}      control whether sources are installed
95
96
97EOF
98}
99
100show_help_post(){
101  cat <<EOF
102
103
104NOTES:
105    Object files are built at the place where configure is launched.
106
107    All boolean options can be negated. The default value is the opposite
108    of that shown above. If the option --disable-foo is listed, then
109    the default value for foo is enabled.
110
111Supported targets:
112EOF
113  show_targets ${all_platforms}
114  echo
115  exit 1
116}
117
118show_targets() {
119  while [ -n "$*" ]; do
120    if [ "${1%%-*}" = "${2%%-*}" ]; then
121      if [ "${2%%-*}" = "${3%%-*}" ]; then
122        printf "    %-24s %-24s %-24s\n" "$1" "$2" "$3"
123        shift; shift; shift
124      else
125        printf "    %-24s %-24s\n" "$1" "$2"
126        shift; shift
127      fi
128    else
129      printf "    %-24s\n" "$1"
130      shift
131    fi
132  done
133}
134
135show_help() {
136  show_help_pre
137  show_help_post
138}
139
140#
141# List Processing Functions
142#
143set_all(){
144  value=$1
145  shift
146  for var in $*; do
147    eval $var=$value
148  done
149}
150
151is_in(){
152  value=$1
153  shift
154  for var in $*; do
155    [ $var = $value ] && return 0
156  done
157  return 1
158}
159
160add_cflags() {
161  CFLAGS="${CFLAGS} $@"
162  CXXFLAGS="${CXXFLAGS} $@"
163}
164
165add_cflags_only() {
166  CFLAGS="${CFLAGS} $@"
167}
168
169add_cxxflags_only() {
170  CXXFLAGS="${CXXFLAGS} $@"
171}
172
173add_ldflags() {
174  LDFLAGS="${LDFLAGS} $@"
175}
176
177add_asflags() {
178  ASFLAGS="${ASFLAGS} $@"
179}
180
181add_extralibs() {
182  extralibs="${extralibs} $@"
183}
184
185#
186# Boolean Manipulation Functions
187#
188
189enable_feature(){
190  set_all yes $*
191}
192
193disable_feature(){
194  set_all no $*
195}
196
197enabled(){
198  eval test "x\$$1" = "xyes"
199}
200
201disabled(){
202  eval test "x\$$1" = "xno"
203}
204
205enable_codec(){
206  enabled "${1}" || echo "  enabling ${1}"
207  enable_feature "${1}"
208
209  is_in "${1}" vp8 vp9 && enable_feature "${1}_encoder" "${1}_decoder"
210}
211
212disable_codec(){
213  disabled "${1}" || echo "  disabling ${1}"
214  disable_feature "${1}"
215
216  is_in "${1}" vp8 vp9 && disable_feature "${1}_encoder" "${1}_decoder"
217}
218
219# Iterates through positional parameters, checks to confirm the parameter has
220# not been explicitly (force) disabled, and enables the setting controlled by
221# the parameter when the setting is not disabled.
222# Note: Does NOT alter RTCD generation options ($RTCD_OPTIONS).
223soft_enable() {
224  for var in $*; do
225    if ! disabled $var; then
226      enabled $var || log_echo "  enabling $var"
227      enable_feature $var
228    fi
229  done
230}
231
232# Iterates through positional parameters, checks to confirm the parameter has
233# not been explicitly (force) enabled, and disables the setting controlled by
234# the parameter when the setting is not enabled.
235# Note: Does NOT alter RTCD generation options ($RTCD_OPTIONS).
236soft_disable() {
237  for var in $*; do
238    if ! enabled $var; then
239      disabled $var || log_echo "  disabling $var"
240      disable_feature $var
241    fi
242  done
243}
244
245#
246# Text Processing Functions
247#
248toupper(){
249  echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
250}
251
252tolower(){
253  echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
254}
255
256#
257# Temporary File Functions
258#
259source_path=${0%/*}
260enable_feature source_path_used
261if [ -z "$source_path" ] || [ "$source_path" = "." ]; then
262  source_path="`pwd`"
263  disable_feature source_path_used
264fi
265# Makefiles greedily process the '#' character as a comment, even if it is
266# inside quotes. So, this character must be escaped in all paths in Makefiles.
267source_path_mk=$(echo $source_path | sed -e 's;\#;\\\#;g')
268
269if test ! -z "$TMPDIR" ; then
270  TMPDIRx="${TMPDIR}"
271elif test ! -z "$TEMPDIR" ; then
272  TMPDIRx="${TEMPDIR}"
273else
274  TMPDIRx="/tmp"
275fi
276RAND=$(awk 'BEGIN { srand(); printf "%d\n",(rand() * 32768)}')
277TMP_H="${TMPDIRx}/vpx-conf-$$-${RAND}.h"
278TMP_C="${TMPDIRx}/vpx-conf-$$-${RAND}.c"
279TMP_CC="${TMPDIRx}/vpx-conf-$$-${RAND}.cc"
280TMP_O="${TMPDIRx}/vpx-conf-$$-${RAND}.o"
281TMP_X="${TMPDIRx}/vpx-conf-$$-${RAND}.x"
282TMP_ASM="${TMPDIRx}/vpx-conf-$$-${RAND}.asm"
283
284clean_temp_files() {
285  rm -f ${TMP_C} ${TMP_CC} ${TMP_H} ${TMP_O} ${TMP_X} ${TMP_ASM}
286  enabled gcov && rm -f ${TMP_C%.c}.gcno ${TMP_CC%.cc}.gcno
287}
288
289#
290# Toolchain Check Functions
291#
292check_cmd() {
293  enabled external_build && return
294  log "$@"
295  "$@" >>${logfile} 2>&1
296}
297
298check_cc() {
299  log check_cc "$@"
300  cat >${TMP_C}
301  log_file ${TMP_C}
302  check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
303}
304
305check_cxx() {
306  log check_cxx "$@"
307  cat >${TMP_CC}
308  log_file ${TMP_CC}
309  check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_CC}
310}
311
312check_cpp() {
313  log check_cpp "$@"
314  cat > ${TMP_C}
315  log_file ${TMP_C}
316  check_cmd ${CC} ${CFLAGS} "$@" -E -o ${TMP_O} ${TMP_C}
317}
318
319check_ld() {
320  log check_ld "$@"
321  check_cc $@ \
322    && check_cmd ${LD} ${LDFLAGS} "$@" -o ${TMP_X} ${TMP_O} ${extralibs}
323}
324
325check_lib() {
326  log check_lib "$@"
327  check_cc $@ \
328    && check_cmd ${LD} ${LDFLAGS} -o ${TMP_X} ${TMP_O} "$@" ${extralibs}
329}
330
331check_header(){
332  log check_header "$@"
333  header=$1
334  shift
335  var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
336  disable_feature $var
337  check_cpp "$@" <<EOF && enable_feature $var
338#include "$header"
339int x;
340EOF
341}
342
343check_cflags() {
344 log check_cflags "$@"
345 check_cc -Werror "$@" <<EOF
346int x;
347EOF
348}
349
350check_cxxflags() {
351  log check_cxxflags "$@"
352
353  # Catch CFLAGS that trigger CXX warnings
354  case "$CXX" in
355    *c++-analyzer|*clang++|*g++*)
356      check_cxx -Werror "$@" <<EOF
357int x;
358EOF
359      ;;
360    *)
361      check_cxx -Werror "$@" <<EOF
362int x;
363EOF
364      ;;
365    esac
366}
367
368check_add_cflags() {
369  check_cxxflags "$@" && add_cxxflags_only "$@"
370  check_cflags "$@" && add_cflags_only "$@"
371}
372
373check_add_cxxflags() {
374  check_cxxflags "$@" && add_cxxflags_only "$@"
375}
376
377check_add_asflags() {
378  log add_asflags "$@"
379  add_asflags "$@"
380}
381
382check_add_ldflags() {
383  log add_ldflags "$@"
384  add_ldflags "$@"
385}
386
387check_asm_align() {
388  log check_asm_align "$@"
389  cat >${TMP_ASM} <<EOF
390section .rodata
391align 16
392EOF
393  log_file ${TMP_ASM}
394  check_cmd ${AS} ${ASFLAGS} -o ${TMP_O} ${TMP_ASM}
395  readelf -WS ${TMP_O} >${TMP_X}
396  log_file ${TMP_X}
397  if ! grep -q '\.rodata .* 16$' ${TMP_X}; then
398    die "${AS} ${ASFLAGS} does not support section alignment (nasm <=2.08?)"
399  fi
400}
401
402# tests for -m$1 toggling the feature given in $2. If $2 is empty $1 is used.
403check_gcc_machine_option() {
404  opt="$1"
405  feature="$2"
406  [ -n "$feature" ] || feature="$opt"
407
408  if enabled gcc && ! disabled "$feature" && ! check_cflags "-m$opt"; then
409    RTCD_OPTIONS="${RTCD_OPTIONS}--disable-$feature "
410  else
411    soft_enable "$feature"
412  fi
413}
414
415# tests for -m$2, -m$3, -m$4... toggling the feature given in $1.
416check_gcc_machine_options() {
417  feature="$1"
418  shift
419  flags="-m$1"
420  shift
421  for opt in $*; do
422    flags="$flags -m$opt"
423  done
424
425  if enabled gcc && ! disabled "$feature" && ! check_cflags $flags; then
426    RTCD_OPTIONS="${RTCD_OPTIONS}--disable-$feature "
427  else
428    soft_enable "$feature"
429  fi
430}
431
432check_gcc_avx512_compiles() {
433  if disabled gcc; then
434    return
435  fi
436
437  check_cc -mavx512f <<EOF
438#include <immintrin.h>
439void f(void) {
440  __m512i x = _mm512_set1_epi16(0);
441  (void)x;
442}
443EOF
444  compile_result=$?
445  if [ ${compile_result} -ne 0 ]; then
446    log_echo "    disabling avx512: not supported by compiler"
447    disable_feature avx512
448    RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx512 "
449  fi
450}
451
452write_common_config_banner() {
453  print_webm_license config.mk "##" ""
454  echo '# This file automatically generated by configure. Do not edit!' >> config.mk
455  echo "TOOLCHAIN := ${toolchain}" >> config.mk
456
457  case ${toolchain} in
458    *-linux-rvct)
459      echo "ALT_LIBC := ${alt_libc}" >> config.mk
460      ;;
461  esac
462}
463
464write_common_config_targets() {
465  for t in ${all_targets}; do
466    if enabled ${t}; then
467      if enabled child; then
468        fwrite config.mk "ALL_TARGETS += ${t}-${toolchain}"
469      else
470        fwrite config.mk "ALL_TARGETS += ${t}"
471      fi
472    fi
473    true;
474  done
475  true
476}
477
478write_common_target_config_mk() {
479  saved_CC="${CC}"
480  saved_CXX="${CXX}"
481  enabled ccache && CC="ccache ${CC}"
482  enabled ccache && CXX="ccache ${CXX}"
483  print_webm_license $1 "##" ""
484
485  cat >> $1 << EOF
486# This file automatically generated by configure. Do not edit!
487SRC_PATH="$source_path_mk"
488SRC_PATH_BARE=$source_path_mk
489BUILD_PFX=${BUILD_PFX}
490TOOLCHAIN=${toolchain}
491ASM_CONVERSION=${asm_conversion_cmd:-${source_path_mk}/build/make/ads2gas.pl}
492GEN_VCPROJ=${gen_vcproj_cmd}
493MSVS_ARCH_DIR=${msvs_arch_dir}
494
495CC=${CC}
496CXX=${CXX}
497AR=${AR}
498LD=${LD}
499AS=${AS}
500STRIP=${STRIP}
501NM=${NM}
502
503CFLAGS  = ${CFLAGS}
504CXXFLAGS  = ${CXXFLAGS}
505ARFLAGS = -crs\$(if \$(quiet),,v)
506LDFLAGS = ${LDFLAGS}
507ASFLAGS = ${ASFLAGS}
508extralibs = ${extralibs}
509AS_SFX    = ${AS_SFX:-.asm}
510EXE_SFX   = ${EXE_SFX}
511VCPROJ_SFX = ${VCPROJ_SFX}
512RTCD_OPTIONS = ${RTCD_OPTIONS}
513LIBYUV_CXXFLAGS = ${LIBYUV_CXXFLAGS}
514EOF
515
516  if enabled rvct; then cat >> $1 << EOF
517fmt_deps = sed -e 's;^__image.axf;\${@:.d=.o} \$@;' #hide
518EOF
519  else cat >> $1 << EOF
520fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\${@:.d=.o} \$@;'
521EOF
522  fi
523
524  print_config_mk VPX_ARCH "${1}" ${ARCH_LIST}
525  print_config_mk HAVE     "${1}" ${HAVE_LIST}
526  print_config_mk CONFIG   "${1}" ${CONFIG_LIST}
527  print_config_mk HAVE     "${1}" gnu_strip
528
529  enabled msvs && echo "CONFIG_VS_VERSION=${vs_version}" >> "${1}"
530
531  CC="${saved_CC}"
532  CXX="${saved_CXX}"
533}
534
535write_common_target_config_h() {
536  print_webm_license ${TMP_H} "/*" " */"
537  cat >> ${TMP_H} << EOF
538/* This file automatically generated by configure. Do not edit! */
539#ifndef VPX_CONFIG_H
540#define VPX_CONFIG_H
541#define RESTRICT    ${RESTRICT}
542#define INLINE      ${INLINE}
543EOF
544  print_config_h VPX_ARCH "${TMP_H}" ${ARCH_LIST}
545  print_config_h HAVE     "${TMP_H}" ${HAVE_LIST}
546  print_config_h CONFIG   "${TMP_H}" ${CONFIG_LIST}
547  print_config_vars_h     "${TMP_H}" ${VAR_LIST}
548  echo "#endif /* VPX_CONFIG_H */" >> ${TMP_H}
549  mkdir -p `dirname "$1"`
550  cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
551}
552
553write_win_arm64_neon_h_workaround() {
554  print_webm_license ${TMP_H} "/*" " */"
555  cat >> ${TMP_H} << EOF
556/* This file automatically generated by configure. Do not edit! */
557#ifndef VPX_WIN_ARM_NEON_H_WORKAROUND
558#define VPX_WIN_ARM_NEON_H_WORKAROUND
559/* The Windows SDK has arm_neon.h, but unlike on other platforms it is
560 * ARM32-only. ARM64 NEON support is provided by arm64_neon.h, a proper
561 * superset of arm_neon.h. Work around this by providing a more local
562 * arm_neon.h that simply #includes arm64_neon.h.
563 */
564#include <arm64_neon.h>
565#endif /* VPX_WIN_ARM_NEON_H_WORKAROUND */
566EOF
567  mkdir -p `dirname "$1"`
568  cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
569}
570
571process_common_cmdline() {
572  for opt in "$@"; do
573    optval="${opt#*=}"
574    case "$opt" in
575      --child)
576        enable_feature child
577        ;;
578      --log*)
579        logging="$optval"
580        if ! disabled logging ; then
581          enabled logging || logfile="$logging"
582        else
583          logfile=/dev/null
584        fi
585        ;;
586      --target=*)
587        toolchain="${toolchain:-${optval}}"
588        ;;
589      --force-target=*)
590        toolchain="${toolchain:-${optval}}"
591        enable_feature force_toolchain
592        ;;
593      --cpu=*)
594        tune_cpu="$optval"
595        ;;
596      --extra-cflags=*)
597        extra_cflags="${optval}"
598        ;;
599      --extra-cxxflags=*)
600        extra_cxxflags="${optval}"
601        ;;
602      --enable-?*|--disable-?*)
603        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
604        if is_in ${option} ${ARCH_EXT_LIST}; then
605          [ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${option} "
606        elif [ $action = "disable" ] && ! disabled $option ; then
607          is_in ${option} ${CMDLINE_SELECT} || die_unknown $opt
608          log_echo "  disabling $option"
609        elif [ $action = "enable" ] && ! enabled $option ; then
610          is_in ${option} ${CMDLINE_SELECT} || die_unknown $opt
611          log_echo "  enabling $option"
612        fi
613        ${action}_feature $option
614        ;;
615      --require-?*)
616        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
617        if is_in ${option} ${ARCH_EXT_LIST}; then
618            RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
619        else
620            die_unknown $opt
621        fi
622        ;;
623      --force-enable-?*|--force-disable-?*)
624        eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
625        ${action}_feature $option
626        ;;
627      --libc=*)
628        [ -d "${optval}" ] || die "Not a directory: ${optval}"
629        disable_feature builtin_libc
630        alt_libc="${optval}"
631        ;;
632      --as=*)
633        [ "${optval}" = yasm ] || [ "${optval}" = nasm ] \
634          || [ "${optval}" = auto ] \
635          || die "Must be yasm, nasm or auto: ${optval}"
636        alt_as="${optval}"
637        ;;
638      --size-limit=*)
639        w="${optval%%x*}"
640        h="${optval##*x}"
641        VAR_LIST="DECODE_WIDTH_LIMIT ${w} DECODE_HEIGHT_LIMIT ${h}"
642        [ ${w} -gt 0 ] && [ ${h} -gt 0 ] || die "Invalid size-limit: too small."
643        [ ${w} -lt 65536 ] && [ ${h} -lt 65536 ] \
644            || die "Invalid size-limit: too big."
645        enable_feature size_limit
646        ;;
647      --prefix=*)
648        prefix="${optval}"
649        ;;
650      --libdir=*)
651        libdir="${optval}"
652        ;;
653      --libc|--as|--prefix|--libdir)
654        die "Option ${opt} requires argument"
655        ;;
656      --help|-h)
657        show_help
658        ;;
659      *)
660        die_unknown $opt
661        ;;
662    esac
663  done
664}
665
666process_cmdline() {
667  for opt do
668    optval="${opt#*=}"
669    case "$opt" in
670      *)
671        process_common_cmdline $opt
672        ;;
673    esac
674  done
675}
676
677post_process_common_cmdline() {
678  prefix="${prefix:-/usr/local}"
679  prefix="${prefix%/}"
680  libdir="${libdir:-${prefix}/lib}"
681  libdir="${libdir%/}"
682  if [ "${libdir#${prefix}}" = "${libdir}" ]; then
683    die "Libdir ${libdir} must be a subdirectory of ${prefix}"
684  fi
685}
686
687post_process_cmdline() {
688  true;
689}
690
691setup_gnu_toolchain() {
692  CC=${CC:-${CROSS}gcc}
693  CXX=${CXX:-${CROSS}g++}
694  AR=${AR:-${CROSS}ar}
695  LD=${LD:-${CROSS}${link_with_cc:-ld}}
696  AS=${AS:-${CROSS}as}
697  STRIP=${STRIP:-${CROSS}strip}
698  NM=${NM:-${CROSS}nm}
699  AS_SFX=.S
700  EXE_SFX=
701}
702
703# Reliably find the newest available Darwin SDKs. (Older versions of
704# xcrun don't support --show-sdk-path.)
705show_darwin_sdk_path() {
706  xcrun --sdk $1 --show-sdk-path 2>/dev/null ||
707    xcodebuild -sdk $1 -version Path 2>/dev/null
708}
709
710# Print the major version number of the Darwin SDK specified by $1.
711show_darwin_sdk_major_version() {
712  xcrun --sdk $1 --show-sdk-version 2>/dev/null | cut -d. -f1
713}
714
715# Print the Xcode version.
716show_xcode_version() {
717  xcodebuild -version | head -n1 | cut -d' ' -f2
718}
719
720# Fails when Xcode version is less than 6.3.
721check_xcode_minimum_version() {
722  xcode_major=$(show_xcode_version | cut -f1 -d.)
723  xcode_minor=$(show_xcode_version | cut -f2 -d.)
724  xcode_min_major=6
725  xcode_min_minor=3
726  if [ ${xcode_major} -lt ${xcode_min_major} ]; then
727    return 1
728  fi
729  if [ ${xcode_major} -eq ${xcode_min_major} ] \
730    && [ ${xcode_minor} -lt ${xcode_min_minor} ]; then
731    return 1
732  fi
733}
734
735process_common_toolchain() {
736  if [ -z "$toolchain" ]; then
737    gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}"
738    # detect tgt_isa
739    case "$gcctarget" in
740      aarch64*)
741        tgt_isa=arm64
742        ;;
743      armv7*-hardfloat* | armv7*-gnueabihf | arm-*-gnueabihf)
744        tgt_isa=armv7
745        float_abi=hard
746        ;;
747      armv7*)
748        tgt_isa=armv7
749        float_abi=softfp
750        ;;
751      *x86_64*|*amd64*)
752        tgt_isa=x86_64
753        ;;
754      *i[3456]86*)
755        tgt_isa=x86
756        ;;
757      *sparc*)
758        tgt_isa=sparc
759        ;;
760      power*64le*-*)
761        tgt_isa=ppc64le
762        ;;
763      *mips64el*)
764        tgt_isa=mips64
765        ;;
766      *mips32el*)
767        tgt_isa=mips32
768        ;;
769    esac
770
771    # detect tgt_os
772    case "$gcctarget" in
773      *darwin1[0-9]*)
774        tgt_isa=x86_64
775        tgt_os=`echo $gcctarget | sed 's/.*\(darwin1[0-9]\).*/\1/'`
776        ;;
777      *darwin20*)
778        tgt_isa=`uname -m`
779        tgt_os=`echo $gcctarget | sed 's/.*\(darwin2[0-9]\).*/\1/'`
780        ;;
781      x86_64*mingw32*)
782        tgt_os=win64
783        ;;
784      x86_64*cygwin*)
785        tgt_os=win64
786        ;;
787      *mingw32*|*cygwin*)
788        [ -z "$tgt_isa" ] && tgt_isa=x86
789        tgt_os=win32
790        ;;
791      *linux*|*bsd*)
792        tgt_os=linux
793        ;;
794      *solaris2.10)
795        tgt_os=solaris
796        ;;
797      *os2*)
798        tgt_os=os2
799        ;;
800    esac
801
802    if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
803      toolchain=${tgt_isa}-${tgt_os}-gcc
804    fi
805  fi
806
807  toolchain=${toolchain:-generic-gnu}
808
809  is_in ${toolchain} ${all_platforms} || enabled force_toolchain \
810    || die "Unrecognized toolchain '${toolchain}'"
811
812  enabled child || log_echo "Configuring for target '${toolchain}'"
813
814  #
815  # Set up toolchain variables
816  #
817  tgt_isa=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $1}')
818  tgt_os=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $2}')
819  tgt_cc=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $3}')
820
821  # Mark the specific ISA requested as enabled
822  soft_enable ${tgt_isa}
823  enable_feature ${tgt_os}
824  enable_feature ${tgt_cc}
825
826  # Enable the architecture family
827  case ${tgt_isa} in
828    arm*)
829      enable_feature arm
830      ;;
831    mips*)
832      enable_feature mips
833      ;;
834    ppc*)
835      enable_feature ppc
836      ;;
837  esac
838
839  # PIC is probably what we want when building shared libs
840  enabled shared && soft_enable pic
841
842  # Minimum iOS version for all target platforms (darwin and iphonesimulator).
843  # Shared library framework builds are only possible on iOS 8 and later.
844  if enabled shared; then
845    IOS_VERSION_OPTIONS="--enable-shared"
846    IOS_VERSION_MIN="8.0"
847  else
848    IOS_VERSION_OPTIONS=""
849    IOS_VERSION_MIN="7.0"
850  fi
851
852  # Handle darwin variants. Newer SDKs allow targeting older
853  # platforms, so use the newest one available.
854  case ${toolchain} in
855    arm*-darwin-*)
856      add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
857      iphoneos_sdk_dir="$(show_darwin_sdk_path iphoneos)"
858      if [ -d "${iphoneos_sdk_dir}" ]; then
859        add_cflags  "-isysroot ${iphoneos_sdk_dir}"
860        add_ldflags "-isysroot ${iphoneos_sdk_dir}"
861      fi
862      ;;
863    *-darwin*)
864      osx_sdk_dir="$(show_darwin_sdk_path macosx)"
865      if [ -d "${osx_sdk_dir}" ]; then
866        add_cflags  "-isysroot ${osx_sdk_dir}"
867        add_ldflags "-isysroot ${osx_sdk_dir}"
868      fi
869      ;;
870  esac
871
872  case ${toolchain} in
873    *-darwin8-*)
874      add_cflags  "-mmacosx-version-min=10.4"
875      add_ldflags "-mmacosx-version-min=10.4"
876      ;;
877    *-darwin9-*)
878      add_cflags  "-mmacosx-version-min=10.5"
879      add_ldflags "-mmacosx-version-min=10.5"
880      ;;
881    *-darwin10-*)
882      add_cflags  "-mmacosx-version-min=10.6"
883      add_ldflags "-mmacosx-version-min=10.6"
884      ;;
885    *-darwin11-*)
886      add_cflags  "-mmacosx-version-min=10.7"
887      add_ldflags "-mmacosx-version-min=10.7"
888      ;;
889    *-darwin12-*)
890      add_cflags  "-mmacosx-version-min=10.8"
891      add_ldflags "-mmacosx-version-min=10.8"
892      ;;
893    *-darwin13-*)
894      add_cflags  "-mmacosx-version-min=10.9"
895      add_ldflags "-mmacosx-version-min=10.9"
896      ;;
897    *-darwin14-*)
898      add_cflags  "-mmacosx-version-min=10.10"
899      add_ldflags "-mmacosx-version-min=10.10"
900      ;;
901    *-darwin15-*)
902      add_cflags  "-mmacosx-version-min=10.11"
903      add_ldflags "-mmacosx-version-min=10.11"
904      ;;
905    *-darwin16-*)
906      add_cflags  "-mmacosx-version-min=10.12"
907      add_ldflags "-mmacosx-version-min=10.12"
908      ;;
909    *-darwin17-*)
910      add_cflags  "-mmacosx-version-min=10.13"
911      add_ldflags "-mmacosx-version-min=10.13"
912      ;;
913    *-darwin18-*)
914      add_cflags  "-mmacosx-version-min=10.14"
915      add_ldflags "-mmacosx-version-min=10.14"
916      ;;
917    *-darwin19-*)
918      add_cflags  "-mmacosx-version-min=10.15"
919      add_ldflags "-mmacosx-version-min=10.15"
920      ;;
921    *-darwin20-*)
922      add_cflags  "-mmacosx-version-min=10.16 -arch ${toolchain%%-*}"
923      add_ldflags "-mmacosx-version-min=10.16 -arch ${toolchain%%-*}"
924      ;;
925    *-iphonesimulator-*)
926      add_cflags  "-miphoneos-version-min=${IOS_VERSION_MIN}"
927      add_ldflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
928      iossim_sdk_dir="$(show_darwin_sdk_path iphonesimulator)"
929      if [ -d "${iossim_sdk_dir}" ]; then
930        add_cflags  "-isysroot ${iossim_sdk_dir}"
931        add_ldflags "-isysroot ${iossim_sdk_dir}"
932      fi
933      ;;
934  esac
935
936  # Handle Solaris variants. Solaris 10 needs -lposix4
937  case ${toolchain} in
938    sparc-solaris-*)
939      add_extralibs -lposix4
940      ;;
941    *-solaris-*)
942      add_extralibs -lposix4
943      ;;
944  esac
945
946  # Process ARM architecture variants
947  case ${toolchain} in
948    arm*)
949      # on arm, isa versions are supersets
950      case ${tgt_isa} in
951        arm64|armv8)
952          soft_enable neon
953          ;;
954        armv7|armv7s)
955          soft_enable neon
956          # Only enable neon_asm when neon is also enabled.
957          enabled neon && soft_enable neon_asm
958          # If someone tries to force it through, die.
959          if disabled neon && enabled neon_asm; then
960            die "Disabling neon while keeping neon-asm is not supported"
961          fi
962          ;;
963      esac
964
965      asm_conversion_cmd="cat"
966
967      case ${tgt_cc} in
968        gcc)
969          link_with_cc=gcc
970          setup_gnu_toolchain
971          arch_int=${tgt_isa##armv}
972          arch_int=${arch_int%%te}
973          tune_cflags="-mtune="
974          if [ ${tgt_isa} = "armv7" ] || [ ${tgt_isa} = "armv7s" ]; then
975            if [ -z "${float_abi}" ]; then
976              check_cpp <<EOF && float_abi=hard || float_abi=softfp
977#ifndef __ARM_PCS_VFP
978#error "not hardfp"
979#endif
980EOF
981            fi
982            check_add_cflags  -march=armv7-a -mfloat-abi=${float_abi}
983            check_add_asflags -march=armv7-a -mfloat-abi=${float_abi}
984
985            if enabled neon || enabled neon_asm; then
986              check_add_cflags -mfpu=neon #-ftree-vectorize
987              check_add_asflags -mfpu=neon
988            fi
989          elif [ ${tgt_isa} = "arm64" ] || [ ${tgt_isa} = "armv8" ]; then
990            check_add_cflags -march=armv8-a
991            check_add_asflags -march=armv8-a
992          else
993            check_add_cflags -march=${tgt_isa}
994            check_add_asflags -march=${tgt_isa}
995          fi
996
997          enabled debug && add_asflags -g
998          asm_conversion_cmd="${source_path_mk}/build/make/ads2gas.pl"
999
1000          case ${tgt_os} in
1001            win*)
1002              asm_conversion_cmd="$asm_conversion_cmd -noelf"
1003              AS="$CC -c"
1004              EXE_SFX=.exe
1005              enable_feature thumb
1006              ;;
1007          esac
1008
1009          if enabled thumb; then
1010            asm_conversion_cmd="$asm_conversion_cmd -thumb"
1011            check_add_cflags -mthumb
1012            check_add_asflags -mthumb -mimplicit-it=always
1013          fi
1014          ;;
1015        vs*)
1016          # A number of ARM-based Windows platforms are constrained by their
1017          # respective SDKs' limitations. Fortunately, these are all 32-bit ABIs
1018          # and so can be selected as 'win32'.
1019          if [ ${tgt_os} = "win32" ]; then
1020            asm_conversion_cmd="${source_path_mk}/build/make/ads2armasm_ms.pl"
1021            AS_SFX=.S
1022            msvs_arch_dir=arm-msvs
1023            disable_feature multithread
1024            disable_feature unit_tests
1025            if [ ${tgt_cc##vs} -ge 12 ]; then
1026              # MSVC 2013 doesn't allow doing plain .exe projects for ARM32,
1027              # only "AppContainerApplication" which requires an AppxManifest.
1028              # Therefore disable the examples, just build the library.
1029              disable_feature examples
1030              disable_feature tools
1031            fi
1032          else
1033            # Windows 10 on ARM, on the other hand, has full Windows SDK support
1034            # for building Win32 ARM64 applications in addition to ARM64
1035            # Windows Store apps. It is the only 64-bit ARM ABI that
1036            # Windows supports, so it is the default definition of 'win64'.
1037            # ARM64 build support officially shipped in Visual Studio 15.9.0.
1038
1039            # Because the ARM64 Windows SDK's arm_neon.h is ARM32-specific
1040            # while LLVM's is not, probe its validity.
1041            if enabled neon; then
1042              if [ -n "${CC}" ]; then
1043                check_header arm_neon.h || check_header arm64_neon.h && \
1044                    enable_feature win_arm64_neon_h_workaround
1045              else
1046                # If a probe is not possible, assume this is the pure Windows
1047                # SDK and so the workaround is necessary.
1048                enable_feature win_arm64_neon_h_workaround
1049              fi
1050            fi
1051          fi
1052          ;;
1053        rvct)
1054          CC=armcc
1055          AR=armar
1056          AS=armasm
1057          LD="${source_path}/build/make/armlink_adapter.sh"
1058          STRIP=arm-none-linux-gnueabi-strip
1059          NM=arm-none-linux-gnueabi-nm
1060          tune_cflags="--cpu="
1061          tune_asflags="--cpu="
1062          if [ -z "${tune_cpu}" ]; then
1063            if [ ${tgt_isa} = "armv7" ]; then
1064              if enabled neon || enabled neon_asm
1065              then
1066                check_add_cflags --fpu=softvfp+vfpv3
1067                check_add_asflags --fpu=softvfp+vfpv3
1068              fi
1069              check_add_cflags --cpu=Cortex-A8
1070              check_add_asflags --cpu=Cortex-A8
1071            else
1072              check_add_cflags --cpu=${tgt_isa##armv}
1073              check_add_asflags --cpu=${tgt_isa##armv}
1074            fi
1075          fi
1076          arch_int=${tgt_isa##armv}
1077          arch_int=${arch_int%%te}
1078          enabled debug && add_asflags -g
1079          add_cflags --gnu
1080          add_cflags --enum_is_int
1081          add_cflags --wchar32
1082          ;;
1083      esac
1084
1085      case ${tgt_os} in
1086        none*)
1087          disable_feature multithread
1088          disable_feature os_support
1089          ;;
1090
1091        android*)
1092          echo "Assuming standalone build with NDK toolchain."
1093          echo "See build/make/Android.mk for details."
1094          check_add_ldflags -static
1095          soft_enable unit_tests
1096          ;;
1097
1098        darwin)
1099          if ! enabled external_build; then
1100            XCRUN_FIND="xcrun --sdk iphoneos --find"
1101            CXX="$(${XCRUN_FIND} clang++)"
1102            CC="$(${XCRUN_FIND} clang)"
1103            AR="$(${XCRUN_FIND} ar)"
1104            AS="$(${XCRUN_FIND} as)"
1105            STRIP="$(${XCRUN_FIND} strip)"
1106            NM="$(${XCRUN_FIND} nm)"
1107            RANLIB="$(${XCRUN_FIND} ranlib)"
1108            AS_SFX=.S
1109            LD="${CXX:-$(${XCRUN_FIND} ld)}"
1110
1111            # ASFLAGS is written here instead of using check_add_asflags
1112            # because we need to overwrite all of ASFLAGS and purge the
1113            # options that were put in above
1114            ASFLAGS="-arch ${tgt_isa} -g"
1115
1116            add_cflags -arch ${tgt_isa}
1117            add_ldflags -arch ${tgt_isa}
1118
1119            alt_libc="$(show_darwin_sdk_path iphoneos)"
1120            if [ -d "${alt_libc}" ]; then
1121              add_cflags -isysroot ${alt_libc}
1122            fi
1123
1124            if [ "${LD}" = "${CXX}" ]; then
1125              add_ldflags -miphoneos-version-min="${IOS_VERSION_MIN}"
1126            else
1127              add_ldflags -ios_version_min "${IOS_VERSION_MIN}"
1128            fi
1129
1130            for d in lib usr/lib usr/lib/system; do
1131              try_dir="${alt_libc}/${d}"
1132              [ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
1133            done
1134
1135            case ${tgt_isa} in
1136              armv7|armv7s|armv8|arm64)
1137                if enabled neon && ! check_xcode_minimum_version; then
1138                  soft_disable neon
1139                  log_echo "  neon disabled: upgrade Xcode (need v6.3+)."
1140                  if enabled neon_asm; then
1141                    soft_disable neon_asm
1142                    log_echo "  neon_asm disabled: upgrade Xcode (need v6.3+)."
1143                  fi
1144                fi
1145                ;;
1146            esac
1147
1148            if [ "$(show_darwin_sdk_major_version iphoneos)" -gt 8 ]; then
1149              check_add_cflags -fembed-bitcode
1150              check_add_asflags -fembed-bitcode
1151              check_add_ldflags -fembed-bitcode
1152            fi
1153          fi
1154
1155          asm_conversion_cmd="${source_path_mk}/build/make/ads2gas_apple.pl"
1156          ;;
1157
1158        linux*)
1159          enable_feature linux
1160          if enabled rvct; then
1161            # Check if we have CodeSourcery GCC in PATH. Needed for
1162            # libraries
1163            which arm-none-linux-gnueabi-gcc 2>&- || \
1164              die "Couldn't find CodeSourcery GCC from PATH"
1165
1166            # Use armcc as a linker to enable translation of
1167            # some gcc specific options such as -lm and -lpthread.
1168            LD="armcc --translate_gcc"
1169
1170            # create configuration file (uses path to CodeSourcery GCC)
1171            armcc --arm_linux_configure --arm_linux_config_file=arm_linux.cfg
1172
1173            add_cflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
1174            add_asflags --no_hide_all --apcs=/interwork
1175            add_ldflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
1176            enabled pic && add_cflags --apcs=/fpic
1177            enabled pic && add_asflags --apcs=/fpic
1178            enabled shared && add_cflags --shared
1179          fi
1180          ;;
1181      esac
1182      ;;
1183    mips*)
1184      link_with_cc=gcc
1185      setup_gnu_toolchain
1186      tune_cflags="-mtune="
1187      if enabled dspr2; then
1188        check_add_cflags -mips32r2 -mdspr2
1189      fi
1190
1191      if enabled runtime_cpu_detect; then
1192        disable_feature runtime_cpu_detect
1193      fi
1194
1195      if [ -n "${tune_cpu}" ]; then
1196        case ${tune_cpu} in
1197          p5600)
1198            check_add_cflags -mips32r5 -mload-store-pairs
1199            check_add_cflags -msched-weight -mhard-float -mfp64
1200            check_add_asflags -mips32r5 -mhard-float -mfp64
1201            check_add_ldflags -mfp64
1202            ;;
1203          i6400|p6600)
1204            check_add_cflags -mips64r6 -mabi=64 -msched-weight
1205            check_add_cflags  -mload-store-pairs -mhard-float -mfp64
1206            check_add_asflags -mips64r6 -mabi=64 -mhard-float -mfp64
1207            check_add_ldflags -mips64r6 -mabi=64 -mfp64
1208            ;;
1209          loongson3*)
1210            check_cflags -march=loongson3a && soft_enable mmi \
1211              || disable_feature mmi
1212            check_cflags -mmsa && soft_enable msa \
1213              || disable_feature msa
1214            tgt_isa=loongson3a
1215            ;;
1216        esac
1217
1218        if enabled mmi || enabled msa; then
1219          soft_enable runtime_cpu_detect
1220        fi
1221
1222        if enabled msa; then
1223          # TODO(libyuv:793)
1224          # The new mips functions in libyuv do not build
1225          # with the toolchains we currently use for testing.
1226          soft_disable libyuv
1227        fi
1228      fi
1229
1230      check_add_cflags -march=${tgt_isa}
1231      check_add_asflags -march=${tgt_isa}
1232      check_add_asflags -KPIC
1233      ;;
1234    ppc64le*)
1235      link_with_cc=gcc
1236      setup_gnu_toolchain
1237      # Do not enable vsx by default.
1238      # https://bugs.chromium.org/p/webm/issues/detail?id=1522
1239      enabled vsx || RTCD_OPTIONS="${RTCD_OPTIONS}--disable-vsx "
1240      if [ -n "${tune_cpu}" ]; then
1241        case ${tune_cpu} in
1242          power?)
1243            tune_cflags="-mcpu="
1244            ;;
1245        esac
1246      fi
1247      ;;
1248    x86*)
1249      case  ${tgt_os} in
1250        android)
1251          soft_enable realtime_only
1252          ;;
1253        win*)
1254          enabled gcc && add_cflags -fno-common
1255          ;;
1256        solaris*)
1257          CC=${CC:-${CROSS}gcc}
1258          CXX=${CXX:-${CROSS}g++}
1259          LD=${LD:-${CROSS}gcc}
1260          CROSS=${CROSS-g}
1261          ;;
1262        os2)
1263          disable_feature pic
1264          AS=${AS:-nasm}
1265          add_ldflags -Zhigh-mem
1266          ;;
1267      esac
1268
1269      AS="${alt_as:-${AS:-auto}}"
1270      case  ${tgt_cc} in
1271        icc*)
1272          CC=${CC:-icc}
1273          LD=${LD:-icc}
1274          setup_gnu_toolchain
1275          add_cflags -use-msasm  # remove -use-msasm too?
1276          # add -no-intel-extensions to suppress warning #10237
1277          # refer to http://software.intel.com/en-us/forums/topic/280199
1278          add_ldflags -i-static -no-intel-extensions
1279          enabled x86_64 && add_cflags -ipo -static -O3 -no-prec-div
1280          enabled x86_64 && AR=xiar
1281          case ${tune_cpu} in
1282            atom*)
1283              tune_cflags="-x"
1284              tune_cpu="SSE3_ATOM"
1285              ;;
1286            *)
1287              tune_cflags="-march="
1288              ;;
1289          esac
1290          ;;
1291        gcc*)
1292          link_with_cc=gcc
1293          tune_cflags="-march="
1294          setup_gnu_toolchain
1295          #for 32 bit x86 builds, -O3 did not turn on this flag
1296          enabled optimizations && disabled gprof && check_add_cflags -fomit-frame-pointer
1297          ;;
1298        vs*)
1299          msvs_arch_dir=x86-msvs
1300          case ${tgt_cc##vs} in
1301            14)
1302              echo "${tgt_cc} does not support avx512, disabling....."
1303              RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx512 "
1304              soft_disable avx512
1305              ;;
1306          esac
1307          ;;
1308      esac
1309
1310      bits=32
1311      enabled x86_64 && bits=64
1312      check_cpp <<EOF && bits=x32
1313#if !defined(__ILP32__) || !defined(__x86_64__)
1314#error "not x32"
1315#endif
1316EOF
1317      case ${tgt_cc} in
1318        gcc*)
1319          add_cflags -m${bits}
1320          add_ldflags -m${bits}
1321          ;;
1322      esac
1323
1324      soft_enable runtime_cpu_detect
1325      # We can't use 'check_cflags' until the compiler is configured and CC is
1326      # populated.
1327      for ext in ${ARCH_EXT_LIST_X86}; do
1328        # disable higher order extensions to simplify asm dependencies
1329        if [ "$disable_exts" = "yes" ]; then
1330          if ! disabled $ext; then
1331            RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${ext} "
1332            disable_feature $ext
1333          fi
1334        elif disabled $ext; then
1335          disable_exts="yes"
1336        else
1337          if [ "$ext" = "avx512" ]; then
1338            check_gcc_machine_options $ext avx512f avx512cd avx512bw avx512dq avx512vl
1339            check_gcc_avx512_compiles
1340          else
1341            # use the shortened version for the flag: sse4_1 -> sse4
1342            check_gcc_machine_option ${ext%_*} $ext
1343          fi
1344        fi
1345      done
1346
1347      if enabled external_build; then
1348        log_echo "  skipping assembler detection"
1349      else
1350        case "${AS}" in
1351          auto|"")
1352            which nasm >/dev/null 2>&1 && AS=nasm
1353            which yasm >/dev/null 2>&1 && AS=yasm
1354            if [ "${AS}" = nasm ] ; then
1355              # Apple ships version 0.98 of nasm through at least Xcode 6. Revisit
1356              # this check if they start shipping a compatible version.
1357              apple=`nasm -v | grep "Apple"`
1358              [ -n "${apple}" ] \
1359                && echo "Unsupported version of nasm: ${apple}" \
1360                && AS=""
1361            fi
1362            [ "${AS}" = auto ] || [ -z "${AS}" ] \
1363              && die "Neither yasm nor nasm have been found." \
1364                     "See the prerequisites section in the README for more info."
1365            ;;
1366        esac
1367        log_echo "  using $AS"
1368      fi
1369      AS_SFX=.asm
1370      case  ${tgt_os} in
1371        win32)
1372          add_asflags -f win32
1373          enabled debug && add_asflags -g cv8
1374          EXE_SFX=.exe
1375          ;;
1376        win64)
1377          add_asflags -f win64
1378          enabled debug && add_asflags -g cv8
1379          EXE_SFX=.exe
1380          ;;
1381        linux*|solaris*|android*)
1382          add_asflags -f elf${bits}
1383          enabled debug && [ "${AS}" = yasm ] && add_asflags -g dwarf2
1384          enabled debug && [ "${AS}" = nasm ] && add_asflags -g
1385          [ "${AS##*/}" = nasm ] && check_asm_align
1386          ;;
1387        darwin*)
1388          add_asflags -f macho${bits}
1389          enabled x86 && darwin_arch="-arch i386" || darwin_arch="-arch x86_64"
1390          add_cflags  ${darwin_arch}
1391          add_ldflags ${darwin_arch}
1392          # -mdynamic-no-pic is still a bit of voodoo -- it was required at
1393          # one time, but does not seem to be now, and it breaks some of the
1394          # code that still relies on inline assembly.
1395          # enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
1396          enabled icc && ! enabled pic && add_cflags -fno-pic
1397          ;;
1398        iphonesimulator)
1399          add_asflags -f macho${bits}
1400          enabled x86 && sim_arch="-arch i386" || sim_arch="-arch x86_64"
1401          add_cflags  ${sim_arch}
1402          add_ldflags ${sim_arch}
1403
1404          if [ "$(disabled external_build)" ] &&
1405              [ "$(show_darwin_sdk_major_version iphonesimulator)" -gt 8 ]; then
1406            # yasm v1.3.0 doesn't know what -fembed-bitcode means, so turning it
1407            # on is pointless (unless building a C-only lib). Warn the user, but
1408            # do nothing here.
1409            log "Warning: Bitcode embed disabled for simulator targets."
1410          fi
1411          ;;
1412        os2)
1413          add_asflags -f aout
1414          enabled debug && add_asflags -g
1415          EXE_SFX=.exe
1416          ;;
1417        *)
1418          log "Warning: Unknown os $tgt_os while setting up $AS flags"
1419          ;;
1420      esac
1421      ;;
1422    *-gcc|generic-gnu)
1423      link_with_cc=gcc
1424      enable_feature gcc
1425      setup_gnu_toolchain
1426      ;;
1427  esac
1428
1429  # Try to enable CPU specific tuning
1430  if [ -n "${tune_cpu}" ]; then
1431    if [ -n "${tune_cflags}" ]; then
1432      check_add_cflags ${tune_cflags}${tune_cpu} || \
1433        die "Requested CPU '${tune_cpu}' not supported by compiler"
1434    fi
1435    if [ -n "${tune_asflags}" ]; then
1436      check_add_asflags ${tune_asflags}${tune_cpu} || \
1437        die "Requested CPU '${tune_cpu}' not supported by assembler"
1438    fi
1439    if [ -z "${tune_cflags}${tune_asflags}" ]; then
1440      log_echo "Warning: CPU tuning not supported by this toolchain"
1441    fi
1442  fi
1443
1444  if enabled debug; then
1445    check_add_cflags -g && check_add_ldflags -g
1446  else
1447    check_add_cflags -DNDEBUG
1448  fi
1449
1450  enabled gprof && check_add_cflags -pg && check_add_ldflags -pg
1451  enabled gcov &&
1452    check_add_cflags -fprofile-arcs -ftest-coverage &&
1453    check_add_ldflags -fprofile-arcs -ftest-coverage
1454
1455  if enabled optimizations; then
1456    if enabled rvct; then
1457      enabled small && check_add_cflags -Ospace || check_add_cflags -Otime
1458    else
1459      enabled small && check_add_cflags -O2 ||  check_add_cflags -O3
1460    fi
1461  fi
1462
1463  # Position Independent Code (PIC) support, for building relocatable
1464  # shared objects
1465  enabled gcc && enabled pic && check_add_cflags -fPIC
1466
1467  # Work around longjmp interception on glibc >= 2.11, to improve binary
1468  # compatibility. See http://code.google.com/p/webm/issues/detail?id=166
1469  enabled linux && check_add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
1470
1471  # Check for strip utility variant
1472  ${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable_feature gnu_strip
1473
1474  # Try to determine target endianness
1475  check_cc <<EOF
1476unsigned int e = 'O'<<24 | '2'<<16 | 'B'<<8 | 'E';
1477EOF
1478    [ -f "${TMP_O}" ] && od -A n -t x1 "${TMP_O}" | tr -d '\n' |
1479        grep '4f *32 *42 *45' >/dev/null 2>&1 && enable_feature big_endian
1480
1481    # Try to find which inline keywords are supported
1482    check_cc <<EOF && INLINE="inline"
1483static inline function() {}
1484EOF
1485
1486  # Almost every platform uses pthreads.
1487  if enabled multithread; then
1488    case ${toolchain} in
1489      *-win*-vs*)
1490        ;;
1491      *-android-gcc)
1492        # bionic includes basic pthread functionality, obviating -lpthread.
1493        ;;
1494      *)
1495        check_header pthread.h && check_lib -lpthread <<EOF && add_extralibs -lpthread || disable_feature pthread_h
1496#include <pthread.h>
1497#include <stddef.h>
1498int main(void) { return pthread_create(NULL, NULL, NULL, NULL); }
1499EOF
1500        ;;
1501    esac
1502  fi
1503
1504  # only for MIPS platforms
1505  case ${toolchain} in
1506    mips*)
1507      if enabled big_endian; then
1508        if enabled dspr2; then
1509          echo "dspr2 optimizations are available only for little endian platforms"
1510          disable_feature dspr2
1511        fi
1512        if enabled msa; then
1513          echo "msa optimizations are available only for little endian platforms"
1514          disable_feature msa
1515        fi
1516        if enabled mmi; then
1517          echo "mmi optimizations are available only for little endian platforms"
1518          disable_feature mmi
1519        fi
1520      fi
1521      ;;
1522  esac
1523
1524  # glibc needs these
1525  if enabled linux; then
1526    add_cflags -D_LARGEFILE_SOURCE
1527    add_cflags -D_FILE_OFFSET_BITS=64
1528  fi
1529}
1530
1531process_toolchain() {
1532  process_common_toolchain
1533}
1534
1535print_config_mk() {
1536  saved_prefix="${prefix}"
1537  prefix=$1
1538  makefile=$2
1539  shift 2
1540  for cfg; do
1541    if enabled $cfg; then
1542      upname="`toupper $cfg`"
1543      echo "${prefix}_${upname}=yes" >> $makefile
1544    fi
1545  done
1546  prefix="${saved_prefix}"
1547}
1548
1549print_config_h() {
1550  saved_prefix="${prefix}"
1551  prefix=$1
1552  header=$2
1553  shift 2
1554  for cfg; do
1555    upname="`toupper $cfg`"
1556    if enabled $cfg; then
1557      echo "#define ${prefix}_${upname} 1" >> $header
1558    else
1559      echo "#define ${prefix}_${upname} 0" >> $header
1560    fi
1561  done
1562  prefix="${saved_prefix}"
1563}
1564
1565print_config_vars_h() {
1566  header=$1
1567  shift
1568  while [ $# -gt 0 ]; do
1569    upname="`toupper $1`"
1570    echo "#define ${upname} $2" >> $header
1571    shift 2
1572  done
1573}
1574
1575print_webm_license() {
1576  saved_prefix="${prefix}"
1577  destination=$1
1578  prefix="$2"
1579  suffix="$3"
1580  shift 3
1581  cat <<EOF > ${destination}
1582${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix}
1583${prefix} ${suffix}
1584${prefix} Use of this source code is governed by a BSD-style license${suffix}
1585${prefix} that can be found in the LICENSE file in the root of the source${suffix}
1586${prefix} tree. An additional intellectual property rights grant can be found${suffix}
1587${prefix} in the file PATENTS.  All contributing project authors may${suffix}
1588${prefix} be found in the AUTHORS file in the root of the source tree.${suffix}
1589EOF
1590  prefix="${saved_prefix}"
1591}
1592
1593process_targets() {
1594  true;
1595}
1596
1597process_detect() {
1598  true;
1599}
1600
1601enable_feature logging
1602logfile="config.log"
1603self=$0
1604process() {
1605  cmdline_args="$@"
1606  process_cmdline "$@"
1607  if enabled child; then
1608    echo "# ${self} $@" >> ${logfile}
1609  else
1610    echo "# ${self} $@" > ${logfile}
1611  fi
1612  post_process_common_cmdline
1613  post_process_cmdline
1614  process_toolchain
1615  process_detect
1616  process_targets
1617
1618  OOT_INSTALLS="${OOT_INSTALLS}"
1619  if enabled source_path_used; then
1620  # Prepare the PWD for building.
1621  for f in ${OOT_INSTALLS}; do
1622    install -D "${source_path}/$f" "$f"
1623  done
1624  fi
1625  cp "${source_path}/build/make/Makefile" .
1626
1627  clean_temp_files
1628  true
1629}
1630