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)
6 dnl Usage LYX_GET_VERSION Sets "lyx_version" to the version of LyX being
7 dnl built, displays it and sets variable "lyx_devel" to yes or no depending
8 dnl whether the version is a development release or not.
9 AC_DEFUN(LYX_GET_VERSION,[
11 # Get LyX version from $1 and guess wether is is stable or experimental.
12 VERSION=`grep '#define *LYX_VERSION' $1 |
13 sed -e 's/^.*"\([0-9.]*\)[^0-9.].*$/\1/' 2>/dev/null`
14 echo "configuring LyX version $VERSION"
15 if echo "$VERSION" | grep '[0-9]*\.[0-9]*[13579]\.[0-9]*' >/dev/null ; then
17 echo "WARNING: This is a development version. Expect bugs."
22 PACKAGE=lyx${program_suffix}
23 AC_SUBST(lyx_devel_version)
24 if test $lyx_devel_version = yes ; then
25 AC_DEFINE(DEVEL_VERSION, 1, Define if you are building a development version of LyX)
28 dnl Usage: LYX_ERROR(message) Displays the warning "message" and sets the
29 dnl flag lyx_error to yes.
31 lyx_error_txt="$lyx_error_txt
37 dnl Usage: LYX_WARNING(message) Displays the warning "message" and sets the
38 dnl flag lyx_warning to yes.
39 AC_DEFUN(LYX_WARNING,[
40 lyx_warning_txt="$lyx_warning_txt
46 dnl Usage: LYX_LIB_ERROR(file,library) Displays an error message indication
47 dnl that 'file' cannot be found because 'lib' may be uncorrectly installed.
48 AC_DEFUN(LYX_LIB_ERROR,[
49 LYX_ERROR([Cannot find $1. Please check that the $2 library
50 is correctly installed on your system.])])
53 dnl Usage: LYX_CHECK_ERRORS Displays a warning message if a LYX_ERROR
54 dnl has occured previously.
55 AC_DEFUN(LYX_CHECK_ERRORS,[
56 if test x$lyx_error = xyes; then
58 **** The following problems have been detected by configure.
59 **** Please check the messages below before running 'make'.
60 **** (see the section 'Problems' in the INSTALL file)
63 deleting cache $cache_file
68 if test x$lyx_warning = xyes; then
70 === The following minor problems have been detected by configure.
71 === Please check the messages below before running 'make'.
72 === (see the section 'Problems' in the INSTALL file)
77 Configuration of LyX was successful.
78 Type 'make' to compile the program,
79 and then 'make install' to install it.
84 dnl LYX_SEARCH_PROG(VARIABLE-NAME,PROGRAMS-LIST,ACTION-IF-FOUND)
86 define(LYX_SEARCH_PROG,[dnl
87 for ac_prog in $2 ; do
88 # Extract the first word of "$ac_prog", so it can be a program name with args.
89 set dummy $ac_prog ; ac_word=$[2]
90 if test -z "[$]$1"; then
91 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
92 for ac_dir in $PATH; do
93 test -z "$ac_dir" && ac_dir=.
94 if test -f [$ac_dir/$ac_word]; then
102 if test -n "[$]$1"; then
108 test -n "[$]$1" && break
113 AC_DEFUN(LYX_PROG_CXX_WORKS,
116 AC_TRY_COMPILER([class foo { int bar; }; int main(){return(0);}], ac_cv_prog_cxx_works, ac_cv_prog_cxx_cross)
118 if test $ac_cv_prog_cxx_works = no; then
121 cross_compiling=$ac_cv_prog_cxx_cross
125 AC_DEFUN(LYX_PROG_CXX,
126 [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
127 AC_MSG_CHECKING([for a working C++ compiler])
128 LYX_SEARCH_PROG(CXX, $CCC g++ gcc c++ CC cxx xlC cc++, LYX_PROG_CXX_WORKS)
130 if test -z "$CXX" ; then
131 AC_ERROR([Unable to find a working C++ compiler])
137 AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler])
138 AC_MSG_RESULT($cross_compiling)
142 dnl We might want to get or shut warnings.
143 AC_ARG_WITH(warnings,
144 [ --with-warnings tell GNU C++ to display more warnings],,
145 [if test $lyx_devel_version = yes && test $ac_cv_prog_gxx = yes ; then
150 if test "x$with_warnings" = xyes ; then
151 lyx_flags="$lyx_flags warnings"
152 AC_DEFINE(WITH_WARNINGS, 1,
153 [Define this if you want to see the warning directives put here and
154 there by the developpers to get attention])
157 # optimize less for development versions
158 if test "$lyx_devel_version" = yes ; then
164 # set the debug flags correctly.
165 if test $ac_cv_prog_gxx = yes; then
167 dnl Check whether -g works, even if CXXFLAGS is set, in case the package
168 dnl plays around with CXXFLAGS (such as to build both debugging and
169 dnl normal versions of a library), tasteless as that idea is.
170 ac_test_CXXFLAGS="${CXXFLAGS+set}"
171 ac_save_CXXFLAGS="$CXXFLAGS"
173 dnl Check the version of g++
174 gxx_version=`g++ --version`
177 if test "$ac_test_CXXFLAGS" = set; then
178 CXXFLAGS="$ac_save_CXXFLAGS"
179 elif test $ac_cv_prog_cxx_g = yes; then
181 2.7*) CXXFLAGS="$lyx_opt";;
182 *) CXXFLAGS="-g $lyx_opt -fno-exceptions -fno-rtti";;
187 if test $with_warnings = yes ; then
188 CXXFLAGS="$CXXFLAGS -ansi -pedantic -Wall"
192 test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
197 dnl Usage: LYX_CXX_RTTI : checks whether the C++ compiler
199 AC_DEFUN(LYX_CXX_RTTI,[
200 ### Check whether the compiler supports runtime type information
201 AC_CACHE_CHECK(whether the C++ compiler supports RTTI,lyx_cv_rtti,
205 virtual int tag() { return 0; }
207 class derived1 : public rtti {
209 int tag() { return 1; }
211 class derived2 : public rtti {
213 int tag() { return 2; }
216 derived1 * foo1 = new derived1();
217 derived2 * foo2 = new derived2();
219 derived1 * bar1 = dynamic_cast<derived1 *>(bar);
223 bar1 = dynamic_cast<derived1 *>(bar);
228 ],lyx_cv_rtti=yes,lyx_cv_rtti=no,lyx_cv_rtti=no)
230 if test x$lyx_cv_rtti = xyes ; then
231 AC_DEFINE(HAVE_RTTI, 1,
232 [Define to 1 if your compiler supports runtime type information])
236 dnl Usage: LYX_CXX_EXPLICIT : checks whether the C++ compiler
237 dnl understands the "explicit" directive.
238 AC_DEFUN(LYX_CXX_EXPLICIT,[
239 ### Check whether the compiler understands the keyword `explicit'
240 AC_CACHE_CHECK(whether the C++ compiler understands explicit,lyx_cv_explicit,
245 };],,lyx_cv_explicit=yes,lyx_cv_explicit=no)
247 if test $lyx_cv_explicit = no ; then
248 AC_DEFINE(explicit,[ ],
249 [Define to nothing if your compiler does not understand the
250 'explicit' directive])
254 dnl Usage: LYX_CXX_STL_STACK : checks whether the C++ compiler
255 dnl has a working stl stack template
256 AC_DEFUN(LYX_CXX_STL_STACK,[
257 AC_CACHE_CHECK(for broken STL stack template,lyx_cv_broken_stack,
264 ],lyx_cv_broken_stack=no,lyx_cv_broken_stack=yes)
266 if test $lyx_cv_broken_stack = yes ; then
267 AC_DEFINE(BROKEN_STL_STACK, 1,
268 [Define if you have the STL from libg++ 2.7.x, where stack<> is not defined
273 dnl Usage: LYX_CXX_STL_MODERN_STREAMS : checks whether the C++ compiler
274 dnl supports modern STL streams
275 AC_DEFUN(LYX_CXX_STL_MODERN_STREAMS,[
276 AC_CACHE_CHECK(for modern STL streams,lyx_cv_modern_streams,
280 std::streambuf * test = std::cerr.rdbuf();
282 ],lyx_cv_modern_streams=yes,lyx_cv_modern_streams=no)
284 if test $lyx_cv_modern_streams = yes ; then
285 AC_DEFINE(MODERN_STL_STREAMS, 1,
286 [Define if you have modern standard-compliant STL streams])
290 dnl Usage: LYX_CXX_STL_STRING : checks whether the C++ compiler
291 dnl has a working stl string container, the check is really stupid
292 dnl and could need some improvement.
293 AC_DEFUN(LYX_CXX_STL_STRING,[
294 AC_REQUIRE([LYX_PROG_CXX])
295 AC_MSG_CHECKING(whether the included std::string should be used)
296 AC_ARG_WITH(included-string,[
297 --with-included-string use LyX string class instead of STL string
299 with_included_string=$withval
305 string a("hello there");
310 with_included_string=no
312 with_included_string=yes
316 if test x$with_included_string = xyes ; then
317 AC_DEFINE(USE_INCLUDED_STRING, 1,
318 [Define to use the lyxstring class bundled with LyX.])
319 lyx_flags="$lyx_flags included-string"
321 AM_CONDITIONAL(USE_LYXSTRING, test x$with_included_string = xyes)
322 AC_MSG_RESULT([$with_included_string])
327 AC_DEFUN(LYX_CXX_MUTABLE, [
328 AC_REQUIRE([LYX_PROG_CXX])
329 AC_MSG_CHECKING(if C++ compiler supports mutable)
335 void foo() const { c=0; }
340 AC_DEFINE(HAVE_MUTABLE, 1,
341 [Defined if you compiler supports 'mutable'.])
345 AC_MSG_RESULT([$ac_mutable])
350 AC_DEFUN(LYX_CXX_PARTIAL, [
351 AC_REQUIRE([LYX_PROG_CXX])
352 AC_MSG_CHECKING(if C++ compiler supports partial specialization)
355 template<class T, class K>
359 template<class T> class k<void,T> { };
364 ac_partial_specialization=yes
365 AC_DEFINE(HAVE_PARTIAL_SPECIALIZATION, 1,
366 [Defined if your compiler supports partial specialization.])
368 ac_partial_specialization=no
370 AC_MSG_RESULT([$ac_partial_specialization])
374 dnl Usage: LYX_CXX_NAMESPACES : checks whether the C++ compiler
375 dnl has a correct namespace handling and define CXX_WORKING_NAMESPACES
376 dnl if true. This macro does not do a thourough test, but it should be
377 dnl good enough to suit our needs.
378 AC_DEFUN(LYX_CXX_NAMESPACES,[
379 AC_CACHE_CHECK(for correct namespaces support,lyx_cv_cxx_namespace,
386 ],lyx_cv_cxx_namespace=yes,lyx_cv_cxx_namespace=no)
388 if test $lyx_cv_cxx_namespace = yes ; then
389 AC_DEFINE(CXX_WORKING_NAMESPACES, 1,
390 [Define if your C++ compiler has correct support for namespaces])
394 dnl Usage: LYX_CXX_CHEADERS : checks whether the C++ compiler
395 dnl provides wrappers for C headers and use our alternate version otherwise.
396 AC_DEFUN(LYX_CXX_CHEADERS,[
397 AC_CACHE_CHECK(for C headers wrappers,lyx_cv_cxx_cheaders,
407 #include <ctime>],[lyx_cv_cxx_cheaders=yes],[lyx_cv_cxx_cheaders=no])])
408 if test $lyx_cv_cxx_cheaders = no ; then
409 LYX_ADD_INC_DIR(lyx_cppflags,\$(top_srcdir)/src/cheaders)
413 dnl Usage LYX_PATH_XPM: Checks for xpm library and header
414 AC_DEFUN(LYX_PATH_XPM,[
415 ### Check for Xpm library
416 AC_CHECK_LIB(Xpm, XpmCreateBufferFromImage,LYX_LIBS="-lXpm $LYX_LIBS",
417 [LYX_LIB_ERROR(libXpm,Xpm)], $LYX_LIBS)
419 ### Check for Xpm headers
420 lyx_cv_xpm_h_location="<xpm.h>"
421 AC_CHECK_HEADER(X11/xpm.h,[
422 ac_cv_header_xpm_h=yes
423 lyx_cv_xpm_h_location="<X11/xpm.h>"],[
424 AC_CHECK_HEADER(xpm.h,[],[
425 LYX_LIB_ERROR(xpm.h,Xpm)])])
426 AC_DEFINE_UNQUOTED(XPM_H_LOCATION,$lyx_cv_xpm_h_location)
428 ### Test for the header version
429 if test $ac_cv_header_xpm_h = yes; then
430 AC_CACHE_CHECK([xpm header version],lyx_cv_xpmversion,
431 [ cat > conftest.$ac_ext <<EOF
432 #line __oline__ "configure"
433 #include "confdefs.h"
435 #include XPM_H_LOCATION
436 "%%%"lyx_cv_xpmv=XpmVersion;lyx_cv_xpmr=XpmRevision"%%%"
438 eval `(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
439 grep '^"%%%"' 2>/dev/null | \
440 sed -e 's/^"%%%"\(.*\)"%%%"/\1/' -e 's/ //g'`
441 case "$lyx_cv_xpmr" in
443 [0-9]) lyxxpmr_alpha=`echo $lyx_cv_xpmr |tr 123456789 abcdefghi`
444 lyxxpmv_alpha=" (aka 3.$lyx_cv_xpmv$lyxxpmr_alpha)";;
448 lyx_cv_xpmversion="$lyx_cv_xpmv.$lyx_cv_xpmr$lyxxpmv_alpha"
450 case "$lyx_cv_xpmr" in
452 [789]|[0-9][0-9]*) ;;
454 *) LYX_WARNING([Version $lyx_cv_xpmversion of the Xpm library is a bit old.
455 If you experience strange crashes with LyX, try to upgrade
456 to at least version 4.7 (aka 3.4g).
457 If you have installed a newer version of the library, check whether you
458 have an old xpm.h header file in your include path.]);;
463 dnl Usage LYX_PATH_XFORMS: Checks for xforms library and flags
464 AC_DEFUN(LYX_PATH_XFORMS,[
465 ### Check for xforms library
466 AC_CHECK_LIB(forms, fl_initialize, LYX_LIBS="-lforms $LYX_LIBS",
467 [AC_CHECK_LIB(xforms, fl_initialize, LYX_LIBS="-lxforms $LYX_LIBS",
468 [LYX_LIB_ERROR(libforms or libxforms,xforms)], $LYX_LIBS)], $LYX_LIBS)
470 ### Check for xforms headers
471 lyx_cv_forms_h_location="<forms.h>"
472 AC_CHECK_HEADER(X11/forms.h,[
473 ac_cv_header_forms_h=yes
474 lyx_cv_forms_h_location="<X11/forms.h>"],[
475 AC_CHECK_HEADER(forms.h,[],[
476 LYX_LIB_ERROR(forms.h,forms)])])
477 AC_DEFINE_UNQUOTED(FORMS_H_LOCATION,$lyx_cv_forms_h_location)
478 if test $ac_cv_header_forms_h = yes; then
479 AC_CACHE_CHECK([xforms header version],lyx_cv_xfversion,
480 [ cat > conftest.$ac_ext <<EOF
481 #line __oline__ "configure"
482 #include "confdefs.h"
484 #include FORMS_H_LOCATION
485 #if ! defined(FL_INCLUDE_VERSION)
488 "%%%"FL_VERSION.FL_REVISION"%%%"
491 lyx_cv_xfversion=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
492 grep '^"%%%"' 2>/dev/null | \
493 sed -e 's/^"%%%"\(.*\)"%%%"/\1/' -e 's/ //g'`
495 case "$lyx_cv_xfversion" in
496 "(unknown)"|0.82|0.83|0.84|0.85)
498 Version $lyx_cv_xfversion of xforms is not compatible with LyX.
499 This version of LyX works best with version 0.88[,] although it
500 supports also versions 0.81[,] 0.86 and 0.87.) ;;
503 While LyX is compatible with version $lyx_cv_xfversion of xforms[,]
504 it is recommended that you upgrade to version 0.88.) ;;
506 0.89) LYX_WARNING(dnl
507 LyX should work ok with version $lyx_cv_xfversion of xforms[,] but
508 it is an unproven version and might still have some bugs. If you
509 have problems[,] please use version 0.88 instead.) ;;
511 Version $lyx_cv_xfversion of xforms might not be compatible with LyX[,]
512 since it is newer than 0.88. You might have slight problems with it.);;
517 dnl Usage: LYX_HPUX Checks for HP-UX and update CXXFLAGS accordingly
519 [#It seems that HPUX requires using -fpcc-struct-return with gcc.
520 AC_CACHE_CHECK(for HP-UX,ac_cv_hpux,[
521 os=`uname -s | tr '[A-Z]' '[a-z]'`
523 test "$os" = hp-ux && ac_cv_hpux=yes])
524 if test "$ac_cv_hpux" = yes; then
525 test "x$GXX" = xyes && CXXFLAGS="$CXXFLAGS -fpcc-struct-return"
529 dnl Usage: LYX_SUNOS4 Checks for SunOS 4.x and sets the flag lyx_broken_headers
532 [#The headers are not correct under SunOS4
533 AC_CACHE_CHECK(for SunOS 4.x,ac_cv_sunos4,[
535 os=`uname -a | sed -e 's/^\([^ ]*\) [^ ]* \([0-9]\)\..*/\1\2/'`
536 changequote([, ]) dnl
538 test "$os" = SunOS4 && ac_cv_sunos4=yes])
539 if test "$ac_cv_sunos4" = yes; then
540 test "x$GXX" = xyes && lyx_broken_headers=yes
544 dnl Usage: LYX_SCO Checks for SCO and sets the flag lyx_broken_headers
547 [AC_CACHE_CHECK(for SCO 3.2v4,ac_cv_sco,[
549 if test `uname -s` != "SCO_SV"; then
550 lyx_machine_rel=`uname -m`:`uname -r`
551 if test $lyx_machine_rel = i386:3.2 || test $lyx_machine_rel = i486:3.2;
553 if test -f /usr/options/cb.name; then
555 elif /bin/uname -X 2>/dev/null >/dev/null ; then
560 if test "$ac_cv_sco" = yes; then
561 test "x$GXX" = xyes && lyx_broken_headers=yes
565 dnl Usage: LYX_WITH_DIR(dir-name,desc,dir-var-name,default-value,
566 dnl [default-yes-value])
567 dnl Adds a --with-'dir-name' option (described by 'desc') and puts the
568 dnl resulting directory name in 'dir-var-name'.
569 AC_DEFUN(LYX_WITH_DIR,[
570 AC_ARG_WITH($1,[ --with-$1 specify $2])
571 AC_MSG_CHECKING([for $2])
572 if test -z "$with_$3"; then
573 AC_CACHE_VAL(lyx_cv_$3, lyx_cv_$3=$4)
575 test "x$with_$3" = xyes && with_$3=$5
578 AC_MSG_RESULT($lyx_cv_$3)])
581 dnl Usage: LYX_LOOP_DIR(value,action)
582 dnl Executes action for values of variable `dir' in `values'. `values' can
583 dnl use ":" as a separator.
584 AC_DEFUN(LYX_LOOP_DIR,[
585 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
586 for dir in `eval "echo $1"`; do
587 if test ! "$dir" = NONE; then
588 test ! -d "$dir" && AC_ERROR([\"$dir\" is not a directory])
596 dnl Usage: LYX_ADD_LIB_DIR(var-name,dir) Adds a -L directive to variable
598 AC_DEFUN(LYX_ADD_LIB_DIR,[
600 if test "`(uname) 2>/dev/null`" = SunOS &&
601 uname -r | grep '^5' >/dev/null; then
602 if test $ac_cv_prog_gxx = yes ; then
603 $1="${$1} -Wl[,]-R$2"
610 dnl Usage: LYX_ADD_INC_DIR(var-name,dir) Adds a -I directive to variable
612 AC_DEFUN(LYX_ADD_INC_DIR,[$1="${$1} -I$2 "])
615 dnl AC_VALIDATE_CACHE_SYSTEM_TYPE[(cmd)]
616 dnl if the cache file is inconsistent with the current host,
617 dnl target and build system types, execute CMD or print a default
619 AC_DEFUN(AC_VALIDATE_CACHE_SYSTEM_TYPE, [
620 AC_REQUIRE([AC_CANONICAL_SYSTEM])
621 AC_MSG_CHECKING([config.cache system type])
622 if { test x"${ac_cv_host_system_type+set}" = x"set" &&
623 test x"$ac_cv_host_system_type" != x"$host"; } ||
624 { test x"${ac_cv_build_system_type+set}" = x"set" &&
625 test x"$ac_cv_build_system_type" != x"$build"; } ||
626 { test x"${ac_cv_target_system_type+set}" = x"set" &&
627 test x"$ac_cv_target_system_type" != x"$target"; }; then
628 AC_MSG_RESULT([different])
630 [AC_MSG_ERROR(["you must remove config.cache and restart configure"])])
632 AC_MSG_RESULT([same])
634 ac_cv_host_system_type="$host"
635 ac_cv_build_system_type="$build"
636 ac_cv_target_system_type="$target"
640 dnl We use this until autoconf fixes its version.
641 AC_DEFUN(LYX_FUNC_SELECT_ARGTYPES,
642 [AC_MSG_CHECKING([types of arguments for select()])
643 AC_CACHE_VAL(ac_cv_func_select_arg234,dnl
644 [AC_CACHE_VAL(ac_cv_func_select_arg1,dnl
645 [AC_CACHE_VAL(ac_cv_func_select_arg5,dnl
646 [for ac_cv_func_select_arg234 in 'fd_set *' 'int *' 'void *'; do
647 for ac_cv_func_select_arg1 in 'int' 'size_t' 'unsigned long' 'unsigned'; do for ac_cv_func_select_arg5 in 'struct timeval *' 'const struct timeval *'; do
649 [#ifdef HAVE_SYS_TYPES_H
650 #include <sys/types.h>
652 #ifdef HAVE_SYS_TIME_H
653 #include <sys/time.h>
655 #ifdef HAVE_SYS_SELECT_H
656 #include <sys/select.h>
658 #ifdef HAVE_SYS_SOCKET_H
659 #include <sys/socket.h>
661 extern int select ($ac_cv_func_select_arg1,$ac_cv_func_select_arg234,$ac_cv_func_select_arg234,$ac_cv_func_select_arg234,$ac_cv_func_select_arg5);],,dnl
662 [ac_not_found=no ; break 3],ac_not_found=yes)
669 if test "$ac_not_found" = yes; then
670 ac_cv_func_select_arg1=int
671 ac_cv_func_select_arg234='int *'
672 ac_cv_func_select_arg5='struct timeval *'
674 AC_MSG_RESULT([$ac_cv_func_select_arg1,$ac_cv_func_select_arg234,$ac_cv_func_select_arg5])
675 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1,$ac_cv_func_select_arg1)
676 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234,($ac_cv_func_select_arg234))
677 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5,($ac_cv_func_select_arg5))