#!/bin/sh ## ## configure ## ## This script is the front-end to the build system. It provides a similar ## interface to standard configure scripts with some extra bits for dealing ## with toolchains that differ from the standard POSIX interface and ## for extracting subsets of the source tree. In theory, reusable parts ## of this script were intended to live in build/make/configure.sh, ## but in practice, the line is pretty blurry. ## ## This build system is based in part on the FFmpeg configure script. ## #source_path="`dirname \"$0\"`" source_path=${0%/*} . "${source_path}/build/make/configure.sh" show_help(){ show_help_pre cat << EOF Advanced options: ${toggle_libs} libraries ${toggle_examples} examples ${toggle_analyzer} analyzer ${toggle_docs} documentation ${toggle_unit_tests} unit tests ${toggle_decode_perf_tests} build decoder perf tests with unit tests ${toggle_encode_perf_tests} build encoder perf tests with unit tests --cpu=CPU tune for the specified CPU (ARM: cortex-a8, X86: sse3) --libc=PATH path to alternate libc --size-limit=WxH max size to allow in the decoder --as={yasm|nasm|auto} use specified assembler [auto, yasm preferred] --sdk-path=PATH path to root of sdk (android builds only) ${toggle_codec_srcs} in/exclude codec library source code ${toggle_debug_libs} in/exclude debug version of libraries ${toggle_static_msvcrt} use static MSVCRT (VS builds only) ${toggle_highbitdepth} enable 16-bit generic pixel pipeline (used by high bitdepth profiles) ${toggle_lowbitdepth} enable 8-bit optimized pixel pipeline ${toggle_av1} AV1 codec support ${toggle_internal_stats} output of encoder internal stats for debug, if supported (encoders) ${toggle_postproc} postprocessing ${toggle_multithread} multithreaded encoding and decoding ${toggle_spatial_resampling} spatial sampling (scaling) support ${toggle_realtime_only} enable this option while building for real-time encoding ${toggle_onthefly_bitpacking} enable on-the-fly bitpacking in real-time encoding ${toggle_error_concealment} enable this option to get a decoder which is able to conceal losses ${toggle_coefficient_range_checking} enable decoder to check if intermediate transform coefficients are in valid range ${toggle_runtime_cpu_detect} runtime cpu detection ${toggle_shared} shared library support ${toggle_static} static library support ${toggle_small} favor smaller size over speed ${toggle_postproc_visualizer} macro block / block level visualizers ${toggle_webm_io} enable input from and output to WebM container ${toggle_libyuv} enable libyuv ${toggle_accounting} enable bit accounting ${toggle_inspection} enable bitstream inspection Codecs: Codecs can be selectively enabled or disabled individually, or by family: --disable- is equivalent to: --disable--encoder --disable--decoder Codecs available in this distribution: EOF #restore editor state ' family=""; last_family=""; c=""; str=""; for c in ${CODECS}; do family=${c%_*} if [ "${family}" != "${last_family}" ]; then [ -z "${str}" ] || echo "${str}" str="$(printf ' %10s:' ${family})" fi str="${str} $(printf '%10s' ${c#*_})" last_family=${family} done echo "${str}" show_help_post } ## ## BEGIN APPLICATION SPECIFIC CONFIGURATION ## # all_platforms is a list of all supported target platforms. Maintain # alphabetically by architecture, generic-gnu last. all_platforms="${all_platforms} arm64-darwin-gcc" all_platforms="${all_platforms} arm64-linux-gcc" all_platforms="${all_platforms} armv6-linux-rvct" all_platforms="${all_platforms} armv6-linux-gcc" all_platforms="${all_platforms} armv6-none-rvct" all_platforms="${all_platforms} armv7-android-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8 all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-none-rvct" #neon Cortex-A8 all_platforms="${all_platforms} armv7-win32-vs12" all_platforms="${all_platforms} armv7-win32-vs14" all_platforms="${all_platforms} armv7s-darwin-gcc" all_platforms="${all_platforms} armv8-linux-gcc" all_platforms="${all_platforms} mips32-linux-gcc" all_platforms="${all_platforms} mips64-linux-gcc" all_platforms="${all_platforms} sparc-solaris-gcc" all_platforms="${all_platforms} x86-android-gcc" all_platforms="${all_platforms} x86-darwin8-gcc" all_platforms="${all_platforms} x86-darwin8-icc" all_platforms="${all_platforms} x86-darwin9-gcc" all_platforms="${all_platforms} x86-darwin9-icc" all_platforms="${all_platforms} x86-darwin10-gcc" all_platforms="${all_platforms} x86-darwin11-gcc" all_platforms="${all_platforms} x86-darwin12-gcc" all_platforms="${all_platforms} x86-darwin13-gcc" all_platforms="${all_platforms} x86-darwin14-gcc" all_platforms="${all_platforms} x86-darwin15-gcc" all_platforms="${all_platforms} x86-darwin16-gcc" all_platforms="${all_platforms} x86-iphonesimulator-gcc" all_platforms="${all_platforms} x86-linux-gcc" all_platforms="${all_platforms} x86-linux-icc" all_platforms="${all_platforms} x86-os2-gcc" all_platforms="${all_platforms} x86-solaris-gcc" all_platforms="${all_platforms} x86-win32-gcc" all_platforms="${all_platforms} x86-win32-vs12" all_platforms="${all_platforms} x86-win32-vs14" all_platforms="${all_platforms} x86_64-android-gcc" all_platforms="${all_platforms} x86_64-darwin9-gcc" all_platforms="${all_platforms} x86_64-darwin10-gcc" all_platforms="${all_platforms} x86_64-darwin11-gcc" all_platforms="${all_platforms} x86_64-darwin12-gcc" all_platforms="${all_platforms} x86_64-darwin13-gcc" all_platforms="${all_platforms} x86_64-darwin14-gcc" all_platforms="${all_platforms} x86_64-darwin15-gcc" all_platforms="${all_platforms} x86_64-darwin16-gcc" all_platforms="${all_platforms} x86_64-iphonesimulator-gcc" all_platforms="${all_platforms} x86_64-linux-gcc" all_platforms="${all_platforms} x86_64-linux-icc" all_platforms="${all_platforms} x86_64-solaris-gcc" all_platforms="${all_platforms} x86_64-win64-gcc" all_platforms="${all_platforms} x86_64-win64-vs12" all_platforms="${all_platforms} x86_64-win64-vs14" all_platforms="${all_platforms} generic-gnu" # all_targets is a list of all targets that can be configured # note that these should be in dependency order for now. all_targets="libs examples docs" # all targets available are enabled, by default. for t in ${all_targets}; do [ -f "${source_path}/${t}.mk" ] && enable_feature ${t} done if ! perl --version >/dev/null; then die "Perl is required to build" fi if [ "`cd \"${source_path}\" && pwd`" != "`pwd`" ]; then # test to see if source_path already configured if [ -f "${source_path}/aom_config.h" ]; then die "source directory already configured; run 'make distclean' there first" fi fi # check installed doxygen version doxy_version=$(doxygen --version 2>/dev/null) doxy_major=${doxy_version%%.*} if [ ${doxy_major:-0} -ge 1 ]; then doxy_version=${doxy_version#*.} doxy_minor=${doxy_version%%.*} doxy_patch=${doxy_version##*.} [ $doxy_major -gt 1 ] && enable_feature doxygen [ $doxy_minor -gt 5 ] && enable_feature doxygen [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable_feature doxygen fi # disable codecs when their source directory does not exist [ -d "${source_path}/av1" ] || disable_codec av1 # install everything except the sources, by default. sources will have # to be enabled when doing dist builds, since that's no longer a common # case. enabled doxygen && enable_feature install_docs enable_feature install_bins enable_feature install_libs enable_feature static enable_feature optimizations enable_feature dependency_tracking enable_feature spatial_resampling enable_feature multithread enable_feature os_support CODECS=" av1_encoder av1_decoder " CODEC_FAMILIES=" av1 " ARCH_LIST=" arm mips x86 x86_64 " ARCH_EXT_LIST_X86=" mmx sse sse2 sse3 ssse3 sse4_1 avx avx2 " ARCH_EXT_LIST=" edsp media neon neon_asm mips32 dspr2 msa mips64 ${ARCH_EXT_LIST_X86} " HAVE_LIST=" ${ARCH_EXT_LIST} aom_ports fexcept pthread_h unistd_h wxwidgets " EXPERIMENT_LIST=" fp_mb_stats cdef var_tx rect_tx ref_mv tpl_mv dual_filter convolve_round compound_round ext_tx tx64x64 sub8x8_mc ext_intra intra_interp filter_intra intrabc ext_inter interintra wedge compound_segment ext_refs global_motion new_quant supertx ans ec_multisymbol new_tokenset loop_restoration ext_partition ext_partition_types unpoison_partition_ctx ext_tile motion_var ncobmc warped_motion q_adapt_probs subframe_prob_update bitstream_debug alt_intra palette palette_delta_encoding daala_ec rawbits ec_smallmul pvq cfl xiphrc cb4x4 chroma_2x2 chroma_sub8x8 frame_size delta_q ext_delta_q adapt_scan filter_7bit parallel_deblocking parallel_deblocking_15tap loopfiltering_across_tiles tile_groups ec_adapt tempmv_signaling rd_debug reference_buffer coef_interleave entropy_stats masked_tx dependent_horztiles daala_dist tripred palette_throughput ref_adapt lv_map txk_sel mv_compress frame_superres new_multisymbol compound_singleref aom_qm lowdelay_compound " CONFIG_LIST=" dependency_tracking external_build install_docs install_bins install_libs install_srcs debug gprof gcov rvct gcc msvs pic big_endian codec_srcs debug_libs runtime_cpu_detect postproc multithread internal_stats ${CODECS} ${CODEC_FAMILIES} encoders decoders static_msvcrt spatial_resampling realtime_only onthefly_bitpacking error_concealment shared static small postproc_visualizer os_support unit_tests webm_io libyuv accounting inspection decode_perf_tests encode_perf_tests coefficient_range_checking lowbitdepth highbitdepth experimental size_limit ${EXPERIMENT_LIST} analyzer " CMDLINE_SELECT=" dependency_tracking external_build extra_warnings werror install_docs install_bins install_libs install_srcs debug gprof gcov pic optimizations ccache runtime_cpu_detect thumb libs examples analyzer docs libc as size_limit codec_srcs debug_libs postproc multithread internal_stats ${CODECS} ${CODEC_FAMILIES} static_msvcrt spatial_resampling realtime_only onthefly_bitpacking error_concealment shared static small postproc_visualizer unit_tests webm_io libyuv accounting inspection decode_perf_tests encode_perf_tests coefficient_range_checking lowbitdepth aom_highbitdepth highbitdepth experimental " process_cmdline() { for opt do optval="${opt#*=}" case "$opt" in --disable-codecs) for c in ${CODEC_FAMILIES}; do disable_codec $c; done ;; --enable-?*|--disable-?*) eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'` if is_in ${option} ${EXPERIMENT_LIST}; then if enabled experimental; then ${action}_feature $option else log_echo "Ignoring $opt -- not in experimental mode." fi elif is_in ${option} "${CODECS} ${CODEC_FAMILIES}"; then ${action}_codec ${option} else process_common_cmdline $opt fi ;; *) process_common_cmdline "$opt" ;; esac done } post_process_cmdline() { c="" # Enable all detected codecs, if they haven't been disabled for c in ${CODECS}; do soft_enable $c; done # Enable the codec family if any component of that family is enabled for c in ${CODECS}; do enabled $c && enable_feature ${c%_*} done # Set the {en,de}coders variable if any algorithm in that class is enabled for c in ${CODECS}; do enabled ${c} && enable_feature ${c##*_}s done # Enable adopted experiments by default soft_enable ref_mv soft_enable cb4x4 soft_enable filter_7bit soft_enable reference_buffer soft_enable delta_q soft_enable tile_groups soft_enable rect_tx soft_enable global_motion soft_enable cdef soft_enable ec_adapt soft_enable new_tokenset soft_enable ext_intra soft_enable mv_compress soft_enable ext_refs soft_enable dual_filter soft_enable motion_var soft_enable warped_motion soft_enable ext_delta_q # Backwards/jenkins compatibility with --enable-aom-highbitdepth enabled aom_highbitdepth && enable_feature highbitdepth # Enable low-bitdepth pixel pipeline by default soft_enable lowbitdepth ! enabled ans && soft_enable daala_ec soft_enable ec_multisymbol soft_enable palette soft_enable alt_intra soft_enable palette_throughput # Fix up experiment dependencies enabled pvq && enable_feature ec_adapt enabled ec_adapt && enable_feature ec_multisymbol enabled new_tokenset && enable_feature ec_multisymbol enabled new_multisymbol && enable_feature ec_multisymbol enabled ec_multisymbol && ! enabled ans && soft_enable daala_ec enabled ec_multisymbol && ! enabled daala_ec && soft_enable ans enabled palette_throughput && soft_enable palette enabled ext_delta_q && soft_enable delta_q enabled txk_sel && soft_enable lv_map enabled compound_round && soft_enable convolve_round if enabled rawbits && ! enabled daala_ec; then log_echo "rawbits requires daala_ec, so disabling rawbits" disable_feature rawbits fi if enabled ec_smallmul && ! enabled daala_ec; then log_echo "ec_smallmul requires daala_ec, so disabling ec_smallmul" disable_feature ec_smallmul fi if enabled ext_tile; then log_echo "ext_tile not compatible with reference_buffer, so" log_echo "disabling reference_buffer" disable_feature reference_buffer fi if enabled ext_tile; then log_echo "ext_tile not compatible with tile_groups, so" log_echo "disabling tile_groups" disable_feature tile_groups fi # Enable accounting and inspection when building the analyzer if enabled analyzer; then soft_enable accounting soft_enable inspection fi } process_targets() { enabled child || write_common_config_banner write_common_target_config_h ${BUILD_PFX}aom_config.h write_common_config_targets # Calculate the default distribution name, based on the enabled features cf="" DIST_DIR=aom for cf in $CODEC_FAMILIES; do if enabled ${cf}_encoder && enabled ${cf}_decoder; then DIST_DIR="${DIST_DIR}-${cf}" elif enabled ${cf}_encoder; then DIST_DIR="${DIST_DIR}-${cf}cx" elif enabled ${cf}_decoder; then DIST_DIR="${DIST_DIR}-${cf}dx" fi done enabled debug_libs && DIST_DIR="${DIST_DIR}-debug" enabled codec_srcs && DIST_DIR="${DIST_DIR}-src" ! enabled postproc && DIST_DIR="${DIST_DIR}-nopost" ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt" ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs" DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}" case "${tgt_os}" in win*) enabled static_msvcrt && DIST_DIR="${DIST_DIR}mt" || DIST_DIR="${DIST_DIR}md" DIST_DIR="${DIST_DIR}-${tgt_cc}" ;; esac if [ -f "${source_path}/build/make/version.sh" ]; then ver=`"$source_path/build/make/version.sh" --bare "$source_path"` DIST_DIR="${DIST_DIR}-${ver}" VERSION_STRING=${ver} ver=${ver%%-*} VERSION_PATCH=${ver##*.} ver=${ver%.*} VERSION_MINOR=${ver##*.} ver=${ver#v} VERSION_MAJOR=${ver%.*} fi enabled child || cat <> config.mk PREFIX=${prefix} ifeq (\$(MAKECMDGOALS),dist) DIST_DIR?=${DIST_DIR} else DIST_DIR?=\$(DESTDIR)${prefix} endif LIBSUBDIR=${libdir##${prefix}/} VERSION_STRING=${VERSION_STRING} VERSION_MAJOR=${VERSION_MAJOR} VERSION_MINOR=${VERSION_MINOR} VERSION_PATCH=${VERSION_PATCH} CONFIGURE_ARGS=${CONFIGURE_ARGS} EOF enabled child || echo "CONFIGURE_ARGS?=${CONFIGURE_ARGS}" >> config.mk # # Write makefiles for all enabled targets # for tgt in libs examples docs solution; do tgt_fn="$tgt-$toolchain.mk" if enabled $tgt; then echo "Creating makefiles for ${toolchain} ${tgt}" write_common_target_config_mk $tgt_fn ${BUILD_PFX}aom_config.h #write_${tgt}_config fi done } process_detect() { if enabled shared; then # Can only build shared libs on a subset of platforms. Doing this check # here rather than at option parse time because the target auto-detect # magic happens after the command line has been parsed. case "${tgt_os}" in linux|os2|darwin*|iphonesimulator*) # Supported platforms ;; *) if enabled gnu; then echo "--enable-shared is only supported on ELF; assuming this is OK" else die "--enable-shared only supported on ELF, OS/2, and Darwin for now" fi ;; esac fi if [ -z "$CC" ] || enabled external_build; then echo "Bypassing toolchain for environment detection." enable_feature external_build check_header() { log fake_check_header "$@" header=$1 shift var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'` disable_feature $var # Headers common to all environments case $header in stdio.h) true; ;; *) result=false for d in "$@"; do [ -f "${d##-I}/$header" ] && result=true && break done ${result:-true} esac && enable_feature $var # Specialize windows and POSIX environments. case $toolchain in *-win*-*) # Don't check for any headers in Windows builds. false ;; *) case $header in pthread.h) true;; unistd.h) true;; *) false;; esac && enable_feature $var esac enabled $var } check_ld() { true } fi check_header stdio.h || die "Unable to invoke compiler: ${CC} ${CFLAGS}" check_ld < int main(void) { (void)feenableexcept(FE_DIVBYZERO | FE_INVALID); return 0; } EOF } process_toolchain() { process_common_toolchain # Enable some useful compiler flags if enabled gcc; then enabled werror && check_add_cflags -Werror check_add_cflags -Wall check_add_cflags -Wdisabled-optimization check_add_cflags -Wfloat-conversion check_add_cflags -Wpointer-arith check_add_cflags -Wtype-limits check_add_cflags -Wvla check_add_cflags -Wimplicit-function-declaration check_add_cflags -Wuninitialized check_add_cflags -Wunused check_add_cflags -Wsign-compare check_add_cflags -Wlogical-op check_add_cflags -Wstack-usage=320000 # Enabling the following warning (in combination with -Wunused above) # for C++ generates errors in third_party code including googletest and # libyuv. So enable it only for C code. check_cflags "-Wextra" && add_cflags_only "-Wextra" # Enabling the following warning for C++ generates some useless warnings # about some function parameters shadowing class member function names. # So, only enable this warning for C code. check_cflags "-Wshadow" && add_cflags_only "-Wshadow" if enabled mips || [ -z "${INLINE}" ]; then enabled extra_warnings || check_add_cflags -Wno-unused-function fi # gtest makes heavy use of undefined pre-processor symbols check_cflags "-Wundef" && add_cflags_only "-Wundef" # Avoid this warning for third_party C++ sources. Some reorganization # would be needed to apply this only to test/*.cc. check_cflags -Wshorten-64-to-32 && add_cflags_only -Wshorten-64-to-32 fi if enabled icc; then enabled werror && check_add_cflags -Werror check_add_cflags -Wall check_add_cflags -Wpointer-arith # ICC has a number of floating point optimizations that we disable # in favor of deterministic output WRT to other compilers add_cflags -fp-model precise fi if enabled analyzer; then soft_enable wxwidgets if ! wx-config --version > /dev/null; then die "Couldn't find wx-config" fi add_cxxflags_only $(wx-config --cppflags) add_extralibs $(wx-config --libs) fi # Enable extra, harmless warnings. These might provide additional insight # to what the compiler is doing and why, but in general, but they shouldn't # be treated as fatal, even if we're treating warnings as errors. GCC_EXTRA_WARNINGS=" -Wdisabled-optimization -Winline " enabled gcc && EXTRA_WARNINGS="${GCC_EXTRA_WARNINGS}" RVCT_EXTRA_WARNINGS=" --remarks " enabled rvct && EXTRA_WARNINGS="${RVCT_EXTRA_WARNINGS}" if enabled extra_warnings; then for w in ${EXTRA_WARNINGS}; do check_add_cflags ${w} enabled gcc && enabled werror && check_add_cflags -Wno-error=${w} done fi # ccache only really works on gcc toolchains enabled gcc || soft_disable ccache # Enable the postbuild target if building for visual studio. case "$tgt_cc" in vs*) enable_feature msvs enable_feature solution vs_version=${tgt_cc##vs} VCPROJ_SFX=vcxproj gen_vcproj_cmd=${source_path}/build/make/gen_msvs_vcxproj.sh enabled werror && gen_vcproj_cmd="${gen_vcproj_cmd} --enable-werror" all_targets="${all_targets} solution" INLINE="__forceinline" ;; esac # Other toolchain specific defaults case $toolchain in x86*) soft_enable postproc;; esac if enabled postproc_visualizer; then enabled postproc || die "postproc_visualizer requires postproc to be enabled" fi # Enable unit tests by default if we have a working C++ compiler. case "$toolchain" in *-vs*) soft_enable unit_tests soft_enable webm_io soft_enable libyuv ;; *-android-*) soft_enable webm_io soft_enable libyuv # GTestLog must be modified to use Android logging utilities. ;; *-darwin-*) # iOS/ARM builds do not work with gtest. This does not match # x86 targets. ;; *-iphonesimulator-*) soft_enable webm_io soft_enable libyuv ;; *-win*) # Some mingw toolchains don't have pthread available by default. # Treat these more like visual studio where threading in gtest # would be disabled for the same reason. check_cxx "$@" <> ${BUILD_PFX}aom_config.c #include "aom/aom_codec.h" static const char* const cfg = "$CONFIGURE_ARGS"; const char *aom_codec_build_config(void) {return cfg;} EOF