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 -Wall"
189 # a small hack to avoid problems with headers
190 echo '#undef __STRICT_ANSI__' >>confdefs.h
194 test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
198 dnl We do not use this one anymore.
199 dnl AC_DEFUN(LYX_GXX_STRENGTH_REDUCE,[
200 dnl #check for the strength reduction bug of gcc
201 dnl if test x$GXX = xyes && test $cross_compiling = no ; then
202 dnl AC_CACHE_CHECK( "for gcc strength-reduce bug", ac_cv_c_gcc_strength_bug,
205 dnl static int Array[[3]];
206 dnl unsigned int B = 3;
208 dnl for(i=0; i<B; i++) Array[[i]] = i - 3;
209 dnl exit( Array[[1]] != -2 );
211 dnl ac_cv_c_gcc_strength_bug="no",
212 dnl ac_cv_c_gcc_strength_bug="yes",
213 dnl ac_cv_c_gcc_strength_bug="yes") )
214 dnl if test "$ac_cv_c_gcc_strength_bug" = "yes"
216 dnl CXXFLAGS="$CXXFLAGS -fno-strength-reduce"
221 dnl Usage: LYX_CXX_RTTI : checks whether the C++ compiler
223 AC_DEFUN(LYX_CXX_RTTI,[
224 ### Check whether the compiler supports runtime type information
225 AC_CACHE_CHECK(whether the C++ compiler supports RTTI,lyx_cv_rtti,
229 virtual int tag() { return 0; }
231 class derived1 : public rtti {
233 int tag() { return 1; }
235 class derived2 : public rtti {
237 int tag() { return 2; }
240 derived1 * foo1 = new derived1();
241 derived2 * foo2 = new derived2();
243 derived1 * bar1 = dynamic_cast<derived1 *>(bar);
247 bar1 = dynamic_cast<derived1 *>(bar);
252 ],lyx_cv_rtti=yes,lyx_cv_rtti=no,lyx_cv_rtti=no)
254 if test x$lyx_cv_rtti = xyes ; then
255 AC_DEFINE(HAVE_RTTI, 1,
256 [Define to 1 if your compiler supports runtime type information])
260 dnl Usage: LYX_CXX_EXPLICIT : checks whether the C++ compiler
261 dnl understands the "explicit" directive.
262 AC_DEFUN(LYX_CXX_EXPLICIT,[
263 ### Check whether the compiler understands the keyword `explicit'
264 AC_CACHE_CHECK(whether the C++ compiler understands explicit,lyx_cv_explicit,
269 };],,lyx_cv_explicit=yes,lyx_cv_explicit=no)
271 if test $lyx_cv_explicit = no ; then
272 AC_DEFINE(explicit,[ ],
273 [Define to nothing if your compiler does not understand the
274 'explicit' directive])
278 dnl Usage: LYX_CXX_STL_STACK : checks whether the C++ compiler
279 dnl has a working stl stack template
280 AC_DEFUN(LYX_CXX_STL_STACK,[
281 AC_CACHE_CHECK(for broken STL stack template,lyx_cv_broken_stack,
287 ],lyx_cv_broken_stack=no,lyx_cv_broken_stack=yes)
289 if test $lyx_cv_broken_stack = yes ; then
290 AC_DEFINE(BROKEN_STL_STACK, 1,
291 [Define if you have the STL from libg++ 2.7.x, where stack<> is not defined
296 dnl Usage: LYX_CXX_STL_STRING : checks whether the C++ compiler
297 dnl has a working stl string container
298 AC_DEFUN(LYX_CXX_STL_STRING,[
299 AC_ARG_WITH(included-string,
300 [ --with-included-string use LyX string class instead of STL string],,
301 [AC_CHECK_HEADER(std/bastring.h,
302 [with_included_string=yes],
303 [with_included_string=no])])
304 if test x$with_included_string = xyes ; then
305 AC_DEFINE(USE_INCLUDED_STRING, 1,
306 [Define to use the LString class bundled with LyX])
307 lyx_flags="$lyx_flags included-string"
312 AC_DEFUN(LYX_CXX_MUTABLE, [
313 AC_REQUIRE([LYX_PROG_CXX])
314 AC_MSG_CHECKING(if C++ compiler supports mutable)
320 void foo() const { c=0; }
325 AC_DEFINE(HAVE_MUTABLE, 1,
326 [Defined if you compiler supports 'mutable'.])
330 AC_MSG_RESULT([$ac_mutable])
335 AC_DEFUN(LYX_CXX_PARTIAL, [
336 AC_REQUIRE([LYX_PROG_CXX])
337 AC_MSG_CHECKING(if C++ compiler supports partial specialization)
340 template<class T, class K>
344 template<class T> class k<void,T> { };
349 ac_partial_specialization=yes
350 AC_DEFINE(HAVE_PARTIAL_SPECIALIZATION, 1,
351 [Defined if your compiler supports partial specialization.])
353 ac_partial_specialization=no
355 AC_MSG_RESULT([$ac_partial_specialization])
358 dnl Usage: LYX_CXX_NAMESPACES : checks whether the C++ compiler
359 dnl has a correct namespace handling and define CXX_WORKING_NAMESPACES
360 dnl if true. This macro does not do a thourough test, but it should be
361 dnl good enough to suit our needs.
362 AC_DEFUN(LYX_CXX_NAMESPACES,[
363 AC_CACHE_CHECK(for correct namespaces support,lyx_cv_cxx_namespace,
370 ],lyx_cv_cxx_namespace=yes,lyx_cv_cxx_namespace=no)
372 if test $lyx_cv_cxx_namespace = yes ; then
373 AC_DEFINE(CXX_WORKING_NAMESPACES, 1,
374 [Define if your C++ compiler has correct support for namespaces])
377 dnl Usage: LYX_CXX_CHEADERS : checks whether the C++ compiler
378 dnl provides wrappers for C headers and use our alternate version otherwise.
379 AC_DEFUN(LYX_CXX_CHEADERS,[
380 AC_CACHE_CHECK(for C headers wrappers,lyx_cv_cxx_cheaders,
389 #include <ctime>],[lyx_cv_cxx_cheaders=yes],[lyx_cv_cxx_cheaders=no])])
390 if test $lyx_cv_cxx_cheaders = no ; then
391 LYX_ADD_INC_DIR(lyx_cppflags,\$(top_srcdir)/src/cheaders)
395 dnl Usage LYX_PATH_XPM: Checks for xpm library and header
396 AC_DEFUN(LYX_PATH_XPM,[
397 ### Check for Xpm library
398 AC_CHECK_LIB(Xpm, XpmCreateBufferFromImage,LYX_LIBS="-lXpm $LYX_LIBS",
399 [LYX_LIB_ERROR(libXpm,Xpm)], $LYX_LIBS)
401 ### Check for Xpm headers
402 lyx_cv_xpm_h_location="<xpm.h>"
403 AC_CHECK_HEADER(X11/xpm.h,[
404 ac_cv_header_xpm_h=yes
405 lyx_cv_xpm_h_location="<X11/xpm.h>"],[
406 AC_CHECK_HEADER(xpm.h,[],[
407 LYX_LIB_ERROR(xpm.h,Xpm)])])
408 AC_DEFINE_UNQUOTED(XPM_H_LOCATION,$lyx_cv_xpm_h_location)
410 ### Test for the header version
411 if test $ac_cv_header_xpm_h = yes; then
412 AC_CACHE_CHECK([xpm header version],lyx_cv_xpmversion,
413 [ cat > conftest.$ac_ext <<EOF
414 #line __oline__ "configure"
415 #include "confdefs.h"
417 #include XPM_H_LOCATION
418 "%%%"lyx_cv_xpmv=XpmVersion;lyx_cv_xpmr=XpmRevision"%%%"
420 eval `(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
421 grep '^"%%%"' 2>/dev/null | \
422 sed -e 's/^"%%%"\(.*\)"%%%"/\1/' -e 's/ //g'`
423 case "$lyx_cv_xpmr" in
425 [0-9]) lyxxpmr_alpha=`echo $lyx_cv_xpmr |tr 123456789 abcdefghi`
426 lyxxpmv_alpha=" (aka 3.$lyx_cv_xpmv$lyxxpmr_alpha)";;
430 lyx_cv_xpmversion="$lyx_cv_xpmv.$lyx_cv_xpmr$lyxxpmv_alpha"
432 case "$lyx_cv_xpmr" in
434 [789]|[0-9][0-9]*) ;;
436 *) LYX_WARNING([Version $lyx_cv_xpmversion of the Xpm library is a bit old.
437 If you experience strange crashes with LyX, try to upgrade
438 to at least version 4.7 (aka 3.4g).
439 If you have installed a newer version of the library, check whether you
440 have an old xpm.h header file in your include path.]);;
445 dnl Usage LYX_PATH_XFORMS: Checks for xforms library and flags
446 AC_DEFUN(LYX_PATH_XFORMS,[
447 ### Check for xforms library
448 AC_CHECK_LIB(forms, fl_initialize, LYX_LIBS="-lforms $LYX_LIBS",
449 [AC_CHECK_LIB(xforms, fl_initialize, LYX_LIBS="-lxforms $LYX_LIBS",
450 [LYX_LIB_ERROR(libforms or libxforms,xforms)], $LYX_LIBS)], $LYX_LIBS)
452 ### Check for xforms headers
453 lyx_cv_forms_h_location="<forms.h>"
454 AC_CHECK_HEADER(X11/forms.h,[
455 ac_cv_header_forms_h=yes
456 lyx_cv_forms_h_location="<X11/forms.h>"],[
457 AC_CHECK_HEADER(forms.h,[],[
458 LYX_LIB_ERROR(forms.h,forms)])])
459 AC_DEFINE_UNQUOTED(FORMS_H_LOCATION,$lyx_cv_forms_h_location)
460 if test $ac_cv_header_forms_h = yes; then
461 AC_CACHE_CHECK([xforms header version],lyx_cv_xfversion,
462 [ cat > conftest.$ac_ext <<EOF
463 #line __oline__ "configure"
464 #include "confdefs.h"
466 #include FORMS_H_LOCATION
467 #if ! defined(FL_INCLUDE_VERSION)
470 "%%%"FL_VERSION.FL_REVISION"%%%"
473 lyx_cv_xfversion=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
474 grep '^"%%%"' 2>/dev/null | \
475 sed -e 's/^"%%%"\(.*\)"%%%"/\1/' -e 's/ //g'`
477 case "$lyx_cv_xfversion" in
478 "(unknown)"|0.82|0.83|0.84|0.85)
480 Version $lyx_cv_xfversion of xforms is not compatible with LyX.
481 This version of LyX works best with version 0.88[,] although it
482 supports also versions 0.81[,] 0.86 and 0.87.) ;;
485 While LyX is compatible with version $lyx_cv_xfversion of xforms[,]
486 it is recommended that you upgrade to version 0.88.) ;;
488 0.89) LYX_WARNING(dnl
489 LyX should work ok with version $lyx_cv_xfversion of xforms[,] but
490 it is an unproven version and might still have some bugs. If you
491 have problems[,] please use version 0.88 instead.) ;;
493 Version $lyx_cv_xfversion of xforms might not be compatible with LyX[,]
494 since it is newer than 0.88. You might have slight problems with it.);;
499 dnl Usage: LYX_HPUX Checks for HP-UX and update CXXFLAGS accordingly
501 [#It seems that HPUX requires using -fpcc-struct-return with gcc.
502 AC_CACHE_CHECK(for HP-UX,ac_cv_hpux,[
503 os=`uname -s | tr '[A-Z]' '[a-z]'`
505 test "$os" = hp-ux && ac_cv_hpux=yes])
506 if test "$ac_cv_hpux" = yes; then
507 test "x$GXX" = xyes && CXXFLAGS="$CXXFLAGS -fpcc-struct-return"
511 dnl Usage: LYX_SUNOS4 Checks for SunOS 4.x and sets the flag lyx_broken_headers
514 [#The headers are not correct under SunOS4
515 AC_CACHE_CHECK(for SunOS 4.x,ac_cv_sunos4,[
517 os=`uname -a | sed -e 's/^\([^ ]*\) [^ ]* \([0-9]\)\..*/\1\2/'`
518 changequote([, ]) dnl
520 test "$os" = SunOS4 && ac_cv_sunos4=yes])
521 if test "$ac_cv_sunos4" = yes; then
522 test "x$GXX" = xyes && lyx_broken_headers=yes
526 dnl Usage: LYX_SCO Checks for SCO and sets the flag lyx_broken_headers
529 [AC_CACHE_CHECK(for SCO 3.2v4,ac_cv_sco,[
531 if test `uname -s` != "SCO_SV"; then
532 lyx_machine_rel=`uname -m`:`uname -r`
533 if test $lyx_machine_rel = i386:3.2 || test $lyx_machine_rel = i486:3.2;
535 if test -f /usr/options/cb.name; then
537 elif /bin/uname -X 2>/dev/null >/dev/null ; then
542 if test "$ac_cv_sco" = yes; then
543 test "x$GXX" = xyes && lyx_broken_headers=yes
547 dnl Usage: LYX_WITH_DIR(dir-name,desc,dir-var-name,default-value,
548 dnl [default-yes-value])
549 dnl Adds a --with-'dir-name' option (described by 'desc') and puts the
550 dnl resulting directory name in 'dir-var-name'.
551 AC_DEFUN(LYX_WITH_DIR,[
552 AC_ARG_WITH($1,[ --with-$1 specify $2])
553 AC_MSG_CHECKING([for $2])
554 if test -z "$with_$3"; then
555 AC_CACHE_VAL(lyx_cv_$3, lyx_cv_$3=$4)
557 test "x$with_$3" = xyes && with_$3=$5
560 AC_MSG_RESULT($lyx_cv_$3)])
563 dnl Usage: LYX_LOOP_DIR(value,action)
564 dnl Executes action for values of variable `dir' in `values'. `values' can
565 dnl use ":" as a separator.
566 AC_DEFUN(LYX_LOOP_DIR,[
567 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
568 for dir in `eval "echo $1"`; do
569 if test ! "$dir" = NONE; then
570 test ! -d "$dir" && AC_ERROR([\"$dir\" is not a directory])
578 dnl Usage: LYX_ADD_LIB_DIR(var-name,dir) Adds a -L directive to variable
580 AC_DEFUN(LYX_ADD_LIB_DIR,[
582 if test "`(uname) 2>/dev/null`" = SunOS &&
583 uname -r | grep '^5' >/dev/null; then
584 if test $ac_cv_prog_gxx = yes ; then
585 $1="${$1} -Wl[,]-R$2"
592 dnl Usage: LYX_ADD_INC_DIR(var-name,dir) Adds a -I directive to variable
594 AC_DEFUN(LYX_ADD_INC_DIR,[$1="${$1} -I$2 "])
597 dnl AC_VALIDATE_CACHE_SYSTEM_TYPE[(cmd)]
598 dnl if the cache file is inconsistent with the current host,
599 dnl target and build system types, execute CMD or print a default
601 AC_DEFUN(AC_VALIDATE_CACHE_SYSTEM_TYPE, [
602 AC_REQUIRE([AC_CANONICAL_SYSTEM])
603 AC_MSG_CHECKING([config.cache system type])
604 if { test x"${ac_cv_host_system_type+set}" = x"set" &&
605 test x"$ac_cv_host_system_type" != x"$host"; } ||
606 { test x"${ac_cv_build_system_type+set}" = x"set" &&
607 test x"$ac_cv_build_system_type" != x"$build"; } ||
608 { test x"${ac_cv_target_system_type+set}" = x"set" &&
609 test x"$ac_cv_target_system_type" != x"$target"; }; then
610 AC_MSG_RESULT([different])
612 [AC_MSG_ERROR(["you must remove config.cache and restart configure"])])
614 AC_MSG_RESULT([same])
616 ac_cv_host_system_type="$host"
617 ac_cv_build_system_type="$build"
618 ac_cv_target_system_type="$target"
621 dnl We use this until autoconf fixes its version.
622 AC_DEFUN(LYX_FUNC_SELECT_ARGTYPES,
623 [AC_MSG_CHECKING([types of arguments for select()])
624 AC_CACHE_VAL(ac_cv_func_select_arg234,dnl
625 [AC_CACHE_VAL(ac_cv_func_select_arg1,dnl
626 [AC_CACHE_VAL(ac_cv_func_select_arg5,dnl
627 [for ac_cv_func_select_arg234 in 'fd_set *' 'int *' 'void *'; do
628 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
630 [#ifdef HAVE_SYS_TYPES_H
631 #include <sys/types.h>
633 #ifdef HAVE_SYS_TIME_H
634 #include <sys/time.h>
636 #ifdef HAVE_SYS_SELECT_H
637 #include <sys/select.h>
639 #ifdef HAVE_SYS_SOCKET_H
640 #include <sys/socket.h>
642 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
643 [ac_not_found=no ; break 3],ac_not_found=yes)
650 if test "$ac_not_found" = yes; then
651 ac_cv_func_select_arg1=int
652 ac_cv_func_select_arg234='int *'
653 ac_cv_func_select_arg5='struct timeval *'
655 AC_MSG_RESULT([$ac_cv_func_select_arg1,$ac_cv_func_select_arg234,$ac_cv_func_select_arg5])
656 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1,$ac_cv_func_select_arg1)
657 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234,($ac_cv_func_select_arg234))
658 AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5,($ac_cv_func_select_arg5))