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 VERSION=`grep '#define *LYX_VERSION' $1 |
12 sed -e 's/^.*"\(.*\)"$/\1/' 2>/dev/null`
13 echo "configuring LyX version $VERSION"
14 if echo "$VERSION" | grep 'cvs' >/dev/null ; then
16 echo "WARNING: This is a development version. Expect bugs."
20 if echo "$VERSION" | grep 'pre' > /dev/null ; then
22 echo "WARNING: This is a prerelease. Be careful and backup your documents."
27 PACKAGE=lyx${program_suffix}
28 AC_SUBST(lyx_devel_version)
29 if test $lyx_devel_version = yes ; then
30 AC_DEFINE(DEVEL_VERSION, 1, Define if you are building a development version of LyX)
33 dnl Usage: LYX_ERROR(message) Displays the warning "message" and sets the
34 dnl flag lyx_error to yes.
36 lyx_error_txt="$lyx_error_txt
42 dnl Usage: LYX_WARNING(message) Displays the warning "message" and sets the
43 dnl flag lyx_warning to yes.
44 AC_DEFUN(LYX_WARNING,[
45 lyx_warning_txt="$lyx_warning_txt
51 dnl Usage: LYX_LIB_ERROR(file,library) Displays an error message indication
52 dnl that 'file' cannot be found because 'lib' may be uncorrectly installed.
53 AC_DEFUN(LYX_LIB_ERROR,[
54 LYX_ERROR([Cannot find $1. Please check that the $2 library
55 is correctly installed on your system.])])
58 dnl Usage: LYX_CHECK_ERRORS Displays a warning message if a LYX_ERROR
59 dnl has occured previously.
60 AC_DEFUN(LYX_CHECK_ERRORS,[
61 if test x$lyx_error = xyes; then
63 **** The following problems have been detected by configure.
64 **** Please check the messages below before running 'make'.
65 **** (see the section 'Problems' in the INSTALL file)
68 deleting cache $cache_file
73 if test x$lyx_warning = xyes; then
75 === The following minor problems have been detected by configure.
76 === Please check the messages below before running 'make'.
77 === (see the section 'Problems' in the INSTALL file)
82 Configuration of LyX was successful.
83 Type 'make' to compile the program,
84 and then 'make install' to install it.
89 dnl LYX_SEARCH_PROG(VARIABLE-NAME,PROGRAMS-LIST,ACTION-IF-FOUND)
91 define(LYX_SEARCH_PROG,[dnl
92 for ac_prog in $2 ; do
93 # Extract the first word of "$ac_prog", so it can be a program name with args.
94 set dummy $ac_prog ; ac_word=$[2]
95 if test -z "[$]$1"; then
96 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
97 for ac_dir in $PATH; do
98 test -z "$ac_dir" && ac_dir=.
99 if test -f [$ac_dir/$ac_word]; then
107 if test -n "[$]$1"; then
113 test -n "[$]$1" && break
118 AC_DEFUN(LYX_PROG_CXX_WORKS,
121 AC_TRY_COMPILER([class foo { int bar; }; int main(){return(0);}], ac_cv_prog_cxx_works, ac_cv_prog_cxx_cross)
123 if test $ac_cv_prog_cxx_works = no; then
126 cross_compiling=$ac_cv_prog_cxx_cross
130 AC_DEFUN(LYX_PROG_CXX,
131 [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
132 AC_MSG_CHECKING([for a working C++ compiler])
133 LYX_SEARCH_PROG(CXX, $CCC g++ gcc c++ CC cxx xlC cc++, LYX_PROG_CXX_WORKS)
135 if test -z "$CXX" ; then
136 AC_ERROR([Unable to find a working C++ compiler])
142 AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler])
143 AC_MSG_RESULT($cross_compiling)
147 dnl We might want to get or shut warnings.
148 AC_ARG_WITH(warnings,
149 [ --with-warnings tell GNU C++ to display more warnings],,
150 [ if test $lyx_devel_version = yes -o $lyx_prerelease = yes && test $ac_cv_prog_gxx = yes ; then
155 if test x$with_warnings = xyes ; then
156 lyx_flags="$lyx_flags warnings"
157 AC_DEFINE(WITH_WARNINGS, 1,
158 [Define this if you want to see the warning directives put here and
159 there by the developpers to get attention])
162 # optimize less for development versions
163 if test $lyx_devel_version = yes -o $lyx_prerelease = yes ; then
169 # set the debug flags correctly.
170 if test $ac_cv_prog_gxx = yes; then
172 dnl Check whether -g works, even if CXXFLAGS is set, in case the package
173 dnl plays around with CXXFLAGS (such as to build both debugging and
174 dnl normal versions of a library), tasteless as that idea is.
175 ac_test_CXXFLAGS="${CXXFLAGS+set}"
176 ac_save_CXXFLAGS="$CXXFLAGS"
178 dnl Check the version of g++
179 gxx_version=`g++ --version`
182 if test "$ac_test_CXXFLAGS" = set; then
183 CXXFLAGS="$ac_save_CXXFLAGS"
184 elif test $ac_cv_prog_cxx_g = yes; then
186 2.7*) CXXFLAGS="$lyx_opt";;
187 *) CXXFLAGS="-g $lyx_opt -fno-exceptions -fno-rtti";;
192 if test x$with_warnings = xyes ; then
193 CXXFLAGS="$CXXFLAGS -ansi -Wall"
194 if test $lyx_devel_version = yes ; then
195 CXXFLAGS="$CXXFLAGS -pedantic"
200 test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
205 dnl Usage: LYX_CXX_RTTI : checks whether the C++ compiler
207 AC_DEFUN(LYX_CXX_RTTI,[
208 ### Check whether the compiler supports runtime type information
209 AC_CACHE_CHECK(whether the C++ compiler supports RTTI,lyx_cv_rtti,
213 virtual int tag() { return 0; }
215 class derived1 : public rtti {
217 int tag() { return 1; }
219 class derived2 : public rtti {
221 int tag() { return 2; }
224 derived1 * foo1 = new derived1();
225 derived2 * foo2 = new derived2();
227 derived1 * bar1 = dynamic_cast<derived1 *>(bar);
231 bar1 = dynamic_cast<derived1 *>(bar);
236 ],lyx_cv_rtti=yes,lyx_cv_rtti=no,lyx_cv_rtti=no)
238 if test x$lyx_cv_rtti = xyes ; then
239 AC_DEFINE(HAVE_RTTI, 1,
240 [Define to 1 if your compiler supports runtime type information])
244 dnl Usage: LYX_CXX_EXPLICIT : checks whether the C++ compiler
245 dnl understands the "explicit" directive.
246 AC_DEFUN(LYX_CXX_EXPLICIT,[
247 ### Check whether the compiler understands the keyword `explicit'
248 AC_CACHE_CHECK(whether the C++ compiler understands explicit,lyx_cv_explicit,
253 };],,lyx_cv_explicit=yes,lyx_cv_explicit=no)
255 if test $lyx_cv_explicit = no ; then
256 AC_DEFINE(explicit,[ ],
257 [Define to nothing if your compiler does not understand the
258 'explicit' directive])
262 dnl Usage: LYX_CXX_STL_STACK : checks whether the C++ compiler
263 dnl has a working stl stack template
264 AC_DEFUN(LYX_CXX_STL_STACK,[
265 AC_CACHE_CHECK(for broken STL stack template,lyx_cv_broken_stack,
272 ],lyx_cv_broken_stack=no,lyx_cv_broken_stack=yes)
274 if test $lyx_cv_broken_stack = yes ; then
275 AC_DEFINE(BROKEN_STL_STACK, 1,
276 [Define if you have the STL from libg++ 2.7.x, where stack<> is not defined
281 dnl Usage: LYX_CXX_STL_MODERN_STREAMS : checks whether the C++ compiler
282 dnl supports modern STL streams
283 AC_DEFUN(LYX_CXX_STL_MODERN_STREAMS,[
284 AC_CACHE_CHECK(for modern STL streams,lyx_cv_modern_streams,
288 std::streambuf * test = std::cerr.rdbuf();
290 ],lyx_cv_modern_streams=yes,lyx_cv_modern_streams=no)
292 if test $lyx_cv_modern_streams = yes ; then
293 AC_DEFINE(MODERN_STL_STREAMS, 1,
294 [Define if you have modern standard-compliant STL streams])
298 dnl Usage: LYX_CXX_STL_STRING : checks whether the C++ compiler
299 dnl has a working stl string container, the check is really stupid
300 dnl and could need some improvement.
301 AC_DEFUN(LYX_CXX_STL_STRING,[
302 AC_REQUIRE([LYX_PROG_CXX])
303 AC_MSG_CHECKING(whether the included std::string should be used)
304 AC_ARG_WITH(included-string,[
305 --with-included-string use LyX string class instead of STL string
307 with_included_string=$withval
313 string a("hello there");
318 with_included_string=no
320 with_included_string=yes
324 if test x$with_included_string = xyes ; then
325 AC_DEFINE(USE_INCLUDED_STRING, 1,
326 [Define to use the lyxstring class bundled with LyX.])
327 lyx_flags="$lyx_flags included-string"
329 AM_CONDITIONAL(USE_LYXSTRING, test x$with_included_string = xyes)
330 AC_MSG_RESULT([$with_included_string])
335 AC_DEFUN(LYX_CXX_MUTABLE, [
336 AC_REQUIRE([LYX_PROG_CXX])
337 AC_MSG_CHECKING(if C++ compiler supports mutable)
343 void foo() const { c=0; }
348 AC_DEFINE(HAVE_MUTABLE, 1,
349 [Defined if you compiler supports 'mutable'.])
353 AC_MSG_RESULT([$ac_mutable])
358 AC_DEFUN(LYX_CXX_PARTIAL, [
359 AC_REQUIRE([LYX_PROG_CXX])
360 AC_MSG_CHECKING(if C++ compiler supports partial specialization)
363 template<class T, class K>
367 template<class T> class k<void,T> { };
372 ac_partial_specialization=yes
373 AC_DEFINE(HAVE_PARTIAL_SPECIALIZATION, 1,
374 [Defined if your compiler supports partial specialization.])
376 ac_partial_specialization=no
378 AC_MSG_RESULT([$ac_partial_specialization])
382 dnl Usage: LYX_CXX_NAMESPACES : checks whether the C++ compiler
383 dnl has a correct namespace handling and define CXX_WORKING_NAMESPACES
384 dnl if true. This macro does not do a thourough test, but it should be
385 dnl good enough to suit our needs.
386 AC_DEFUN(LYX_CXX_NAMESPACES,[
387 AC_CACHE_CHECK(for correct namespaces support,lyx_cv_cxx_namespace,
394 ],lyx_cv_cxx_namespace=yes,lyx_cv_cxx_namespace=no)
396 if test $lyx_cv_cxx_namespace = yes ; then
397 AC_DEFINE(CXX_WORKING_NAMESPACES, 1,
398 [Define if your C++ compiler has correct support for namespaces])
402 dnl Usage: LYX_CXX_CHEADERS : checks whether the C++ compiler
403 dnl provides wrappers for C headers and use our alternate version otherwise.
404 AC_DEFUN(LYX_CXX_CHEADERS,[
405 AC_CACHE_CHECK(for C headers wrappers,lyx_cv_cxx_cheaders,
415 #include <ctime>],[lyx_cv_cxx_cheaders=yes],[lyx_cv_cxx_cheaders=no])])
416 if test $lyx_cv_cxx_cheaders = no ; then
417 LYX_ADD_INC_DIR(lyx_cppflags,\$(top_srcdir)/src/cheaders)
421 dnl Usage LYX_PATH_XPM: Checks for xpm library and header
422 AC_DEFUN(LYX_PATH_XPM,[
423 ### Check for Xpm library
424 AC_CHECK_LIB(Xpm, XpmCreateBufferFromImage,LYX_LIBS="-lXpm $LYX_LIBS",
425 [LYX_LIB_ERROR(libXpm,Xpm)], $LYX_LIBS)
427 ### Check for Xpm headers
428 lyx_cv_xpm_h_location="<xpm.h>"
429 AC_CHECK_HEADER(X11/xpm.h,[
430 ac_cv_header_xpm_h=yes
431 lyx_cv_xpm_h_location="<X11/xpm.h>"],[
432 AC_CHECK_HEADER(xpm.h,[],[
433 LYX_LIB_ERROR(xpm.h,Xpm)])])
434 AC_DEFINE_UNQUOTED(XPM_H_LOCATION,$lyx_cv_xpm_h_location)
436 ### Test for the header version
437 if test $ac_cv_header_xpm_h = yes; then
438 AC_CACHE_CHECK([xpm header version],lyx_cv_xpmversion,
439 [ cat > conftest.$ac_ext <<EOF
440 #line __oline__ "configure"
441 #include "confdefs.h"
443 #include XPM_H_LOCATION
444 "%%%"lyx_cv_xpmv=XpmVersion;lyx_cv_xpmr=XpmRevision"%%%"
446 eval `(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
447 grep '^"%%%"' 2>/dev/null | \
448 sed -e 's/^"%%%"\(.*\)"%%%"/\1/' -e 's/ //g'`
449 case "$lyx_cv_xpmr" in
451 [0-9]) lyxxpmr_alpha=`echo $lyx_cv_xpmr |tr 123456789 abcdefghi`
452 lyxxpmv_alpha=" (aka 3.$lyx_cv_xpmv$lyxxpmr_alpha)";;
456 lyx_cv_xpmversion="$lyx_cv_xpmv.$lyx_cv_xpmr$lyxxpmv_alpha"
458 case "$lyx_cv_xpmr" in
460 [789]|[0-9][0-9]*) ;;
462 *) LYX_WARNING([Version $lyx_cv_xpmversion of the Xpm library is a bit old.
463 If you experience strange crashes with LyX, try to upgrade
464 to at least version 4.7 (aka 3.4g).
465 If you have installed a newer version of the library, check whether you
466 have an old xpm.h header file in your include path.]);;
471 dnl Usage LYX_PATH_XFORMS: Checks for xforms library and flags
472 AC_DEFUN(LYX_PATH_XFORMS,[
473 ### Check for xforms library
474 AC_CHECK_LIB(forms, fl_initialize, LYX_LIBS="-lforms $LYX_LIBS",
475 [AC_CHECK_LIB(xforms, fl_initialize, LYX_LIBS="-lxforms $LYX_LIBS",
476 [LYX_LIB_ERROR(libforms or libxforms,xforms)], $LYX_LIBS)], $LYX_LIBS)
478 ### Check for xforms headers
479 lyx_cv_forms_h_location="<forms.h>"
480 AC_CHECK_HEADER(X11/forms.h,[
481 ac_cv_header_forms_h=yes
482 lyx_cv_forms_h_location="<X11/forms.h>"],[
483 AC_CHECK_HEADER(forms.h,[],[
484 LYX_LIB_ERROR(forms.h,forms)])])
485 AC_DEFINE_UNQUOTED(FORMS_H_LOCATION,$lyx_cv_forms_h_location)
486 if test $ac_cv_header_forms_h = yes; then
487 AC_CACHE_CHECK([xforms header version],lyx_cv_xfversion,
488 [ cat > conftest.$ac_ext <<EOF
489 #line __oline__ "configure"
490 #include "confdefs.h"
492 #include FORMS_H_LOCATION
493 #if ! defined(FL_INCLUDE_VERSION)
496 "%%%"FL_VERSION.FL_REVISION"%%%"
499 lyx_cv_xfversion=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
500 grep '^"%%%"' 2>/dev/null | \
501 sed -e 's/^"%%%"\(.*\)"%%%"/\1/' -e 's/ //g'`
503 case "$lyx_cv_xfversion" in
504 "(unknown)"|0.82|0.83|0.84|0.85)
506 Version $lyx_cv_xfversion of xforms is not compatible with LyX.
507 This version of LyX works best with version 0.88[,] although it
508 supports also versions 0.81[,] 0.86 and 0.87.) ;;
511 While LyX is compatible with version $lyx_cv_xfversion of xforms[,]
512 it is recommended that you upgrade to version 0.88.) ;;
514 0.89) LYX_WARNING(dnl
515 LyX should work ok with version $lyx_cv_xfversion of xforms[,] but
516 it is an unproven version and might still have some bugs. If you
517 have problems[,] please use version 0.88 instead.) ;;
519 Version $lyx_cv_xfversion of xforms might not be compatible with LyX[,]
520 since it is newer than 0.88. You might have slight problems with it.);;
525 dnl Usage: LYX_HPUX Checks for HP-UX and update CXXFLAGS accordingly
527 [#It seems that HPUX requires using -fpcc-struct-return with gcc.
528 AC_CACHE_CHECK(for HP-UX,ac_cv_hpux,[
529 os=`uname -s | tr '[A-Z]' '[a-z]'`
531 test "$os" = hp-ux && ac_cv_hpux=yes])
532 if test "$ac_cv_hpux" = yes; then
533 test "x$GXX" = xyes && CXXFLAGS="$CXXFLAGS -fpcc-struct-return"
537 dnl Usage: LYX_SUNOS4 Checks for SunOS 4.x and sets the flag lyx_broken_headers
540 [#The headers are not correct under SunOS4
541 AC_CACHE_CHECK(for SunOS 4.x,ac_cv_sunos4,[
543 os=`uname -a | sed -e 's/^\([^ ]*\) [^ ]* \([0-9]\)\..*/\1\2/'`
544 changequote([, ]) dnl
546 test "$os" = SunOS4 && ac_cv_sunos4=yes])
547 if test "$ac_cv_sunos4" = yes; then
548 test "x$GXX" = xyes && lyx_broken_headers=yes
552 dnl Usage: LYX_SCO Checks for SCO and sets the flag lyx_broken_headers
555 [AC_CACHE_CHECK(for SCO 3.2v4,ac_cv_sco,[
557 if test `uname -s` != "SCO_SV"; then
558 lyx_machine_rel=`uname -m`:`uname -r`
559 if test $lyx_machine_rel = i386:3.2 || test $lyx_machine_rel = i486:3.2;
561 if test -f /usr/options/cb.name; then
563 elif /bin/uname -X 2>/dev/null >/dev/null ; then
568 if test "$ac_cv_sco" = yes; then
569 test "x$GXX" = xyes && lyx_broken_headers=yes
573 dnl Usage: LYX_WITH_DIR(dir-name,desc,dir-var-name,default-value,
574 dnl [default-yes-value])
575 dnl Adds a --with-'dir-name' option (described by 'desc') and puts the
576 dnl resulting directory name in 'dir-var-name'.
577 AC_DEFUN(LYX_WITH_DIR,[
578 AC_ARG_WITH($1,[ --with-$1 specify $2])
579 AC_MSG_CHECKING([for $2])
580 if test -z "$with_$3"; then
581 AC_CACHE_VAL(lyx_cv_$3, lyx_cv_$3=$4)
583 test "x$with_$3" = xyes && with_$3=$5
586 AC_MSG_RESULT($lyx_cv_$3)])
589 dnl Usage: LYX_LOOP_DIR(value,action)
590 dnl Executes action for values of variable `dir' in `values'. `values' can
591 dnl use ":" as a separator.
592 AC_DEFUN(LYX_LOOP_DIR,[
593 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
594 for dir in `eval "echo $1"`; do
595 if test ! "$dir" = NONE; then
596 test ! -d "$dir" && AC_ERROR([\"$dir\" is not a directory])
604 dnl Usage: LYX_ADD_LIB_DIR(var-name,dir) Adds a -L directive to variable
606 AC_DEFUN(LYX_ADD_LIB_DIR,[
608 if test "`(uname) 2>/dev/null`" = SunOS &&
609 uname -r | grep '^5' >/dev/null; then
610 if test $ac_cv_prog_gxx = yes ; then
611 $1="${$1} -Wl[,]-R$2"
618 dnl Usage: LYX_ADD_INC_DIR(var-name,dir) Adds a -I directive to variable
620 AC_DEFUN(LYX_ADD_INC_DIR,[$1="${$1} -I$2 "])
623 dnl AC_VALIDATE_CACHE_SYSTEM_TYPE[(cmd)]
624 dnl if the cache file is inconsistent with the current host,
625 dnl target and build system types, execute CMD or print a default
627 AC_DEFUN(AC_VALIDATE_CACHE_SYSTEM_TYPE, [
628 AC_REQUIRE([AC_CANONICAL_SYSTEM])
629 AC_MSG_CHECKING([config.cache system type])
630 if { test x"${ac_cv_host_system_type+set}" = x"set" &&
631 test x"$ac_cv_host_system_type" != x"$host"; } ||
632 { test x"${ac_cv_build_system_type+set}" = x"set" &&
633 test x"$ac_cv_build_system_type" != x"$build"; } ||
634 { test x"${ac_cv_target_system_type+set}" = x"set" &&
635 test x"$ac_cv_target_system_type" != x"$target"; }; then
636 AC_MSG_RESULT([different])
638 [AC_MSG_ERROR(["you must remove config.cache and restart configure"])])
640 AC_MSG_RESULT([same])
642 ac_cv_host_system_type="$host"
643 ac_cv_build_system_type="$build"
644 ac_cv_target_system_type="$target"
648 dnl We use this until autoconf fixes its version.
649 AC_DEFUN(LYX_FUNC_SELECT_ARGTYPES,
650 [AC_MSG_CHECKING([types of arguments for select()])
651 AC_CACHE_VAL(ac_cv_func_select_arg234,dnl
652 [AC_CACHE_VAL(ac_cv_func_select_arg1,dnl
653 [AC_CACHE_VAL(ac_cv_func_select_arg5,dnl
654 [for ac_cv_func_select_arg234 in 'fd_set *' 'int *' 'void *'; do
655 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
657 [#ifdef HAVE_SYS_TYPES_H
658 #include <sys/types.h>
660 #ifdef HAVE_SYS_TIME_H
661 #include <sys/time.h>
663 #ifdef HAVE_SYS_SELECT_H
664 #include <sys/select.h>
666 #ifdef HAVE_SYS_SOCKET_H
667 #include <sys/socket.h>
669 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
670 [ac_not_found=no ; break 3],ac_not_found=yes)
677 if test "$ac_not_found" = yes; then
678 ac_cv_func_select_arg1=int
679 ac_cv_func_select_arg234='int *'
680 ac_cv_func_select_arg5='struct timeval *'
682 AC_MSG_RESULT([$ac_cv_func_select_arg1,$ac_cv_func_select_arg234,$ac_cv_func_select_arg5])
683 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1,$ac_cv_func_select_arg1)
684 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234,($ac_cv_func_select_arg234))
685 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5,($ac_cv_func_select_arg5))