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