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}
323 log check_header "$@"
326 var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
328 check_cpp "$@" <<EOF && enable_feature $var
335 log check_cflags "$@"
336 check_cc -Werror "$@" <<EOF
342 log check_cxxflags "$@"
344 # Catch CFLAGS that trigger CXX warnings
346 *c++-analyzer|*clang++|*g++*)
347 check_cxx -Werror "$@" <<EOF
352 check_cxx -Werror "$@" <<EOF
360 check_cxxflags "$@" && add_cxxflags_only "$@"
361 check_cflags "$@" && add_cflags_only "$@"
364 check_add_cxxflags() {
365 check_cxxflags "$@" && add_cxxflags_only "$@"
368 check_add_asflags() {
373 check_add_ldflags() {
379 log check_asm_align "$@"
380 cat >${TMP_ASM} <<EOF
385 check_cmd ${AS} ${ASFLAGS} -o ${TMP_O} ${TMP_ASM}
386 readelf -WS ${TMP_O} >${TMP_X}
388 if ! grep -q '\.rodata .* 16$' ${TMP_X}; then
389 die "${AS} ${ASFLAGS} does not support section alignment (nasm <=2.08?)"
393 # tests for -m$1 toggling the feature given in $2. If $2 is empty $1 is used.
394 check_gcc_machine_option() {
397 [ -n "$feature" ] || feature="$opt"
399 if enabled gcc && ! disabled "$feature" && ! check_cflags "-m$opt"; then
400 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-$feature "
402 soft_enable "$feature"
406 # tests for -m$2, -m$3, -m$4... toggling the feature given in $1.
407 check_gcc_machine_options() {
413 flags="$flags -m$opt"
416 if enabled gcc && ! disabled "$feature" && ! check_cflags $flags; then
417 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-$feature "
419 soft_enable "$feature"
423 write_common_config_banner() {
424 print_webm_license config.mk "##" ""
425 echo '# This file automatically generated by configure. Do not edit!' >> config.mk
426 echo "TOOLCHAIN := ${toolchain}" >> config.mk
430 echo "ALT_LIBC := ${alt_libc}" >> config.mk
435 write_common_config_targets() {
436 for t in ${all_targets}; do
437 if enabled ${t}; then
438 if enabled child; then
439 fwrite config.mk "ALL_TARGETS += ${t}-${toolchain}"
441 fwrite config.mk "ALL_TARGETS += ${t}"
449 write_common_target_config_mk() {
452 enabled ccache && CC="ccache ${CC}"
453 enabled ccache && CXX="ccache ${CXX}"
454 print_webm_license $1 "##" ""
457 # This file automatically generated by configure. Do not edit!
458 SRC_PATH="$source_path"
459 SRC_PATH_BARE=$source_path
460 BUILD_PFX=${BUILD_PFX}
461 TOOLCHAIN=${toolchain}
462 ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
463 GEN_VCPROJ=${gen_vcproj_cmd}
464 MSVS_ARCH_DIR=${msvs_arch_dir}
475 CXXFLAGS = ${CXXFLAGS}
476 ARFLAGS = -crs\$(if \$(quiet),,v)
479 extralibs = ${extralibs}
480 AS_SFX = ${AS_SFX:-.asm}
482 VCPROJ_SFX = ${VCPROJ_SFX}
483 RTCD_OPTIONS = ${RTCD_OPTIONS}
486 if enabled rvct; then cat >> $1 << EOF
487 fmt_deps = sed -e 's;^__image.axf;\${@:.d=.o} \$@;' #hide
489 else cat >> $1 << EOF
490 fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\${@:.d=.o} \$@;'
494 print_config_mk ARCH "${1}" ${ARCH_LIST}
495 print_config_mk HAVE "${1}" ${HAVE_LIST}
496 print_config_mk CONFIG "${1}" ${CONFIG_LIST}
497 print_config_mk HAVE "${1}" gnu_strip
499 enabled msvs && echo "CONFIG_VS_VERSION=${vs_version}" >> "${1}"
505 write_common_target_config_h() {
506 print_webm_license ${TMP_H} "/*" " */"
507 cat >> ${TMP_H} << EOF
508 /* This file automatically generated by configure. Do not edit! */
511 #define RESTRICT ${RESTRICT}
512 #define INLINE ${INLINE}
514 print_config_h ARCH "${TMP_H}" ${ARCH_LIST}
515 print_config_h HAVE "${TMP_H}" ${HAVE_LIST}
516 print_config_h CONFIG "${TMP_H}" ${CONFIG_LIST}
517 print_config_vars_h "${TMP_H}" ${VAR_LIST}
518 echo "#endif /* VPX_CONFIG_H */" >> ${TMP_H}
519 mkdir -p `dirname "$1"`
520 cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
523 process_common_cmdline() {
532 if ! disabled logging ; then
533 enabled logging || logfile="$logging"
539 toolchain="${toolchain:-${optval}}"
542 toolchain="${toolchain:-${optval}}"
543 enable_feature force_toolchain
549 extra_cflags="${optval}"
552 extra_cxxflags="${optval}"
554 --enable-?*|--disable-?*)
555 eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
556 if is_in ${option} ${ARCH_EXT_LIST}; then
557 [ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${option} "
558 elif [ $action = "disable" ] && ! disabled $option ; then
559 is_in ${option} ${CMDLINE_SELECT} || die_unknown $opt
560 log_echo " disabling $option"
561 elif [ $action = "enable" ] && ! enabled $option ; then
562 is_in ${option} ${CMDLINE_SELECT} || die_unknown $opt
563 log_echo " enabling $option"
565 ${action}_feature $option
568 eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
569 if is_in ${option} ${ARCH_EXT_LIST}; then
570 RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
575 --force-enable-?*|--force-disable-?*)
576 eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
577 ${action}_feature $option
580 [ -d "${optval}" ] || die "Not a directory: ${optval}"
581 disable_feature builtin_libc
585 [ "${optval}" = yasm ] || [ "${optval}" = nasm ] \
586 || [ "${optval}" = auto ] \
587 || die "Must be yasm, nasm or auto: ${optval}"
593 VAR_LIST="DECODE_WIDTH_LIMIT ${w} DECODE_HEIGHT_LIMIT ${h}"
594 [ ${w} -gt 0 ] && [ ${h} -gt 0 ] || die "Invalid size-limit: too small."
595 [ ${w} -lt 65536 ] && [ ${h} -lt 65536 ] \
596 || die "Invalid size-limit: too big."
597 enable_feature size_limit
606 [ -d "${optval}" ] || die "Not a directory: ${optval}"
609 --libc|--as|--prefix|--libdir|--sdk-path)
610 die "Option ${opt} requires argument"
627 process_common_cmdline $opt
633 post_process_common_cmdline() {
634 prefix="${prefix:-/usr/local}"
636 libdir="${libdir:-${prefix}/lib}"
638 if [ "${libdir#${prefix}}" = "${libdir}" ]; then
639 die "Libdir ${libdir} must be a subdirectory of ${prefix}"
643 post_process_cmdline() {
647 setup_gnu_toolchain() {
648 CC=${CC:-${CROSS}gcc}
649 CXX=${CXX:-${CROSS}g++}
651 LD=${LD:-${CROSS}${link_with_cc:-ld}}
653 STRIP=${STRIP:-${CROSS}strip}
659 # Reliably find the newest available Darwin SDKs. (Older versions of
660 # xcrun don't support --show-sdk-path.)
661 show_darwin_sdk_path() {
662 xcrun --sdk $1 --show-sdk-path 2>/dev/null ||
663 xcodebuild -sdk $1 -version Path 2>/dev/null
666 # Print the major version number of the Darwin SDK specified by $1.
667 show_darwin_sdk_major_version() {
668 xcrun --sdk $1 --show-sdk-version 2>/dev/null | cut -d. -f1
671 # Print the Xcode version.
672 show_xcode_version() {
673 xcodebuild -version | head -n1 | cut -d' ' -f2
676 # Fails when Xcode version is less than 6.3.
677 check_xcode_minimum_version() {
678 xcode_major=$(show_xcode_version | cut -f1 -d.)
679 xcode_minor=$(show_xcode_version | cut -f2 -d.)
682 if [ ${xcode_major} -lt ${xcode_min_major} ]; then
685 if [ ${xcode_major} -eq ${xcode_min_major} ] \
686 && [ ${xcode_minor} -lt ${xcode_min_minor} ]; then
691 process_common_toolchain() {
692 if [ -z "$toolchain" ]; then
693 gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}"
699 armv7*-hardfloat* | armv7*-gnueabihf | arm-*-gnueabihf)
767 [ -z "$tgt_isa" ] && tgt_isa=x86
781 if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
782 toolchain=${tgt_isa}-${tgt_os}-gcc
786 toolchain=${toolchain:-generic-gnu}
788 is_in ${toolchain} ${all_platforms} || enabled force_toolchain \
789 || die "Unrecognized toolchain '${toolchain}'"
791 enabled child || log_echo "Configuring for target '${toolchain}'"
794 # Set up toolchain variables
796 tgt_isa=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $1}')
797 tgt_os=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $2}')
798 tgt_cc=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $3}')
800 # Mark the specific ISA requested as enabled
801 soft_enable ${tgt_isa}
802 enable_feature ${tgt_os}
803 enable_feature ${tgt_cc}
805 # Enable the architecture family
818 # PIC is probably what we want when building shared libs
819 enabled shared && soft_enable pic
821 # Minimum iOS version for all target platforms (darwin and iphonesimulator).
822 # Shared library framework builds are only possible on iOS 8 and later.
823 if enabled shared; then
824 IOS_VERSION_OPTIONS="--enable-shared"
825 IOS_VERSION_MIN="8.0"
827 IOS_VERSION_OPTIONS=""
828 IOS_VERSION_MIN="6.0"
831 # Handle darwin variants. Newer SDKs allow targeting older
832 # platforms, so use the newest one available.
835 add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
836 iphoneos_sdk_dir="$(show_darwin_sdk_path iphoneos)"
837 if [ -d "${iphoneos_sdk_dir}" ]; then
838 add_cflags "-isysroot ${iphoneos_sdk_dir}"
839 add_ldflags "-isysroot ${iphoneos_sdk_dir}"
843 osx_sdk_dir="$(show_darwin_sdk_path macosx)"
844 if [ -d "${osx_sdk_dir}" ]; then
845 add_cflags "-isysroot ${osx_sdk_dir}"
846 add_ldflags "-isysroot ${osx_sdk_dir}"
853 add_cflags "-mmacosx-version-min=10.4"
854 add_ldflags "-mmacosx-version-min=10.4"
857 add_cflags "-mmacosx-version-min=10.5"
858 add_ldflags "-mmacosx-version-min=10.5"
861 add_cflags "-mmacosx-version-min=10.6"
862 add_ldflags "-mmacosx-version-min=10.6"
865 add_cflags "-mmacosx-version-min=10.7"
866 add_ldflags "-mmacosx-version-min=10.7"
869 add_cflags "-mmacosx-version-min=10.8"
870 add_ldflags "-mmacosx-version-min=10.8"
873 add_cflags "-mmacosx-version-min=10.9"
874 add_ldflags "-mmacosx-version-min=10.9"
877 add_cflags "-mmacosx-version-min=10.10"
878 add_ldflags "-mmacosx-version-min=10.10"
881 add_cflags "-mmacosx-version-min=10.11"
882 add_ldflags "-mmacosx-version-min=10.11"
885 add_cflags "-mmacosx-version-min=10.12"
886 add_ldflags "-mmacosx-version-min=10.12"
889 add_cflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
890 add_ldflags "-miphoneos-version-min=${IOS_VERSION_MIN}"
891 iossim_sdk_dir="$(show_darwin_sdk_path iphonesimulator)"
892 if [ -d "${iossim_sdk_dir}" ]; then
893 add_cflags "-isysroot ${iossim_sdk_dir}"
894 add_ldflags "-isysroot ${iossim_sdk_dir}"
899 # Handle Solaris variants. Solaris 10 needs -lposix4
902 add_extralibs -lposix4
905 add_extralibs -lposix4
909 # Process ARM architecture variants
912 # on arm, isa versions are supersets
919 # Only enable neon_asm when neon is also enabled.
920 enabled neon && soft_enable neon_asm
921 # If someone tries to force it through, die.
922 if disabled neon && enabled neon_asm; then
923 die "Disabling neon while keeping neon-asm is not supported"
928 asm_conversion_cmd="cat"
934 arch_int=${tgt_isa##armv}
935 arch_int=${arch_int%%te}
936 check_add_asflags --defsym ARCHITECTURE=${arch_int}
937 tune_cflags="-mtune="
938 if [ ${tgt_isa} = "armv7" ] || [ ${tgt_isa} = "armv7s" ]; then
939 if [ -z "${float_abi}" ]; then
940 check_cpp <<EOF && float_abi=hard || float_abi=softfp
941 #ifndef __ARM_PCS_VFP
946 check_add_cflags -march=armv7-a -mfloat-abi=${float_abi}
947 check_add_asflags -march=armv7-a -mfloat-abi=${float_abi}
949 if enabled neon || enabled neon_asm; then
950 check_add_cflags -mfpu=neon #-ftree-vectorize
951 check_add_asflags -mfpu=neon
953 elif [ ${tgt_isa} = "arm64" ] || [ ${tgt_isa} = "armv8" ]; then
954 check_add_cflags -march=armv8-a
955 check_add_asflags -march=armv8-a
957 check_add_cflags -march=${tgt_isa}
958 check_add_asflags -march=${tgt_isa}
961 enabled debug && add_asflags -g
962 asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
963 if enabled thumb; then
964 asm_conversion_cmd="$asm_conversion_cmd -thumb"
965 check_add_cflags -mthumb
966 check_add_asflags -mthumb -mimplicit-it=always
970 asm_conversion_cmd="${source_path}/build/make/ads2armasm_ms.pl"
972 msvs_arch_dir=arm-msvs
973 disable_feature multithread
974 disable_feature unit_tests
975 vs_version=${tgt_cc##vs}
976 if [ $vs_version -ge 12 ]; then
977 # MSVC 2013 doesn't allow doing plain .exe projects for ARM,
978 # only "AppContainerApplication" which requires an AppxManifest.
979 # Therefore disable the examples, just build the library.
980 disable_feature examples
981 disable_feature tools
988 LD="${source_path}/build/make/armlink_adapter.sh"
989 STRIP=arm-none-linux-gnueabi-strip
990 NM=arm-none-linux-gnueabi-nm
992 tune_asflags="--cpu="
993 if [ -z "${tune_cpu}" ]; then
994 if [ ${tgt_isa} = "armv7" ]; then
995 if enabled neon || enabled neon_asm
997 check_add_cflags --fpu=softvfp+vfpv3
998 check_add_asflags --fpu=softvfp+vfpv3
1000 check_add_cflags --cpu=Cortex-A8
1001 check_add_asflags --cpu=Cortex-A8
1003 check_add_cflags --cpu=${tgt_isa##armv}
1004 check_add_asflags --cpu=${tgt_isa##armv}
1007 arch_int=${tgt_isa##armv}
1008 arch_int=${arch_int%%te}
1009 check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
1010 enabled debug && add_asflags -g
1012 add_cflags --enum_is_int
1013 add_cflags --wchar32
1019 disable_feature multithread
1020 disable_feature os_support
1024 if [ -n "${sdk_path}" ]; then
1025 SDK_PATH=${sdk_path}
1026 COMPILER_LOCATION=`find "${SDK_PATH}" \
1027 -name "arm-linux-androideabi-gcc*" -print -quit`
1028 TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/arm-linux-androideabi-
1029 CC=${TOOLCHAIN_PATH}gcc
1030 CXX=${TOOLCHAIN_PATH}g++
1031 AR=${TOOLCHAIN_PATH}ar
1032 LD=${TOOLCHAIN_PATH}gcc
1033 AS=${TOOLCHAIN_PATH}as
1034 STRIP=${TOOLCHAIN_PATH}strip
1035 NM=${TOOLCHAIN_PATH}nm
1037 if [ -z "${alt_libc}" ]; then
1038 alt_libc=`find "${SDK_PATH}" -name arch-arm -print | \
1039 awk '{n = split($0,a,"/"); \
1040 split(a[n-1],b,"-"); \
1041 print $0 " " b[2]}' | \
1043 awk '{ print $1 }' | tail -1`
1046 if [ -d "${alt_libc}" ]; then
1047 add_cflags "--sysroot=${alt_libc}"
1048 add_ldflags "--sysroot=${alt_libc}"
1051 # linker flag that routes around a CPU bug in some
1052 # Cortex-A8 implementations (NDK Dev Guide)
1053 add_ldflags "-Wl,--fix-cortex-a8"
1056 soft_enable realtime_only
1057 if [ ${tgt_isa} = "armv7" ]; then
1058 soft_enable runtime_cpu_detect
1060 if enabled runtime_cpu_detect; then
1061 add_cflags "-I${SDK_PATH}/sources/android/cpufeatures"
1064 echo "Assuming standalone build with NDK toolchain."
1065 echo "See build/make/Android.mk for details."
1066 check_add_ldflags -static
1067 soft_enable unit_tests
1072 XCRUN_FIND="xcrun --sdk iphoneos --find"
1073 CXX="$(${XCRUN_FIND} clang++)"
1074 CC="$(${XCRUN_FIND} clang)"
1075 AR="$(${XCRUN_FIND} ar)"
1076 AS="$(${XCRUN_FIND} as)"
1077 STRIP="$(${XCRUN_FIND} strip)"
1078 NM="$(${XCRUN_FIND} nm)"
1079 RANLIB="$(${XCRUN_FIND} ranlib)"
1081 LD="${CXX:-$(${XCRUN_FIND} ld)}"
1083 # ASFLAGS is written here instead of using check_add_asflags
1084 # because we need to overwrite all of ASFLAGS and purge the
1085 # options that were put in above
1086 ASFLAGS="-arch ${tgt_isa} -g"
1088 add_cflags -arch ${tgt_isa}
1089 add_ldflags -arch ${tgt_isa}
1091 alt_libc="$(show_darwin_sdk_path iphoneos)"
1092 if [ -d "${alt_libc}" ]; then
1093 add_cflags -isysroot ${alt_libc}
1096 if [ "${LD}" = "${CXX}" ]; then
1097 add_ldflags -miphoneos-version-min="${IOS_VERSION_MIN}"
1099 add_ldflags -ios_version_min "${IOS_VERSION_MIN}"
1102 for d in lib usr/lib usr/lib/system; do
1103 try_dir="${alt_libc}/${d}"
1104 [ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
1108 armv7|armv7s|armv8|arm64)
1109 if enabled neon && ! check_xcode_minimum_version; then
1111 log_echo " neon disabled: upgrade Xcode (need v6.3+)."
1112 if enabled neon_asm; then
1113 soft_disable neon_asm
1114 log_echo " neon_asm disabled: upgrade Xcode (need v6.3+)."
1120 asm_conversion_cmd="${source_path}/build/make/ads2gas_apple.pl"
1122 if [ "$(show_darwin_sdk_major_version iphoneos)" -gt 8 ]; then
1123 check_add_cflags -fembed-bitcode
1124 check_add_asflags -fembed-bitcode
1125 check_add_ldflags -fembed-bitcode
1130 enable_feature linux
1131 if enabled rvct; then
1132 # Check if we have CodeSourcery GCC in PATH. Needed for
1134 which arm-none-linux-gnueabi-gcc 2>&- || \
1135 die "Couldn't find CodeSourcery GCC from PATH"
1137 # Use armcc as a linker to enable translation of
1138 # some gcc specific options such as -lm and -lpthread.
1139 LD="armcc --translate_gcc"
1141 # create configuration file (uses path to CodeSourcery GCC)
1142 armcc --arm_linux_configure --arm_linux_config_file=arm_linux.cfg
1144 add_cflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
1145 add_asflags --no_hide_all --apcs=/interwork
1146 add_ldflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
1147 enabled pic && add_cflags --apcs=/fpic
1148 enabled pic && add_asflags --apcs=/fpic
1149 enabled shared && add_cflags --shared
1157 tune_cflags="-mtune="
1158 if enabled dspr2; then
1159 check_add_cflags -mips32r2 -mdspr2
1162 if enabled runtime_cpu_detect; then
1163 disable_feature runtime_cpu_detect
1166 if [ -n "${tune_cpu}" ]; then
1169 check_add_cflags -mips32r5 -mload-store-pairs
1170 check_add_cflags -msched-weight -mhard-float -mfp64
1171 check_add_asflags -mips32r5 -mhard-float -mfp64
1172 check_add_ldflags -mfp64
1175 check_add_cflags -mips64r6 -mabi=64 -msched-weight
1176 check_add_cflags -mload-store-pairs -mhard-float -mfp64
1177 check_add_asflags -mips64r6 -mabi=64 -mhard-float -mfp64
1178 check_add_ldflags -mips64r6 -mabi=64 -mfp64
1182 if enabled msa; then
1189 if enabled mmi; then
1191 check_add_ldflags -march=loongson3a
1194 check_add_cflags -march=${tgt_isa}
1195 check_add_asflags -march=${tgt_isa}
1196 check_add_asflags -KPIC
1201 check_gcc_machine_option "vsx"
1206 enabled gcc && add_cflags -fno-common
1209 CC=${CC:-${CROSS}gcc}
1210 CXX=${CXX:-${CROSS}g++}
1211 LD=${LD:-${CROSS}gcc}
1217 add_ldflags -Zhigh-mem
1221 AS="${alt_as:-${AS:-auto}}"
1227 add_cflags -use-msasm # remove -use-msasm too?
1228 # add -no-intel-extensions to suppress warning #10237
1229 # refer to http://software.intel.com/en-us/forums/topic/280199
1230 add_ldflags -i-static -no-intel-extensions
1231 enabled x86_64 && add_cflags -ipo -static -O3 -no-prec-div
1232 enabled x86_64 && AR=xiar
1236 tune_cpu="SSE3_ATOM"
1239 tune_cflags="-march="
1245 tune_cflags="-march="
1247 #for 32 bit x86 builds, -O3 did not turn on this flag
1248 enabled optimizations && disabled gprof && check_add_cflags -fomit-frame-pointer
1251 # When building with Microsoft Visual Studio the assembler is
1252 # invoked directly. Checking at configure time is unnecessary.
1253 # Skip the check by setting AS arbitrarily
1255 msvs_arch_dir=x86-msvs
1256 vc_version=${tgt_cc##vs}
1258 7|8|9|10|11|12|13|14)
1259 echo "${tgt_cc} does not support avx512, disabling....."
1260 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx512 "
1266 echo "${tgt_cc} does not support avx/avx2, disabling....."
1267 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx --disable-avx2 "
1274 echo "${tgt_cc} omits stdint.h, disabling webm-io..."
1275 soft_disable webm_io
1282 enabled x86_64 && bits=64
1283 check_cpp <<EOF && bits=x32
1284 #if !defined(__ILP32__) || !defined(__x86_64__)
1290 add_cflags -m${bits}
1291 add_ldflags -m${bits}
1295 soft_enable runtime_cpu_detect
1296 # We can't use 'check_cflags' until the compiler is configured and CC is
1298 for ext in ${ARCH_EXT_LIST_X86}; do
1299 # disable higher order extensions to simplify asm dependencies
1300 if [ "$disable_exts" = "yes" ]; then
1301 if ! disabled $ext; then
1302 RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${ext} "
1303 disable_feature $ext
1305 elif disabled $ext; then
1308 if [ "$ext" = "avx512" ]; then
1309 check_gcc_machine_options $ext avx512f avx512cd avx512bw avx512dq avx512vl
1311 # use the shortened version for the flag: sse4_1 -> sse4
1312 check_gcc_machine_option ${ext%_*} $ext
1317 if enabled external_build; then
1318 log_echo " skipping assembler detection"
1322 which nasm >/dev/null 2>&1 && AS=nasm
1323 which yasm >/dev/null 2>&1 && AS=yasm
1324 if [ "${AS}" = nasm ] ; then
1325 # Apple ships version 0.98 of nasm through at least Xcode 6. Revisit
1326 # this check if they start shipping a compatible version.
1327 apple=`nasm -v | grep "Apple"`
1329 && echo "Unsupported version of nasm: ${apple}" \
1332 [ "${AS}" = auto ] || [ -z "${AS}" ] \
1333 && die "Neither yasm nor nasm have been found." \
1334 "See the prerequisites section in the README for more info."
1337 log_echo " using $AS"
1342 add_asflags -f win32
1343 enabled debug && add_asflags -g cv8
1347 add_asflags -f win64
1348 enabled debug && add_asflags -g cv8
1351 linux*|solaris*|android*)
1352 add_asflags -f elf${bits}
1353 enabled debug && [ "${AS}" = yasm ] && add_asflags -g dwarf2
1354 enabled debug && [ "${AS}" = nasm ] && add_asflags -g
1355 [ "${AS##*/}" = nasm ] && check_asm_align
1358 add_asflags -f macho${bits}
1359 enabled x86 && darwin_arch="-arch i386" || darwin_arch="-arch x86_64"
1360 add_cflags ${darwin_arch}
1361 add_ldflags ${darwin_arch}
1362 # -mdynamic-no-pic is still a bit of voodoo -- it was required at
1363 # one time, but does not seem to be now, and it breaks some of the
1364 # code that still relies on inline assembly.
1365 # enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
1366 enabled icc && ! enabled pic && add_cflags -fno-pic
1369 add_asflags -f macho${bits}
1370 enabled x86 && sim_arch="-arch i386" || sim_arch="-arch x86_64"
1371 add_cflags ${sim_arch}
1372 add_ldflags ${sim_arch}
1374 if [ "$(show_darwin_sdk_major_version iphonesimulator)" -gt 8 ]; then
1375 # yasm v1.3.0 doesn't know what -fembed-bitcode means, so turning it
1376 # on is pointless (unless building a C-only lib). Warn the user, but
1378 log "Warning: Bitcode embed disabled for simulator targets."
1383 enabled debug && add_asflags -g
1387 log "Warning: Unknown os $tgt_os while setting up $AS flags"
1398 # Try to enable CPU specific tuning
1399 if [ -n "${tune_cpu}" ]; then
1400 if [ -n "${tune_cflags}" ]; then
1401 check_add_cflags ${tune_cflags}${tune_cpu} || \
1402 die "Requested CPU '${tune_cpu}' not supported by compiler"
1404 if [ -n "${tune_asflags}" ]; then
1405 check_add_asflags ${tune_asflags}${tune_cpu} || \
1406 die "Requested CPU '${tune_cpu}' not supported by assembler"
1408 if [ -z "${tune_cflags}${tune_asflags}" ]; then
1409 log_echo "Warning: CPU tuning not supported by this toolchain"
1413 if enabled debug; then
1414 check_add_cflags -g && check_add_ldflags -g
1416 check_add_cflags -DNDEBUG
1419 enabled gprof && check_add_cflags -pg && check_add_ldflags -pg
1421 check_add_cflags -fprofile-arcs -ftest-coverage &&
1422 check_add_ldflags -fprofile-arcs -ftest-coverage
1424 if enabled optimizations; then
1425 if enabled rvct; then
1426 enabled small && check_add_cflags -Ospace || check_add_cflags -Otime
1428 enabled small && check_add_cflags -O2 || check_add_cflags -O3
1432 # Position Independent Code (PIC) support, for building relocatable
1434 enabled gcc && enabled pic && check_add_cflags -fPIC
1436 # Work around longjmp interception on glibc >= 2.11, to improve binary
1437 # compatibility. See http://code.google.com/p/webm/issues/detail?id=166
1438 enabled linux && check_add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
1440 # Check for strip utility variant
1441 ${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable_feature gnu_strip
1443 # Try to determine target endianness
1445 unsigned int e = 'O'<<24 | '2'<<16 | 'B'<<8 | 'E';
1447 [ -f "${TMP_O}" ] && od -A n -t x1 "${TMP_O}" | tr -d '\n' |
1448 grep '4f *32 *42 *45' >/dev/null 2>&1 && enable_feature big_endian
1450 # Try to find which inline keywords are supported
1451 check_cc <<EOF && INLINE="inline"
1452 static inline function() {}
1455 # Almost every platform uses pthreads.
1456 if enabled multithread; then
1457 case ${toolchain} in
1461 # bionic includes basic pthread functionality, obviating -lpthread.
1464 check_header pthread.h && add_extralibs -lpthread
1469 # only for MIPS platforms
1470 case ${toolchain} in
1472 if enabled big_endian; then
1473 if enabled dspr2; then
1474 echo "dspr2 optimizations are available only for little endian platforms"
1475 disable_feature dspr2
1477 if enabled msa; then
1478 echo "msa optimizations are available only for little endian platforms"
1481 if enabled mmi; then
1482 echo "mmi optimizations are available only for little endian platforms"
1490 if enabled linux; then
1491 add_cflags -D_LARGEFILE_SOURCE
1492 add_cflags -D_FILE_OFFSET_BITS=64
1496 process_toolchain() {
1497 process_common_toolchain
1501 saved_prefix="${prefix}"
1506 if enabled $cfg; then
1507 upname="`toupper $cfg`"
1508 echo "${prefix}_${upname}=yes" >> $makefile
1511 prefix="${saved_prefix}"
1515 saved_prefix="${prefix}"
1520 upname="`toupper $cfg`"
1521 if enabled $cfg; then
1522 echo "#define ${prefix}_${upname} 1" >> $header
1524 echo "#define ${prefix}_${upname} 0" >> $header
1527 prefix="${saved_prefix}"
1530 print_config_vars_h() {
1533 while [ $# -gt 0 ]; do
1534 upname="`toupper $1`"
1535 echo "#define ${upname} $2" >> $header
1540 print_webm_license() {
1541 saved_prefix="${prefix}"
1546 cat <<EOF > ${destination}
1547 ${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix}
1549 ${prefix} Use of this source code is governed by a BSD-style license${suffix}
1550 ${prefix} that can be found in the LICENSE file in the root of the source${suffix}
1551 ${prefix} tree. An additional intellectual property rights grant can be found${suffix}
1552 ${prefix} in the file PATENTS. All contributing project authors may${suffix}
1553 ${prefix} be found in the AUTHORS file in the root of the source tree.${suffix}
1555 prefix="${saved_prefix}"
1566 enable_feature logging
1567 logfile="config.log"
1571 process_cmdline "$@"
1572 if enabled child; then
1573 echo "# ${self} $@" >> ${logfile}
1575 echo "# ${self} $@" > ${logfile}
1577 post_process_common_cmdline
1578 post_process_cmdline
1583 OOT_INSTALLS="${OOT_INSTALLS}"
1584 if enabled source_path_used; then
1585 # Prepare the PWD for building.
1586 for f in ${OOT_INSTALLS}; do
1587 install -D "${source_path}/$f" "$f"
1590 cp "${source_path}/build/make/Makefile" .