5 ## This script is sourced by the main configure script and contains
6 ## utility functions and other common bits that aren't strictly libvpx
9 ## This build system is based in part on the FFmpeg configure script.
14 # Logging / Output Functions
17 echo "Unknown option \"$1\"."
18 echo "See $0 --help for available options."
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."
53 echo "$@" >> ${outfile}
57 for opt in ${CMDLINE_SELECT}; do
58 opt2=`echo $opt | sed -e 's;_;-;g'`
60 eval "toggle_${opt}=\"--disable-${opt2}\""
62 eval "toggle_${opt}=\"--enable-${opt2} \""
67 Usage: configure [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
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
105 Object files are built at the place where configure is launched.
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.
113 show_targets ${all_platforms}
119 while [ -n "$*" ]; do
120 if [ "${1%%-*}" = "${2%%-*}" ]; then
121 if [ "${2%%-*}" = "${3%%-*}" ]; then
122 printf " %-24s %-24s %-24s\n" "$1" "$2" "$3"
125 printf " %-24s %-24s\n" "$1" "$2"
129 printf " %-24s\n" "$1"
141 # List Processing Functions
155 [ $var = $value ] && return 0
161 CFLAGS="${CFLAGS} $@"
162 CXXFLAGS="${CXXFLAGS} $@"
166 CFLAGS="${CFLAGS} $@"
169 add_cxxflags_only() {
170 CXXFLAGS="${CXXFLAGS} $@"
174 LDFLAGS="${LDFLAGS} $@"
178 ASFLAGS="${ASFLAGS} $@"
182 extralibs="${extralibs} $@"
186 # Boolean Manipulation Functions
198 eval test "x\$$1" = "xyes"
202 eval test "x\$$1" = "xno"
206 enabled "${1}" || echo " enabling ${1}"
207 enable_feature "${1}"
209 is_in "${1}" vp8 vp9 && enable_feature "${1}_encoder" "${1}_decoder"
213 disabled "${1}" || echo " disabling ${1}"
214 disable_feature "${1}"
216 is_in "${1}" vp8 vp9 && disable_feature "${1}_encoder" "${1}_decoder"
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).
225 if ! disabled $var; then
226 enabled $var || log_echo " enabling $var"
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).
238 if ! enabled $var; then
239 disabled $var || log_echo " disabling $var"
246 # Text Processing Functions
249 echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
253 echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
257 # Temporary File Functions
260 enable_feature source_path_used
261 if [ -z "$source_path" ] || [ "$source_path" = "." ]; then
263 disable_feature source_path_used
266 if test ! -z "$TMPDIR" ; then
268 elif test ! -z "$TEMPDIR" ; then
273 RAND=$(awk 'BEGIN { srand(); printf "%d\n",(rand() * 32768)}')
274 TMP_H="${TMPDIRx}/vpx-conf-$$-${RAND}.h"
275 TMP_C="${TMPDIRx}/vpx-conf-$$-${RAND}.c"
276 TMP_CC="${TMPDIRx}/vpx-conf-$$-${RAND}.cc"
277 TMP_O="${TMPDIRx}/vpx-conf-$$-${RAND}.o"
278 TMP_X="${TMPDIRx}/vpx-conf-$$-${RAND}.x"
279 TMP_ASM="${TMPDIRx}/vpx-conf-$$-${RAND}.asm"
282 rm -f ${TMP_C} ${TMP_CC} ${TMP_H} ${TMP_O} ${TMP_X} ${TMP_ASM}
283 enabled gcov && rm -f ${TMP_C%.c}.gcno ${TMP_CC%.cc}.gcno
287 # Toolchain Check Functions
290 enabled external_build && return
292 "$@" >>${logfile} 2>&1
299 check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
306 check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_CC}
313 check_cmd ${CC} ${CFLAGS} "$@" -E -o ${TMP_O} ${TMP_C}
319 && check_cmd ${LD} ${LDFLAGS} "$@" -o ${TMP_X} ${TMP_O} ${extralibs}
325 && check_cmd ${LD} ${LDFLAGS} -o ${TMP_X} ${TMP_O} "$@" ${extralibs}
329 log check_header "$@"
332 var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
334 check_cpp "$@" <<EOF && enable_feature $var
341 log check_cflags "$@"
342 check_cc -Werror "$@" <<EOF
348 log check_cxxflags "$@"
350 # Catch CFLAGS that trigger CXX warnings
352 *c++-analyzer|*clang++|*g++*)
353 check_cxx -Werror "$@" <<EOF
358 check_cxx -Werror "$@" <<EOF
366 check_cxxflags "$@" && add_cxxflags_only "$@"
367 check_cflags "$@" && add_cflags_only "$@"
370 check_add_cxxflags() {
371 check_cxxflags "$@" && add_cxxflags_only "$@"
374 check_add_asflags() {
379 check_add_ldflags() {
385 log check_asm_align "$@"
386 cat >${TMP_ASM} <<EOF
391 check_cmd ${AS} ${ASFLAGS} -o ${TMP_O} ${TMP_ASM}
392 readelf -WS ${TMP_O} >${TMP_X}
394 if ! grep -q '\.rodata .* 16$' ${TMP_X}; then
395 die "${AS} ${ASFLAGS} does not support section alignment (nasm <=2.08?)"
399 # tests for -m$1 toggling the feature given in $2. If $2 is empty $1 is used.
400 check_gcc_machine_option() {
403 [ -n "$feature" ] || feature="$opt"
405 if enabled gcc && ! disabled "$feature" && ! check_cflags "-m$opt"; then
406 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-$feature "
408 soft_enable "$feature"
412 # tests for -m$2, -m$3, -m$4... toggling the feature given in $1.
413 check_gcc_machine_options() {
419 flags="$flags -m$opt"
422 if enabled gcc && ! disabled "$feature" && ! check_cflags $flags; then
423 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-$feature "
425 soft_enable "$feature"
429 check_gcc_avx512_compiles() {
430 if disabled gcc; then
434 check_cc -mavx512f <<EOF
435 #include <immintrin.h>
437 __m512i x = _mm512_set1_epi16(0);
442 if [ ${compile_result} -ne 0 ]; then
443 log_echo " disabling avx512: not supported by compiler"
444 disable_feature avx512
445 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx512 "
449 write_common_config_banner() {
450 print_webm_license config.mk "##" ""
451 echo '# This file automatically generated by configure. Do not edit!' >> config.mk
452 echo "TOOLCHAIN := ${toolchain}" >> config.mk
456 echo "ALT_LIBC := ${alt_libc}" >> config.mk
461 write_common_config_targets() {
462 for t in ${all_targets}; do
463 if enabled ${t}; then
464 if enabled child; then
465 fwrite config.mk "ALL_TARGETS += ${t}-${toolchain}"
467 fwrite config.mk "ALL_TARGETS += ${t}"
475 write_common_target_config_mk() {
478 enabled ccache && CC="ccache ${CC}"
479 enabled ccache && CXX="ccache ${CXX}"
480 print_webm_license $1 "##" ""
483 # This file automatically generated by configure. Do not edit!
484 SRC_PATH="$source_path"
485 SRC_PATH_BARE=$source_path
486 BUILD_PFX=${BUILD_PFX}
487 TOOLCHAIN=${toolchain}
488 ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
489 GEN_VCPROJ=${gen_vcproj_cmd}
490 MSVS_ARCH_DIR=${msvs_arch_dir}
501 CXXFLAGS = ${CXXFLAGS}
502 ARFLAGS = -crs\$(if \$(quiet),,v)
505 extralibs = ${extralibs}
506 AS_SFX = ${AS_SFX:-.asm}
508 VCPROJ_SFX = ${VCPROJ_SFX}
509 RTCD_OPTIONS = ${RTCD_OPTIONS}
512 if enabled rvct; then cat >> $1 << EOF
513 fmt_deps = sed -e 's;^__image.axf;\${@:.d=.o} \$@;' #hide
515 else cat >> $1 << EOF
516 fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\${@:.d=.o} \$@;'
520 print_config_mk ARCH "${1}" ${ARCH_LIST}
521 print_config_mk HAVE "${1}" ${HAVE_LIST}
522 print_config_mk CONFIG "${1}" ${CONFIG_LIST}
523 print_config_mk HAVE "${1}" gnu_strip
525 enabled msvs && echo "CONFIG_VS_VERSION=${vs_version}" >> "${1}"
531 write_common_target_config_h() {
532 print_webm_license ${TMP_H} "/*" " */"
533 cat >> ${TMP_H} << EOF
534 /* This file automatically generated by configure. Do not edit! */
537 #define RESTRICT ${RESTRICT}
538 #define INLINE ${INLINE}
540 print_config_h ARCH "${TMP_H}" ${ARCH_LIST}
541 print_config_h HAVE "${TMP_H}" ${HAVE_LIST}
542 print_config_h CONFIG "${TMP_H}" ${CONFIG_LIST}
543 print_config_vars_h "${TMP_H}" ${VAR_LIST}
544 echo "#endif /* VPX_CONFIG_H */" >> ${TMP_H}
545 mkdir -p `dirname "$1"`
546 cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
549 write_win_arm64_neon_h_workaround() {
550 print_webm_license ${TMP_H} "/*" " */"
551 cat >> ${TMP_H} << EOF
552 /* This file automatically generated by configure. Do not edit! */
553 #ifndef VPX_WIN_ARM_NEON_H_WORKAROUND
554 #define VPX_WIN_ARM_NEON_H_WORKAROUND
555 /* The Windows SDK has arm_neon.h, but unlike on other platforms it is
556 * ARM32-only. ARM64 NEON support is provided by arm64_neon.h, a proper
557 * superset of arm_neon.h. Work around this by providing a more local
558 * arm_neon.h that simply #includes arm64_neon.h.
560 #include <arm64_neon.h>
561 #endif /* VPX_WIN_ARM_NEON_H_WORKAROUND */
563 mkdir -p `dirname "$1"`
564 cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
567 process_common_cmdline() {
576 if ! disabled logging ; then
577 enabled logging || logfile="$logging"
583 toolchain="${toolchain:-${optval}}"
586 toolchain="${toolchain:-${optval}}"
587 enable_feature force_toolchain
593 extra_cflags="${optval}"
596 extra_cxxflags="${optval}"
598 --enable-?*|--disable-?*)
599 eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
600 if is_in ${option} ${ARCH_EXT_LIST}; then
601 [ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${option} "
602 elif [ $action = "disable" ] && ! disabled $option ; then
603 is_in ${option} ${CMDLINE_SELECT} || die_unknown $opt
604 log_echo " disabling $option"
605 elif [ $action = "enable" ] && ! enabled $option ; then
606 is_in ${option} ${CMDLINE_SELECT} || die_unknown $opt
607 log_echo " enabling $option"
609 ${action}_feature $option
612 eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
613 if is_in ${option} ${ARCH_EXT_LIST}; then
614 RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
619 --force-enable-?*|--force-disable-?*)
620 eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
621 ${action}_feature $option
624 [ -d "${optval}" ] || die "Not a directory: ${optval}"
625 disable_feature builtin_libc
629 [ "${optval}" = yasm ] || [ "${optval}" = nasm ] \
630 || [ "${optval}" = auto ] \
631 || die "Must be yasm, nasm or auto: ${optval}"
637 VAR_LIST="DECODE_WIDTH_LIMIT ${w} DECODE_HEIGHT_LIMIT ${h}"
638 [ ${w} -gt 0 ] && [ ${h} -gt 0 ] || die "Invalid size-limit: too small."
639 [ ${w} -lt 65536 ] && [ ${h} -lt 65536 ] \
640 || die "Invalid size-limit: too big."
641 enable_feature size_limit
649 --libc|--as|--prefix|--libdir)
650 die "Option ${opt} requires argument"
667 process_common_cmdline $opt
673 post_process_common_cmdline() {
674 prefix="${prefix:-/usr/local}"
676 libdir="${libdir:-${prefix}/lib}"
678 if [ "${libdir#${prefix}}" = "${libdir}" ]; then
679 die "Libdir ${libdir} must be a subdirectory of ${prefix}"
683 post_process_cmdline() {
687 setup_gnu_toolchain() {
688 CC=${CC:-${CROSS}gcc}
689 CXX=${CXX:-${CROSS}g++}
691 LD=${LD:-${CROSS}${link_with_cc:-ld}}
693 STRIP=${STRIP:-${CROSS}strip}
699 # Reliably find the newest available Darwin SDKs. (Older versions of
700 # xcrun don't support --show-sdk-path.)
701 show_darwin_sdk_path() {
702 xcrun --sdk $1 --show-sdk-path 2>/dev/null ||
703 xcodebuild -sdk $1 -version Path 2>/dev/null
706 # Print the major version number of the Darwin SDK specified by $1.
707 show_darwin_sdk_major_version() {
708 xcrun --sdk $1 --show-sdk-version 2>/dev/null | cut -d. -f1
711 # Print the Xcode version.
712 show_xcode_version() {
713 xcodebuild -version | head -n1 | cut -d' ' -f2
716 # Fails when Xcode version is less than 6.3.
717 check_xcode_minimum_version() {
718 xcode_major=$(show_xcode_version | cut -f1 -d.)
719 xcode_minor=$(show_xcode_version | cut -f2 -d.)
722 if [ ${xcode_major} -lt ${xcode_min_major} ]; then
725 if [ ${xcode_major} -eq ${xcode_min_major} ] \
726 && [ ${xcode_minor} -lt ${xcode_min_minor} ]; then
731 process_common_toolchain() {
732 if [ -z "$toolchain" ]; then
733 gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}"
739 armv7*-hardfloat* | armv7*-gnueabihf | arm-*-gnueabihf)
808 [ -z "$tgt_isa" ] && tgt_isa=x86
822 if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
823 toolchain=${tgt_isa}-${tgt_os}-gcc
827 toolchain=${toolchain:-generic-gnu}
829 is_in ${toolchain} ${all_platforms} || enabled force_toolchain \
830 || die "Unrecognized toolchain '${toolchain}'"
832 enabled child || log_echo "Configuring for target '${toolchain}'"
835 # Set up toolchain variables
837 tgt_isa=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $1}')
838 tgt_os=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $2}')
839 tgt_cc=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $3}')
841 # Mark the specific ISA requested as enabled
842 soft_enable ${tgt_isa}
843 enable_feature ${tgt_os}
844 enable_feature ${tgt_cc}
846 # Enable the architecture family
859 # PIC is probably what we want when building shared libs
860 enabled shared && soft_enable pic
862 # Minimum iOS version for all target platforms (darwin and iphonesimulator).
863 # Shared library framework builds are only possible on iOS 8 and later.
864 if enabled shared; then
865 IOS_VERSION_OPTIONS="--enable-shared"
866 IOS_VERSION_MIN="8.0"
868 IOS_VERSION_OPTIONS=""
869 IOS_VERSION_MIN="7.0"
872 # Handle darwin variants. Newer SDKs allow targeting older
873 # platforms, so use the newest one available.
876 add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
877 iphoneos_sdk_dir="$(show_darwin_sdk_path iphoneos)"
878 if [ -d "${iphoneos_sdk_dir}" ]; then
879 add_cflags "-isysroot ${iphoneos_sdk_dir}"
880 add_ldflags "-isysroot ${iphoneos_sdk_dir}"
884 osx_sdk_dir="$(show_darwin_sdk_path macosx)"
885 if [ -d "${osx_sdk_dir}" ]; then
886 add_cflags "-isysroot ${osx_sdk_dir}"
887 add_ldflags "-isysroot ${osx_sdk_dir}"
894 add_cflags "-mmacosx-version-min=10.4"
895 add_ldflags "-mmacosx-version-min=10.4"
898 add_cflags "-mmacosx-version-min=10.5"
899 add_ldflags "-mmacosx-version-min=10.5"
902 add_cflags "-mmacosx-version-min=10.6"
903 add_ldflags "-mmacosx-version-min=10.6"
906 add_cflags "-mmacosx-version-min=10.7"
907 add_ldflags "-mmacosx-version-min=10.7"
910 add_cflags "-mmacosx-version-min=10.8"
911 add_ldflags "-mmacosx-version-min=10.8"
914 add_cflags "-mmacosx-version-min=10.9"
915 add_ldflags "-mmacosx-version-min=10.9"
918 add_cflags "-mmacosx-version-min=10.10"
919 add_ldflags "-mmacosx-version-min=10.10"
922 add_cflags "-mmacosx-version-min=10.11"
923 add_ldflags "-mmacosx-version-min=10.11"
926 add_cflags "-mmacosx-version-min=10.12"
927 add_ldflags "-mmacosx-version-min=10.12"
930 add_cflags "-mmacosx-version-min=10.13"
931 add_ldflags "-mmacosx-version-min=10.13"
934 add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
935 add_ldflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
936 iossim_sdk_dir="$(show_darwin_sdk_path iphonesimulator)"
937 if [ -d "${iossim_sdk_dir}" ]; then
938 add_cflags "-isysroot ${iossim_sdk_dir}"
939 add_ldflags "-isysroot ${iossim_sdk_dir}"
944 # Handle Solaris variants. Solaris 10 needs -lposix4
947 add_extralibs -lposix4
950 add_extralibs -lposix4
954 # Process ARM architecture variants
957 # on arm, isa versions are supersets
964 # Only enable neon_asm when neon is also enabled.
965 enabled neon && soft_enable neon_asm
966 # If someone tries to force it through, die.
967 if disabled neon && enabled neon_asm; then
968 die "Disabling neon while keeping neon-asm is not supported"
973 asm_conversion_cmd="cat"
979 arch_int=${tgt_isa##armv}
980 arch_int=${arch_int%%te}
981 tune_cflags="-mtune="
982 if [ ${tgt_isa} = "armv7" ] || [ ${tgt_isa} = "armv7s" ]; then
983 if [ -z "${float_abi}" ]; then
984 check_cpp <<EOF && float_abi=hard || float_abi=softfp
985 #ifndef __ARM_PCS_VFP
990 check_add_cflags -march=armv7-a -mfloat-abi=${float_abi}
991 check_add_asflags -march=armv7-a -mfloat-abi=${float_abi}
993 if enabled neon || enabled neon_asm; then
994 check_add_cflags -mfpu=neon #-ftree-vectorize
995 check_add_asflags -mfpu=neon
997 elif [ ${tgt_isa} = "arm64" ] || [ ${tgt_isa} = "armv8" ]; then
998 check_add_cflags -march=armv8-a
999 check_add_asflags -march=armv8-a
1001 check_add_cflags -march=${tgt_isa}
1002 check_add_asflags -march=${tgt_isa}
1005 enabled debug && add_asflags -g
1006 asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
1010 asm_conversion_cmd="$asm_conversion_cmd -noelf"
1013 enable_feature thumb
1017 if enabled thumb; then
1018 asm_conversion_cmd="$asm_conversion_cmd -thumb"
1019 check_add_cflags -mthumb
1020 check_add_asflags -mthumb -mimplicit-it=always
1024 # A number of ARM-based Windows platforms are constrained by their
1025 # respective SDKs' limitations. Fortunately, these are all 32-bit ABIs
1026 # and so can be selected as 'win32'.
1027 if [ ${tgt_os} = "win32" ]; then
1028 asm_conversion_cmd="${source_path}/build/make/ads2armasm_ms.pl"
1030 msvs_arch_dir=arm-msvs
1031 disable_feature multithread
1032 disable_feature unit_tests
1033 if [ ${tgt_cc##vs} -ge 12 ]; then
1034 # MSVC 2013 doesn't allow doing plain .exe projects for ARM32,
1035 # only "AppContainerApplication" which requires an AppxManifest.
1036 # Therefore disable the examples, just build the library.
1037 disable_feature examples
1038 disable_feature tools
1041 # Windows 10 on ARM, on the other hand, has full Windows SDK support
1042 # for building Win32 ARM64 applications in addition to ARM64
1043 # Windows Store apps. It is the only 64-bit ARM ABI that
1044 # Windows supports, so it is the default definition of 'win64'.
1045 # ARM64 build support officially shipped in Visual Studio 15.9.0.
1047 # Because the ARM64 Windows SDK's arm_neon.h is ARM32-specific
1048 # while LLVM's is not, probe its validity.
1049 if enabled neon; then
1050 if [ -n "${CC}" ]; then
1051 check_header arm_neon.h || check_header arm64_neon.h && \
1052 enable_feature win_arm64_neon_h_workaround
1054 # If a probe is not possible, assume this is the pure Windows
1055 # SDK and so the workaround is necessary.
1056 enable_feature win_arm64_neon_h_workaround
1065 LD="${source_path}/build/make/armlink_adapter.sh"
1066 STRIP=arm-none-linux-gnueabi-strip
1067 NM=arm-none-linux-gnueabi-nm
1068 tune_cflags="--cpu="
1069 tune_asflags="--cpu="
1070 if [ -z "${tune_cpu}" ]; then
1071 if [ ${tgt_isa} = "armv7" ]; then
1072 if enabled neon || enabled neon_asm
1074 check_add_cflags --fpu=softvfp+vfpv3
1075 check_add_asflags --fpu=softvfp+vfpv3
1077 check_add_cflags --cpu=Cortex-A8
1078 check_add_asflags --cpu=Cortex-A8
1080 check_add_cflags --cpu=${tgt_isa##armv}
1081 check_add_asflags --cpu=${tgt_isa##armv}
1084 arch_int=${tgt_isa##armv}
1085 arch_int=${arch_int%%te}
1086 enabled debug && add_asflags -g
1088 add_cflags --enum_is_int
1089 add_cflags --wchar32
1095 disable_feature multithread
1096 disable_feature os_support
1100 echo "Assuming standalone build with NDK toolchain."
1101 echo "See build/make/Android.mk for details."
1102 check_add_ldflags -static
1103 soft_enable unit_tests
1107 XCRUN_FIND="xcrun --sdk iphoneos --find"
1108 CXX="$(${XCRUN_FIND} clang++)"
1109 CC="$(${XCRUN_FIND} clang)"
1110 AR="$(${XCRUN_FIND} ar)"
1111 AS="$(${XCRUN_FIND} as)"
1112 STRIP="$(${XCRUN_FIND} strip)"
1113 NM="$(${XCRUN_FIND} nm)"
1114 RANLIB="$(${XCRUN_FIND} ranlib)"
1116 LD="${CXX:-$(${XCRUN_FIND} ld)}"
1118 # ASFLAGS is written here instead of using check_add_asflags
1119 # because we need to overwrite all of ASFLAGS and purge the
1120 # options that were put in above
1121 ASFLAGS="-arch ${tgt_isa} -g"
1123 add_cflags -arch ${tgt_isa}
1124 add_ldflags -arch ${tgt_isa}
1126 alt_libc="$(show_darwin_sdk_path iphoneos)"
1127 if [ -d "${alt_libc}" ]; then
1128 add_cflags -isysroot ${alt_libc}
1131 if [ "${LD}" = "${CXX}" ]; then
1132 add_ldflags -miphoneos-version-min="${IOS_VERSION_MIN}"
1134 add_ldflags -ios_version_min "${IOS_VERSION_MIN}"
1137 for d in lib usr/lib usr/lib/system; do
1138 try_dir="${alt_libc}/${d}"
1139 [ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
1143 armv7|armv7s|armv8|arm64)
1144 if enabled neon && ! check_xcode_minimum_version; then
1146 log_echo " neon disabled: upgrade Xcode (need v6.3+)."
1147 if enabled neon_asm; then
1148 soft_disable neon_asm
1149 log_echo " neon_asm disabled: upgrade Xcode (need v6.3+)."
1155 asm_conversion_cmd="${source_path}/build/make/ads2gas_apple.pl"
1157 if [ "$(show_darwin_sdk_major_version iphoneos)" -gt 8 ]; then
1158 check_add_cflags -fembed-bitcode
1159 check_add_asflags -fembed-bitcode
1160 check_add_ldflags -fembed-bitcode
1165 enable_feature linux
1166 if enabled rvct; then
1167 # Check if we have CodeSourcery GCC in PATH. Needed for
1169 which arm-none-linux-gnueabi-gcc 2>&- || \
1170 die "Couldn't find CodeSourcery GCC from PATH"
1172 # Use armcc as a linker to enable translation of
1173 # some gcc specific options such as -lm and -lpthread.
1174 LD="armcc --translate_gcc"
1176 # create configuration file (uses path to CodeSourcery GCC)
1177 armcc --arm_linux_configure --arm_linux_config_file=arm_linux.cfg
1179 add_cflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
1180 add_asflags --no_hide_all --apcs=/interwork
1181 add_ldflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
1182 enabled pic && add_cflags --apcs=/fpic
1183 enabled pic && add_asflags --apcs=/fpic
1184 enabled shared && add_cflags --shared
1192 tune_cflags="-mtune="
1193 if enabled dspr2; then
1194 check_add_cflags -mips32r2 -mdspr2
1197 if enabled runtime_cpu_detect; then
1198 disable_feature runtime_cpu_detect
1201 if [ -n "${tune_cpu}" ]; then
1204 check_add_cflags -mips32r5 -mload-store-pairs
1205 check_add_cflags -msched-weight -mhard-float -mfp64
1206 check_add_asflags -mips32r5 -mhard-float -mfp64
1207 check_add_ldflags -mfp64
1210 check_add_cflags -mips64r6 -mabi=64 -msched-weight
1211 check_add_cflags -mload-store-pairs -mhard-float -mfp64
1212 check_add_asflags -mips64r6 -mabi=64 -mhard-float -mfp64
1213 check_add_ldflags -mips64r6 -mabi=64 -mfp64
1217 if enabled msa; then
1219 # The new mips functions in libyuv do not build
1220 # with the toolchains we currently use for testing.
1229 if enabled mmi; then
1231 check_add_ldflags -march=loongson3a
1234 check_add_cflags -march=${tgt_isa}
1235 check_add_asflags -march=${tgt_isa}
1236 check_add_asflags -KPIC
1241 check_gcc_machine_option "vsx"
1242 if [ -n "${tune_cpu}" ]; then
1245 tune_cflags="-mcpu="
1253 soft_enable realtime_only
1256 enabled gcc && add_cflags -fno-common
1259 CC=${CC:-${CROSS}gcc}
1260 CXX=${CXX:-${CROSS}g++}
1261 LD=${LD:-${CROSS}gcc}
1267 add_ldflags -Zhigh-mem
1271 AS="${alt_as:-${AS:-auto}}"
1277 add_cflags -use-msasm # remove -use-msasm too?
1278 # add -no-intel-extensions to suppress warning #10237
1279 # refer to http://software.intel.com/en-us/forums/topic/280199
1280 add_ldflags -i-static -no-intel-extensions
1281 enabled x86_64 && add_cflags -ipo -static -O3 -no-prec-div
1282 enabled x86_64 && AR=xiar
1286 tune_cpu="SSE3_ATOM"
1289 tune_cflags="-march="
1295 tune_cflags="-march="
1297 #for 32 bit x86 builds, -O3 did not turn on this flag
1298 enabled optimizations && disabled gprof && check_add_cflags -fomit-frame-pointer
1301 # When building with Microsoft Visual Studio the assembler is
1302 # invoked directly. Checking at configure time is unnecessary.
1303 # Skip the check by setting AS arbitrarily
1305 msvs_arch_dir=x86-msvs
1306 case ${tgt_cc##vs} in
1308 echo "${tgt_cc} does not support avx512, disabling....."
1309 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx512 "
1317 enabled x86_64 && bits=64
1318 check_cpp <<EOF && bits=x32
1319 #if !defined(__ILP32__) || !defined(__x86_64__)
1325 add_cflags -m${bits}
1326 add_ldflags -m${bits}
1330 soft_enable runtime_cpu_detect
1331 # We can't use 'check_cflags' until the compiler is configured and CC is
1333 for ext in ${ARCH_EXT_LIST_X86}; do
1334 # disable higher order extensions to simplify asm dependencies
1335 if [ "$disable_exts" = "yes" ]; then
1336 if ! disabled $ext; then
1337 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${ext} "
1338 disable_feature $ext
1340 elif disabled $ext; then
1343 if [ "$ext" = "avx512" ]; then
1344 check_gcc_machine_options $ext avx512f avx512cd avx512bw avx512dq avx512vl
1345 check_gcc_avx512_compiles
1347 # use the shortened version for the flag: sse4_1 -> sse4
1348 check_gcc_machine_option ${ext%_*} $ext
1353 if enabled external_build; then
1354 log_echo " skipping assembler detection"
1358 which nasm >/dev/null 2>&1 && AS=nasm
1359 which yasm >/dev/null 2>&1 && AS=yasm
1360 if [ "${AS}" = nasm ] ; then
1361 # Apple ships version 0.98 of nasm through at least Xcode 6. Revisit
1362 # this check if they start shipping a compatible version.
1363 apple=`nasm -v | grep "Apple"`
1365 && echo "Unsupported version of nasm: ${apple}" \
1368 [ "${AS}" = auto ] || [ -z "${AS}" ] \
1369 && die "Neither yasm nor nasm have been found." \
1370 "See the prerequisites section in the README for more info."
1373 log_echo " using $AS"
1378 add_asflags -f win32
1379 enabled debug && add_asflags -g cv8
1383 add_asflags -f win64
1384 enabled debug && add_asflags -g cv8
1387 linux*|solaris*|android*)
1388 add_asflags -f elf${bits}
1389 enabled debug && [ "${AS}" = yasm ] && add_asflags -g dwarf2
1390 enabled debug && [ "${AS}" = nasm ] && add_asflags -g
1391 [ "${AS##*/}" = nasm ] && check_asm_align
1394 add_asflags -f macho${bits}
1395 enabled x86 && darwin_arch="-arch i386" || darwin_arch="-arch x86_64"
1396 add_cflags ${darwin_arch}
1397 add_ldflags ${darwin_arch}
1398 # -mdynamic-no-pic is still a bit of voodoo -- it was required at
1399 # one time, but does not seem to be now, and it breaks some of the
1400 # code that still relies on inline assembly.
1401 # enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
1402 enabled icc && ! enabled pic && add_cflags -fno-pic
1405 add_asflags -f macho${bits}
1406 enabled x86 && sim_arch="-arch i386" || sim_arch="-arch x86_64"
1407 add_cflags ${sim_arch}
1408 add_ldflags ${sim_arch}
1410 if [ "$(disabled external_build)" ] &&
1411 [ "$(show_darwin_sdk_major_version iphonesimulator)" -gt 8 ]; then
1412 # yasm v1.3.0 doesn't know what -fembed-bitcode means, so turning it
1413 # on is pointless (unless building a C-only lib). Warn the user, but
1415 log "Warning: Bitcode embed disabled for simulator targets."
1420 enabled debug && add_asflags -g
1424 log "Warning: Unknown os $tgt_os while setting up $AS flags"
1435 # Try to enable CPU specific tuning
1436 if [ -n "${tune_cpu}" ]; then
1437 if [ -n "${tune_cflags}" ]; then
1438 check_add_cflags ${tune_cflags}${tune_cpu} || \
1439 die "Requested CPU '${tune_cpu}' not supported by compiler"
1441 if [ -n "${tune_asflags}" ]; then
1442 check_add_asflags ${tune_asflags}${tune_cpu} || \
1443 die "Requested CPU '${tune_cpu}' not supported by assembler"
1445 if [ -z "${tune_cflags}${tune_asflags}" ]; then
1446 log_echo "Warning: CPU tuning not supported by this toolchain"
1450 if enabled debug; then
1451 check_add_cflags -g && check_add_ldflags -g
1453 check_add_cflags -DNDEBUG
1456 enabled gprof && check_add_cflags -pg && check_add_ldflags -pg
1458 check_add_cflags -fprofile-arcs -ftest-coverage &&
1459 check_add_ldflags -fprofile-arcs -ftest-coverage
1461 if enabled optimizations; then
1462 if enabled rvct; then
1463 enabled small && check_add_cflags -Ospace || check_add_cflags -Otime
1465 enabled small && check_add_cflags -O2 || check_add_cflags -O3
1469 # Position Independent Code (PIC) support, for building relocatable
1471 enabled gcc && enabled pic && check_add_cflags -fPIC
1473 # Work around longjmp interception on glibc >= 2.11, to improve binary
1474 # compatibility. See http://code.google.com/p/webm/issues/detail?id=166
1475 enabled linux && check_add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
1477 # Check for strip utility variant
1478 ${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable_feature gnu_strip
1480 # Try to determine target endianness
1482 unsigned int e = 'O'<<24 | '2'<<16 | 'B'<<8 | 'E';
1484 [ -f "${TMP_O}" ] && od -A n -t x1 "${TMP_O}" | tr -d '\n' |
1485 grep '4f *32 *42 *45' >/dev/null 2>&1 && enable_feature big_endian
1487 # Try to find which inline keywords are supported
1488 check_cc <<EOF && INLINE="inline"
1489 static inline function() {}
1492 # Almost every platform uses pthreads.
1493 if enabled multithread; then
1494 case ${toolchain} in
1498 # bionic includes basic pthread functionality, obviating -lpthread.
1501 check_header pthread.h && check_lib -lpthread <<EOF && add_extralibs -lpthread || disable_feature pthread_h
1502 #include <pthread.h>
1504 int main(void) { return pthread_create(NULL, NULL, NULL, NULL); }
1510 # only for MIPS platforms
1511 case ${toolchain} in
1513 if enabled big_endian; then
1514 if enabled dspr2; then
1515 echo "dspr2 optimizations are available only for little endian platforms"
1516 disable_feature dspr2
1518 if enabled msa; then
1519 echo "msa optimizations are available only for little endian platforms"
1522 if enabled mmi; then
1523 echo "mmi optimizations are available only for little endian platforms"
1531 if enabled linux; then
1532 add_cflags -D_LARGEFILE_SOURCE
1533 add_cflags -D_FILE_OFFSET_BITS=64
1537 process_toolchain() {
1538 process_common_toolchain
1542 saved_prefix="${prefix}"
1547 if enabled $cfg; then
1548 upname="`toupper $cfg`"
1549 echo "${prefix}_${upname}=yes" >> $makefile
1552 prefix="${saved_prefix}"
1556 saved_prefix="${prefix}"
1561 upname="`toupper $cfg`"
1562 if enabled $cfg; then
1563 echo "#define ${prefix}_${upname} 1" >> $header
1565 echo "#define ${prefix}_${upname} 0" >> $header
1568 prefix="${saved_prefix}"
1571 print_config_vars_h() {
1574 while [ $# -gt 0 ]; do
1575 upname="`toupper $1`"
1576 echo "#define ${upname} $2" >> $header
1581 print_webm_license() {
1582 saved_prefix="${prefix}"
1587 cat <<EOF > ${destination}
1588 ${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix}
1590 ${prefix} Use of this source code is governed by a BSD-style license${suffix}
1591 ${prefix} that can be found in the LICENSE file in the root of the source${suffix}
1592 ${prefix} tree. An additional intellectual property rights grant can be found${suffix}
1593 ${prefix} in the file PATENTS. All contributing project authors may${suffix}
1594 ${prefix} be found in the AUTHORS file in the root of the source tree.${suffix}
1596 prefix="${saved_prefix}"
1607 enable_feature logging
1608 logfile="config.log"
1612 process_cmdline "$@"
1613 if enabled child; then
1614 echo "# ${self} $@" >> ${logfile}
1616 echo "# ${self} $@" > ${logfile}
1618 post_process_common_cmdline
1619 post_process_cmdline
1624 OOT_INSTALLS="${OOT_INSTALLS}"
1625 if enabled source_path_used; then
1626 # Prepare the PWD for building.
1627 for f in ${OOT_INSTALLS}; do
1628 install -D "${source_path}/$f" "$f"
1631 cp "${source_path}/build/make/Makefile" .