1dnl Process this file with autoconf to produce a configure script.
2
3dnl configure.ac
4dnl
5dnl This file is part of bino, a 3D video player.
6dnl
7dnl Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016
8dnl Martin Lambers <marlam@marlam.de>
9dnl Frédéric Devernay <Frederic.Devernay@inrialpes.fr>
10dnl Binocle <http://binocle.com> (author: Olivier Letz <oletz@binocle.com>)
11dnl
12dnl This program is free software; you can redistribute it and/or modify
13dnl it under the terms of the GNU General Public License as published by
14dnl the Free Software Foundation; either version 3 of the License, or
15dnl (at your option) any later version.
16dnl
17dnl This program is distributed in the hope that it will be useful,
18dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
19dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20dnl GNU General Public License for more details.
21dnl
22dnl You should have received a copy of the GNU General Public License
23dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
24
25dnl Autotools init stuff
26AC_PREREQ([2.63])
27AC_INIT([Bino], [1.6.5], [bino-list@nongnu.org], [bino], [http://bino3d.org/])
28AC_CONFIG_SRCDIR([src/main.cpp])
29AC_CONFIG_AUX_DIR([build-aux])
30AC_CONFIG_MACRO_DIR([m4])
31AC_CONFIG_HEADERS([config.h])
32AC_CANONICAL_TARGET
33AC_USE_SYSTEM_EXTENSIONS
34AC_SYS_LARGEFILE
35AM_INIT_AUTOMAKE([1.11.1 color-tests silent-rules tar-pax no-texinfo.tex -Wall -Wno-portability])
36AM_SILENT_RULES([yes])
37AC_PROG_CXX
38AC_PROG_INSTALL
39AC_PROG_RANLIB
40AC_PROG_LN_S
41AC_LANG([C++])
42AC_C_BIGENDIAN
43
44dnl Check if the C++ compiler works. Autoconf will not do that for us!?
45AC_MSG_CHECKING([whether the C++ compiler works])
46AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [COMPILER_WORKS=1], [COMPILER_WORKS=0])
47if test "$COMPILER_WORKS" = "1"; then
48    AC_MSG_RESULT([yes])
49else
50    AC_MSG_RESULT([no])
51    AC_MSG_ERROR([The C++ compiler was not found or does not work.])
52fi
53
54dnl Useful definitions
55AC_DEFINE_UNQUOTED([PLATFORM], ["${target}"], [Platform triplet])
56
57dnl Special handling of W32
58case "${target}" in *-*-mingw32*) w32="yes" ;; *) w32="no " ;; esac
59if test "$w32" = "yes"; then
60    CXXFLAGS="-mthreads $CXXFLAGS"
61    LDFLAGS="-mthreads -mwindows $LDFLAGS"
62    AC_ARG_VAR([WINDRES], [windres command])
63    if test -z "$WINDRES"; then
64        AC_CHECK_TOOLS([WINDRES], [windres])
65    fi
66    if test -z "$WINDRES"; then
67        AC_MSG_ERROR([windres not found])
68    fi
69    AC_ARG_VAR([MAKENSIS], [makensis command])
70    if test -z "$MAKENSIS"; then
71        AC_CHECK_TOOLS([MAKENSIS], [makensis])
72    fi
73    if test -z "$MAKENSIS"; then
74        AC_MSG_WARN([optional tool makensis not found])
75    fi
76else
77    MAKENSIS=""
78fi
79AM_CONDITIONAL([HAVE_MAKENSIS], [test -n "$MAKENSIS"])
80AM_CONDITIONAL([W32], [test "$w32" = "yes"])
81
82dnl Configure switches
83AC_ARG_ENABLE([debug],
84    [AS_HELP_STRING([--enable-debug], [Enable debugging checks. Disabled by default.])],
85    [if test "$enableval" = "yes"; then ndebug=0; else ndebug=1; fi], [ndebug=1])
86if test "$ndebug" = "1"; then
87    AC_DEFINE_UNQUOTED([NDEBUG], [1], [Define to 1 to disable assertions and other debugging checks.])
88fi
89
90dnl Feature checks needed by the base modules
91AC_LANG_PUSH([C])
92dnl - dbg
93AC_CHECK_FUNCS([backtrace sigaction])
94dnl - end
95dnl AC_C_BIGENDIAN
96dnl - fio
97dnl case "${target}" in *-*-mingw*) LIBS="$LIBS -lshlwapi" ;; esac
98dnl AC_CHECK_FUNCS([fdatasync fnmatch fseeko ftello getpwuid link mmap posix_fadvise readdir_r symlink])
99dnl - opt
100case "${target}" in *-*-mingw*) CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE" ;; esac
101AC_CHECK_DECLS([optreset], [], [], [#include <getopt.h>])
102dnl - pth
103AC_MSG_CHECKING([for GCC atomic builtins])
104AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],
105    [[int b, x = 0; b = __sync_bool_compare_and_swap(&x, 0, 1);]])],
106    HAVE_GCC_ATOMIC_BUILTINS=1, HAVE_GCC_ATOMIC_BUILTINS=0)
107if test "$HAVE_GCC_ATOMIC_BUILTINS" = "1"; then
108    AC_MSG_RESULT([yes])
109else
110    AC_MSG_RESULT([no])
111    AC_MSG_ERROR([GCC atomic builtins not found. Please use a newer compiler.])
112fi
113AC_SEARCH_LIBS([pthread_create], [pthread])
114CPPFLAGS_bak="$CPPFLAGS"
115LDFLAGS_bak="$LDFLAGS"
116CPPFLAGS="-pthread $CPPFLAGS"
117LDFLAGS="-pthread $LDFLAGS"
118AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [], [CPPFLAGS="$CPPFLAGS_bak"; LDFLAGS="$LDFLAGS_bak"])
119dnl - str
120AM_ICONV([])
121AC_CHECK_FUNCS([nl_langinfo vasprintf wcswidth])
122dnl - sys
123dnl AC_CHECK_FUNCS([nanosleep sysconf sched_yield])
124dnl - tmr
125AC_SEARCH_LIBS([clock_gettime], [rt])
126AC_CHECK_FUNCS([clock_gettime])
127AC_LANG_POP([C])
128
129dnl Gettext
130AC_LANG_PUSH([C])
131AM_ICONV([])
132if test "$am_cv_func_iconv" != "yes"; then
133    AC_MSG_WARN([required library libiconv not found])
134fi
135AM_GNU_GETTEXT([external])
136AC_LANG_POP([C])
137
138dnl pkg-config (required to detect libraries)
139PKG_PROG_PKG_CONFIG([])
140if test -z "$PKG_CONFIG"; then
141    AC_MSG_WARN([required tool pkg-config not found])
142    AC_MSG_WARN([required libraries cannot be detected])
143    AC_MSG_WARN([please install pkg-config; Debian package: pkg-config])
144fi
145
146dnl FFmpeg
147PKG_CHECK_MODULES([libavformat], [libavformat >= 52.110.0 libavcodec libavutil], [HAVE_LIBAVFORMAT=1], [HAVE_LIBAVFORMAT=0])
148if test "$HAVE_LIBAVFORMAT" != "1"; then
149    AC_MSG_WARN([required library libavformat >= 52.110.0 not found:])
150    AC_MSG_WARN([$libavformat_PKG_ERRORS])
151    AC_MSG_WARN([libavformat >= 52.110.0 is provided by libav >= 0.7 or FFmpeg >= 0.7])
152fi
153PKG_CHECK_MODULES([libavdevice], [libavdevice >= 52.5.0], [HAVE_LIBAVDEVICE=1], [HAVE_LIBAVDEVICE=0])
154if test "$HAVE_LIBAVDEVICE" != "1"; then
155    AC_MSG_WARN([required library libavdevice >= 52.5.0 not found:])
156    AC_MSG_WARN([$libavdevice_PKG_ERRORS])
157    AC_MSG_WARN([libavdevice >= 52.5.0 is provided by libav >= 0.7 or FFmpeg >= 0.7])
158fi
159PKG_CHECK_MODULES([libswscale], [libswscale >= 0.14.1 libavutil], [HAVE_LIBSWSCALE=1], [HAVE_LIBSWSCALE=0])
160if test "$HAVE_LIBSWSCALE" != "1"; then
161    AC_MSG_WARN([required library libswscale >= 0.14.1 not found:])
162    AC_MSG_WARN([$libswscale_PKG_ERRORS])
163    AC_MSG_WARN([libswscale >= 0.14.1 is provided by libav >= 0.7 or FFmpeg >= 0.7])
164fi
165AC_CHECK_FUNCS([sysconf])
166
167dnl libass
168LIBASS_PKGCONFIG_VERSION="\"\""
169PKG_CHECK_MODULES([libass], [libass >= 0.9.9], [HAVE_LIBASS=1], [HAVE_LIBASS=0])
170if test "$HAVE_LIBASS" != "1"; then
171    AC_MSG_WARN([required library libass not found:])
172    AC_MSG_WARN([$libass_PKG_ERRORS])
173    AC_MSG_WARN([libass is provided by LibASS; Debian package: libass-dev])
174else
175    LIBASS_PKGCONFIG_VERSION="\"`$PKG_CONFIG --modversion libass`\""
176fi
177AC_DEFINE_UNQUOTED([LIBASS_PKGCONFIG_VERSION], [$LIBASS_PKGCONFIG_VERSION], [libass version])
178
179dnl OpenAL
180PKG_CHECK_MODULES([libopenal], [openal >= 0.0], [HAVE_LIBOPENAL=1], [HAVE_LIBOPENAL=0])
181if test "$HAVE_LIBOPENAL" = "1"; then
182    CPPFLAGS_BAK="$CPPFLAGS"
183    CPPFLAGS="$CPPFLAGS $libopenal_CFLAGS"
184    AC_CHECK_HEADERS([AL/al.h])
185    CPPFLAGS="$CPPFLAGS_BAK"
186else
187    AC_MSG_WARN([required library libopenal not found:])
188    AC_MSG_WARN([$libopenal_PKG_ERRORS])
189    AC_MSG_WARN([libopenal is provided by OpenAL; Debian package: libopenal-dev])
190fi
191
192dnl Qt
193qt_version=""
194AC_ARG_WITH([qt-version],
195    [AS_HELP_STRING([--with-qt-version], [Choose Qt version. Currently 4 or 5; 5 is the default.])],
196    [qt_version="$withval"], [qt_version="5"])
197if test "$qt_version" != "4" -a "$qt_version" != "5"; then
198    AC_MSG_WARN([unknown Qt version requested, falling back to Qt 5.])
199    qt_version="5"
200fi
201AC_ARG_VAR([RCC], [rcc command])
202AC_ARG_VAR([MOC], [moc command])
203if test "$qt_version" = "4"; then
204    PKG_CHECK_MODULES([libqtopengl], [QtOpenGL >= 4.6], [HAVE_LIBQTOPENGL=1], [HAVE_LIBQTOPENGL=0])
205    if test "$HAVE_LIBQTOPENGL" != "1"; then
206        AC_MSG_WARN([required library QtOpenGL not found:])
207        AC_MSG_WARN([$libqtopengl_PKG_ERRORS])
208        AC_MSG_WARN([QtOpenGL is provided by Qt])
209    else
210        if test -z "$RCC"; then
211            AC_CHECK_TOOLS([RCC], [rcc-qt4 rcc])
212        fi
213        if test -z "$MOC"; then
214            AC_CHECK_TOOLS([MOC], [moc-qt4 moc])
215        fi
216    fi
217    dnl Check if we are running on X11. Needed for GLXEW.
218    AC_MSG_CHECKING([whether Qt uses X11])
219    CPPFLAGS_BAK="$CPPFLAGS"
220    CPPFLAGS="$CPPFLAGS $libqtopengl_CFLAGS"
221    AC_COMPILE_IFELSE(
222        [AC_LANG_PROGRAM([[
223         #include <QGLWidget>
224         #ifndef Q_WS_X11
225          error: No X11
226         #endif]],
227        [[int x = 0;]])],
228        [NEED_LIBX11="yes"],[NEED_LIBX11="no"])
229    CPPFLAGS="$CPPFLAGS_BAK"
230    AC_MSG_RESULT([$NEED_LIBX11])
231    dnl With Qt4, we use X11 functions directly, and thus need to link with -lX11
232    if test "$NEED_LIBX11" = "yes"; then
233        AC_DEFINE([HAVE_X11], [1], [Whether we are running on X11])
234        PKG_CHECK_MODULES([libX11], [x11 >= 0.0], [HAVE_LIBX11=1], [HAVE_LIBX11=0])
235        if test "$HAVE_LIBX11" != "1"; then
236            AC_MSG_WARN([required library libX11 not found:])
237            AC_MSG_WARN([$libX11_PKG_ERRORS])
238        else
239            libqtopengl_CFLAGS="$libqtopengl_CFLAGS $libX11_CFLAGS"
240            libqtopengl_LIBS="$libqtopengl_LIBS $libX11_LIBS"
241        fi
242    else
243        AC_DEFINE([HAVE_X11], [0], [Whether we are running on X11])
244    fi
245else
246    PKG_CHECK_MODULES([libqtopengl], [Qt5OpenGL >= 5.1], [HAVE_LIBQTOPENGL=1], [HAVE_LIBQTOPENGL=0])
247    if test -z "$RCC"; then
248        AC_CHECK_TOOLS([RCC], [rcc-qt5 rcc])
249    fi
250    if test -z "$MOC"; then
251        AC_CHECK_TOOLS([MOC], [moc-qt5 moc])
252    fi
253    dnl Qt5 on Linux requires -fPIC / -pie with gcc, but does not record this fact
254    dnl in the pkg-config files (which is a bug in my opinion). Work around that.
255    AC_MSG_CHECKING([whether Qt needs -fPIC and -pie])
256    if test -n "`$PKG_CONFIG --variable=qt_config Qt5Core | $GREP reduce_relocations`"; then
257        AC_MSG_RESULT([yes])
258        CXXFLAGS="$CXXFLAGS -fPIC"
259        LDFLAGS="$LDFLAGS -pie"
260    else
261        AC_MSG_RESULT([no])
262    fi
263    dnl Check if we are running on X11. Needed for GLXEW.
264    AC_MSG_CHECKING([whether Qt uses X11])
265    if test -n "`$PKG_CONFIG --variable=qt_config Qt5Core | $GREP xcb`"; then
266        AC_DEFINE([HAVE_X11], [1], [Whether we are running on X11])
267        AC_MSG_RESULT([yes])
268    else
269        AC_DEFINE([HAVE_X11], [0], [Whether we are running on X11])
270        AC_MSG_RESULT([no])
271    fi
272fi
273if test "$HAVE_LIBQTOPENGL" = "1"; then
274    if test -z "$RCC" -o -z "$MOC"; then
275        AC_MSG_WARN([required tools rcc and/or moc not found; Qt not usable])
276        HAVE_LIBQTOPENGL="0"
277    fi
278fi
279
280dnl Equalizer
281dnl We assume that Equalizer does not use an included GLEW!
282AC_ARG_WITH([equalizer],
283    [AS_HELP_STRING([--without-equalizer], [Disable multi-display support via Equalizer (enabled by default)])],
284    [if test "$withval" = "yes"; then equalizer="yes"; else equalizer="no"; fi], [equalizer="yes"])
285if test "$equalizer" = "yes"; then
286    PKG_CHECK_MODULES([libEqualizer], [Equalizer >= 0.9.3], [HAVE_LIBEQUALIZER=1], [HAVE_LIBEQUALIZER=0])
287    if test "$HAVE_LIBEQUALIZER" != "1"; then
288        AC_MSG_WARN([optional library libEqualizer not found:])
289        AC_MSG_WARN([$libEqualizer_PKG_ERRORS])
290        AC_MSG_WARN([libEqualizer is provided by Equalizer])
291	equalizer="no"
292    fi
293else
294    HAVE_LIBEQUALIZER=0
295fi
296AC_DEFINE_UNQUOTED([HAVE_LIBEQUALIZER], [$HAVE_LIBEQUALIZER], [Have Equalizer?])
297AM_CONDITIONAL([HAVE_LIBEQUALIZER], [test "$HAVE_LIBEQUALIZER" = "1"])
298
299dnl glew
300dnl With Equalizer, we need glewmx, since that is what Equalizer uses.
301dnl Without Equalizer, glew (without mx) is ok to use, too.
302PKG_CHECK_MODULES([libglewmx], [glewmx >= 1.6.0], [HAVE_LIBGLEWMX=1], [HAVE_LIBGLEWMX=0])
303if test "$HAVE_LIBGLEWMX" != "1"; then
304    AC_MSG_WARN([required library libglewmx >= 1.6.0 not found:])
305    AC_MSG_WARN([$libglewmx_PKG_ERRORS])
306    AC_MSG_WARN([libglewmx is provided by glew; Debian package: libglewmx-dev])
307fi
308AM_CONDITIONAL([HAVE_LIBGLEWMX], [test "$HAVE_LIBGLEWMX" = "1"])
309if test "$HAVE_LIBGLEWMX" != "1" -a "$HAVE_LIBEQUALIZER" != "1"; then
310    AC_MSG_NOTICE([trying to use libglew instead of libglewmx])
311    PKG_CHECK_MODULES([libglew], [glew >= 1.6.0], [HAVE_LIBGLEW=1], [HAVE_LIBGLEW=0])
312    if test "$HAVE_LIBGLEW" != "1"; then
313        AC_MSG_WARN([required library libglew >= 1.6.0 not found:])
314        AC_MSG_WARN([$libglew_PKG_ERRORS])
315        AC_MSG_WARN([libglew is provided by glew; Debian package: libglew-dev])
316    fi
317fi
318
319dnl libXNVCtrl
320AC_ARG_WITH([xnvctrl],
321    [AS_HELP_STRING([--with-xnvctrl], [Enable NVIDIA Quadro SDI output (disabled by default)])],
322    [if test "$withval" = "yes"; then xnvctrl="yes"; else xnvctrl="no"; fi], [xnvctrl="no"])
323if test "$xnvctrl" = "yes"; then
324    CPPFLAGS_BAK="$CPPFLAGS"
325    CPPFLAGS="$CPPFLAGS $libX11_CFLAGS $xnvctrl_CFLAGS"
326    AC_SUBST([xnvctrl_CFLAGS])
327    AC_CHECK_HEADERS([NVCtrl/NVCtrl.h NVCtrl/NVCtrlLib.h],
328                     [HAVE_LIBXNVCTRL=1],
329                     [HAVE_LIBXNVCTRL=0],
330                     [#include <GL/glx.h>])
331    if test "$HAVE_LIBXNVCTRL" = "1"; then
332        LDFLAGS_BAK="$LDFLAGS"
333        LDFLAGS="$LDFLAGS $xnvctrl_LDFLAGS"
334        AC_SUBST([xnvctrl_LDFLAGS])
335        AC_CHECK_LIB([XNVCtrl],
336                     [XNVCTRLQueryAttribute],
337                     [HAVE_LIBXNVCTRL=1],
338                     [HAVE_LIBXNVCTRL=0],
339                     [-lX11 -lXext])
340        LDFLAGS="$LDFLAGS_BAK"
341    fi
342    CPPFLAGS="$CPPFLAGS_BAK"
343    if test "$HAVE_LIBXNVCTRL" != "1"; then
344        AC_MSG_WARN([optional library libXNVCtrl not found])
345        AC_MSG_WARN([libXNVCtrl is provided by NVIDIA; Debian package: libxnvctrl-dev])
346        xnvctrl="no"
347    fi
348else
349    HAVE_LIBXNVCTRL=0
350fi
351AC_DEFINE_UNQUOTED([HAVE_LIBXNVCTRL], [$HAVE_LIBXNVCTRL], [Have NVIDIA libXNVCtrl for Quadro SDI output?])
352AM_CONDITIONAL([HAVE_LIBXNVCTRL], [test "$HAVE_LIBXNVCTRL" = "1"])
353
354dnl OpenGL
355dnl We need to explicitly link with OpenGL since we use its functions directly.
356dnl However, this is most probably not necessary on Windows and Mac OS X (for
357dnl now), so we just use a pkg-config check (which usually only works on Linux)
358dnl and ignore a failure.
359PKG_CHECK_MODULES([libgl], [gl >= 0.0], [HAVE_LIBGL=1], [HAVE_LIBGL=0])
360
361dnl LIRC
362LIRC_PKGCONFIG_VERSION="\"\""
363AC_ARG_WITH([lirc],
364    [AS_HELP_STRING([--without-lirc], [Disable remote control support via lirc (enabled by default)])],
365    [if test "$withval" = "yes"; then lirc="yes"; else lirc="no"; fi], [lirc="yes"])
366if test "$lirc" = "yes"; then
367    PKG_CHECK_MODULES([lirc], [lirc >= 0.0], [HAVE_LIRC=1], [HAVE_LIRC=0])
368    if test "$HAVE_LIRC" != "1"; then
369        PKG_CHECK_MODULES([lirc], [liblircclient0 >= 0.0], [HAVE_LIRC=1], [HAVE_LIRC=0])
370        if test "$HAVE_LIRC" != "1"; then
371            AC_MSG_WARN([optional library lirc not found:])
372            AC_MSG_WARN([$lirc_PKG_ERRORS])
373            AC_MSG_WARN([lirc is provided by LIRC; Debian package: liblircclient-dev])
374            lirc="no"
375        else
376            LIRC_PKGCONFIG_VERSION="\"`$PKG_CONFIG --modversion liblircclient0`\""
377        fi
378    else
379        LIRC_PKGCONFIG_VERSION="\"`$PKG_CONFIG --modversion lirc`\""
380    fi
381else
382    HAVE_LIRC=0
383fi
384AC_DEFINE_UNQUOTED([HAVE_LIRC], [$HAVE_LIRC], [Have lirc?])
385AC_DEFINE_UNQUOTED([LIRC_PKGCONFIG_VERSION], [$LIRC_PKGCONFIG_VERSION], [lirc version])
386AM_CONDITIONAL([HAVE_LIRC], [test "$HAVE_LIRC" = "1"])
387
388dnl Icon and Menu tools. It is ok if these are missing.
389GTK_UPDATE_ICON_CACHE=""
390AC_ARG_VAR([GTK_UPDATE_ICON_CACHE], [gtk-update-icon-cache command])
391AC_CHECK_PROGS([GTK_UPDATE_ICON_CACHE], [gtk-update-icon-cache])
392UPDATE_DESKTOP_DATABASE=""
393AC_ARG_VAR([UPDATE_DESKTOP_DATABASE], [update-desktop-database command])
394AC_CHECK_PROGS([UPDATE_DESKTOP_DATABASE], [update-desktop-database])
395
396dnl Check if all libraries were found
397if test "$am_cv_func_iconv" != "yes" \
398    -o "$HAVE_LIBAVFORMAT" != "1" \
399    -o "$HAVE_LIBAVDEVICE" != "1" \
400    -o "$HAVE_LIBSWSCALE" != "1" \
401    -o "$HAVE_LIBASS" != "1" \
402    -o "$HAVE_LIBOPENAL" != "1" \
403    -o "$HAVE_LIBQTOPENGL" != "1" \
404    -o \( "$HAVE_LIBGLEWMX" != "1" -a "$HAVE_LIBGLEW" != "1" \) \
405    -o \( "$equalizer" = "yes" -a "$HAVE_LIBEQUALIZER" != "1" \) \
406    -o \( "$xnvctrl" = "yes" -a "$HAVE_LIBXNVCTRL" != "1" \) \
407    -o \( "$lirc" = "yes" -a "$HAVE_LIRC" != "1" \) ; then
408    AC_MSG_ERROR([One or more libraries were not found. See messages above.])
409fi
410
411dnl Output
412AC_CONFIG_FILES([Makefile	\
413	po/Makefile.in		\
414	src/base/Makefile	\
415	src/Makefile		\
416	doc/Makefile		\
417	pkg/macosx/Info.plist	\
418	])
419AC_OUTPUT
420
421dnl Print configuration for user to check
422echo "Configuration:"
423echo "NLS:                      $USE_NLS"
424echo "Equalizer:                $equalizer"
425echo "NVIDIA Quadro SDI output: $xnvctrl"
426echo "lirc:                     $lirc"
427