1 #!/bin/bash 2 ## 3 ## configure 4 ## 5 ## This script is the front-end to the build system. It provides a similar 6 ## interface to standard configure scripts with some extra bits for dealing 7 ## with toolchains that differ from the standard POSIX interface and 8 ## for extracting subsets of the source tree. In theory, reusable parts 9 ## of this script were intended to live in build/make/configure.sh, 10 ## but in practice, the line is pretty blurry. 11 ## 12 ## This build system is based in part on the FFmpeg configure script. 13 ## 14 15 #source_path="`dirname \"$0\"`" 16 source_path=${0%/*} 17 . "${source_path}/build/make/configure.sh" 18 19 show_help(){ 20 show_help_pre 21 cat << EOF 22 Advanced options: 23 ${toggle_libs} don't build libraries 24 ${toggle_examples} don't build examples 25 --libc=PATH path to alternate libc 26 --as={yasm|nasm|auto} use specified assembler [auto, yasm preferred] 27 ${toggle_fast_unaligned} don't use unaligned accesses, even when 28 supported by hardware [auto] 29 ${toggle_codec_srcs} in/exclude codec library source code 30 ${toggle_debug_libs} in/exclude debug version of libraries 31 ${toggle_md5} support for output of checksum data 32 ${toggle_static_msvcrt} use static MSVCRT (VS builds only) 33 ${toggle_vp8} VP8 codec support 34 ${toggle_psnr} output of PSNR data, if supported (encoders) 35 ${toggle_mem_tracker} track memory usage 36 ${toggle_postproc} postprocessing 37 ${toggle_multithread} multithreaded encoding and decoding. 38 ${toggle_spatial_resampling} spatial sampling (scaling) support 39 ${toggle_realtime_only} enable this option while building for real-time encoding 40 ${toggle_runtime_cpu_detect} runtime cpu detection 41 ${toggle_shared} shared library support 42 ${toggle_small} favor smaller size over speed 43 ${toggle_arm_asm_detok} assembly version of the detokenizer (ARM platforms only) 44 45 Codecs: 46 Codecs can be selectively enabled or disabled individually, or by family: 47 --disable-<codec> 48 is equivalent to: 49 --disable-<codec>-encoder 50 --disable-<codec>-decoder 51 52 Codecs available in this distribution: 53 EOF 54 #restore editor state ' 55 56 local family; 57 local last_family; 58 local c; 59 local str; 60 for c in ${CODECS}; do 61 family=${c%_*} 62 if [ "${family}" != "${last_family}" ]; then 63 [ -z "${str}" ] || echo "${str}" 64 str="$(printf ' %10s:' ${family})" 65 fi 66 str="${str} $(printf '%10s' ${c#*_})" 67 last_family=${family} 68 done 69 echo "${str}" 70 show_help_post 71 } 72 73 ## 74 ## BEGIN APPLICATION SPECIFIC CONFIGURATION 75 ## 76 77 # all_platforms is a list of all supported target platforms. Maintain 78 # alphabetically by architecture, generic-gnu last. 79 all_platforms="${all_platforms} armv5te-linux-rvct" 80 all_platforms="${all_platforms} armv5te-linux-gcc" 81 all_platforms="${all_platforms} armv5te-symbian-gcc" 82 all_platforms="${all_platforms} armv5te-wince-vs8" 83 all_platforms="${all_platforms} armv6-darwin-gcc" 84 all_platforms="${all_platforms} armv6-linux-rvct" 85 all_platforms="${all_platforms} armv6-linux-gcc" 86 all_platforms="${all_platforms} armv6-symbian-gcc" 87 all_platforms="${all_platforms} armv6-wince-vs8" 88 all_platforms="${all_platforms} iwmmxt-linux-rvct" 89 all_platforms="${all_platforms} iwmmxt-linux-gcc" 90 all_platforms="${all_platforms} iwmmxt-wince-vs8" 91 all_platforms="${all_platforms} iwmmxt2-linux-rvct" 92 all_platforms="${all_platforms} iwmmxt2-linux-gcc" 93 all_platforms="${all_platforms} iwmmxt2-wince-vs8" 94 all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8 95 all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8 96 all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8 97 all_platforms="${all_platforms} mips32-linux-gcc" 98 all_platforms="${all_platforms} ppc32-darwin8-gcc" 99 all_platforms="${all_platforms} ppc32-darwin9-gcc" 100 all_platforms="${all_platforms} ppc32-linux-gcc" 101 all_platforms="${all_platforms} ppc64-darwin8-gcc" 102 all_platforms="${all_platforms} ppc64-darwin9-gcc" 103 all_platforms="${all_platforms} ppc64-linux-gcc" 104 all_platforms="${all_platforms} sparc-solaris-gcc" 105 all_platforms="${all_platforms} x86-darwin8-gcc" 106 all_platforms="${all_platforms} x86-darwin8-icc" 107 all_platforms="${all_platforms} x86-darwin9-gcc" 108 all_platforms="${all_platforms} x86-darwin9-icc" 109 all_platforms="${all_platforms} x86-linux-gcc" 110 all_platforms="${all_platforms} x86-linux-icc" 111 all_platforms="${all_platforms} x86-solaris-gcc" 112 all_platforms="${all_platforms} x86-win32-gcc" 113 all_platforms="${all_platforms} x86-win32-vs7" 114 all_platforms="${all_platforms} x86-win32-vs8" 115 all_platforms="${all_platforms} x86-win32-vs9" 116 all_platforms="${all_platforms} x86_64-darwin9-gcc" 117 all_platforms="${all_platforms} x86_64-linux-gcc" 118 all_platforms="${all_platforms} x86_64-linux-icc" 119 all_platforms="${all_platforms} x86_64-solaris-gcc" 120 all_platforms="${all_platforms} x86_64-win64-vs8" 121 all_platforms="${all_platforms} x86_64-win64-vs9" 122 all_platforms="${all_platforms} universal-darwin8-gcc" 123 all_platforms="${all_platforms} universal-darwin9-gcc" 124 all_platforms="${all_platforms} generic-gnu" 125 126 # all_targets is a list of all targets that can be configured 127 # note that these should be in dependency order for now. 128 all_targets="libs examples docs" 129 130 # all targets available are enabled, by default. 131 for t in ${all_targets}; do 132 [ -f ${source_path}/${t}.mk ] && enable ${t} 133 done 134 135 # check installed doxygen version 136 doxy_version=$(doxygen --version 2>/dev/null) 137 doxy_major=${doxy_version%%.*} 138 if [ ${doxy_major:-0} -ge 1 ]; then 139 doxy_version=${doxy_version#*.} 140 doxy_minor=${doxy_version%%.*} 141 doxy_patch=${doxy_version##*.} 142 143 [ $doxy_major -gt 1 ] && enable doxygen 144 [ $doxy_minor -gt 5 ] && enable doxygen 145 [ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable doxygen 146 fi 147 148 # install everything except the sources, by default. sources will have 149 # to be enabled when doing dist builds, since that's no longer a common 150 # case. 151 enabled doxygen && php -v >/dev/null 2>&1 && enable install_docs 152 enable install_bins 153 enable install_libs 154 155 enable optimizations 156 enable fast_unaligned #allow unaligned accesses, if supported by hw 157 enable md5 158 enable spatial_resampling 159 enable multithread 160 161 [ -d ${source_path}/../include ] && enable alt_tree_layout 162 for d in vp8; do 163 [ -d ${source_path}/${d} ] && disable alt_tree_layout; 164 done 165 166 if ! enabled alt_tree_layout; then 167 # development environment 168 [ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder" 169 else 170 # customer environment 171 [ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder" 172 [ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder" 173 174 [ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt 175 fi 176 177 CODECS="$(echo ${CODECS} | tr ' ' '\n')" 178 CODEC_FAMILIES="$(for c in ${CODECS}; do echo ${c%_*}; done | sort | uniq)" 179 180 ARCH_LIST=" 181 arm 182 mips 183 x86 184 x86_64 185 ppc32 186 ppc64 187 " 188 ARCH_EXT_LIST=" 189 armv5te 190 armv6 191 armv7 192 iwmmxt 193 iwmmxt2 194 195 mips32 196 197 mmx 198 sse 199 sse2 200 sse3 201 ssse3 202 sse4_1 203 204 altivec 205 " 206 HAVE_LIST=" 207 ${ARCH_EXT_LIST} 208 vpx_ports 209 stdint_h 210 alt_tree_layout 211 pthread_h 212 sys_mman_h 213 " 214 CONFIG_LIST=" 215 external_build 216 install_docs 217 install_bins 218 install_libs 219 install_srcs 220 debug 221 gprof 222 gcov 223 rvct 224 gcc 225 msvs 226 pic 227 big_endian 228 229 codec_srcs 230 debug_libs 231 fast_unaligned 232 mem_manager 233 mem_tracker 234 mem_checks 235 md5 236 237 dequant_tokens 238 dc_recon 239 runtime_cpu_detect 240 postproc 241 multithread 242 psnr 243 ${CODECS} 244 ${CODEC_FAMILIES} 245 encoders 246 decoders 247 static_msvcrt 248 spatial_resampling 249 realtime_only 250 shared 251 small 252 arm_asm_detok 253 " 254 CMDLINE_SELECT=" 255 extra_warnings 256 werror 257 install_docs 258 install_bins 259 install_libs 260 install_srcs 261 debug 262 gprof 263 gcov 264 pic 265 optimizations 266 ccache 267 runtime_cpu_detect 268 269 libs 270 examples 271 libc 272 as 273 fast_unaligned 274 codec_srcs 275 debug_libs 276 md5 277 278 dequant_tokens 279 dc_recon 280 postproc 281 multithread 282 psnr 283 ${CODECS} 284 ${CODEC_FAMILIES} 285 static_msvcrt 286 mem_tracker 287 spatial_resampling 288 realtime_only 289 shared 290 small 291 arm_asm_detok 292 " 293 294 process_cmdline() { 295 for opt do 296 optval="${opt#*=}" 297 case "$opt" in 298 --disable-codecs) for c in ${CODECS}; do disable $c; done ;; 299 *) process_common_cmdline $opt 300 ;; 301 esac 302 done 303 } 304 305 post_process_cmdline() { 306 local c 307 308 # If the codec family is disabled, disable all components of that family. 309 # If the codec family is enabled, enable all components of that family. 310 log_echo "Configuring selected codecs" 311 for c in ${CODECS}; do 312 disabled ${c%%_*} && disable ${c} 313 enabled ${c%%_*} && enable ${c} 314 done 315 316 # Enable all detected codecs, if they haven't been disabled 317 for c in ${CODECS}; do soft_enable $c; done 318 319 # Enable the codec family if any component of that family is enabled 320 for c in ${CODECS}; do 321 enabled $c && enable ${c%_*} 322 done 323 324 # Set the {en,de}coders variable if any algorithm in that class is enabled 325 for c in ${CODECS}; do 326 enabled ${c} && enable ${c##*_}s 327 done 328 329 330 } 331 332 333 process_targets() { 334 enabled child || write_common_config_banner 335 enabled universal || write_common_target_config_h ${BUILD_PFX}vpx_config.h 336 337 # TODO: add host tools target (obj_int_extract, etc) 338 339 # For fat binaries, call configure recursively to configure for each 340 # binary architecture to be included. 341 if enabled universal; then 342 # Call configure (ourselves) for each subarchitecture 343 for arch in $fat_bin_archs; do 344 BUILD_PFX=${arch}/ toolchain=${arch} $self --child $cmdline_args || exit $? 345 done 346 fi 347 348 # The write_common_config (config.mk) logic is deferred until after the 349 # recursive calls to configure complete, becuase we want our universal 350 # targets to be executed last. 351 write_common_config_targets 352 enabled universal && echo "FAT_ARCHS=${fat_bin_archs}" >> config.mk 353 354 # Calculate the default distribution name, based on the enabled features 355 local cf 356 local DIST_DIR=vpx 357 for cf in $CODEC_FAMILIES; do 358 if enabled ${cf}_encoder && enabled ${cf}_decoder; then 359 DIST_DIR="${DIST_DIR}-${cf}" 360 elif enabled ${cf}_encoder; then 361 DIST_DIR="${DIST_DIR}-${cf}cx" 362 elif enabled ${cf}_decoder; then 363 DIST_DIR="${DIST_DIR}-${cf}dx" 364 fi 365 done 366 enabled debug_libs && DIST_DIR="${DIST_DIR}-debug" 367 enabled codec_srcs && DIST_DIR="${DIST_DIR}-src" 368 ! enabled postproc && DIST_DIR="${DIST_DIR}-nopost" 369 ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt" 370 ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs" 371 DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}" 372 case "${tgt_os}" in 373 win*) enabled static_msvcrt && DIST_DIR="${DIST_DIR}mt" || DIST_DIR="${DIST_DIR}md" 374 DIST_DIR="${DIST_DIR}-${tgt_cc}" 375 ;; 376 esac 377 if [ -f "${source_path}/build/make/version.sh" ]; then 378 local ver=`"$source_path/build/make/version.sh" --bare $source_path` 379 DIST_DIR="${DIST_DIR}-${ver}" 380 ver=${ver%%-*} 381 VERSION_PATCH=${ver##*.} 382 ver=${ver%.*} 383 VERSION_MINOR=${ver##*.} 384 ver=${ver#v} 385 VERSION_MAJOR=${ver%.*} 386 fi 387 enabled child || cat <<EOF >> config.mk 388 ifeq (\$(MAKECMDGOALS),dist) 389 DIST_DIR?=${DIST_DIR} 390 else 391 DIST_DIR?=\$(DESTDIR)${prefix} 392 endif 393 LIBSUBDIR=${libdir##${prefix}/} 394 395 VERSION_MAJOR=${VERSION_MAJOR} 396 VERSION_MINOR=${VERSION_MINOR} 397 VERSION_PATCH=${VERSION_PATCH} 398 399 CONFIGURE_ARGS=${CONFIGURE_ARGS} 400 EOF 401 enabled child || echo "CONFIGURE_ARGS?=${CONFIGURE_ARGS}" >> config.mk 402 403 # 404 # Write makefiles for all enabled targets 405 # 406 for tgt in libs examples docs solution; do 407 local tgt_fn="$tgt-$toolchain.mk" 408 409 if enabled $tgt; then 410 echo "Creating makefiles for ${toolchain} ${tgt}" 411 write_common_target_config_mk $tgt_fn ${BUILD_PFX}vpx_config.h 412 #write_${tgt}_config 413 fi 414 done 415 416 } 417 418 process_detect() { 419 if enabled shared; then 420 # Can only build shared libs on a subset of platforms. Doing this check 421 # here rather than at option parse time because the target auto-detect 422 # magic happens after the command line has been parsed. 423 enabled linux || die "--enable-shared only supported on ELF for now" 424 fi 425 if [ -z "$CC" ]; then 426 echo "Bypassing toolchain for environment detection." 427 enable external_build 428 check_header() { 429 log fake_check_header "$@" 430 header=$1 431 shift 432 var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'` 433 disable $var 434 case $header in 435 stdio.h) 436 true; 437 ;; 438 *) 439 local result=false 440 for d in "$@"; do 441 [ -f "${d##-I}/$header" ] && result=true && break 442 done 443 ${result:-true} 444 esac && enable $var 445 } 446 check_ld() { 447 true 448 } 449 fi 450 check_header stdio.h || die "Unable to invoke compiler: ${CC} ${CFLAGS}" 451 check_ld <<EOF || die "Toolchain is unable to link executables" 452 int main(void) {return 0;} 453 EOF 454 # check system headers 455 check_header stdint.h 456 check_header pthread.h 457 check_header sys/mman.h 458 459 check_header vpx/vpx_integer.h -I${source_path} && enable vpx_ports 460 } 461 462 process_toolchain() { 463 process_common_toolchain 464 465 # Handle universal binaries for this architecture 466 case $toolchain in 467 universal-darwin*) 468 local darwin_ver=${tgt_os##darwin} 469 fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc" 470 471 # Intel 472 fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}" 473 if [ $darwin_ver -gt 8 ]; then 474 fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}" 475 fi 476 ;; 477 esac 478 479 480 # Enable some useful compiler flags 481 if enabled gcc; then 482 enabled werror && check_add_cflags -Werror 483 check_add_cflags -Wall 484 check_add_cflags -Wdeclaration-after-statement 485 check_add_cflags -Wdisabled-optimization 486 check_add_cflags -Wpointer-arith 487 check_add_cflags -Wtype-limits 488 check_add_cflags -Wcast-qual 489 enabled extra_warnings || check_add_cflags -Wno-unused 490 fi 491 492 if enabled icc; then 493 enabled werror && check_add_cflags -Werror 494 check_add_cflags -Wall 495 check_add_cflags -Wpointer-arith 496 497 # ICC has a number of floating point optimizations that we disable 498 # in favor of deterministic output WRT to other compilers 499 add_cflags -fp-model precise 500 fi 501 502 # Enable extra, harmless warnings. These might provide additional insight 503 # to what the compiler is doing and why, but in general, but they shouldn't 504 # be treated as fatal, even if we're treating warnings as errors. 505 GCC_EXTRA_WARNINGS=" 506 -Wdisabled-optimization 507 -Winline 508 " 509 enabled gcc && EXTRA_WARNINGS="${GCC_EXTRA_WARNINGS}" 510 RVCT_EXTRA_WARNINGS=" 511 --remarks 512 " 513 enabled rvct && EXTRA_WARNINGS="${RVCT_EXTRA_WARNINGS}" 514 if enabled extra_warnings; then 515 for w in ${EXTRA_WARNINGS}; do 516 check_add_cflags ${w} 517 enabled gcc && enabled werror && check_add_cflags -Wno-error=${w} 518 done 519 fi 520 521 # ccache only really works on gcc toolchains 522 enabled gcc || soft_disable ccache 523 if enabled mips; then 524 enable dequant_tokens 525 enable dc_recon 526 fi 527 528 # Enable the postbuild target if building for visual studio. 529 case "$tgt_cc" in 530 vs*) enable msvs 531 enable solution 532 vs_version=${tgt_cc##vs} 533 all_targets="${all_targets} solution" 534 ;; 535 esac 536 537 # Other toolchain specific defaults 538 case $toolchain in x86*|ppc*|universal*) soft_enable postproc;; esac 539 } 540 541 542 ## 543 ## END APPLICATION SPECIFIC CONFIGURATION 544 ## 545 CONFIGURE_ARGS="$@" 546 process "$@" 547 cat <<EOF > ${BUILD_PFX}vpx_config.c 548 static const char* const cfg = "$CONFIGURE_ARGS"; 549 const char *vpx_codec_build_config(void) {return cfg;} 550 EOF 551