]> git.sesse.net Git - x264/blob - configure
Fix free callback, add x264_encoder_parameters function
[x264] / configure
1 #!/bin/bash
2
3 if test x"$1" = x"-h" -o x"$1" = x"--help" ; then
4
5 echo "Usage: ./configure [options]"
6 echo ""
7 echo "available options:"
8 echo ""
9 echo "  --help                   print this message"
10 echo "  --disable-avs-input      disables avisynth input (win32 only)"
11 echo "  --disable-lavf-input     disables libavformat input"
12 echo "  --disable-ffms-input     disables ffmpegsource input"
13 echo "  --disable-mp4-output     disables mp4 output (using gpac)"
14 echo "  --disable-pthread        disables multithreaded encoding"
15 echo "  --disable-asm            disables assembly optimizations on x86 and arm"
16 echo "  --enable-debug           adds -g, doesn't strip"
17 echo "  --enable-gprof           adds -pg, doesn't strip"
18 echo "  --enable-visualize       enables visualization (X11 only)"
19 echo "  --enable-pic             build position-independent code"
20 echo "  --enable-shared          build libx264.so"
21 echo "  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS"
22 echo "  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS"
23 echo "  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS"
24 echo "  --host=HOST              build programs to run on HOST"
25 echo "  --cross-prefix=PREFIX    use PREFIX for compilation tools"
26 echo ""
27 exit 1
28 fi
29
30 cc_check() {
31     rm -f conftest.c
32     [ -n "$1" ] && echo "#include <$1>" > conftest.c
33     echo "int main () { $3 return 0; }" >> conftest.c
34     $CC conftest.c $CFLAGS $LDFLAGS $LDFLAGSCLI $2 -o conftest 2>$DEVNULL
35 }
36
37 as_check() {
38     echo "$1" > conftest.asm
39     $AS conftest.asm $ASFLAGS $2 -o conftest.o 2>$DEVNULL
40 }
41
42 die() {
43     echo "$@"
44     exit 1
45 }
46
47 rm -f config.h config.mak x264.pc conftest*
48
49 prefix='/usr/local'
50 exec_prefix='${prefix}'
51 bindir='${exec_prefix}/bin'
52 libdir='${exec_prefix}/lib'
53 includedir='${prefix}/include'
54 DEVNULL='/dev/null'
55
56 avs_input="auto"
57 lavf_input="auto"
58 ffms_input="auto"
59 mp4_output="auto"
60 pthread="auto"
61 asm="yes"
62 debug="no"
63 gprof="no"
64 pic="no"
65 vis="no"
66 shared="no"
67
68 CFLAGS="$CFLAGS -Wall -I."
69 LDFLAGS="$LDFLAGS"
70 LDFLAGSCLI="$LDFLAGSCLI"
71 ASFLAGS="$ASFLAGS"
72 HAVE_GETOPT_LONG=1
73 cross_prefix=""
74
75 EXE=""
76
77 # parse options
78
79 for opt do
80     optarg="${opt#*=}"
81     case "$opt" in
82         --prefix=*)
83             prefix="$optarg"
84             ;;
85         --exec-prefix=*)
86             exec_prefix="$optarg"
87             ;;
88         --bindir=*)
89             bindir="$optarg"
90             ;;
91         --libdir=*)
92             libdir="$optarg"
93             ;;
94         --includedir=*)
95             includedir="$optarg"
96             ;;
97         --enable-asm)
98             asm="yes"
99             ;;
100         --disable-asm)
101             asm="no"
102             ;;
103         --enable-avs-input)
104             avs_input="auto"
105             ;;
106         --disable-avs-input)
107             avs_input="no"
108             ;;
109         --enable-lavf-input)
110             lavf_input="auto"
111             ;;
112         --disable-lavf-input)
113             lavf_input="no"
114             ;;
115         --enable-ffms-input)
116             ffms_input="auto"
117             ;;
118         --disable-ffms-input)
119             ffms_input="no"
120             ;;
121         --enable-mp4-output)
122             mp4_output="yes"
123             ;;
124         --disable-mp4-output)
125             mp4_output="no"
126             ;;
127         --extra-asflags=*)
128             ASFLAGS="$ASFLAGS ${opt#--extra-asflags=}"
129             ;;
130         --extra-cflags=*)
131             CFLAGS="$CFLAGS ${opt#--extra-cflags=}"
132             ;;
133         --extra-ldflags=*)
134             LDFLAGS="$LDFLAGS ${opt#--extra-ldflags=}"
135             ;;
136         --enable-pthread)
137             pthread="auto" # can't skip detection, since it differs by OS
138             ;;
139         --disable-pthread)
140             pthread="no"
141             ;;
142         --enable-debug)
143             debug="yes"
144             ;;
145         --enable-gprof)
146             CFLAGS="$CFLAGS -pg"
147             LDFLAGS="$LDFLAGS -pg"
148             gprof="yes"
149             ;;
150         --enable-pic)
151             pic="yes"
152             ;;
153         --enable-shared)
154             shared="yes"
155             ;;
156         --enable-visualize)
157             LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11"
158             CFLAGS="$CFLAGS -DVISUALIZE=1"
159             vis="yes"
160             ;;
161         --host=*)
162             host="${opt#--host=}"
163             ;;
164         --cross-prefix=*)
165             cross_prefix="${opt#--cross-prefix=}"
166             ;;
167         *)
168             echo "Unknown option $opt, ignored"
169             ;;
170     esac
171 done
172
173 CC="${CC-${cross_prefix}gcc}"
174 AR="${AR-${cross_prefix}ar}"
175 RANLIB="${RANLIB-${cross_prefix}ranlib}"
176 STRIP="${STRIP-${cross_prefix}strip}"
177
178 if [ "x$host" = x ]; then
179     host=`./config.guess`
180 fi
181 # normalize a triplet into a quadruplet
182 host=`./config.sub $host`
183
184 # split $host
185 host_cpu="${host%%-*}"
186 host="${host#*-}"
187 host_vendor="${host%%-*}"
188 host_os="${host#*-}"
189
190 case $host_os in
191   beos*)
192     SYS="BEOS"
193     CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
194     ;;
195   darwin*)
196     SYS="MACOSX"
197     CFLAGS="$CFLAGS -falign-loops=16"
198     LDFLAGS="$LDFLAGS -lm"
199     if [ "$pic" = "no" ]; then
200         cc_check "" -mdynamic-no-pic && CFLAGS="$CFLAGS -mdynamic-no-pic"
201     fi
202     ;;
203   freebsd*)
204     SYS="FREEBSD"
205     LDFLAGS="$LDFLAGS -lm"
206     ;;
207   kfreebsd*-gnu)
208     SYS="FREEBSD"
209     CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
210     LDFLAGS="$LDFLAGS -lm"
211     ;;
212   netbsd*)
213     SYS="NETBSD"
214     LDFLAGS="$LDFLAGS -lm"
215     ;;
216   openbsd*)
217     SYS="OPENBSD"
218     CFLAGS="$CFLAGS -I/usr/X11R6/include"
219     LDFLAGS="$LDFLAGS -lm"
220     ;;
221   *linux*)
222     SYS="LINUX"
223     CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
224     LDFLAGS="$LDFLAGS -lm"
225     ;;
226   cygwin*)
227     SYS="MINGW"
228     EXE=".exe"
229     DEVNULL="NUL"
230     if cc_check "" -mno-cygwin; then
231         CFLAGS="$CFLAGS -mno-cygwin"
232         LDFLAGS="$LDFLAGS -mno-cygwin"
233     fi
234     ;;
235   mingw*)
236     SYS="MINGW"
237     EXE=".exe"
238     DEVNULL="NUL"
239     ;;
240   sunos*|solaris*)
241     SYS="SunOS"
242     CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
243     LDFLAGS="$LDFLAGS -lm"
244     HAVE_GETOPT_LONG=0
245     ;;
246   *)
247     die "Unknown system $host, edit the configure"
248     ;;
249 esac
250
251 case $host_cpu in
252   i*86)
253     ARCH="X86"
254     AS="yasm"
255     ASFLAGS="$ASFLAGS -O2"
256     if [[ "$asm" == yes && "$CFLAGS" != *-march* ]]; then
257       CFLAGS="$CFLAGS -march=i686"
258     fi
259     if [[ "$asm" == yes && "$CFLAGS" != *-mfpmath* ]]; then
260       CFLAGS="$CFLAGS -mfpmath=sse -msse"
261     fi
262     if [ "$SYS" = MACOSX ]; then
263       ASFLAGS="$ASFLAGS -f macho -DPREFIX"
264     elif [ "$SYS" = MINGW ]; then
265       ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
266     else
267       ASFLAGS="$ASFLAGS -f elf"
268     fi
269     ;;
270   x86_64)
271     ARCH="X86_64"
272     AS="yasm"
273     if [ "$SYS" = MACOSX ];then
274       ASFLAGS="$ASFLAGS -f macho64 -m amd64 -DPIC -DPREFIX"
275       if cc_check '' "-arch x86_64"; then
276         CFLAGS="$CFLAGS -arch x86_64"
277         LDFLAGS="$LDFLAGS -arch x86_64"
278       fi
279     elif [ "$SYS" = MINGW ]; then
280       ASFLAGS="$ASFLAGS -f win32 -m amd64 -DPREFIX"
281     else
282       ASFLAGS="$ASFLAGS -f elf -m amd64"
283     fi
284     ;;
285   powerpc|powerpc64)
286     ARCH="PPC"
287     if [ $SYS = MACOSX ]
288     then
289       CFLAGS="$CFLAGS -faltivec -fastf -mcpu=G4"
290     else
291       CFLAGS="$CFLAGS -maltivec -mabi=altivec -DHAVE_ALTIVEC_H"
292     fi
293     ;;
294   sparc)
295     if test "$(uname -m)" = "sun4u"; then
296       ARCH="UltraSparc"
297       CFLAGS="$CFLAGS -mcpu=ultrasparc"
298       LDFLAGS="$LDFLAGS -mcpu=ultrasparc"
299       AS="${cross_prefix}as"
300       ASFLAGS="$ASFLAGS -xarch=v8plusa"
301     else
302       ARCH="Sparc"
303     fi
304     ;;
305   mips|mipsel|mips64|mips64el)
306     ARCH="MIPS"
307     ;;
308   arm*)
309     ARCH="ARM"
310     AS="${AS-${cross_prefix}gcc}"
311     ;;
312   s390|s390x)
313     ARCH="S390"
314     ;;
315   parisc|parisc64)
316     ARCH="PARISC"
317     ;;
318   *)
319     ARCH="$(echo $host_cpu | tr a-z A-Z)"
320     ;;
321 esac
322
323 # check requirements
324
325 cc_check || die "No working C compiler found."
326
327 if [ $shared = yes -a \( $ARCH = "X86_64" -o $ARCH = "PPC" -o $ARCH = "ALPHA" -o $ARCH = "ARM" \) ] ; then
328     pic="yes"
329 fi
330
331 if [ $asm = yes -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then
332     if ! as_check "lzcnt eax, eax" ; then
333         VER=`($AS --version || echo no assembler) 2>$DEVNULL | head -n 1`
334         echo "Found $VER"
335         echo "Minimum version is yasm-0.6.2"
336         echo "If you really want to compile without asm, configure with --disable-asm."
337         exit 1
338     fi
339     if ! cc_check '' '' 'asm("pabsw %xmm0, %xmm0");' ; then
340         VER=`(as --version || echo no gnu as) 2>$DEVNULL | head -n 1`
341         echo "Found $VER"
342         echo "Minimum version is binutils-2.17"
343         echo "Your compiler can't handle inline SSSE3 asm."
344         echo "If you really want to compile without asm, configure with --disable-asm."
345         exit 1
346     fi
347     CFLAGS="$CFLAGS -DHAVE_MMX"
348 fi
349
350 if [ $asm = yes -a $ARCH = ARM ] ; then
351     # set flags so neon is built by default
352     echo $CFLAGS | grep -Eq '(-mcpu|-march|-mfpu|-mfloat-abi)' || CFLAGS="$CFLAGS -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp"
353
354     if  cc_check '' '' 'asm("rev ip, ip");' ; then      CFLAGS="$CFLAGS -DHAVE_ARMV6"
355         cc_check '' '' 'asm("movt r0, #0");'         && CFLAGS="$CFLAGS -DHAVE_ARMV6T2"
356         cc_check '' '' 'asm("vadd.i16 q0, q0, q0");' && CFLAGS="$CFLAGS -DHAVE_NEON"
357         ASFLAGS="$ASFLAGS $CFLAGS -c"
358     else
359         echo "You specified a pre-ARMv6 or Thumb-1 CPU in your CFLAGS."
360         echo "If you really want to run on such a CPU, configure with --disable-asm."
361         exit 1
362     fi
363 fi
364
365 [ $asm = no ] && AS=""
366 [ "x$AS" = x ] && asm="no"
367
368 CFLAGS="$CFLAGS -DARCH_$ARCH -DSYS_$SYS"
369
370 echo "int i = 0x42494745; double f = 0x1.0656e6469616ep+102;" > conftest.c
371 $CC $CFLAGS conftest.c -c -o conftest.o 2>$DEVNULL || die "endian test failed"
372 if grep -q BIGE conftest.o && grep -q FPendian conftest.o ; then
373     CFLAGS="$CFLAGS -DWORDS_BIGENDIAN"
374 elif !(grep -q EGIB conftest.o && grep -q naidnePF conftest.o) ; then
375     die "endian test failed"
376 fi
377
378 # autodetect options that weren't forced nor disabled
379
380 libpthread=""
381 if test "$pthread" = "auto" ; then
382     pthread="no"
383     case $SYS in
384         BEOS)
385             pthread="yes"
386             ;;
387         MINGW)
388             if cc_check pthread.h -lpthread "pthread_create(0,0,0,0);" ; then
389                 pthread="yes"
390                 libpthread="-lpthread"
391             elif cc_check pthread.h -lpthreadGC2 "pthread_create(0,0,0,0);" ; then
392                 pthread="yes"
393                 libpthread="-lpthreadGC2"
394             elif cc_check pthread.h "-lpthreadGC2 -lwsock32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
395                 pthread="yes"
396                 libpthread="-lpthreadGC2 -lwsock32"
397                 CFLAGS="$CFLAGS -DPTW32_STATIC_LIB"
398             elif cc_check pthread.h "-lpthreadGC2 -lws2_32 -DPTW32_STATIC_LIB" "pthread_create(0,0,0,0);" ; then
399                 pthread="yes"
400                 libpthread="-lpthreadGC2 -lws2_32"
401                 CFLAGS="$CFLAGS -DPTW32_STATIC_LIB"
402             fi
403             ;;
404         OPENBSD)
405             cc_check pthread.h -pthread && pthread="yes" && libpthread="-pthread"
406             ;;
407         *)
408             cc_check pthread.h -lpthread && pthread="yes" && libpthread="-lpthread"
409             ;;
410     esac
411 fi
412 if test "$pthread" = "yes" ; then
413     CFLAGS="$CFLAGS -DHAVE_PTHREAD"
414     LDFLAGS="$LDFLAGS $libpthread"
415 fi
416
417 if [ "$lavf_input" = "auto" ] ; then
418     lavf_input="no"
419     if [ `pkg-config --exists libavformat libavcodec libswscale 2>$DEVNULL` ] ; then
420         LAVF_LDFLAGS="$LAVF_LDFLAGS $(pkg-config --libs libavformat libavcodec libswscale)"
421         LAVF_CDFLAGS="$LAVF_CFLAGS $(pkg-config --cflags libavformat libavcodec libswscale)"
422     fi
423     if [ -z "$LAVF_LDFLAGS" -a -z "$LAVF_CFLAGS" ]; then
424         LAVF_LDFLAGS="-lavformat -lswscale"
425         for lib in -lpostproc -lavcodec -lavutil -lm -lz -lbz2 $libpthread -lavifil32; do
426             cc_check "" $lib && LAVF_LDFLAGS="$LAVF_LDFLAGS $lib"
427         done
428     fi
429     LAVF_LDFLAGS="-L. $LAVF_LDFLAGS"
430     if cc_check libavformat/avformat.h "$LAVF_CFLAGS $LAVF_LDFLAGS" && \
431        cc_check libswscale/swscale.h "$LAVF_CFLAGS $LAVF_LDFLAGS" ; then
432         # avcodec_decode_video2 is currently the most recently added function that we use; it was added in r18351
433         if cc_check libavformat/avformat.h "$LAVF_CFLAGS $LAVF_LDFLAGS" "avcodec_decode_video2( NULL, NULL, NULL, NULL );" ; then
434             lavf_input="yes"
435             echo "#define LAVF_INPUT" >> config.h
436             LDFLAGSCLI="$LDFLAGSCLI $LAVF_LDFLAGS"
437             [ -n "$LAVF_CFLAGS" ] && CFLAGS="$CFLAGS $LAVF_CFLAGS"
438         else
439             echo "Warning: libavformat is too old, update to ffmpeg r18351+"
440         fi
441     fi
442 fi
443
444 if [ "$ffms_input" = "auto" ] ; then
445     ffms_input="no"
446     if [ "$lavf_input" = "yes" ] ; then
447         if cc_check ffms.h -lFFMS2 "FFMS_DestroyVideoSource(0);" ; then
448            ffms_input="yes"
449            echo "#define FFMS_INPUT" >> config.h
450            LDFLAGSCLI="$LDFLAGSCLI -lFFMS2"
451         elif cc_check ffms.h "-lFFMS2 $LAVF_LDFLAGS -lstdc++" "FFMS_DestroyVideoSource(0);" ; then
452            ffms_input="yes"
453            echo "#define FFMS_INPUT" >> config.h
454            LDFLAGSCLI="-lFFMS2 $LDFLAGSCLI -lstdc++"
455         fi
456     fi
457 fi
458
459 MP4_LDFLAGS="-lgpac_static"
460 if [ $SYS = MINGW ]; then
461     MP4_LDFLAGS="$MP4_LDFLAGS -lwinmm"
462 fi
463 if [ "$mp4_output" = "auto" ] ; then
464     mp4_output="no"
465     cc_check gpac/isomedia.h "$MP4_LDFLAGS" && mp4_output="yes"
466 fi
467 if [ "$mp4_output" = "yes" ] ; then
468     echo "#define MP4_OUTPUT" >> config.h
469     LDFLAGSCLI="$LDFLAGSCLI $MP4_LDFLAGS"
470 fi
471
472 if [ "$avs_input" = "auto" ] ; then
473     avs_input=no
474     if [ $SYS = MINGW ] && cc_check avisynth_c.h ; then
475         avs_input="yes"
476         echo "#define AVS_INPUT" >> config.h
477         echo "#define HAVE_AVISYNTH_C_H" >> config.h
478     elif [ $SYS = MINGW ] && cc_check extras/avisynth_c.h ; then
479         avs_input="yes"
480         echo "#define AVS_INPUT" >> config.h
481     fi
482 fi
483
484 if [ "$pic" = "yes" ] ; then
485     CFLAGS="$CFLAGS -fPIC"
486     ASFLAGS="$ASFLAGS -DPIC"
487     # resolve textrels in the x86 asm
488     cc_check stdio.h -Wl,-Bsymbolic && LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
489 fi
490
491 if [ "$debug" != "yes" -a "$gprof" != "yes" ]; then
492     CFLAGS="$CFLAGS -s -fomit-frame-pointer"
493     LDFLAGS="$LDFLAGS -s"
494 fi
495
496 if [ "$debug" = "yes" ]; then
497     CFLAGS="-O1 -g $CFLAGS"
498 elif [ $ARCH = ARM ]; then
499     # arm-gcc-4.2 produces incorrect output with -ffast-math
500     # and it doesn't save any speed anyway on 4.4, so disable it
501     CFLAGS="-O4 -fno-fast-math $CFLAGS"
502 else
503     CFLAGS="-O4 -ffast-math $CFLAGS"
504 fi
505
506 if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then
507     echo "#define fseek fseeko" >> config.h
508     echo "#define ftell ftello" >> config.h
509 elif cc_check "stdio.h" "" "fseeko64(stdin,0,0);" ; then
510     echo "#define fseek fseeko64" >> config.h
511     echo "#define ftell ftello64" >> config.h
512 fi
513
514 rm -f conftest*
515
516 # generate config files
517
518 cat > config.mak << EOF
519 prefix=$prefix
520 exec_prefix=$exec_prefix
521 bindir=$bindir
522 libdir=$libdir
523 includedir=$includedir
524 ARCH=$ARCH
525 SYS=$SYS
526 CC=$CC
527 CFLAGS=$CFLAGS
528 LDFLAGS=$LDFLAGS
529 LDFLAGSCLI=$LDFLAGSCLI
530 AR=$AR
531 RANLIB=$RANLIB
532 STRIP=$STRIP
533 AS=$AS
534 ASFLAGS=$ASFLAGS
535 EXE=$EXE
536 VIS=$vis
537 HAVE_GETOPT_LONG=$HAVE_GETOPT_LONG
538 DEVNULL=$DEVNULL
539 EOF
540
541 if [ "$shared" = "yes" ]; then
542     API=$(grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' ')
543     if [ "$SYS" = "MINGW" ]; then
544         echo "SONAME=libx264-$API.dll" >> config.mak
545         echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
546         echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
547     elif [ "$SYS" = "MACOSX" ]; then
548         echo "SOSUFFIX=dylib" >> config.mak
549         echo "SONAME=libx264.$API.dylib" >> config.mak
550         echo 'SOFLAGS=-dynamiclib -Wl,-single_module -Wl,-read_only_relocs,suppress -install_name $(DESTDIR)$(libdir)/$(SONAME)' >> config.mak
551     elif [ "$SYS" = "SunOS" ]; then
552         echo "SOSUFFIX=so" >> config.mak
553         echo "SONAME=libx264.so.$API" >> config.mak
554         echo 'SOFLAGS=-Wl,-h,$(SONAME)' >> config.mak
555     else
556         echo "SOSUFFIX=so" >> config.mak
557         echo "SONAME=libx264.so.$API" >> config.mak
558         echo 'SOFLAGS=-Wl,-soname,$(SONAME)' >> config.mak
559     fi
560     echo 'default: $(SONAME)' >> config.mak
561 fi
562
563 ./version.sh
564
565 pclibs="-L$libdir -lx264 $libpthread"
566
567 cat > x264.pc << EOF
568 prefix=$prefix
569 exec_prefix=$exec_prefix
570 libdir=$libdir
571 includedir=$includedir
572
573 Name: x264
574 Description: H.264 (MPEG4 AVC) encoder library
575 Version: $(grep POINTVER < config.h | sed -e 's/.* "//; s/".*//')
576 Libs: $pclibs
577 Cflags: -I$includedir
578 EOF
579
580
581 echo "Platform:   $ARCH"
582 echo "System:     $SYS"
583 echo "asm:        $asm"
584 echo "avs input:  $avs_input"
585 echo "lavf input: $lavf_input"
586 echo "ffms input: $ffms_input"
587 echo "mp4 output: $mp4_output"
588 echo "pthread:    $pthread"
589 echo "debug:      $debug"
590 echo "gprof:      $gprof"
591 echo "PIC:        $pic"
592 echo "shared:     $shared"
593 echo "visualize:  $vis"
594 echo
595 echo "You can run 'make' or 'make fprofiled' now."
596