]> git.sesse.net Git - x264/blob - configure
Improve configure help
[x264] / configure
1 #!/bin/bash
2
3 if test x"$1" = x"-h" -o x"$1" = x"--help" ; then
4 cat <<EOF
5 Usage: ./configure [options]
6
7 Help:
8   -h, --help               print this message
9
10 Standard options:
11   --prefix=PREFIX          install architecture-independent files in PREFIX
12                            [/usr/local]
13   --exec-prefix=EPREFIX    install architecture-dependent files in EPREFIX
14                            [PREFIX]
15   --bindir=DIR             install binaries in DIR [EPREFIX/bin]
16   --libdir=DIR             install libs in DIR [EPREFIX/lib]
17   --includedir=DIR         install includes in DIR [PREFIX/include]
18   --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS
19   --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS
20   --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS
21
22 Configuration options:
23   --disable-cli            disable cli
24   --system-libx264         use system libx264 instead of internal
25   --enable-shared          build shared library
26   --enable-static          build static library
27   --disable-gpl            disable GPL-only features
28   --disable-thread         disable multithreaded encoding
29   --enable-win32thread     use win32threads (windows only)
30   --disable-interlaced     disable interlaced encoding support
31   --enable-visualize       enable visualization (X11 only)
32   --bit-depth=BIT_DEPTH    set output bit depth (8-10) [8]
33
34 Advanced options:
35   --disable-asm            disable platform-specific assembly optimizations
36   --enable-debug           add -g
37   --enable-gprof           add -pg
38   --enable-strip           add -s
39   --enable-pic             build position-independent code
40
41 Cross-compilation:
42   --host=HOST              build programs to run on HOST
43   --cross-prefix=PREFIX    use PREFIX for compilation tools
44   --sysroot=SYSROOT        root of cross-build tree
45
46 External library support:
47   --disable-avs            disable avisynth support (windows only)
48   --disable-swscale        disable swscale support
49   --disable-lavf           disable libavformat support
50   --disable-ffms           disable ffmpegsource support
51   --disable-gpac           disable gpac support
52
53 EOF
54 exit 1
55 fi
56
57 log_check() {
58     echo -n "checking $1... " >> config.log
59 }
60
61 log_ok() {
62     echo "yes" >> config.log
63 }
64
65 log_fail() {
66     echo "no" >> config.log
67 }
68
69 log_msg() {
70     echo "$1" >> config.log
71 }
72
73 intel_cflags() {
74     # Intel Compiler issues an incredibly large number of warnings on any warning level,
75     # suppress them by disabling all warnings rather than having to use #pragmas to disable most of them
76     for arg in $*; do
77         [ $arg = -ffast-math ] && arg=
78         [[ "$arg" = -falign-loops* ]] && arg=
79         [ "$arg" = -fno-tree-vectorize ] && arg=
80         [ "$arg" = -Wshadow ] && arg=
81         if [ $compiler = ICL ]; then
82             [ "$arg" = -Wall ] && arg=-W0
83             [ "$arg" = -g ] && arg=-Z7
84             [ "$arg" = -fomit-frame-pointer ] && arg=
85             [ "$arg" = -s ] && arg=
86             [ "$arg" = -fPIC ] && arg=
87         else
88             [ "$arg" = -Wall ] && arg=-w0
89         fi
90
91         [ -n "$arg" ] && echo -n "$arg "
92     done
93 }
94
95 icl_ldflags() {
96     for arg in $*; do
97         arg=${arg/LIBPATH/libpath}
98         [ ${arg#-libpath:} == $arg -a ${arg#-l} != $arg ] && arg=${arg#-l}.lib
99         [ ${arg#-L} != $arg ] && arg=-libpath:${arg#-L}
100         [ $arg = -Wl,--large-address-aware ] && arg=-largeaddressaware
101         [ $arg = -s ] && arg=
102         [ "$arg" = -Wl,-Bsymbolic ] && arg=
103
104         arg=${arg/pthreadGC/pthreadVC}
105         [ "$arg" = avifil32.lib ] && arg=vfw32.lib
106         [ "$arg" = gpac_static.lib ] && arg=libgpac_static.lib
107
108         [ -n "$arg" ] && echo -n "$arg "
109     done
110 }
111
112 cc_check() {
113     if [ -z "$3" ]; then
114         if [ -z "$1$2" ]; then
115             log_check "whether $CC works"
116         elif [ -z "$1" ]; then
117             log_check "for $2"
118         else
119             log_check "for $1"
120         fi
121     elif [ -z "$1" ]; then
122         if [ -z "$2" ]; then
123             log_check "whether $CC supports $3"
124         else
125             log_check "whether $CC supports $3 with $2"
126         fi
127     else
128         log_check "for $3 in $1";
129     fi
130     rm -f conftest.c
131     [ -n "$1" ] && echo "#include <$1>" > conftest.c
132     echo "int main () { $3 return 0; }" >> conftest.c
133     if [ $compiler = ICL ]; then
134         cc_cmd="$CC conftest.c $CFLAGS $2 -link $(icl_ldflags $2 $LDFLAGSCLI $LDFLAGS)"
135     else
136         cc_cmd="$CC conftest.c $CFLAGS $2 $LDFLAGSCLI $LDFLAGS -o conftest"
137     fi
138     if $cc_cmd >conftest.log 2>&1; then
139         res=$?
140         log_ok
141     else
142         res=$?
143         log_fail
144         log_msg "Failed commandline was:"
145         log_msg "--------------------------------------------------"
146         log_msg "$cc_cmd"
147         cat conftest.log >> config.log
148         log_msg "--------------------------------------------------"
149         log_msg "Failed program was:"
150         log_msg "--------------------------------------------------"
151         cat conftest.c >> config.log
152         log_msg "--------------------------------------------------"
153     fi
154     return $res
155 }
156
157 cpp_check() {
158     log_check "whether $3 is true"
159     rm -f conftest.c
160     [ -n "$1" ] && echo "#include <$1>" > conftest.c
161     echo -e "#if !($3) \n#error $4 \n#endif " >> conftest.c
162
163     if $CC conftest.c $CFLAGS $2 -E -o conftest >conftest.log 2>&1; then
164         res=$?
165         log_ok
166     else
167         res=$?
168         log_fail
169         log_msg "--------------------------------------------------"
170         cat conftest.log >> config.log
171         log_msg "--------------------------------------------------"
172         log_msg "Failed program was:"
173         log_msg "--------------------------------------------------"
174         cat conftest.c >> config.log
175         log_msg "--------------------------------------------------"
176     fi
177     return $res
178 }
179
180 as_check() {
181     log_check "whether $AS supports $1"
182     echo "$1" > conftest.asm
183     if $AS conftest.asm $ASFLAGS $2 -o conftest.o >conftest.log 2>&1; then
184         res=$?
185         log_ok
186     else
187         res=$?
188         log_fail
189         log_msg "Failed commandline was:"
190         log_msg "--------------------------------------------------"
191         log_msg "$AS conftest.asm $ASFLAGS $2 -o conftest.o"
192         cat conftest.log >> config.log
193         log_msg "--------------------------------------------------"
194         log_msg "Failed program was:"
195         log_msg "--------------------------------------------------"
196         cat conftest.asm >> config.log
197         log_msg "--------------------------------------------------"
198     fi
199     return $res
200 }
201
202 define() {
203     echo "#define $1$([ -n "$2" ] && echo " $2" || echo " 1")" >> config.h
204 }
205
206 die() {
207     log_msg "DIED: $@"
208     echo "$@"
209     exit 1
210 }
211
212 rm -f x264_config.h config.h config.mak config.log x264.pc x264.def conftest*
213
214 prefix='/usr/local'
215 exec_prefix='${prefix}'
216 bindir='${exec_prefix}/bin'
217 libdir='${exec_prefix}/lib'
218 includedir='${prefix}/include'
219 DEVNULL='/dev/null'
220
221 cli="yes"
222 cli_libx264="internal"
223 shared="no"
224 static="no"
225 avs="auto"
226 lavf="auto"
227 ffms="auto"
228 gpac="auto"
229 gpl="yes"
230 thread="auto"
231 swscale="auto"
232 asm="auto"
233 interlaced="yes"
234 debug="no"
235 gprof="no"
236 strip="no"
237 pic="no"
238 vis="no"
239 bit_depth="8"
240 compiler="GNU"
241
242 CFLAGS="$CFLAGS -Wall -I."
243 LDFLAGS="$LDFLAGS"
244 LDFLAGSCLI="$LDFLAGSCLI"
245 ASFLAGS="$ASFLAGS"
246 HAVE_GETOPT_LONG=1
247 cross_prefix=""
248
249 EXE=""
250
251 # list of all preprocessor HAVE values we can define
252 CONFIG_HAVE="MALLOC_H ALTIVEC ALTIVEC_H MMX ARMV6 ARMV6T2 NEON BEOSTHREAD POSIXTHREAD WIN32THREAD THREAD LOG2F VISUALIZE SWSCALE LAVF FFMS GPAC GF_MALLOC AVS GPL VECTOREXT INTERLACED"
253
254 # parse options
255
256 for opt do
257     optarg="${opt#*=}"
258     case "$opt" in
259         --prefix=*)
260             prefix="$optarg"
261             ;;
262         --exec-prefix=*)
263             exec_prefix="$optarg"
264             ;;
265         --bindir=*)
266             bindir="$optarg"
267             ;;
268         --libdir=*)
269             libdir="$optarg"
270             ;;
271         --includedir=*)
272             includedir="$optarg"
273             ;;
274         --disable-cli)
275             cli="no"
276             ;;
277         --system-libx264)
278             cli_libx264="system"
279             ;;
280         --enable-shared)
281             shared="yes"
282             ;;
283         --enable-static)
284             static="yes"
285             ;;
286         --disable-asm)
287             asm="no"
288             ;;
289         --disable-interlaced)
290             interlaced="no"
291             ;;
292         --disable-avs)
293             avs="no"
294             ;;
295         --disable-lavf)
296             lavf="no"
297             ;;
298         --disable-ffms)
299             ffms="no"
300             ;;
301         --disable-gpac)
302             gpac="no"
303             ;;
304         --disable-gpl)
305             gpl="no"
306             ;;
307         --extra-asflags=*)
308             ASFLAGS="$ASFLAGS $optarg"
309             ;;
310         --extra-cflags=*)
311             CFLAGS="$CFLAGS $optarg"
312             ;;
313         --extra-ldflags=*)
314             LDFLAGS="$LDFLAGS $optarg"
315             ;;
316         --disable-thread)
317             thread="no"
318             ;;
319         --enable-win32thread)
320             thread="win32"
321             ;;
322         --disable-swscale)
323             swscale="no"
324             ;;
325         --enable-debug)
326             debug="yes"
327             ;;
328         --enable-gprof)
329             CFLAGS="$CFLAGS -pg"
330             LDFLAGS="$LDFLAGS -pg"
331             gprof="yes"
332             ;;
333         --enable-strip)
334             strip="yes"
335             ;;
336         --enable-pic)
337             pic="yes"
338             ;;
339         --enable-visualize)
340             vis="yes"
341             ;;
342         --host=*)
343             host="$optarg"
344             ;;
345         --cross-prefix=*)
346             cross_prefix="$optarg"
347             ;;
348         --sysroot=*)
349             CFLAGS="$CFLAGS --sysroot=$optarg"
350             LDFLAGS="$LDFLAGS --sysroot=$optarg"
351             ;;
352         --bit-depth=*)
353             bit_depth="$optarg"
354             if [ "$bit_depth" -lt "8" -o "$bit_depth" -gt "10" ]; then
355                 echo "Supplied bit depth must be in range [8,10]."
356                 exit 1
357             fi
358             bit_depth=`expr $bit_depth + 0`
359             ;;
360         *)
361             echo "Unknown option $opt, ignored"
362             ;;
363     esac
364 done
365
366 [ "$cli" = "no" -a "$shared" = "no" -a "$static" = "no" ] && die "Nothing to build. Enable cli, shared or static."
367
368 CC="${CC-${cross_prefix}gcc}"
369 AR="${AR-${cross_prefix}ar}"
370 RANLIB="${RANLIB-${cross_prefix}ranlib}"
371 STRIP="${STRIP-${cross_prefix}strip}"
372
373 if [ "x$host" = x ]; then
374     host=`./config.guess`
375 fi
376 # normalize a triplet into a quadruplet
377 host=`./config.sub $host`
378
379 # split $host
380 host_cpu="${host%%-*}"
381 host="${host#*-}"
382 host_vendor="${host%%-*}"
383 host_os="${host#*-}"
384
385 # test for use of Intel Compiler
386 if [[ $host_os = mingw* || $host_os = cygwin* ]]; then
387     if [[ `basename "$CC"` = icl* ]]; then
388         # Windows Intel Compiler creates dependency generation with absolute Windows paths, Cygwin's make does not support Windows paths.
389         [[ $host_os = cygwin* ]] && die "Windows Intel Compiler support requires MSYS"
390         compiler=ICL
391         CFLAGS="$CFLAGS -Qstd=c99 -nologo -Qms0 -DHAVE_STRING_H -Iextras"
392         QPRE="-Q"
393         `$CC 2>&1 | grep -q IA-32` && host_cpu=i486
394         `$CC 2>&1 | grep -q "Intel(R) 64"` && host_cpu=x86_64
395         cpp_check "" "" "_MSC_VER >= 1400" || die "Windows Intel Compiler support requires Visual Studio 2005 or newer"
396     fi
397 else
398     if [[ `basename "$CC"` = icc* ]]; then
399         AR="xiar"
400         compiler=ICC
401         QPRE="-"
402     fi
403 fi
404
405 case $host_os in
406     beos*)
407         SYS="BEOS"
408         define HAVE_MALLOC_H
409         ;;
410     darwin*)
411         SYS="MACOSX"
412         CFLAGS="$CFLAGS -falign-loops=16"
413         LDFLAGS="$LDFLAGS -lm"
414         if [ "$pic" = "no" ]; then
415             cc_check "" -mdynamic-no-pic && CFLAGS="$CFLAGS -mdynamic-no-pic"
416         fi
417         ;;
418     freebsd*)
419         SYS="FREEBSD"
420         LDFLAGS="$LDFLAGS -lm"
421         ;;
422     kfreebsd*-gnu)
423         SYS="FREEBSD"
424         define HAVE_MALLOC_H
425         LDFLAGS="$LDFLAGS -lm"
426         ;;
427     netbsd*)
428         SYS="NETBSD"
429         LDFLAGS="$LDFLAGS -lm"
430         ;;
431     openbsd*)
432         SYS="OPENBSD"
433         LDFLAGS="$LDFLAGS -lm"
434         ;;
435     *linux*)
436         SYS="LINUX"
437         define HAVE_MALLOC_H
438         LDFLAGS="$LDFLAGS -lm"
439         ;;
440     cygwin*)
441         EXE=".exe"
442         if cc_check "" -mno-cygwin; then
443             CFLAGS="$CFLAGS -mno-cygwin"
444             LDFLAGS="$LDFLAGS -mno-cygwin"
445         fi
446         if cpp_check "" "" "defined(__CYGWIN32__)" ; then
447             define HAVE_MALLOC_H
448             SYS="CYGWIN"
449         else
450             SYS="WINDOWS"
451             DEVNULL="NUL"
452         fi
453         ;;
454     mingw*)
455         SYS="WINDOWS"
456         EXE=".exe"
457         DEVNULL="NUL"
458         ;;
459     sunos*|solaris*)
460         SYS="SunOS"
461         define HAVE_MALLOC_H
462         LDFLAGS="$LDFLAGS -lm"
463         HAVE_GETOPT_LONG=0
464         ;;
465     *)
466         die "Unknown system $host, edit the configure"
467         ;;
468 esac
469
470 case $host_cpu in
471     i*86)
472         ARCH="X86"
473         AS="yasm"
474         ASFLAGS="$ASFLAGS -O2"
475         if [ $compiler = GNU ]; then
476             if [[ "$asm" == auto && "$CFLAGS" != *-march* ]]; then
477                 CFLAGS="$CFLAGS -march=i686"
478             fi
479             if [[ "$asm" == auto && "$CFLAGS" != *-mfpmath* ]]; then
480                 CFLAGS="$CFLAGS -mfpmath=sse -msse"
481             fi
482         else
483             # icc on linux has various degrees of mod16 stack support
484             if [ $SYS = LINUX ]; then
485                 # < 11 is completely incapable of keeping a mod16 stack
486                 if cpp_check "" "" "__INTEL_COMPILER < 1100" ; then
487                     define BROKEN_STACK_ALIGNMENT
488                 # 11 <= x < 12 is capable of keeping a mod16 stack, but defaults to not doing so.
489                 elif cpp_check "" "" "__INTEL_COMPILER < 1200" ; then
490                     CFLAGS="$CFLAGS -falign-stack=assume-16-byte"
491                 fi
492                 # >= 12 defaults to a mod16 stack
493             fi
494             # icl on windows has no mod16 stack support
495             [ $SYS = WINDOWS ] && define BROKEN_STACK_ALIGNMENT
496         fi
497         if [ "$SYS" = MACOSX ]; then
498             ASFLAGS="$ASFLAGS -f macho -DPREFIX"
499         elif [ "$SYS" = WINDOWS -o "$SYS" = CYGWIN ]; then
500             ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
501             LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
502         else
503             ASFLAGS="$ASFLAGS -f elf"
504         fi
505         ;;
506     x86_64)
507         ARCH="X86_64"
508         AS="yasm"
509         if [ "$SYS" = MACOSX ]; then
510             ASFLAGS="$ASFLAGS -f macho64 -m amd64 -DPIC -DPREFIX"
511             if cc_check '' "-arch x86_64"; then
512                 CFLAGS="$CFLAGS -arch x86_64"
513                 LDFLAGS="$LDFLAGS -arch x86_64"
514             fi
515         elif [ "$SYS" = WINDOWS ]; then
516             ASFLAGS="$ASFLAGS -f win32 -m amd64"
517             # only the GNU toolchain is inconsistent in prefixing function names with _
518             [ $compiler = GNU ] && cc_check "" "-S" && grep -q "_main:" conftest && ASFLAGS="$ASFLAGS -DPREFIX"
519         else
520             ASFLAGS="$ASFLAGS -f elf -m amd64"
521         fi
522         ;;
523     powerpc|powerpc64)
524         ARCH="PPC"
525         if [ $asm = auto ] ; then
526             define HAVE_ALTIVEC
527             AS="${AS-${cross_prefix}gcc}"
528             if [ $SYS = MACOSX ] ; then
529                 CFLAGS="$CFLAGS -faltivec -fastf -mcpu=G4"
530             else
531                 CFLAGS="$CFLAGS -maltivec -mabi=altivec"
532                 define HAVE_ALTIVEC_H
533             fi
534         fi
535         ;;
536     sparc)
537         ARCH="SPARC"
538         case $(uname -m) in
539             sun4u|sun4v)
540                 if [ $asm = auto ]; then
541                     ARCH="UltraSPARC"
542                     if ! echo $CFLAGS | grep -Eq '\-mcpu' ; then
543                         CFLAGS="$CFLAGS -mcpu=ultrasparc"
544                         LDFLAGS="$LDFLAGS -mcpu=ultrasparc"
545                     fi
546                     AS="${AS-${cross_prefix}as}"
547                     ASFLAGS="$ASFLAGS -xarch=v8plusa"
548                 fi
549                 ;;
550         esac
551         ;;
552     mips|mipsel|mips64|mips64el)
553         ARCH="MIPS"
554         ;;
555     arm*)
556         ARCH="ARM"
557         if [ "$SYS" = MACOSX ] ; then
558             AS="${AS-extras/gas-preprocessor.pl $CC}"
559             ASFLAGS="$ASFLAGS -DPREFIX -DPIC"  # apple's ld doesn't support movw/movt relocations at all
560             # build for armv7 by default
561             if ! echo $CFLAGS | grep -Eq '\-arch' ; then
562                 CFLAGS="$CFLAGS -arch armv7"
563                 LDFLAGS="$LDFLAGS -arch armv7"
564             fi
565         else
566             AS="${AS-${cross_prefix}gcc}"
567         fi
568         ;;
569     s390|s390x)
570         ARCH="S390"
571         ;;
572     parisc|parisc64)
573         ARCH="PARISC"
574         ;;
575     ia64)
576         ARCH="IA64"
577         ;;
578     *)
579         ARCH="$(echo $host_cpu | tr a-z A-Z)"
580         ;;
581 esac
582
583 log_msg "x264 configure script"
584 if [ -n "$*" ]; then
585     msg="Command line options:"
586     for i in $@; do
587         msg="$msg \"$i\""
588     done
589     log_msg "$msg"
590 fi
591 log_msg ""
592
593 # check requirements
594
595 cc_check || die "No working C compiler found."
596
597 if [ $compiler != ICL ]; then
598     if cc_check '' -std=gnu99 'for( int i = 0; i < 9; i++ );' ; then
599         CFLAGS="$CFLAGS -std=gnu99"
600     elif cc_check '' -std=c99 'for( int i = 0; i < 9; i++ );' ; then
601         CFLAGS="$CFLAGS -std=c99 -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE"
602     elif ! cc_check '' '' 'for( int i = 0; i < 9; i++ );' ; then
603         die "C99 compiler is needed for compilation."
604     fi
605 fi
606
607 if [ $shared = yes -a \( $ARCH = "X86_64" -o $ARCH = "PPC" -o $ARCH = "ALPHA" -o $ARCH = "ARM" -o $ARCH = "IA64" \) ] ; then
608     pic="yes"
609 fi
610
611 if [ $asm = auto -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then
612     if ! as_check "vpaddw xmm0, xmm0, xmm0" ; then
613         VER=`($AS --version || echo no assembler) 2>/dev/null | head -n 1`
614         echo "Found $VER"
615         echo "Minimum version is yasm-0.7.0"
616         echo "If you really want to compile without asm, configure with --disable-asm."
617         exit 1
618     fi
619     if ! cc_check '' '' '__asm__("pabsw %xmm0, %xmm0");' ; then
620         VER=`(${cross_prefix}as --version || echo no gnu as) 2>/dev/null | head -n 1`
621         echo "Found $VER"
622         echo "Minimum version is binutils-2.17"
623         echo "Your compiler can't handle inline SSSE3 asm."
624         echo "If you really want to compile without asm, configure with --disable-asm."
625         exit 1
626     fi
627     define HAVE_MMX
628 fi
629
630 if [ $asm = auto -a $ARCH = ARM ] ; then
631     # set flags so neon is built by default
632     echo $CFLAGS | grep -Eq '(-mcpu|-march|-mfpu)' || CFLAGS="$CFLAGS -mcpu=cortex-a8 -mfpu=neon"
633
634     if  cc_check '' '' '__asm__("rev ip, ip");' ; then      define HAVE_ARMV6
635         cc_check '' '' '__asm__("movt r0, #0");'         && define HAVE_ARMV6T2
636         cc_check '' '' '__asm__("vadd.i16 q0, q0, q0");' && define HAVE_NEON
637         ASFLAGS="$ASFLAGS $CFLAGS -c"
638     else
639         echo "You specified a pre-ARMv6 or Thumb-1 CPU in your CFLAGS."
640         echo "If you really want to run on such a CPU, configure with --disable-asm."
641         exit 1
642     fi
643 fi
644
645 [ $asm = no ] && AS=""
646 [ "x$AS" = x ] && asm="no" || asm="yes"
647
648 define ARCH_$ARCH
649 define SYS_$SYS
650
651 # skip endianness check for Intel Compiler, as all supported platforms are little. the -ipo flag will also cause the check to fail
652 if [ $compiler = GNU ]; then
653     echo "int i[2] = {0x42494745,0}; double f[2] = {0x1.0656e6469616ep+102,0};" > conftest.c
654     $CC $CFLAGS conftest.c -c -o conftest.o 2>/dev/null || die "endian test failed"
655     if (${cross_prefix}strings -a conftest.o | grep -q BIGE) && (${cross_prefix}strings -a conftest.o | grep -q FPendian) ; then
656         define WORDS_BIGENDIAN
657     elif !(${cross_prefix}strings -a conftest.o | grep -q EGIB && ${cross_prefix}strings -a conftest.o | grep -q naidnePF) ; then
658         die "endian test failed"
659     fi
660 fi
661
662 # autodetect options that weren't forced nor disabled
663
664 # pthread-win32 is lgpl, prevent its use if --disable-gpl is specified and targeting windows
665 [ "$SYS" = "WINDOWS" -a "$gpl" = "no" -a "$thread" = "auto" ] && thread="win32"
666
667 libpthread=""
668 if [ "$thread" = "auto" ]; then
669     thread="no"
670     case $SYS in
671         BEOS)
672             thread="beos"
673             define HAVE_BEOSTHREAD
674             ;;
675         WINDOWS)
676             if cc_check pthread.h -lpthread "pthread_create(0,0,0,0);" ; then
677                 thread="posix"
678                 libpthread="-lpthread"
679             elif cc_check pthread.h -lpthreadGC2 "pthread_create(0,0,0,0);" ; then
680                 thread="posix"
681                 libpthread="-lpthreadGC2"
682             elif cc_check pthread.h "-lpthreadGC2 -lwsock32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
683                 thread="posix"
684                 libpthread="-lpthreadGC2 -lwsock32"
685                 define PTW32_STATIC_LIB
686             elif cc_check pthread.h "-lpthreadGC2 -lws2_32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
687                 thread="posix"
688                 libpthread="-lpthreadGC2 -lws2_32"
689                 define PTW32_STATIC_LIB
690             else
691                 # default to native threading if pthread-win32 is unavailable
692                 thread="win32"
693             fi
694             ;;
695         OPENBSD)
696             cc_check pthread.h -pthread && thread="posix" && libpthread="-pthread"
697             ;;
698         *)
699             cc_check pthread.h -lpthread && thread="posix" && libpthread="-lpthread"
700             ;;
701     esac
702 fi
703 if [ "$thread" = "posix" ]; then
704     LDFLAGS="$LDFLAGS $libpthread"
705     define HAVE_POSIXTHREAD
706 fi
707 if [ "$thread" = "win32" ]; then
708     # cygwin does not support win32 threads
709     if [ "$SYS" = "WINDOWS" ]; then
710         define HAVE_WIN32THREAD
711     else
712         thread="no"
713     fi
714 fi
715 [ "$thread" != "no" ] && define HAVE_THREAD
716
717 if cc_check "math.h" "-Werror" "return log2f(2);" ; then
718     define HAVE_LOG2F
719 fi
720
721 if [ "$vis" = "yes" ] ; then
722     save_CFLAGS="$CFLAGS"
723     CFLAGS="$CFLAGS -I/usr/X11R6/include"
724     if cc_check "X11/Xlib.h" "-L/usr/X11R6/lib -lX11" "XOpenDisplay(0);" ; then
725         LDFLAGS="-L/usr/X11R6/lib -lX11 $LDFLAGS"
726         define HAVE_VISUALIZE
727     else
728         vis="no"
729         CFLAGS="$save_CFLAGS"
730    fi
731 fi
732
733 if [ "$swscale" = "auto" ] ; then
734     swscale="no"
735     if ${cross_prefix}pkg-config --exists libswscale 2>/dev/null; then
736         SWSCALE_LIBS="$SWSCALE_LIBS $(${cross_prefix}pkg-config --libs libswscale libavutil)"
737         SWSCALE_CFLAGS="$SWSCALE_CFLAGS $(${cross_prefix}pkg-config --cflags libswscale libavutil)"
738     fi
739     [ -z "$SWSCALE_LIBS" ] && SWSCALE_LIBS="-lswscale -lavutil"
740
741     if cc_check "libswscale/swscale.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "sws_init_context(0,0,0);" ; then
742         if cc_check "libavutil/pixdesc.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "av_get_pix_fmt_name(0);" ; then
743             swscale="yes"
744         else
745             echo "Warning: av_get_pix_fmt_name is missing from libavutil, update for swscale support"
746         fi
747     fi
748 fi
749
750 if [ "$lavf" = "auto" ] ; then
751     lavf="no"
752     if ${cross_prefix}pkg-config --exists libavformat libavcodec libswscale 2>/dev/null; then
753         LAVF_LIBS="$LAVF_LIBS $(${cross_prefix}pkg-config --libs libavformat libavcodec libavutil libswscale)"
754         LAVF_CFLAGS="$LAVF_CFLAGS $(${cross_prefix}pkg-config --cflags libavformat libavcodec libavutil libswscale)"
755     fi
756     if [ -z "$LAVF_LIBS" -a -z "$LAVF_CFLAGS" ]; then
757         LAVF_LIBS="-lavformat"
758         for lib in -lpostproc -lavcodec -lavcore -lswscale -lavutil -lm -lz -lbz2 $libpthread -lavifil32; do
759             cc_check "" $lib && LAVF_LIBS="$LAVF_LIBS $lib"
760         done
761     fi
762     LAVF_LIBS="-L. $LAVF_LIBS"
763     if cc_check libavformat/avformat.h "$LAVF_CFLAGS $LAVF_LIBS" "avformat_open_input(0,0,0,0); avcodec_open2(0,0,0);" ; then
764         if [ "$swscale" = "yes" ]; then
765             lavf="yes"
766         else
767             echo "Warning: libavformat is not supported without swscale support"
768         fi
769     fi
770 fi
771
772 if [ "$ffms" = "auto" ] ; then
773     ffms_major="2"; ffms_minor="14"; ffms_micro="0"; ffms_bump="0"
774     ffms="no"
775
776     if ${cross_prefix}pkg-config --exists ffms2 2>/dev/null; then
777         FFMS2_LIBS="$FFMS2_LIBS $(${cross_prefix}pkg-config --libs ffms2)"
778         FFMS2_CFLAGS="$FFMS2_CFLAGS $(${cross_prefix}pkg-config --cflags ffms2)"
779     fi
780     [ -z "$FFMS2_LIBS" ] && FFMS2_LIBS="-lffms2"
781
782     if cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS" "FFMS_DestroyVideoSource(0);" ; then
783         ffms="yes"
784     elif cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS -lstdc++ $LAVF_LIBS" "FFMS_DestroyVideoSource(0);" ; then
785         ffms="yes"
786         FFMS2_LIBS="$FFMS2_LIBS -lstdc++ $LAVF_LIBS"
787     fi
788
789     error="ffms must be at least version $ffms_major.$ffms_minor.$ffms_micro.$ffms_bump"
790     if [ $ffms = "yes" ] && ! cpp_check "ffms.h" "$FFMS2_CFLAGS" "FFMS_VERSION >= (($ffms_major << 24) | ($ffms_minor << 16) | ($ffms_micro << 8) | $ffms_bump)" "$error"; then
791        ffms="no"
792        echo "Warning: $error"
793     fi
794     if [ "$ffms" = "yes" -a "$swscale" = "no" ]; then
795         echo "Warning: ffms is not supported without swscale support"
796         ffms="no"
797     fi
798 fi
799
800 if [ "$swscale" = "yes" ]; then
801     LDFLAGSCLI="$SWSCALE_LIBS $LDFLAGSCLI"
802     CFLAGS="$CFLAGS $SWSCALE_CFLAGS"
803     define HAVE_SWSCALE
804     if [ "$lavf" = "yes" ]; then
805         LDFLAGSCLI="$LAVF_LIBS $LDFLAGSCLI"
806         CFLAGS="$CFLAGS $LAVF_CFLAGS"
807         define HAVE_LAVF
808     fi
809     if [ "$ffms" = "yes" ]; then
810         LDFLAGSCLI="$FFMS2_LIBS $LDFLAGSCLI"
811         CFLAGS="$CFLAGS $FFMS2_CFLAGS"
812         define HAVE_FFMS
813     fi
814 fi
815
816 if [ "$gpac" = "auto" ] ; then
817     gpac="no"
818     cc_check "" -lz && GPAC_LIBS="-lgpac_static -lz" || GPAC_LIBS="-lgpac_static"
819     if [ "$SYS" = "WINDOWS" ] ; then
820         GPAC_LIBS="$GPAC_LIBS -lwinmm"
821     fi
822     if cc_check gpac/isomedia.h "$GPAC_LIBS" ; then
823         if cc_check gpac/isomedia.h "$GPAC_LIBS" "gf_isom_set_pixel_aspect_ratio(0,0,0,0,0);" ; then
824             gpac="yes"
825         else
826             echo "Warning: gpac is too old, update to 2007-06-21 UTC or later"
827         fi
828     fi
829 fi
830 if [ "$gpac" = "yes" ] ; then
831     define HAVE_GPAC
832     if cc_check gpac/isomedia.h "-Werror $GPAC_LIBS" "gf_malloc(1); gf_free(NULL);" ; then
833         define HAVE_GF_MALLOC
834     fi
835     LDFLAGSCLI="$GPAC_LIBS $LDFLAGSCLI"
836 fi
837
838 if [ "$avs" = "auto" ] ; then
839     avs="no"
840     # cygwin can use avisynth if it can use LoadLibrary
841     if [ $SYS = WINDOWS ] || ([ $SYS = CYGWIN ] && cc_check windows.h "" "LoadLibrary(0);") ; then
842         avs="yes"
843         define HAVE_AVS
844     fi
845 fi
846
847 cc_check "stdint.h" "" "uint32_t test_vec __attribute__ ((vector_size (16))) = {0,1,2,3};" && define HAVE_VECTOREXT
848
849 if [ "$pic" = "yes" ] ; then
850     CFLAGS="$CFLAGS -fPIC"
851     ASFLAGS="$ASFLAGS -DPIC"
852     # resolve textrels in the x86 asm
853     cc_check stdio.h -Wl,-Bsymbolic && LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
854 fi
855
856 if [ "$debug" != "yes" -a "$gprof" != "yes" ]; then
857     CFLAGS="$CFLAGS -fomit-frame-pointer"
858 fi
859
860 if [ "$strip" = "yes" ]; then
861     CFLAGS="$CFLAGS -s"
862     LDFLAGS="$LDFLAGS -s"
863 fi
864
865 if [ "$debug" = "yes" ]; then
866     CFLAGS="-O1 -g $CFLAGS"
867 elif [ $ARCH = ARM ]; then
868     # arm-gcc-4.2 produces incorrect output with -ffast-math
869     # and it doesn't save any speed anyway on 4.4, so disable it
870     CFLAGS="-O3 -fno-fast-math $CFLAGS"
871 else
872     CFLAGS="-O3 -ffast-math $CFLAGS"
873 fi
874
875 if cc_check '' -fno-tree-vectorize ; then
876     CFLAGS="$CFLAGS -fno-tree-vectorize"
877 fi
878
879 if [ $SYS = WINDOWS -a $ARCH = X86 -a $compiler = GNU ] ; then
880     # workaround gcc/ld bug with alignment of static variables/arrays that are initialized to zero
881     cc_check '' -fno-zero-initialized-in-bss && CFLAGS="$CFLAGS -fno-zero-initialized-in-bss"
882 fi
883
884 if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then
885     define fseek fseeko
886     define ftell ftello
887 elif cc_check "stdio.h" "" "fseeko64(stdin,0,0);" ; then
888     define fseek fseeko64
889     define ftell ftello64
890 elif cc_check "stdio.h" "" "_fseeki64(stdin,0,0);" ; then
891     define fseek _fseeki64
892     define ftell _ftelli64
893 fi
894
895 if cc_check '' -Wshadow ; then
896     CFLAGS="-Wshadow $CFLAGS"
897 fi
898
899 if [ "$bit_depth" -gt "8" ]; then
900     define HIGH_BIT_DEPTH
901     ASFLAGS="$ASFLAGS -DHIGH_BIT_DEPTH"
902 fi
903
904 ASFLAGS="$ASFLAGS -DBIT_DEPTH=$bit_depth"
905
906 [ $gpl = yes ] && define HAVE_GPL && x264_gpl=1 || x264_gpl=0
907
908 [ $interlaced = yes ] && define HAVE_INTERLACED && x264_interlaced=1 || x264_interlaced=0
909
910 #define undefined vars as 0
911 for var in $CONFIG_HAVE; do
912     grep -q "HAVE_$var 1" config.h || define HAVE_$var 0
913 done
914
915 if [ $compiler = ICL ]; then
916     AR="xilib -nologo -out:"
917     DEPMM=-QMM
918     DEPMT=-QMT
919     HAVE_GETOPT_LONG=0
920     LD="xilink -out:"
921     LDFLAGS="-nologo -incremental:no $(icl_ldflags $LDFLAGS)"
922     LDFLAGSCLI="$(icl_ldflags $LDFLAGSCLI)"
923     LIBX264=libx264.lib
924     RANLIB=
925     STRIP=
926     if [ $debug = yes ]; then
927         LDFLAGS="-debug $LDFLAGS"
928         CFLAGS="-D_DEBUG $CFLAGS"
929     else
930         CFLAGS="-DNDEBUG $CFLAGS"
931     fi
932 else
933     AR="$AR rc "
934     DEPMM="-MM -g0"
935     DEPMT="-MT"
936     LD="$CC -o "
937     LIBX264=libx264.a
938 fi
939 if [ $compiler = GNU ]; then
940     PROF_GEN_CC="-fprofile-generate"
941     PROF_GEN_LD="-fprofile-generate"
942     PROF_USE_CC="-fprofile-use"
943     PROF_USE_LD="-fprofile-use"
944 else
945     CFLAGS="$(intel_cflags $CFLAGS)"
946     # icc does not define __SSE__ until SSE2 optimization and icl never defines it or _M_IX86_FP
947     [ \( $ARCH = X86_64 -o $ARCH = X86 \) -a $asm = yes ] && ! cpp_check "" "" "defined(__SSE__)" && define __SSE__
948     PROF_GEN_CC="${QPRE}prof-gen ${QPRE}prof-dir."
949     PROF_GEN_LD=
950     PROF_USE_CC="${QPRE}prof-use ${QPRE}prof-dir."
951     PROF_USE_LD=
952 fi
953
954 rm -f conftest*
955
956 # generate exported config file
957
958 cat > x264_config.h << EOF
959 #define X264_BIT_DEPTH  $bit_depth
960 #define X264_GPL        $x264_gpl
961 #define X264_INTERLACED $x264_interlaced
962 EOF
963
964 # generate config files
965
966 cat > config.mak << EOF
967 prefix=$prefix
968 exec_prefix=$exec_prefix
969 bindir=$bindir
970 libdir=$libdir
971 includedir=$includedir
972 ARCH=$ARCH
973 SYS=$SYS
974 CC=$CC
975 CFLAGS=$CFLAGS
976 DEPMM=$DEPMM
977 DEPMT=$DEPMT
978 LD=$LD
979 LDFLAGS=$LDFLAGS
980 LIBX264=$LIBX264
981 AR=$AR
982 RANLIB=$RANLIB
983 STRIP=$STRIP
984 AS=$AS
985 ASFLAGS=$ASFLAGS
986 EXE=$EXE
987 HAVE_GETOPT_LONG=$HAVE_GETOPT_LONG
988 DEVNULL=$DEVNULL
989 PROF_GEN_CC=$PROF_GEN_CC
990 PROF_GEN_LD=$PROF_GEN_LD
991 PROF_USE_CC=$PROF_USE_CC
992 PROF_USE_LD=$PROF_USE_LD
993 EOF
994
995 if [ $compiler = ICL ]; then
996     echo '%.o: %.c' >> config.mak
997     echo '      $(CC) $(CFLAGS) -c -Fo$@ $<' >> config.mak
998 fi
999
1000 if [ "$cli" = "yes" ]; then
1001     echo 'default: cli' >> config.mak
1002     echo 'install: install-cli' >> config.mak
1003 fi
1004
1005 if [ "$shared" = "yes" ]; then
1006     API=$(grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' ')
1007     if [ "$SYS" = "WINDOWS" -o "$SYS" = "CYGWIN" ]; then
1008         echo "SONAME=libx264-$API.dll" >> config.mak
1009         if [ $compiler = ICL ]; then
1010             echo 'IMPLIBNAME=libx264.dll.lib' >> config.mak
1011             # GNU ld on windows defaults to exporting all global functions if there are no explicit __declspec(dllexport) declarations
1012             # MSVC link does not act similarly, so it is required to make an export definition out of x264.h and use it at link time
1013             echo 'SOFLAGS=-dll -def:x264.def -implib:$(IMPLIBNAME)' >> config.mak
1014             echo "EXPORTS" > x264.def
1015             grep "^\(int\|void\|x264_t\|extern\).*x264.*[\[(;]" x264.h | sed -e "s/.*\(x264.*\)[\[(].*/\1/;s/.*\(x264.*\);/\1/;s/open/open_$API/g" >> x264.def
1016         else
1017             echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
1018             echo 'SOFLAGS=-shared -Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
1019         fi
1020     elif [ "$SYS" = "MACOSX" ]; then
1021         echo "SOSUFFIX=dylib" >> config.mak
1022         echo "SONAME=libx264.$API.dylib" >> config.mak
1023         echo 'SOFLAGS=-shared -dynamiclib -Wl,-single_module -Wl,-read_only_relocs,suppress -install_name $(DESTDIR)$(libdir)/$(SONAME)' >> config.mak
1024     elif [ "$SYS" = "SunOS" ]; then
1025         echo "SOSUFFIX=so" >> config.mak
1026         echo "SONAME=libx264.so.$API" >> config.mak
1027         echo 'SOFLAGS=-shared -Wl,-h,$(SONAME)' >> config.mak
1028     else
1029         echo "SOSUFFIX=so" >> config.mak
1030         echo "SONAME=libx264.so.$API" >> config.mak
1031         echo 'SOFLAGS=-shared -Wl,-soname,$(SONAME)' >> config.mak
1032     fi
1033     echo 'default: lib-shared' >> config.mak
1034     echo 'install: install-lib-shared' >> config.mak
1035 fi
1036
1037 if [ "$static" = "yes" ]; then
1038     echo 'default: lib-static' >> config.mak
1039     echo 'install: install-lib-static' >> config.mak
1040 fi
1041
1042 if [ "$cli_libx264" = "system" ] ; then
1043     if [ "$shared" = "yes" ]; then
1044         CLI_LIBX264='$(SONAME)'
1045     elif ${cross_prefix}pkg-config --exists x264 2>/dev/null; then
1046         LDFLAGSCLI="$LDFLAGSCLI $(${cross_prefix}pkg-config --libs x264)"
1047         CLI_LIBX264=
1048     else
1049         die "Can not find system libx264"
1050     fi
1051 else
1052     CLI_LIBX264='$(LIBX264)'
1053 fi
1054 echo "LDFLAGSCLI = $LDFLAGSCLI" >> config.mak
1055 echo "CLI_LIBX264 = $CLI_LIBX264" >> config.mak
1056
1057 ./version.sh >> config.h
1058
1059 pclibs="-L$libdir -lx264 $libpthread"
1060
1061 cat > x264.pc << EOF
1062 prefix=$prefix
1063 exec_prefix=$exec_prefix
1064 libdir=$libdir
1065 includedir=$includedir
1066
1067 Name: x264
1068 Description: H.264 (MPEG4 AVC) encoder library
1069 Version: $(grep POINTVER < config.h | sed -e 's/.* "//; s/".*//')
1070 Libs: $pclibs
1071 Cflags: -I$includedir
1072 EOF
1073
1074 filters="crop select_every"
1075 gpl_filters=""
1076 [ $swscale = yes ] && filters="resize $filters"
1077 [ $gpl = yes ] && filters="$filters $gpl_filters"
1078
1079 cat > conftest.log <<EOF
1080 Platform:   $ARCH
1081 System:     $SYS
1082 cli:        $cli
1083 libx264:    $cli_libx264
1084 shared:     $shared
1085 static:     $static
1086 asm:        $asm
1087 interlaced: $interlaced
1088 avs:        $avs
1089 lavf:       $lavf
1090 ffms:       $ffms
1091 gpac:       $gpac
1092 gpl:        $gpl
1093 thread:     $thread
1094 filters:    $filters
1095 debug:      $debug
1096 gprof:      $gprof
1097 strip:      $strip
1098 PIC:        $pic
1099 visualize:  $vis
1100 bit depth:  $bit_depth
1101 EOF
1102
1103 echo >> config.log
1104 cat conftest.log >> config.log
1105 cat conftest.log
1106 rm conftest.log
1107
1108 echo
1109 echo "You can run 'make' or 'make fprofiled' now."
1110