1dnl Some useful functions for LyXs configure.in                 -*- sh -*-
2dnl Author: Jean-Marc Lasgouttes (Jean-Marc.Lasgouttes@inria.fr)
3dnl         Lars Gullik Bj�nnes (larsbj@lyx.org)
4dnl         Allan Rae (rae@lyx.org)
5
6dnl Compute the default build type from AC_PACKAGE_VERSION at autoconf time.
7m4_define([LYX_BUILD_TYPE], [m4_bmatch(AC_PACKAGE_VERSION,
8    [dev], [development],
9    [pre\|alpha\|beta\|rc], [prerelease],
10    [release])])
11
12
13dnl Usage LYX_CHECK_VERSION   Displays version of LyX being built and
14dnl sets variable "build_type"
15AC_DEFUN([LYX_CHECK_VERSION],[
16echo "configuring LyX version" AC_PACKAGE_VERSION
17
18AC_MSG_CHECKING([for build type])
19lyx_devel_version=no
20lyx_prerelease=no
21AC_ARG_ENABLE(build-type,
22  AC_HELP_STRING([--enable-build-type=STR],[set build type to rel(ease), pre(release), dev(elopment), prof(iling), or gprof (default: LYX_BUILD_TYPE)]),
23  [case $enableval in
24    dev*) build_type=development;;
25    pre*) build_type=prerelease;;
26    prof*)  build_type=profiling;;
27    gprof*) build_type=gprof;;
28    rel*) build_type=release;;
29    *) AC_MSG_ERROR([bad build type specification \"$enableval\". Please use one of rel(ease), pre(release), dev(elopment), prof(iling), or gprof]);;
30   esac],
31  [build_type=LYX_BUILD_TYPE])
32AC_MSG_RESULT([$build_type])
33lyx_flags="$lyx_flags build=$build_type"
34case $build_type in
35    development) lyx_devel_version=yes
36		 LYX_DATE="not released yet" ;;
37    prerelease) lyx_prerelease=yes ;;
38esac
39
40AC_SUBST(lyx_devel_version)
41])
42
43
44dnl Define the option to set a LyX version on installed executables and directories
45dnl
46dnl
47AC_DEFUN([LYX_VERSION_SUFFIX],[
48AC_MSG_CHECKING([for version suffix])
49dnl We need the literal double quotes in the rpm spec file
50RPM_VERSION_SUFFIX='""'
51AC_ARG_WITH(version-suffix,
52  [AC_HELP_STRING([--with-version-suffix@<:@=STR@:>@], install lyx files as lyxSTR (default STR: -AC_PACKAGE_VERSION))],
53  [if test "x$withval" = "xyes";
54   then
55     withval="-"AC_PACKAGE_VERSION
56     ac_configure_args=`echo "$ac_configure_args" | sed "s,--with-version-suffix,--with-version-suffix=$withval,"`
57   fi
58   AC_SUBST(version_suffix,$withval)
59   RPM_VERSION_SUFFIX="--with-version-suffix=$withval"])
60AC_SUBST(RPM_VERSION_SUFFIX)
61AC_SUBST(program_base_name,"lyx")
62AC_MSG_RESULT([$withval])
63])
64
65
66dnl Check whether to configure for Qt5. Default is Qt4.
67dnl
68AC_DEFUN([LYX_CHECK_QT5],[
69AC_MSG_CHECKING([whether Qt5 is requested])
70AC_ARG_ENABLE([qt5],
71  [  --enable-qt5            use Qt5 for building],
72  USE_QT5=$enableval, USE_QT5=no)
73AC_MSG_RESULT([$USE_QT5])
74AC_SUBST([USE_QT5])
75])
76
77
78dnl Usage: LYX_WARNING(message)  Displays the warning "message" and sets the
79dnl flag lyx_warning to yes.
80AC_DEFUN([LYX_WARNING],[
81lyx_warning_txt="$lyx_warning_txt
82== $1
83"
84lyx_warning=yes])
85
86
87dnl Usage: LYX_LIB_ERROR(file,library)  Displays an error message indication
88dnl  that 'file' cannot be found because 'lib' may be uncorrectly installed.
89AC_DEFUN([LYX_LIB_ERROR],[
90AC_MSG_ERROR([cannot find $1. Please check that the $2 library
91   is correctly installed on your system.])])
92
93
94dnl Usage: LYX_CHECK_WARNINGS  Displays a warning message if a LYX_WARNING
95dnl   has occurred previously.
96AC_DEFUN([LYX_CHECK_WARNINGS],[
97if test x$lyx_warning = xyes; then
98cat <<EOF
99=== The following minor problems have been detected by configure.
100=== Please check the messages below before running 'make'.
101=== (see the section 'Problems' in the INSTALL file)
102$lyx_warning_txt
103
104EOF
105fi])
106
107
108dnl LYX_SEARCH_PROG(VARIABLE-NAME,PROGRAMS-LIST,ACTION-IF-FOUND)
109dnl
110define(LYX_SEARCH_PROG,[dnl
111for ac_prog in $2 ; do
112# Extract the first word of "$ac_prog", so it can be a program name with args.
113  set dummy $ac_prog ; ac_word=$[2]
114  if test -z "[$]$1"; then
115    IFS="${IFS=	}"; ac_save_ifs="$IFS"; IFS=":"
116    for ac_dir in $PATH; do
117      test -z "$ac_dir" && ac_dir=.
118      if test -f [$ac_dir/$ac_word]; then
119	$1="$ac_prog"
120	break
121      fi
122    done
123    IFS="$ac_save_ifs"
124  fi
125
126  if test -n "[$]$1"; then
127    ac_result=yes
128  else
129    ac_result=no
130  fi
131  ifelse($3,,,[$3])
132  test -n "[$]$1" && break
133done
134])dnl
135
136
137dnl Usage: LYX_PROG_CLANG: set CLANG to yes if the compiler is clang.
138AC_DEFUN([LYX_PROG_CLANG],
139[AC_CACHE_CHECK([whether the compiler is clang],
140               [lyx_cv_prog_clang],
141[AC_TRY_COMPILE([], [
142#ifndef __clang__
143	    this is not clang
144#endif
145],
146[lyx_cv_prog_clang=yes ; CLANG=yes], [lyx_cv_prog_clang=no ; CLANG=no])])
147if test $CLANG = yes ; then
148  AC_CACHE_CHECK([for clang version],
149    [lyx_cv_clang_version],
150    [clang_noversion=no
151     AC_COMPUTE_INT(clang_major,__clang_major__,,[clang_noversion_=yes])
152     AC_COMPUTE_INT(clang_minor,__clang_minor__,,[clang_noversion_=yes])
153     AC_COMPUTE_INT(clang_patchlevel,__clang_patchlevel__,,[clang_noversion_=yes])
154     if test $clang_noversion = yes ; then
155       clang_version=unknown
156     else
157       clang_version=$clang_major.$clang_minor.$clang_patchlevel
158     fi
159     lyx_cv_clang_version=$clang_version])
160fi
161])
162
163
164dnl Usage: LYX_CXX_CXX11_FLAGS: add to AM_CXXFLAGS the best flag that
165selects C++11 mode; gives an error when C++11 mode is not found.
166AC_DEFUN([LYX_CXX_CXX11_FLAGS],
167[AC_CACHE_CHECK([for at least C++11 mode], [lyx_cv_cxx11_flags],
168 [lyx_cv_cxx11_flags=none
169  for flag in -std=c++14 -std=c++11 "" -std=c++0x -std=gnu++14 -std=gnu++11 -std=gnu++0x ; do
170    save_CPPFLAGS=$CPPFLAGS
171    CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
172    save_CXXFLAGS=$CXXFLAGS
173    CXXFLAGS="$flag $AM_CXXFLAGS $CXXFLAGS"
174    dnl sample openmp source code to test
175    AC_TRY_COMPILE([
176       template <typename T>
177       struct check
178       {
179	   static_assert(sizeof(int) <= sizeof(T), "not big enough");
180       };
181
182       typedef check<check<bool>> right_angle_brackets;
183
184       class TestDeleted
185       {
186       public:
187	   TestDeleted() = delete;
188       };
189
190
191       int a;
192       decltype(a) b;
193
194       typedef check<int> check_type;
195       check_type c;
196       check_type&& cr = static_cast<check_type&&>(c);
197
198       auto d = a;], [],
199    [lyx_cv_cxx11_flags=$flag; break])
200   CXXFLAGS=$save_CXXFLAGS
201   CPPFLAGS=$save_CPPFLAGS
202  done])
203  if test $lyx_cv_cxx11_flags = none ; then
204    AC_ERROR([Cannot find suitable C++11 mode for compiler $CXX])
205  fi
206  AM_CXXFLAGS="$lyx_cv_cxx11_flags $AM_CXXFLAGS"
207])
208
209
210dnl Usage: LYX_CXX_USE_REGEX
211dnl decide whether we want to use std::regex and set the
212dnl LYX_USE_STD_REGEX macro and conditional accordingly.
213AC_DEFUN([LYX_CXX_USE_REGEX],
214[AC_ARG_ENABLE(std-regex,
215  AC_HELP_STRING([--enable-std-regex],[use std::regex instead of boost::regex (default is autodetected)]),
216  [lyx_std_regex=$enableval],
217  [AC_MSG_CHECKING([for correct regex implementation])
218   save_CPPFLAGS=$CPPFLAGS
219   CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
220   save_CXXFLAGS=$CXXFLAGS
221   CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS"
222   # The following code snippet has been taken taken from example in
223   #   http://stackoverflow.com/questions/8561850/compile-stdregex-iterator-with-gcc
224   AC_TRY_LINK(
225     [
226	#include <regex>
227	#include <iostream>
228
229	#include <string.h>
230
231	typedef std::regex_iterator<const char *> Myiter;
232     ], [
233	const char *pat = "axayaz";
234	Myiter::regex_type rx("a");
235	Myiter next(pat, pat + strlen(pat), rx);
236	Myiter end;
237   ], [lyx_std_regex=yes], [lyx_std_regex=no])
238   CXXFLAGS=$save_CXXFLAGS
239   CPPFLAGS=$save_CPPFLAGS
240   AC_MSG_RESULT([$lyx_std_regex])
241 ])
242
243 if test $lyx_std_regex = yes ; then
244  lyx_flags="$lyx_flags std-regex"
245  AC_DEFINE([LYX_USE_STD_REGEX], 1, [define to 1 if std::regex should be preferred to boost::regex])
246 fi
247 AM_CONDITIONAL([LYX_USE_STD_REGEX], test $lyx_std_regex = yes)
248])
249
250
251dnl Usage: LYX_CXX_USE_CALL_ONCE
252dnl check whether we can use std::call_once and set the
253dnl LYX_USE_STD_CALL_ONCE macro and conditional accordingly.
254AC_DEFUN([LYX_CXX_USE_CALL_ONCE],
255[AC_MSG_CHECKING([for std::call_once availability])
256   save_CPPFLAGS=$CPPFLAGS
257   CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
258   save_CXXFLAGS=$CXXFLAGS
259   CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS"
260   AC_TRY_LINK(
261     [
262	#include <mutex>
263	static std::once_flag flag;
264     ], [
265	std::call_once(flag, [](){ return; });
266   ], [lyx_std_call_once=yes], [lyx_std_call_once=no])
267   CXXFLAGS=$save_CXXFLAGS
268   CPPFLAGS=$save_CPPFLAGS
269   AC_MSG_RESULT([$lyx_std_call_once])
270
271 if test $lyx_std_call_once = yes ; then
272  AC_DEFINE([LYX_USE_STD_CALL_ONCE], 1, [define to 1 if std::call_once is supported by the compiler])
273 fi
274 AM_CONDITIONAL([LYX_USE_STD_CALL_ONCE], test $lyx_std_call_once = yes)
275])
276
277
278dnl Usage: LYX_LIB_STDCXX: set lyx_cv_lib_stdcxx to yes if the STL library is libstdc++.
279AC_DEFUN([LYX_LIB_STDCXX],
280[AC_CACHE_CHECK([whether STL is libstdc++],
281               [lyx_cv_lib_stdcxx],
282[AC_TRY_COMPILE([#include<vector>], [
283#if ! defined(__GLIBCXX__) && ! defined(__GLIBCPP__)
284	    this is not libstdc++
285#endif
286],
287[lyx_cv_lib_stdcxx=yes], [lyx_cv_lib_stdcxx=no])])
288])
289
290
291dnl Usage: LYX_LIB_STDCXX_CXX11_ABI: set lyx_cv_lib_stdcxx_cxx11_abi to yes
292dnl        if the STL library is GNU libstdc++ and the C++11 ABI is used.
293AC_DEFUN([LYX_LIB_STDCXX_CXX11_ABI],
294[AC_CACHE_CHECK([whether STL is libstdc++ using the C++11 ABI],
295               [lyx_cv_lib_stdcxx_cxx11_abi],
296[AC_TRY_COMPILE([#include<vector>], [
297#if ! defined(_GLIBCXX_USE_CXX11_ABI) || ! _GLIBCXX_USE_CXX11_ABI
298	    this is not libstdc++ using the C++11 ABI
299#endif
300],
301[lyx_cv_lib_stdcxx_cxx11_abi=yes], [lyx_cv_lib_stdcxx_cxx11_abi=no])])
302])
303
304
305AC_DEFUN([LYX_PROG_CXX],
306[AC_REQUIRE([AC_PROG_CXX])
307AC_REQUIRE([AC_PROG_CXXCPP])
308
309AC_LANG_PUSH(C++)
310LYX_PROG_CLANG
311LYX_CXX_CXX11_FLAGS
312LYX_LIB_STDCXX
313LYX_LIB_STDCXX_CXX11_ABI
314LYX_CXX_USE_REGEX
315LYX_CXX_USE_CALL_ONCE
316AC_LANG_POP(C++)
317
318if test $lyx_cv_lib_stdcxx = "yes" ; then
319  if test $lyx_cv_lib_stdcxx_cxx11_abi = "yes" ; then
320    AC_DEFINE(USE_GLIBCXX_CXX11_ABI, 1, [use GNU libstdc++ with C++11 ABI])
321  else
322    AC_DEFINE(STD_STRING_USES_COW, 1, [std::string uses copy-on-write])
323  fi
324else
325  if test $lyx_cv_prog_clang = "yes" ; then
326    AC_DEFINE(USE_LLVM_LIBCPP, 1, [use libc++ provided by llvm instead of GNU libstdc++])
327  fi
328fi
329
330### We might want to get or shut warnings.
331AC_ARG_ENABLE(warnings,
332  AC_HELP_STRING([--enable-warnings],[tell the compiler to display more warnings]),,
333  [ if test $lyx_devel_version = yes -o $lyx_prerelease = yes && test $ac_cv_prog_gxx = yes ; then
334	enable_warnings=yes;
335    else
336	enable_warnings=no;
337    fi;])
338if test x$enable_warnings = xyes ; then
339  lyx_flags="$lyx_flags warnings"
340fi
341
342### We might want to disable debug
343AC_ARG_ENABLE(debug,
344  AC_HELP_STRING([--enable-debug],[enable debug information]),,
345  [AS_CASE([$build_type], [rel*], [enable_debug=no], [enable_debug=yes])]
346)
347
348AC_ARG_ENABLE(stdlib-debug,
349  AC_HELP_STRING([--enable-stdlib-debug],[enable debug mode in the standard library]),,
350  [AS_CASE([$build_type], [dev*], [enable_stdlib_debug=yes],
351	  [enable_stdlib_debug=no])]
352)
353
354### set up optimization
355AC_ARG_ENABLE(optimization,
356    AC_HELP_STRING([--enable-optimization@<:@=ARG@:>@],[enable compiler optimisation]),,
357    enable_optimization=yes;)
358case $enable_optimization in
359    yes)
360        if test $lyx_devel_version = yes ; then
361            lyx_optim=-O
362        else
363            lyx_optim=-O2
364        fi;;
365    no) lyx_optim=;;
366    *) lyx_optim=${enable_optimization};;
367esac
368
369AC_ARG_ENABLE(assertions,
370  AC_HELP_STRING([--enable-assertions],[add runtime sanity checks in the program]),,
371  [AS_CASE([$build_type], [dev*|pre*], [enable_assertions=yes],
372	  [enable_assertions=no])]
373)
374if test "x$enable_assertions" = xyes ; then
375   lyx_flags="$lyx_flags assertions"
376   AC_DEFINE(ENABLE_ASSERTIONS,1,
377    [Define if you want assertions to be enabled in the code])
378fi
379
380# set the compiler options correctly.
381if test x$GXX = xyes; then
382  dnl clang++ pretends to be g++ 4.2.1; this is not useful
383  if test x$CLANG = xno; then
384    dnl Useful for global version info
385    gxx_version=`${CXX} -dumpversion`
386    case $gxx_version in
387	*.*) ;;
388	*) gxx_version=`${CXX} -dumpfullversion` ;;
389    esac
390    CXX_VERSION="($gxx_version)"
391  else
392    gxx_version=clang-$clang_version
393    CXX_VERSION="($clang_version)"
394  fi
395
396  AM_CXXFLAGS="$lyx_optim $AM_CXXFLAGS"
397  if test x$enable_debug = xyes ; then
398      AM_CXXFLAGS="-g $AM_CXXFLAGS"
399  fi
400  if test $build_type = gprof ; then
401    AM_CXXFLAGS="$AM_CXXFLAGS -pg"
402    AM_LDFLAGS="$AM_LDFLAGS -pg"
403  fi
404  if test $build_type = profiling ; then
405    AM_CXXFLAGS="$AM_CXXFLAGS -fno-omit-frame-pointer"
406  fi
407
408  if test x$USE_QT5 = xyes ; then
409      AS_CASE([$host], [*mingw*|*cygwin*], [], [AM_CXXFLAGS="-fPIC $AM_CXXFLAGS"])
410  fi
411  dnl Warnings are for preprocessor too
412  if test x$enable_warnings = xyes ; then
413      case $gxx_version in
414	  9.*) AM_CPPFLAGS="$AM_CPPFLAGS -Wall -Wextra -Wno-deprecated-copy";;
415	  *) AM_CPPFLAGS="$AM_CPPFLAGS -Wall -Wextra";;
416      esac
417    fi
418  case $gxx_version in
419      2.*|3.*) AC_ERROR([gcc >= 4.6 is required]);;
420      4.0*|4.1*|4.2*|4.3*|4.4*|4.5*) AC_ERROR([gcc >= 4.6 is required]);;
421  esac
422  if test x$enable_stdlib_debug = xyes ; then
423    dnl FIXME: for clang/libc++, one should define _LIBCPP_DEBUG2=0
424    dnl See http://clang-developers.42468.n3.nabble.com/libc-debug-mode-td3336742.html
425    case $gxx_version in
426      *)
427        lyx_flags="$lyx_flags stdlib-debug"
428	AC_DEFINE(_GLIBCXX_DEBUG, 1, [libstdc++ debug mode])
429	AC_DEFINE(_GLIBCXX_DEBUG_PEDANTIC, 1, [libstdc++ pedantic debug mode])
430	AC_SUBST(STDLIB_DEBUG, "-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
431        ;;
432    esac
433  fi
434fi
435
436# Some additional flags may be needed
437if test x$GXX = xyes; then
438    case $gxx_version in
439      clang-3.0*|clang-3.1*|clang-3.2*|clang-3.3*)
440        dnl boost contains pragmas that are annoying on older clang versions
441        AM_CPPFLAGS="-Wno-unknown-pragmas $AM_CPPFLAGS";;
442      clang*)
443        dnl the more recent versions support the deprecated-register warning,
444        dnl which  is very annoying with Qt4.x right now.
445        AM_CXXFLAGS="$AM_CXXFLAGS -Wno-deprecated-register";;
446    esac
447fi
448])
449
450dnl Usage: LYX_USE_INCLUDED_BOOST : select if the included boost should
451dnl        be used.
452AC_DEFUN([LYX_USE_INCLUDED_BOOST],[
453	AC_MSG_CHECKING([whether to use included boost library])
454	AC_ARG_WITH(included-boost,
455	    [AC_HELP_STRING([--without-included-boost], [do not use the boost lib supplied with LyX, try to find one in the system directories - compilation will abort if nothing suitable is found])],
456	    [lyx_cv_with_included_boost=$withval],
457	    [lyx_cv_with_included_boost=yes])
458	AM_CONDITIONAL(USE_INCLUDED_BOOST, test x$lyx_cv_with_included_boost = xyes)
459	AC_MSG_RESULT([$lyx_cv_with_included_boost])
460	if test x$lyx_cv_with_included_boost = xyes ; then
461	    lyx_included_libs="$lyx_included_libs boost"
462	    BOOST_INCLUDES='-I$(top_srcdir)/3rdparty/boost'
463	    if test $lyx_std_regex = yes ; then
464	      BOOST_LIBS=""
465	    else
466	      BOOST_LIBS='$(top_builddir)/3rdparty/boost/liblyxboost.a'
467	    fi
468	else
469	    BOOST_INCLUDES=
470	    if test $lyx_std_regex = yes ; then
471	      BOOST_LIBS=""
472	    else
473	      AC_LANG_PUSH(C++)
474	      save_LIBS=$LIBS
475
476	      AC_MSG_CHECKING([for multithreaded boost libraries])
477	      LIBS="$save_LIBS -lboost_regex-mt $LIBTHREAD"
478	      AC_LINK_IFELSE(
479		[AC_LANG_PROGRAM([#include <boost/regex.hpp>],
480			[boost::regex reg;])],
481		[AC_MSG_RESULT([yes])
482		 BOOST_MT="-mt"],
483		[AC_MSG_RESULT([no])
484		 AC_MSG_CHECKING([for plain boost libraries])
485		 LIBS="$save_LIBS -lboost_regex"
486		 AC_LINK_IFELSE(
487		     [AC_LANG_PROGRAM([#include <boost/regex.hpp>],
488			     [boost::regex reg;])],
489		     [AC_MSG_RESULT([yes])
490		      BOOST_MT=""],
491		     [AC_MSG_RESULT([no])
492		      AC_MSG_ERROR([cannot find suitable boost library (do not use --without-included-boost)])
493		 ])
494	      ])
495	      LIBS=$save_LIBS
496	      AC_LANG_POP(C++)
497
498	      dnl In general, system boost libraries are incompatible with
499	      dnl the use of stdlib-debug in libstdc++. See ticket #9736 for
500	      dnl details.
501	      if test $enable_stdlib_debug = "yes" ; then
502		LYX_WARNING([Compiling LyX with stdlib-debug and system boost libraries may lead to
503   crashes. Consider using --disable-stdlib-debug or removing
504   --without-included-boost.])
505	      fi
506
507	      BOOST_LIBS="-lboost_regex${BOOST_MT}"
508	    fi
509	fi
510	AC_SUBST(BOOST_INCLUDES)
511	AC_SUBST(BOOST_LIBS)
512])
513
514
515dnl Usage: LYX_USE_INCLUDED_ICONV : select if the included iconv should
516dnl        be used.
517AC_DEFUN([LYX_USE_INCLUDED_ICONV],[
518  AC_MSG_CHECKING([whether to use included iconv library])
519  AC_ARG_WITH(included-iconv,
520    [AC_HELP_STRING([--with-included-iconv], [use the iconv lib supplied with LyX instead of the system one])],
521    [lyx_cv_with_included_iconv=$withval],
522    [lyx_cv_with_included_iconv=no])
523  AM_CONDITIONAL(USE_INCLUDED_ICONV, test x$lyx_cv_with_included_iconv = xyes)
524  AC_MSG_RESULT([$lyx_cv_with_included_iconv])
525  if test x$lyx_cv_with_included_iconv = xyes ; then
526  lyx_included_libs="$lyx_included_libs iconv"
527
528dnl Some bits from libiconv configure.ac to avoid a nested configure call:
529    AC_EILSEQ
530    AC_TYPE_MBSTATE_T
531    AC_CHECK_FUNCS([getc_unlocked mbrtowc wcrtomb mbsinit setlocale])
532dnl Ymbstate_t is used if HAVE_WCRTOMB || HAVE_MBRTOWC, see 3rdparty/libiconv/1.14/lib/loop_wchar.h.
533    if test $ac_cv_func_wcrtomb = yes || test $ac_cv_func_mbrtowc = yes; then
534      USE_MBSTATE_T=1
535    else
536      USE_MBSTATE_T=0
537    fi
538    AC_SUBST([USE_MBSTATE_T])
539    AC_CACHE_CHECK([whether <wchar.h> is standalone],
540      [gl_cv_header_wchar_h_standalone],
541      [AC_COMPILE_IFELSE(
542        [AC_LANG_PROGRAM(
543          [[#include <wchar.h>
544            wchar_t w;]],
545          [[]])],
546        [gl_cv_header_wchar_h_standalone=yes],
547        [gl_cv_header_wchar_h_standalone=no])])
548    if test $gl_cv_header_wchar_h_standalone = yes; then
549      BROKEN_WCHAR_H=0
550    else
551      BROKEN_WCHAR_H=1
552    fi
553    AC_SUBST([BROKEN_WCHAR_H])
554dnl we want const correctness
555    AC_DEFINE_UNQUOTED([ICONV_CONST], [const],
556      [Define as const if the declaration of iconv() needs const.])
557    ICONV_CONST=const
558    AC_SUBST([ICONV_CONST])
559dnl we build a static lib
560    DLL_VARIABLE=
561    AC_SUBST([DLL_VARIABLE])
562    ICONV_INCLUDES='-I$(top_srcdir)/3rdparty/libiconv/1.14 -I$(top_builddir)/3rdparty/libiconv'
563    ICONV_LIBS='\$(top_builddir)/3rdparty/libiconv/liblyxiconv.a'
564    ICONV_ICONV_H_IN=3rdparty/libiconv/iconv.h:3rdparty/libiconv/1.14/include/iconv.h.in
565  else
566    ICONV_INCLUDES=
567    AM_ICONV
568    if test "$am_cv_func_iconv" = no; then
569      AC_MSG_ERROR([cannot find required library iconv.])
570    else
571      ICONV_LIBS="$LIBICONV"
572    fi
573    ICONV_ICONV_H_IN=
574  fi
575  AC_SUBST(ICONV_INCLUDES)
576  AC_SUBST(ICONV_LIBS)
577  AC_SUBST(ICONV_ICONV_H_IN)
578])
579
580
581dnl Usage: LYX_USE_INCLUDED_ZLIB : select if the included zlib should
582dnl        be used.
583AC_DEFUN([LYX_USE_INCLUDED_ZLIB],[
584  AC_MSG_CHECKING([whether to use included zlib library])
585  AC_ARG_WITH(included-zlib,
586    [AC_HELP_STRING([--with-included-zlib], [use the zlib lib supplied with LyX instead of the system one])],
587    [lyx_cv_with_included_zlib=$withval],
588    [lyx_cv_with_included_zlib=no])
589  AM_CONDITIONAL(USE_INCLUDED_ZLIB, test x$lyx_cv_with_included_zlib = xyes)
590  AC_MSG_RESULT([$lyx_cv_with_included_zlib])
591  if test x$lyx_cv_with_included_zlib = xyes ; then
592    lyx_included_libs="$lyx_included_libs zlib"
593    ZLIB_INCLUDES='-I$(top_srcdir)/3rdparty/zlib/1.2.8 -I$(top_builddir)/3rdparty/zlib'
594    ZLIB_LIBS='$(top_builddir)/3rdparty/zlib/liblyxzlib.a'
595    mkdir -p 3rdparty/zlib
596dnl include standard config.h for HAVE_UNISTD_H
597    echo "#include <../../config.h>" > 3rdparty/zlib/zconf.h
598dnl prevent clash with system zlib that might be dragged in by other libs
599    echo "#define Z_PREFIX 1" >> 3rdparty/zlib/zconf.h
600    cat "${srcdir}/3rdparty/zlib/1.2.8/zconf.h.in" >> 3rdparty/zlib/zconf.h
601  else
602    ZLIB_INCLUDES=
603    AC_CHECK_HEADERS(zlib.h,
604      [AC_CHECK_LIB(z, gzopen, [ZLIB_LIBS="-lz"], LYX_LIB_ERROR(libz,zlib))],
605      [LYX_LIB_ERROR(zlib.h,zlib)])
606  fi
607  AC_SUBST(ZLIB_INCLUDES)
608  AC_SUBST(ZLIB_LIBS)
609])
610
611
612dnl Usage: LYX_CHECK_CALLSTACK_PRINTING: define LYX_CALLSTACK_PRINTING if the
613dnl        necessary APIs are available to print callstacks.
614AC_DEFUN([LYX_CHECK_CALLSTACK_PRINTING],
615[AC_CACHE_CHECK([whether printing callstack is possible],
616               [lyx_cv_callstack_printing],
617[AC_TRY_COMPILE([
618#include <execinfo.h>
619#include <cxxabi.h>
620], [
621	void* array[200];
622	size_t size = backtrace(array, 200);
623	backtrace_symbols(array, size);
624	int status = 0;
625	abi::__cxa_demangle("abcd", 0, 0, &status);
626],
627[lyx_cv_callstack_printing=yes], [lyx_cv_callstack_printing=no])])
628if test x"$lyx_cv_callstack_printing" = xyes; then
629  AC_DEFINE([LYX_CALLSTACK_PRINTING], 1,
630            [Define if callstack can be printed])
631fi
632])
633
634
635dnl Usage: LYX_USE_INCLUDED_MYTHES : select if the included MyThes should
636dnl        be used.
637AC_DEFUN([LYX_USE_INCLUDED_MYTHES],[
638  AC_ARG_WITH(included-mythes,
639    [AC_HELP_STRING([--with-included-mythes], [force to use the MyThes lib supplied with LyX])],
640    [use_included_mythes=$withval],
641    [use_included_mythes=no])
642  if test x$use_included_mythes != xyes ; then
643    AC_LANG_PUSH(C++)
644    use_included_mythes=yes
645    AC_CHECK_HEADERS([mythes.hxx mythes/mythes.hxx],
646      [mythes_h_location="<$ac_header>"
647       save_LIBS=$LIBS
648       AC_MSG_CHECKING([checking for MyThes library])
649       for ac_lib in mythes mythes-1.2 ; do
650	 LIBS="-l$ac_lib $save_LIBS"
651	 AC_LINK_IFELSE(
652	   [AC_LANG_PROGRAM([#include <cstdio>]
653              [#include $mythes_h_location], [MyThes dummy("idx","dat")])],
654	   [MYTHES_LIBS=-l$ac_lib
655            AC_MSG_RESULT([$MYTHES_LIBS])
656	    use_included_mythes=no])
657       done
658       if test $use_included_mythes != no ; then
659	 AC_MSG_RESULT([not found])
660       fi
661       break])
662    AC_LANG_POP(C++)
663  fi
664  if test $use_included_mythes = yes ; then
665    mythes_h_location="<mythes.hxx>"
666    MYTHES_INCLUDES='-I$(top_srcdir)/3rdparty/mythes/1.2.5/'
667    MYTHES_LIBS='$(top_builddir)/3rdparty/mythes/liblyxmythes.a'
668    lyx_included_libs="$lyx_included_libs mythes"
669  fi
670  AM_CONDITIONAL(USE_INCLUDED_MYTHES, test x$use_included_mythes = xyes)
671  AC_DEFINE_UNQUOTED(MYTHES_H_LOCATION,$mythes_h_location,[Location of mythes.hxx])
672  AC_SUBST(MYTHES_INCLUDES)
673  AC_SUBST(MYTHES_LIBS)
674  AC_MSG_CHECKING([whether to use included MyThes library])
675  AC_MSG_RESULT([$use_included_mythes])
676])
677
678
679dnl Usage: LYX_WITH_DIR(dir-name,desc,dir-var-name,default-value,
680dnl                       [default-yes-value])
681dnl  Adds a --with-'dir-name' option (described by 'desc') and puts the
682dnl  resulting directory name in 'dir-var-name'.
683AC_DEFUN([LYX_WITH_DIR],[
684  AC_ARG_WITH($1,[AC_HELP_STRING([--with-$1],[specify $2])])
685  AC_MSG_CHECKING([for $2])
686  if test -z "$with_$3"; then
687     AC_CACHE_VAL(lyx_cv_$3, lyx_cv_$3=$4)
688  else
689    test "x$with_$3" = xyes && with_$3=$5
690    lyx_cv_$3="$with_$3"
691  fi
692  AC_MSG_RESULT($lyx_cv_$3)
693])
694
695
696dnl Usage: LYX_LOOP_DIR(value,action)
697dnl Executes action for values of variable `dir' in `values'. `values' can
698dnl use ":" as a separator.
699AC_DEFUN([LYX_LOOP_DIR],[
700IFS="${IFS=	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
701for dir in `eval "echo $1"`; do
702  if test ! "$dir" = NONE; then
703    test ! -d "$dir" && AC_MSG_ERROR([\"$dir\" is not a directory])
704    $2
705  fi
706done
707IFS=$ac_save_ifs
708])
709
710
711dnl Usage: LYX_ADD_LIB_DIR(var-name,dir) Adds a -L directive to variable
712dnl var-name.
713AC_DEFUN([LYX_ADD_LIB_DIR],[
714$1="${$1} -L$2"
715if test "`(uname) 2>/dev/null`" = SunOS &&
716    uname -r | grep '^5' >/dev/null; then
717  if test $ac_cv_prog_gxx = yes ; then
718    $1="${$1} -Wl[,]-R$2"
719  else
720    $1="${$1} -R$2"
721  fi
722fi])
723
724
725dnl Usage: LYX_ADD_INC_DIR(var-name,dir) Adds a -I directive to variable
726dnl var-name.
727AC_DEFUN([LYX_ADD_INC_DIR],[$1="${$1} -I$2 "])
728
729### Check for a headers existence and location iff it exists
730## This is supposed to be a generalised version of LYX_STL_STRING_FWD
731## It almost works.  I've tried a few variations but they give errors
732## of one sort or other: bad substitution or file not found etc.  The
733## actual header _is_ found though and the cache variable is set however
734## the reported setting (on screen) is equal to $ac_safe for some unknown
735## reason.
736## Additionally, autoheader can't figure out what to use as the name in
737## the config.h.in file so we need to write our own entries there -- one for
738## each header in the form PATH_HEADER_NAME_H
739##
740AC_DEFUN([LYX_PATH_HEADER],
741[ AC_CHECK_HEADER($1,[
742  ac_tr_safe=PATH_`echo $ac_safe | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
743### the only remaining problem is getting the second parameter to this
744### AC_CACHE_CACHE to print correctly. Currently it just results in value
745### of $ac_safe being printed.
746  AC_CACHE_CHECK([path to $1],[lyx_cv_path2_$ac_safe],
747  [ cat > conftest.$ac_ext <<EOF
748#line __oline__ "configure"
749#include "confdefs.h"
750
751#include <$1>
752EOF
753lyx_path_header_path=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
754  grep $1  2>/dev/null | \
755  sed -e 's/.*\(".*$1"\).*/\1/' -e "1q"`
756eval "lyx_cv_path2_${ac_safe}=\$lyx_path_header_path"
757rm -f conftest*])
758  AC_DEFINE_UNQUOTED($ac_tr_safe, $lyx_path_header_path, [dummy])])
759])
760### end of LYX_PATH_HEADER
761
762## Check what kind of packaging should be used at install time.
763## The default is autodetected.
764AC_DEFUN([LYX_USE_PACKAGING],
765[AC_MSG_CHECKING([what packaging should be used])
766AC_ARG_WITH(packaging,
767  [AC_HELP_STRING([--with-packaging=STR], [set packaging for installation among:
768			    posix, windows, macosx, haiku (default is autodetected)])],
769  [lyx_use_packaging="$withval"], [
770  case $host in
771    *-apple-darwin*) lyx_use_packaging=macosx ;;
772    *-pc-mingw*) lyx_use_packaging=windows ;;
773    *-mingw32*) lyx_use_packaging=windows ;;
774    *haiku*) lyx_use_packaging=haiku ;;
775    *) lyx_use_packaging=posix ;;
776  esac])
777AC_MSG_RESULT($lyx_use_packaging)
778lyx_install_posix=false
779lyx_install_macosx=false
780lyx_install_cygwin=false
781lyx_install_windows=false
782case $lyx_use_packaging in
783   macosx) AC_DEFINE(USE_MACOSX_PACKAGING, 1, [Define to 1 if LyX should use a MacOS X application bundle file layout])
784	   PACKAGE=LyX${version_suffix}
785	   default_prefix="/Applications/${PACKAGE}.app"
786	   AC_SUBST(osx_bundle_program_name,"${program_base_name}")
787	   bindir='${prefix}/Contents/MacOS'
788	   libdir='${prefix}/Contents/Resources'
789	   datarootdir='${prefix}/Contents/Resources'
790	   pkgdatadir='${datadir}'
791	   mandir='${datadir}/man'
792	   lyx_install_macosx=true ;;
793  windows) AC_DEFINE(USE_WINDOWS_PACKAGING, 1, [Define to 1 if LyX should use a Windows-style file layout])
794	   PACKAGE=LyX${version_suffix}
795	   default_prefix="C:/Program Files/${PACKAGE}"
796	   bindir='${prefix}/bin'
797	   libdir='${prefix}/Resources'
798	   datarootdir='${prefix}/Resources'
799	   pkgdatadir='${datadir}'
800	   mandir='${prefix}/Resources/man'
801	   lyx_install_windows=true ;;
802    posix) AC_DEFINE(USE_POSIX_PACKAGING, 1, [Define to 1 if LyX should use a POSIX-style file layout])
803	   PACKAGE=lyx${version_suffix}
804	   program_suffix=$version_suffix
805	   pkgdatadir='${datadir}/${PACKAGE}'
806	   default_prefix=$ac_default_prefix
807	   case ${host} in
808	     *cygwin*) lyx_install_cygwin=true ;;
809	     *apple-darwin*) lyx_install_macosx=true ;;
810	   esac
811	   lyx_install_posix=true ;;
812	haiku) AC_DEFINE(USE_HAIKU_PACKAGING, 1, [Define to 1 if LyX should use a Haiku-style file layout])
813	   PACKAGE=lyx${version_suffix}
814	   program_suffix=$version_suffix
815	   pkgdatadir='${datadir}/${PACKAGE}'
816	   default_prefix=$ac_default_prefix
817	   lyx_install_posix=true ;;
818    *) AC_MSG_ERROR([unknown packaging type $lyx_use_packaging.]) ;;
819esac
820AM_CONDITIONAL(INSTALL_MACOSX, $lyx_install_macosx)
821AM_CONDITIONAL(INSTALL_WINDOWS, $lyx_install_windows)
822AM_CONDITIONAL(INSTALL_CYGWIN, $lyx_install_cygwin)
823AM_CONDITIONAL(INSTALL_POSIX, $lyx_install_posix)
824AC_SUBST(pkgdatadir)
825AC_SUBST(program_suffix)
826])
827
828
829## ------------------------------------------------------------------------
830## Check whether mkdir() is mkdir or _mkdir, and whether it takes
831## one or two arguments.
832##
833## http://ac-archive.sourceforge.net/C_Support/ac_func_mkdir.html
834## ------------------------------------------------------------------------
835##
836AC_DEFUN([AC_FUNC_MKDIR],
837[AC_CHECK_FUNCS([mkdir _mkdir])
838AC_CACHE_CHECK([whether mkdir takes one argument],
839               [ac_cv_mkdir_takes_one_arg],
840[AC_TRY_COMPILE([
841#include <sys/stat.h>
842#if HAVE_UNISTD_H
843#  include <unistd.h>
844#endif
845], [mkdir (".");],
846[ac_cv_mkdir_takes_one_arg=yes], [ac_cv_mkdir_takes_one_arg=no])])
847if test x"$ac_cv_mkdir_takes_one_arg" = xyes; then
848  AC_DEFINE([MKDIR_TAKES_ONE_ARG], 1,
849            [Define if mkdir takes only one argument.])
850fi
851])
852
853
854dnl Set VAR to the canonically resolved absolute equivalent of PATHNAME,
855dnl (which may be a relative path, and need not refer to any existing
856dnl entity).
857
858dnl On Win32-MSYS build hosts, the returned path is resolved to its true
859dnl native Win32 path name, (but with slashes, not backslashes).
860
861dnl On any other system, it is simply the result which would be obtained
862dnl if PATHNAME represented an existing directory, and the pwd command was
863dnl executed in that directory.
864AC_DEFUN([MSYS_AC_CANONICAL_PATH],
865[ac_dir="$2"
866 ( exec 2>/dev/null; cd / && pwd -W ) | grep ':' >/dev/null &&
867    ac_pwd_w="pwd -W" || ac_pwd_w=pwd
868 until ac_val=`exec 2>/dev/null; cd "$ac_dir" && $ac_pwd_w`
869 do
870   ac_dir=`AS_DIRNAME(["$ac_dir"])`
871 done
872 ac_dir=`echo "$ac_dir" | sed 's?^[[./]]*??'`
873 ac_val=`echo "$ac_val" | sed 's?/*$[]??'`
874 $1=`echo "$2" | sed "s?^[[./]]*$ac_dir/*?$ac_val/?"'
875   s?/*$[]??'`
876])
877
878dnl this is used by the macro blow to general a proper config.h.in entry
879m4_define([LYX_AH_CHECK_DECL],
880[AH_TEMPLATE(AS_TR_CPP(HAVE_DECL_$1),
881  [Define if you have the prototype for function `$1'])])dnl`
882
883dnl Check things are declared in headers to avoid errors or warnings.
884dnl Called like LYX_CHECK_DECL(function, header1 header2...)
885dnl Defines HAVE_DECL_{FUNCTION}
886AC_DEFUN([LYX_CHECK_DECL],
887[LYX_AH_CHECK_DECL($1)
888for ac_header in $2
889do
890  AC_MSG_CHECKING([if $1 is declared by header $ac_header])
891  AC_EGREP_HEADER($1, $ac_header,
892      [AC_MSG_RESULT(yes)
893       AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_DECL_$1))
894       break],
895      [AC_MSG_RESULT(no)])
896done])
897
898dnl this is used by the macro below to generate a proper config.h.in entry
899m4_define([LYX_AH_CHECK_DEF],
900[AH_TEMPLATE(AS_TR_CPP(HAVE_DEF_$1),
901  [Define to 1 if `$1' is defined in `$2'])])dnl'
902
903dnl Check whether name is defined in header by using it in codesnippet.
904dnl Called like LYX_CHECK_DEF(name, header, codesnippet)
905dnl Defines HAVE_DEF_{NAME}
906AC_DEFUN([LYX_CHECK_DEF],
907[LYX_AH_CHECK_DEF($1, $2)
908 AC_MSG_CHECKING([whether $1 is defined by header $2])
909 save_CPPFLAGS=$CPPFLAGS
910 CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
911 save_CXXFLAGS=$CXXFLAGS
912 CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS"
913 AC_LANG_PUSH(C++)
914 AC_TRY_COMPILE([#include <$2>], [$3],
915     lyx_have_def_name=yes,
916     lyx_have_def_name=no)
917 AC_LANG_POP(C++)
918 CXXFLAGS=$save_CXXFLAGS
919 CPPFLAGS=$save_CPPFLAGS
920 AC_MSG_RESULT($lyx_have_def_name)
921 if test "x$lyx_have_def_name" = xyes; then
922   AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_DEF_$1))
923 fi
924])
925
926dnl Extract the single digits from PACKAGE_VERSION and make them available.
927dnl Defines LYX_MAJOR_VERSION, LYX_MINOR_VERSION, LYX_RELEASE_LEVEL,
928dnl LYX_RELEASE_PATCH (possibly equal to 0), LYX_DIR_VER, and LYX_USERDIR_VER.
929AC_DEFUN([LYX_SET_VERSION_INFO],
930[lyx_major=`echo $PACKAGE_VERSION | sed -e 's/[[.]].*//'`
931 lyx_patch=`echo $PACKAGE_VERSION | sed -e "s/^$lyx_major//" -e 's/^.//'`
932 lyx_minor=`echo $lyx_patch | sed -e 's/[[.]].*//'`
933 lyx_patch=`echo $lyx_patch | sed -e "s/^$lyx_minor//" -e 's/^.//'`
934 lyx_release=`echo $lyx_patch | sed -e 's/[[^0-9]].*//'`
935 lyx_patch=`echo $lyx_patch | sed -e "s/^$lyx_release//" -e 's/^[[.]]//' -e 's/[[^0-9]].*//'`
936 test "x$lyx_patch" = "x" && lyx_patch=0
937 lyx_dir_ver=LYX_DIR_${lyx_major}${lyx_minor}x
938 lyx_userdir_ver=LYX_USERDIR_${lyx_major}${lyx_minor}x
939 AC_SUBST(LYX_MAJOR_VERSION,$lyx_major)
940 AC_SUBST(LYX_MINOR_VERSION,$lyx_minor)
941 AC_SUBST(LYX_RELEASE_LEVEL,$lyx_release)
942 AC_SUBST(LYX_RELEASE_PATCH,$lyx_patch)
943 AC_SUBST(LYX_DIR_VER,"$lyx_dir_ver")
944 AC_SUBST(LYX_USERDIR_VER,"$lyx_userdir_ver")
945])
946
947