]> git.sesse.net Git - x264/blob - configure
7aea31fe025a3d8fdfd9dc20d4807a0ead9b3497
[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 CPU_COUNT"
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     gnu*)
441         SYS="HURD"
442         define HAVE_MALLOC_H
443         LDFLAGS="$LDFLAGS -lm"
444         ;;
445     cygwin*)
446         EXE=".exe"
447         if cc_check "" -mno-cygwin; then
448             CFLAGS="$CFLAGS -mno-cygwin"
449             LDFLAGS="$LDFLAGS -mno-cygwin"
450         fi
451         if cpp_check "" "" "defined(__CYGWIN32__)" ; then
452             define HAVE_MALLOC_H
453             SYS="CYGWIN"
454         else
455             SYS="WINDOWS"
456             DEVNULL="NUL"
457         fi
458         ;;
459     mingw*)
460         SYS="WINDOWS"
461         EXE=".exe"
462         DEVNULL="NUL"
463         ;;
464     sunos*|solaris*)
465         SYS="SunOS"
466         define HAVE_MALLOC_H
467         LDFLAGS="$LDFLAGS -lm"
468         HAVE_GETOPT_LONG=0
469         ;;
470     *)
471         die "Unknown system $host, edit the configure"
472         ;;
473 esac
474
475 case $host_cpu in
476     i*86)
477         ARCH="X86"
478         AS="yasm"
479         ASFLAGS="$ASFLAGS -O2"
480         if [ $compiler = GNU ]; then
481             if [[ "$asm" == auto && "$CFLAGS" != *-march* ]]; then
482                 CFLAGS="$CFLAGS -march=i686"
483             fi
484             if [[ "$asm" == auto && "$CFLAGS" != *-mfpmath* ]]; then
485                 CFLAGS="$CFLAGS -mfpmath=sse -msse"
486             fi
487         else
488             # icc on linux has various degrees of mod16 stack support
489             if [ $SYS = LINUX ]; then
490                 # < 11 is completely incapable of keeping a mod16 stack
491                 if cpp_check "" "" "__INTEL_COMPILER < 1100" ; then
492                     define BROKEN_STACK_ALIGNMENT
493                 # 11 <= x < 12 is capable of keeping a mod16 stack, but defaults to not doing so.
494                 elif cpp_check "" "" "__INTEL_COMPILER < 1200" ; then
495                     CFLAGS="$CFLAGS -falign-stack=assume-16-byte"
496                 fi
497                 # >= 12 defaults to a mod16 stack
498             fi
499             # icl on windows has no mod16 stack support
500             [ $SYS = WINDOWS ] && define BROKEN_STACK_ALIGNMENT
501         fi
502         if [ "$SYS" = MACOSX ]; then
503             ASFLAGS="$ASFLAGS -f macho -DPREFIX"
504         elif [ "$SYS" = WINDOWS -o "$SYS" = CYGWIN ]; then
505             ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
506             LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
507         else
508             ASFLAGS="$ASFLAGS -f elf"
509         fi
510         ;;
511     x86_64)
512         ARCH="X86_64"
513         AS="yasm"
514         if [ "$SYS" = MACOSX ]; then
515             ASFLAGS="$ASFLAGS -f macho64 -m amd64 -DPIC -DPREFIX"
516             if cc_check '' "-arch x86_64"; then
517                 CFLAGS="$CFLAGS -arch x86_64"
518                 LDFLAGS="$LDFLAGS -arch x86_64"
519             fi
520         elif [ "$SYS" = WINDOWS ]; then
521             ASFLAGS="$ASFLAGS -f win32 -m amd64"
522             # only the GNU toolchain is inconsistent in prefixing function names with _
523             [ $compiler = GNU ] && cc_check "" "-S" && grep -q "_main:" conftest && ASFLAGS="$ASFLAGS -DPREFIX"
524         else
525             ASFLAGS="$ASFLAGS -f elf -m amd64"
526         fi
527         ;;
528     powerpc|powerpc64)
529         ARCH="PPC"
530         if [ $asm = auto ] ; then
531             define HAVE_ALTIVEC
532             AS="${AS-${cross_prefix}gcc}"
533             if [ $SYS = MACOSX ] ; then
534                 CFLAGS="$CFLAGS -faltivec -fastf -mcpu=G4"
535             else
536                 CFLAGS="$CFLAGS -maltivec -mabi=altivec"
537                 define HAVE_ALTIVEC_H
538             fi
539         fi
540         ;;
541     sparc)
542         ARCH="SPARC"
543         case $(uname -m) in
544             sun4u|sun4v)
545                 if [ $asm = auto ]; then
546                     ARCH="UltraSPARC"
547                     if ! echo $CFLAGS | grep -Eq '\-mcpu' ; then
548                         CFLAGS="$CFLAGS -mcpu=ultrasparc"
549                         LDFLAGS="$LDFLAGS -mcpu=ultrasparc"
550                     fi
551                     AS="${AS-${cross_prefix}as}"
552                     ASFLAGS="$ASFLAGS -xarch=v8plusa"
553                 fi
554                 ;;
555         esac
556         ;;
557     mips|mipsel|mips64|mips64el)
558         ARCH="MIPS"
559         ;;
560     arm*)
561         ARCH="ARM"
562         if [ "$SYS" = MACOSX ] ; then
563             AS="${AS-extras/gas-preprocessor.pl $CC}"
564             ASFLAGS="$ASFLAGS -DPREFIX -DPIC"  # apple's ld doesn't support movw/movt relocations at all
565             # build for armv7 by default
566             if ! echo $CFLAGS | grep -Eq '\-arch' ; then
567                 CFLAGS="$CFLAGS -arch armv7"
568                 LDFLAGS="$LDFLAGS -arch armv7"
569             fi
570         else
571             AS="${AS-${cross_prefix}gcc}"
572         fi
573         ;;
574     s390|s390x)
575         ARCH="S390"
576         ;;
577     parisc|parisc64)
578         ARCH="PARISC"
579         ;;
580     ia64)
581         ARCH="IA64"
582         ;;
583     *)
584         ARCH="$(echo $host_cpu | tr a-z A-Z)"
585         ;;
586 esac
587
588 log_msg "x264 configure script"
589 if [ -n "$*" ]; then
590     msg="Command line options:"
591     for i in $@; do
592         msg="$msg \"$i\""
593     done
594     log_msg "$msg"
595 fi
596 log_msg ""
597
598 # check requirements
599
600 cc_check || die "No working C compiler found."
601
602 if [ $compiler != ICL ]; then
603     if cc_check '' -std=gnu99 'for( int i = 0; i < 9; i++ );' ; then
604         CFLAGS="$CFLAGS -std=gnu99"
605     elif cc_check '' -std=c99 'for( int i = 0; i < 9; i++ );' ; then
606         CFLAGS="$CFLAGS -std=c99 -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE"
607     elif ! cc_check '' '' 'for( int i = 0; i < 9; i++ );' ; then
608         die "C99 compiler is needed for compilation."
609     fi
610 fi
611
612 if [ $shared = yes -a \( $ARCH = "X86_64" -o $ARCH = "PPC" -o $ARCH = "ALPHA" -o $ARCH = "ARM" -o $ARCH = "IA64" \) ] ; then
613     pic="yes"
614 fi
615
616 if [ $asm = auto -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then
617     if ! as_check "vpaddw xmm0, xmm0, xmm0" ; then
618         VER=`($AS --version || echo no assembler) 2>/dev/null | head -n 1`
619         echo "Found $VER"
620         echo "Minimum version is yasm-0.7.0"
621         echo "If you really want to compile without asm, configure with --disable-asm."
622         exit 1
623     fi
624     if ! cc_check '' '' '__asm__("pabsw %xmm0, %xmm0");' ; then
625         VER=`(${cross_prefix}as --version || echo no gnu as) 2>/dev/null | head -n 1`
626         echo "Found $VER"
627         echo "Minimum version is binutils-2.17"
628         echo "Your compiler can't handle inline SSSE3 asm."
629         echo "If you really want to compile without asm, configure with --disable-asm."
630         exit 1
631     fi
632     define HAVE_MMX
633 fi
634
635 if [ $asm = auto -a $ARCH = ARM ] ; then
636     # set flags so neon is built by default
637     echo $CFLAGS | grep -Eq '(-mcpu|-march|-mfpu)' || CFLAGS="$CFLAGS -mcpu=cortex-a8 -mfpu=neon"
638
639     if  cc_check '' '' '__asm__("rev ip, ip");' ; then      define HAVE_ARMV6
640         cc_check '' '' '__asm__("movt r0, #0");'         && define HAVE_ARMV6T2
641         cc_check '' '' '__asm__("vadd.i16 q0, q0, q0");' && define HAVE_NEON
642         ASFLAGS="$ASFLAGS $CFLAGS -c"
643     else
644         echo "You specified a pre-ARMv6 or Thumb-1 CPU in your CFLAGS."
645         echo "If you really want to run on such a CPU, configure with --disable-asm."
646         exit 1
647     fi
648 fi
649
650 [ $asm = no ] && AS=""
651 [ "x$AS" = x ] && asm="no" || asm="yes"
652
653 define ARCH_$ARCH
654 define SYS_$SYS
655
656 # skip endianness check for Intel Compiler, as all supported platforms are little. the -ipo flag will also cause the check to fail
657 if [ $compiler = GNU ]; then
658     echo "int i[2] = {0x42494745,0}; double f[2] = {0x1.0656e6469616ep+102,0};" > conftest.c
659     $CC $CFLAGS conftest.c -c -o conftest.o 2>/dev/null || die "endian test failed"
660     if (${cross_prefix}strings -a conftest.o | grep -q BIGE) && (${cross_prefix}strings -a conftest.o | grep -q FPendian) ; then
661         define WORDS_BIGENDIAN
662     elif !(${cross_prefix}strings -a conftest.o | grep -q EGIB && ${cross_prefix}strings -a conftest.o | grep -q naidnePF) ; then
663         die "endian test failed"
664     fi
665 fi
666
667 # autodetect options that weren't forced nor disabled
668
669 # pthread-win32 is lgpl, prevent its use if --disable-gpl is specified and targeting windows
670 [ "$SYS" = "WINDOWS" -a "$gpl" = "no" -a "$thread" = "auto" ] && thread="win32"
671
672 libpthread=""
673 if [ "$thread" = "auto" ]; then
674     thread="no"
675     case $SYS in
676         BEOS)
677             thread="beos"
678             define HAVE_BEOSTHREAD
679             ;;
680         WINDOWS)
681             if cc_check pthread.h -lpthread "pthread_create(0,0,0,0);" ; then
682                 thread="posix"
683                 libpthread="-lpthread"
684             elif cc_check pthread.h -lpthreadGC2 "pthread_create(0,0,0,0);" ; then
685                 thread="posix"
686                 libpthread="-lpthreadGC2"
687             elif cc_check pthread.h "-lpthreadGC2 -lwsock32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
688                 thread="posix"
689                 libpthread="-lpthreadGC2 -lwsock32"
690                 define PTW32_STATIC_LIB
691             elif cc_check pthread.h "-lpthreadGC2 -lws2_32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
692                 thread="posix"
693                 libpthread="-lpthreadGC2 -lws2_32"
694                 define PTW32_STATIC_LIB
695             else
696                 # default to native threading if pthread-win32 is unavailable
697                 thread="win32"
698             fi
699             ;;
700         OPENBSD)
701             cc_check pthread.h -pthread && thread="posix" && libpthread="-pthread"
702             ;;
703         *)
704             cc_check pthread.h -lpthread && thread="posix" && libpthread="-lpthread"
705             ;;
706     esac
707 fi
708 if [ "$thread" = "posix" ]; then
709     LDFLAGS="$LDFLAGS $libpthread"
710     define HAVE_POSIXTHREAD
711     if [ "$SYS" = "LINUX" ] && cc_check sched.h "-D_GNU_SOURCE -Werror" "cpu_set_t p_aff; return CPU_COUNT(&p_aff);" ; then
712         define HAVE_CPU_COUNT
713     fi
714 fi
715 if [ "$thread" = "win32" ]; then
716     # cygwin does not support win32 threads
717     if [ "$SYS" = "WINDOWS" ]; then
718         define HAVE_WIN32THREAD
719     else
720         thread="no"
721     fi
722 fi
723 [ "$thread" != "no" ] && define HAVE_THREAD
724
725 if cc_check "math.h" "-Werror" "return log2f(2);" ; then
726     define HAVE_LOG2F
727 fi
728
729 if [ "$vis" = "yes" ] ; then
730     save_CFLAGS="$CFLAGS"
731     CFLAGS="$CFLAGS -I/usr/X11R6/include"
732     if cc_check "X11/Xlib.h" "-L/usr/X11R6/lib -lX11" "XOpenDisplay(0);" ; then
733         LDFLAGS="-L/usr/X11R6/lib -lX11 $LDFLAGS"
734         define HAVE_VISUALIZE
735     else
736         vis="no"
737         CFLAGS="$save_CFLAGS"
738    fi
739 fi
740
741 if [ "$swscale" = "auto" ] ; then
742     swscale="no"
743     if ${cross_prefix}pkg-config --exists libswscale 2>/dev/null; then
744         SWSCALE_LIBS="$SWSCALE_LIBS $(${cross_prefix}pkg-config --libs libswscale libavutil)"
745         SWSCALE_CFLAGS="$SWSCALE_CFLAGS $(${cross_prefix}pkg-config --cflags libswscale libavutil)"
746     fi
747     [ -z "$SWSCALE_LIBS" ] && SWSCALE_LIBS="-lswscale -lavutil"
748
749     if cc_check "libswscale/swscale.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "sws_init_context(0,0,0);" ; then
750         if cc_check "libavutil/pixdesc.h" "$SWSCALE_CFLAGS $SWSCALE_LIBS" "av_get_pix_fmt_name(0);" ; then
751             swscale="yes"
752         else
753             echo "Warning: av_get_pix_fmt_name is missing from libavutil, update for swscale support"
754         fi
755     fi
756 fi
757
758 if [ "$lavf" = "auto" ] ; then
759     lavf="no"
760     if ${cross_prefix}pkg-config --exists libavformat libavcodec libswscale 2>/dev/null; then
761         LAVF_LIBS="$LAVF_LIBS $(${cross_prefix}pkg-config --libs libavformat libavcodec libavutil libswscale)"
762         LAVF_CFLAGS="$LAVF_CFLAGS $(${cross_prefix}pkg-config --cflags libavformat libavcodec libavutil libswscale)"
763     fi
764     if [ -z "$LAVF_LIBS" -a -z "$LAVF_CFLAGS" ]; then
765         LAVF_LIBS="-lavformat"
766         for lib in -lpostproc -lavcodec -lavcore -lswscale -lavutil -lm -lz -lbz2 $libpthread -lavifil32; do
767             cc_check "" $lib && LAVF_LIBS="$LAVF_LIBS $lib"
768         done
769     fi
770     LAVF_LIBS="-L. $LAVF_LIBS"
771     if cc_check libavformat/avformat.h "$LAVF_CFLAGS $LAVF_LIBS" "avformat_find_stream_info(0,0); avcodec_open2(0,0,0);" ; then
772         if [ "$swscale" = "yes" ]; then
773             lavf="yes"
774         else
775             echo "Warning: libavformat is not supported without swscale support"
776         fi
777     fi
778 fi
779
780 if [ "$ffms" = "auto" ] ; then
781     ffms_major="2"; ffms_minor="14"; ffms_micro="0"; ffms_bump="0"
782     ffms="no"
783
784     if ${cross_prefix}pkg-config --exists ffms2 2>/dev/null; then
785         FFMS2_LIBS="$FFMS2_LIBS $(${cross_prefix}pkg-config --libs ffms2)"
786         FFMS2_CFLAGS="$FFMS2_CFLAGS $(${cross_prefix}pkg-config --cflags ffms2)"
787     fi
788     [ -z "$FFMS2_LIBS" ] && FFMS2_LIBS="-lffms2"
789
790     if cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS" "FFMS_DestroyVideoSource(0);" ; then
791         ffms="yes"
792     elif cc_check ffms.h "$FFMS2_CFLAGS $FFMS2_LIBS -lstdc++ $LAVF_LIBS" "FFMS_DestroyVideoSource(0);" ; then
793         ffms="yes"
794         FFMS2_LIBS="$FFMS2_LIBS -lstdc++ $LAVF_LIBS"
795     fi
796
797     error="ffms must be at least version $ffms_major.$ffms_minor.$ffms_micro.$ffms_bump"
798     if [ $ffms = "yes" ] && ! cpp_check "ffms.h" "$FFMS2_CFLAGS" "FFMS_VERSION >= (($ffms_major << 24) | ($ffms_minor << 16) | ($ffms_micro << 8) | $ffms_bump)" "$error"; then
799        ffms="no"
800        echo "Warning: $error"
801     fi
802     if [ "$ffms" = "yes" -a "$swscale" = "no" ]; then
803         echo "Warning: ffms is not supported without swscale support"
804         ffms="no"
805     fi
806 fi
807
808 if [ "$swscale" = "yes" ]; then
809     LDFLAGSCLI="$SWSCALE_LIBS $LDFLAGSCLI"
810     CFLAGS="$CFLAGS $SWSCALE_CFLAGS"
811     define HAVE_SWSCALE
812     if [ "$lavf" = "yes" ]; then
813         LDFLAGSCLI="$LAVF_LIBS $LDFLAGSCLI"
814         CFLAGS="$CFLAGS $LAVF_CFLAGS"
815         define HAVE_LAVF
816     fi
817     if [ "$ffms" = "yes" ]; then
818         LDFLAGSCLI="$FFMS2_LIBS $LDFLAGSCLI"
819         CFLAGS="$CFLAGS $FFMS2_CFLAGS"
820         define HAVE_FFMS
821     fi
822 fi
823
824 if [ "$gpac" = "auto" ] ; then
825     gpac="no"
826     cc_check "" -lz && GPAC_LIBS="-lgpac_static -lz" || GPAC_LIBS="-lgpac_static"
827     if [ "$SYS" = "WINDOWS" ] ; then
828         GPAC_LIBS="$GPAC_LIBS -lwinmm"
829     fi
830     if cc_check gpac/isomedia.h "$GPAC_LIBS" ; then
831         if cc_check gpac/isomedia.h "$GPAC_LIBS" "gf_isom_set_pixel_aspect_ratio(0,0,0,0,0);" ; then
832             gpac="yes"
833         else
834             echo "Warning: gpac is too old, update to 2007-06-21 UTC or later"
835         fi
836     fi
837 fi
838 if [ "$gpac" = "yes" ] ; then
839     define HAVE_GPAC
840     if cc_check gpac/isomedia.h "-Werror $GPAC_LIBS" "gf_malloc(1); gf_free(NULL);" ; then
841         define HAVE_GF_MALLOC
842     fi
843     LDFLAGSCLI="$GPAC_LIBS $LDFLAGSCLI"
844 fi
845
846 if [ "$avs" = "auto" ] ; then
847     avs="no"
848     # cygwin can use avisynth if it can use LoadLibrary
849     if [ $SYS = WINDOWS ] || ([ $SYS = CYGWIN ] && cc_check windows.h "" "LoadLibrary(0);") ; then
850         avs="yes"
851         define HAVE_AVS
852     fi
853 fi
854
855 cc_check "stdint.h" "" "uint32_t test_vec __attribute__ ((vector_size (16))) = {0,1,2,3};" && define HAVE_VECTOREXT
856
857 if [ "$pic" = "yes" ] ; then
858     CFLAGS="$CFLAGS -fPIC"
859     ASFLAGS="$ASFLAGS -DPIC"
860     # resolve textrels in the x86 asm
861     cc_check stdio.h -Wl,-Bsymbolic && LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
862 fi
863
864 if [ "$debug" != "yes" -a "$gprof" != "yes" ]; then
865     CFLAGS="$CFLAGS -fomit-frame-pointer"
866 fi
867
868 if [ "$strip" = "yes" ]; then
869     CFLAGS="$CFLAGS -s"
870     LDFLAGS="$LDFLAGS -s"
871 fi
872
873 if [ "$debug" = "yes" ]; then
874     CFLAGS="-O1 -g $CFLAGS"
875 elif [ $ARCH = ARM ]; then
876     # arm-gcc-4.2 produces incorrect output with -ffast-math
877     # and it doesn't save any speed anyway on 4.4, so disable it
878     CFLAGS="-O3 -fno-fast-math $CFLAGS"
879 else
880     CFLAGS="-O3 -ffast-math $CFLAGS"
881 fi
882
883 if cc_check '' -fno-tree-vectorize ; then
884     CFLAGS="$CFLAGS -fno-tree-vectorize"
885 fi
886
887 if [ $SYS = WINDOWS -a $ARCH = X86 -a $compiler = GNU ] ; then
888     # workaround gcc/ld bug with alignment of static variables/arrays that are initialized to zero
889     cc_check '' -fno-zero-initialized-in-bss && CFLAGS="$CFLAGS -fno-zero-initialized-in-bss"
890 fi
891
892 if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then
893     define fseek fseeko
894     define ftell ftello
895 elif cc_check "stdio.h" "" "fseeko64(stdin,0,0);" ; then
896     define fseek fseeko64
897     define ftell ftello64
898 elif cc_check "stdio.h" "" "_fseeki64(stdin,0,0);" ; then
899     define fseek _fseeki64
900     define ftell _ftelli64
901 fi
902
903 if cc_check '' -Wshadow ; then
904     CFLAGS="-Wshadow $CFLAGS"
905 fi
906
907 if [ "$bit_depth" -gt "8" ]; then
908     define HIGH_BIT_DEPTH
909     ASFLAGS="$ASFLAGS -DHIGH_BIT_DEPTH"
910 fi
911
912 ASFLAGS="$ASFLAGS -DBIT_DEPTH=$bit_depth"
913
914 [ $gpl = yes ] && define HAVE_GPL && x264_gpl=1 || x264_gpl=0
915
916 [ $interlaced = yes ] && define HAVE_INTERLACED && x264_interlaced=1 || x264_interlaced=0
917
918 #define undefined vars as 0
919 for var in $CONFIG_HAVE; do
920     grep -q "HAVE_$var 1" config.h || define HAVE_$var 0
921 done
922
923 if [ $compiler = ICL ]; then
924     AR="xilib -nologo -out:"
925     DEPMM=-QMM
926     DEPMT=-QMT
927     HAVE_GETOPT_LONG=0
928     LD="xilink -out:"
929     LDFLAGS="-nologo -incremental:no $(icl_ldflags $LDFLAGS)"
930     LDFLAGSCLI="$(icl_ldflags $LDFLAGSCLI)"
931     LIBX264=libx264.lib
932     RANLIB=
933     STRIP=
934     if [ $debug = yes ]; then
935         LDFLAGS="-debug $LDFLAGS"
936         CFLAGS="-D_DEBUG $CFLAGS"
937     else
938         CFLAGS="-DNDEBUG $CFLAGS"
939     fi
940 else
941     AR="$AR rc "
942     DEPMM="-MM -g0"
943     DEPMT="-MT"
944     LD="$CC -o "
945     LIBX264=libx264.a
946 fi
947 if [ $compiler = GNU ]; then
948     PROF_GEN_CC="-fprofile-generate"
949     PROF_GEN_LD="-fprofile-generate"
950     PROF_USE_CC="-fprofile-use"
951     PROF_USE_LD="-fprofile-use"
952 else
953     CFLAGS="$(intel_cflags $CFLAGS)"
954     # icc does not define __SSE__ until SSE2 optimization and icl never defines it or _M_IX86_FP
955     [ \( $ARCH = X86_64 -o $ARCH = X86 \) -a $asm = yes ] && ! cpp_check "" "" "defined(__SSE__)" && define __SSE__
956     PROF_GEN_CC="${QPRE}prof-gen ${QPRE}prof-dir."
957     PROF_GEN_LD=
958     PROF_USE_CC="${QPRE}prof-use ${QPRE}prof-dir."
959     PROF_USE_LD=
960 fi
961
962 rm -f conftest*
963
964 # generate exported config file
965
966 cat > x264_config.h << EOF
967 #define X264_BIT_DEPTH  $bit_depth
968 #define X264_GPL        $x264_gpl
969 #define X264_INTERLACED $x264_interlaced
970 EOF
971
972 # generate config files
973
974 cat > config.mak << EOF
975 prefix=$prefix
976 exec_prefix=$exec_prefix
977 bindir=$bindir
978 libdir=$libdir
979 includedir=$includedir
980 ARCH=$ARCH
981 SYS=$SYS
982 CC=$CC
983 CFLAGS=$CFLAGS
984 DEPMM=$DEPMM
985 DEPMT=$DEPMT
986 LD=$LD
987 LDFLAGS=$LDFLAGS
988 LIBX264=$LIBX264
989 AR=$AR
990 RANLIB=$RANLIB
991 STRIP=$STRIP
992 AS=$AS
993 ASFLAGS=$ASFLAGS
994 EXE=$EXE
995 HAVE_GETOPT_LONG=$HAVE_GETOPT_LONG
996 DEVNULL=$DEVNULL
997 PROF_GEN_CC=$PROF_GEN_CC
998 PROF_GEN_LD=$PROF_GEN_LD
999 PROF_USE_CC=$PROF_USE_CC
1000 PROF_USE_LD=$PROF_USE_LD
1001 EOF
1002
1003 if [ $compiler = ICL ]; then
1004     echo '%.o: %.c' >> config.mak
1005     echo '      $(CC) $(CFLAGS) -c -Fo$@ $<' >> config.mak
1006 fi
1007
1008 if [ "$cli" = "yes" ]; then
1009     echo 'default: cli' >> config.mak
1010     echo 'install: install-cli' >> config.mak
1011 fi
1012
1013 if [ "$shared" = "yes" ]; then
1014     API=$(grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' ')
1015     if [ "$SYS" = "WINDOWS" -o "$SYS" = "CYGWIN" ]; then
1016         echo "SONAME=libx264-$API.dll" >> config.mak
1017         if [ $compiler = ICL ]; then
1018             echo 'IMPLIBNAME=libx264.dll.lib' >> config.mak
1019             # GNU ld on windows defaults to exporting all global functions if there are no explicit __declspec(dllexport) declarations
1020             # 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
1021             echo 'SOFLAGS=-dll -def:x264.def -implib:$(IMPLIBNAME)' >> config.mak
1022             echo "EXPORTS" > x264.def
1023             grep "^\(int\|void\|x264_t\|extern\).*x264.*[\[(;]" x264.h | sed -e "s/.*\(x264.*\)[\[(].*/\1/;s/.*\(x264.*\);/\1/;s/open/open_$API/g" >> x264.def
1024         else
1025             echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
1026             echo 'SOFLAGS=-shared -Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
1027         fi
1028     elif [ "$SYS" = "MACOSX" ]; then
1029         echo "SOSUFFIX=dylib" >> config.mak
1030         echo "SONAME=libx264.$API.dylib" >> config.mak
1031         echo 'SOFLAGS=-shared -dynamiclib -Wl,-single_module -Wl,-read_only_relocs,suppress -install_name $(DESTDIR)$(libdir)/$(SONAME)' >> config.mak
1032     elif [ "$SYS" = "SunOS" ]; then
1033         echo "SOSUFFIX=so" >> config.mak
1034         echo "SONAME=libx264.so.$API" >> config.mak
1035         echo 'SOFLAGS=-shared -Wl,-h,$(SONAME)' >> config.mak
1036     else
1037         echo "SOSUFFIX=so" >> config.mak
1038         echo "SONAME=libx264.so.$API" >> config.mak
1039         echo 'SOFLAGS=-shared -Wl,-soname,$(SONAME)' >> config.mak
1040     fi
1041     echo 'default: lib-shared' >> config.mak
1042     echo 'install: install-lib-shared' >> config.mak
1043 fi
1044
1045 if [ "$static" = "yes" ]; then
1046     echo 'default: lib-static' >> config.mak
1047     echo 'install: install-lib-static' >> config.mak
1048 fi
1049
1050 if [ "$cli_libx264" = "system" ] ; then
1051     if [ "$shared" = "yes" ]; then
1052         CLI_LIBX264='$(SONAME)'
1053     elif ${cross_prefix}pkg-config --exists x264 2>/dev/null; then
1054         LDFLAGSCLI="$LDFLAGSCLI $(${cross_prefix}pkg-config --libs x264)"
1055         CLI_LIBX264=
1056     else
1057         die "Can not find system libx264"
1058     fi
1059 else
1060     CLI_LIBX264='$(LIBX264)'
1061 fi
1062 echo "LDFLAGSCLI = $LDFLAGSCLI" >> config.mak
1063 echo "CLI_LIBX264 = $CLI_LIBX264" >> config.mak
1064
1065 ./version.sh >> x264_config.h
1066
1067 pclibs="-L$libdir -lx264 $libpthread"
1068
1069 cat > x264.pc << EOF
1070 prefix=$prefix
1071 exec_prefix=$exec_prefix
1072 libdir=$libdir
1073 includedir=$includedir
1074
1075 Name: x264
1076 Description: H.264 (MPEG4 AVC) encoder library
1077 Version: $(grep POINTVER < x264_config.h | sed -e 's/.* "//; s/".*//')
1078 Libs: $pclibs
1079 Cflags: -I$includedir
1080 EOF
1081
1082 filters="crop select_every"
1083 gpl_filters=""
1084 [ $swscale = yes ] && filters="resize $filters"
1085 [ $gpl = yes ] && filters="$filters $gpl_filters"
1086
1087 cat > conftest.log <<EOF
1088 Platform:   $ARCH
1089 System:     $SYS
1090 cli:        $cli
1091 libx264:    $cli_libx264
1092 shared:     $shared
1093 static:     $static
1094 asm:        $asm
1095 interlaced: $interlaced
1096 avs:        $avs
1097 lavf:       $lavf
1098 ffms:       $ffms
1099 gpac:       $gpac
1100 gpl:        $gpl
1101 thread:     $thread
1102 filters:    $filters
1103 debug:      $debug
1104 gprof:      $gprof
1105 strip:      $strip
1106 PIC:        $pic
1107 visualize:  $vis
1108 bit depth:  $bit_depth
1109 EOF
1110
1111 echo >> config.log
1112 cat conftest.log >> config.log
1113 cat conftest.log
1114 rm conftest.log
1115
1116 echo
1117 echo "You can run 'make' or 'make fprofiled' now."
1118