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)
7 dnl Usage LYX_CHECK_VERSION Displays version of LyX being built and
8 dnl sets variables "lyx_devel_version" and "lyx_prerelease"
9 AC_DEFUN(LYX_CHECK_VERSION,[
11 echo "configuring LyX version $VERSION"
12 if echo "$VERSION" | grep 'cvs' >/dev/null ; then
14 echo "WARNING: This is a development version. Expect bugs."
18 if echo "$VERSION" | grep 'pre' > /dev/null ; then
20 echo "WARNING: This is a prerelease. Be careful and backup your documents."
25 AC_SUBST(lyx_devel_version)
26 if test $lyx_devel_version = yes ; then
27 AC_DEFINE(DEVEL_VERSION, 1, Define if you are building a development version of LyX)
31 dnl Define the option to set a LyX version on installed executables and directories
34 AC_DEFUN(LYX_VERSION_SUFFIX,[
35 AC_MSG_CHECKING([for install target ... ])
36 AC_ARG_WITH(version-suffix,
37 [ --with-version-suffix[=<version>] install lyx files as lyx<version>],
38 [if test "x$withval" = "xyes";
41 ac_configure_args=`echo $ac_configure_args | sed "s,--with-version-suffix,--with-version-suffix=$withval,"`
44 program_suffix=$withval],
46 AC_MSG_RESULT([$lyxname])
49 dnl Usage: LYX_ERROR(message) Displays the warning "message" and sets the
50 dnl flag lyx_error to yes.
52 lyx_error_txt="$lyx_error_txt
58 dnl Usage: LYX_WARNING(message) Displays the warning "message" and sets the
59 dnl flag lyx_warning to yes.
60 AC_DEFUN(LYX_WARNING,[
61 lyx_warning_txt="$lyx_warning_txt
67 dnl Usage: LYX_LIB_ERROR(file,library) Displays an error message indication
68 dnl that 'file' cannot be found because 'lib' may be uncorrectly installed.
69 AC_DEFUN(LYX_LIB_ERROR,[
70 LYX_ERROR([Cannot find $1. Please check that the $2 library
71 is correctly installed on your system.])])
74 dnl Usage: LYX_CHECK_ERRORS Displays a warning message if a LYX_ERROR
75 dnl has occured previously.
76 AC_DEFUN(LYX_CHECK_ERRORS,[
77 if test x$lyx_error = xyes; then
79 **** The following problems have been detected by configure.
80 **** Please check the messages below before running 'make'.
81 **** (see the section 'Problems' in the INSTALL file)
87 if test x$lyx_warning = xyes; then
89 === The following minor problems have been detected by configure.
90 === Please check the messages below before running 'make'.
91 === (see the section 'Problems' in the INSTALL file)
96 Configuration of LyX was successful.
97 Type 'make' to compile the program,
98 and then 'make install' to install it.
103 dnl LYX_SEARCH_PROG(VARIABLE-NAME,PROGRAMS-LIST,ACTION-IF-FOUND)
105 define(LYX_SEARCH_PROG,[dnl
106 for ac_prog in $2 ; do
107 # Extract the first word of "$ac_prog", so it can be a program name with args.
108 set dummy $ac_prog ; ac_word=$[2]
109 if test -z "[$]$1"; then
110 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
111 for ac_dir in $PATH; do
112 test -z "$ac_dir" && ac_dir=.
113 if test -f [$ac_dir/$ac_word]; then
121 if test -n "[$]$1"; then
127 test -n "[$]$1" && break
132 AC_DEFUN([LYX_PROG_CXX_WORKS],
134 cat >conftest.C <<EOF
136 // we require the mutable keyword
139 // we require namespace support
147 $CXX -c $CXXFLAGS $CPPFLAGS conftest.C >&5 || CXX=
148 rm -f conftest.C conftest.o conftest.obj || true
152 AC_DEFUN(LYX_PROG_CXX,
153 [AC_MSG_CHECKING([for a good enough C++ compiler])
154 LYX_SEARCH_PROG(CXX, $CXX $CCC g++ gcc c++ CC cxx xlC cc++, [LYX_PROG_CXX_WORKS])
156 if test -z "$CXX" ; then
157 AC_MSG_ERROR([Unable to find a good enough C++ compiler])
163 ### We might want to get or shut warnings.
164 AC_ARG_ENABLE(warnings,
165 [ --enable-warnings tell the compiler to display more warnings],,
166 [ if test $lyx_devel_version = yes -o $lyx_prerelease = yes && test $ac_cv_prog_gxx = yes ; then
171 if test x$enable_warnings = xyes ; then
172 lyx_flags="$lyx_flags warnings"
173 AC_DEFINE(WITH_WARNINGS, 1,
174 [Define this if you want to see the warning directives put here and
175 there by the developpers to get attention])
178 ### We might want to disable debug
180 [ --enable-debug enable debug information],,
181 [ if test $lyx_devel_version = yes -o $lyx_prerelease = yes && test $ac_cv_prog_gxx = yes ; then
187 ### set up optimization
188 AC_ARG_ENABLE(optimization,
189 [ --enable-optimization[=value] enable compiler optimisation],,
190 enable_optimization=yes;)
191 case $enable_optimization in
194 *) lyx_opt=${enable_optimization};;
197 # set the debug flags correctly.
198 if test x$GXX = xyes; then
199 dnl Useful for global version info
200 gxx_version=`${CXX} -dumpversion`
201 CXX_VERSION="($gxx_version)"
203 if test "$ac_test_CXXFLAGS" = set; then
204 CXXFLAGS="$ac_save_CXXFLAGS"
207 2.95.1) CXXFLAGS="$lyx_opt -fpermissive -ftemplate-depth-30";;
208 2.95.*) CXXFLAGS="$lyx_opt -Wno-non-template-friend -ftemplate-depth-30";;
209 2.96*) CXXFLAGS="$lyx_opt -fno-exceptions -ftemplate-depth-30 -Wno-non-template-friend";;
210 3.0*) CXXFLAGS="$lyx_opt";;
211 3.1*) CXXFLAGS="$lyx_opt -finline-limit=500 -fno-exceptions";;
212 3.2*) CXXFLAGS="$lyx_opt -fno-exceptions";;
213 3.3*) CXXFLAGS="$lyx_opt -fno-exceptions";;
214 *) CXXFLAGS="$lyx_opt";;
216 if test x$enable_debug = xyes ; then
217 CXXFLAGS="-g $CXXFLAGS"
220 if test x$enable_warnings = xyes ; then
222 2.95.*) CXXFLAGS="$CXXFLAGS -W -Wall";;
223 2.96*) CXXFLAGS="$CXXFLAGS -W -Wall";;
224 3.1*) CXXFLAGS="$CXXFLAGS -W -Wall";;
225 *) CXXFLAGS="$CXXFLAGS -W -Wall";;
231 dnl NOT USED CURRENTLY*************************************
232 dnl Usage: LYX_CXX_RTTI : checks whether the C++ compiler
234 AC_DEFUN(LYX_CXX_RTTI,[
235 ### Check whether the compiler supports runtime type information
236 AC_CACHE_CHECK(whether the C++ compiler supports RTTI,lyx_cv_rtti,
240 virtual int tag() { return 0; }
242 class derived1 : public rtti {
244 int tag() { return 1; }
246 class derived2 : public rtti {
248 int tag() { return 2; }
251 derived1 * foo1 = new derived1();
252 derived2 * foo2 = new derived2();
254 derived1 * bar1 = dynamic_cast<derived1 *>(bar);
258 bar1 = dynamic_cast<derived1 *>(bar);
263 ],lyx_cv_rtti=yes,lyx_cv_rtti=no,lyx_cv_rtti=no)
265 if test x$lyx_cv_rtti = xyes ; then
266 AC_DEFINE(HAVE_RTTI, 1,
267 [Define to 1 if your compiler supports runtime type information])
271 dnl Usage: LYX_CXX_EXPLICIT : checks whether the C++ compiler
272 dnl understands the "explicit" directive.
273 AC_DEFUN(LYX_CXX_EXPLICIT,[
274 ### Check whether the compiler understands the keyword `explicit'
275 AC_CACHE_CHECK(whether the C++ compiler understands explicit,lyx_cv_explicit,
280 };],,lyx_cv_explicit=yes,lyx_cv_explicit=no)
282 if test $lyx_cv_explicit = no ; then
283 AC_DEFINE(explicit,[ ],
284 [Define to nothing if your compiler does not understand the
285 'explicit' directive])
289 dnl NOT USED CURRENTLY*************************************
290 dnl Usage: LYX_CXX_STL_STACK : checks whether the C++ compiler
291 dnl has a working stl stack template
292 AC_DEFUN(LYX_CXX_STL_STACK,[
293 AC_CACHE_CHECK(for broken STL stack template,lyx_cv_broken_stack,
300 ],lyx_cv_broken_stack=no,lyx_cv_broken_stack=yes)
302 if test $lyx_cv_broken_stack = yes ; then
303 AC_DEFINE(BROKEN_STL_STACK, 1,
304 [Define if you have the STL from libg++ 2.7.x, where stack<> is not defined
309 dnl Usage: LYX_STD_COUNT : checks wherer the C++ library have a conforming
310 dnl count template, if not the old HP version is assumed.
311 AC_DEFUN(LYX_STD_COUNT,[
312 AC_CACHE_CHECK(for conforming std::count,lyx_cv_std_count,
316 int countChar(char * b, char * e, char const c)
318 return count(b, e, c);
322 int i = countChar(a, a + 5, 'l');
323 ],lyx_cv_std_count=yes,lyx_cv_std_count=no)
325 if test $lyx_cv_std_count = yes ; then
326 AC_DEFINE(HAVE_STD_COUNT, 1,
327 [Define if you have a conforming std::count template, otherwise HP version of count template is assumed.])
331 dnl Usage: LYX_CXX_STL_MODERN_STREAMS : checks whether the C++ compiler
332 dnl supports modern STL streams
333 AC_DEFUN(LYX_CXX_STL_MODERN_STREAMS,[
334 AC_CACHE_CHECK(for modern STL streams,lyx_cv_modern_streams,
338 std::streambuf * test = std::cerr.rdbuf();
340 ],lyx_cv_modern_streams=yes,lyx_cv_modern_streams=no)
342 if test $lyx_cv_modern_streams = yes ; then
343 AC_DEFINE(MODERN_STL_STREAMS, 1,
344 [Define if you have modern standard-compliant STL streams])
348 dnl Usage: LYX_CXX_STL_STRING : checks whether the C++ compiler
349 dnl has a std::string that is usable for LyX. LyX does not require this
350 dnl std::string to be standard.
351 AC_DEFUN(LYX_CXX_STL_STRING,[
352 AC_REQUIRE([AC_PROG_CXX])
353 AC_MSG_CHECKING(whether the included std::string should be used)
354 AC_ARG_WITH(included-string,
355 [ --with-included-string use LyX string class instead of STL string],
356 [lyx_cv_with_included_string=$withval
357 AC_MSG_RESULT([$with_included_string])],
358 [AC_CACHE_CHECK([],lyx_cv_with_included_string,
363 // LyX has reduced its requirements on the basic_string
364 // implementation so that the basic_string supplied
365 // with gcc is usable. In particular this means that
366 // lyx does not use std::string::clear and not the
367 // strncmp version of std::string::compare. This is mainly
368 // done so that LyX can use precompiled C++ libraries that
369 // already uses the systems basic_string, e.g. gtk--
370 string a("hello there");
374 //int t = a.compare(a.length() - 1, 1, s);
377 lyx_cv_with_included_string=no
379 lyx_cv_with_included_string=yes
383 if test x$lyx_cv_with_included_string = xyes ; then
384 AC_DEFINE(USE_INCLUDED_STRING, 1,
385 [Define to use the lyxstring class bundled with LyX.])
386 lyx_flags="$lyx_flags included-string"
388 AM_CONDITIONAL(USE_LYXSTRING, test x$lyx_cv_with_included_string = xyes)
389 dnl AC_MSG_RESULT([$with_included_string])
393 dnl Usage: LYX_USE_INCLUDED_BOOST : select if the included boost should
395 AC_DEFUN(LYX_USE_INCLUDED_BOOST,[
396 AC_ARG_WITH(included-boost,
397 [ --with-included-boost use the boost lib supplied with LyX],
398 [lyx_cv_with_included_boost=$withval
399 AC_MSG_RESULT([$with_included_boost])],
400 [lyx_cv_with_included_boost=yes])
401 AM_CONDITIONAL(USE_INCLUDED_BOOST, test x$lyx_cv_with_included_boost = xyes)
404 dnl Usage: LYX_CXX_GOOD_STD_STRING : checks whether the C++ compiler
405 dnl has a std::string that is close to the standard. So close that
406 dnl methods not found in "unstandard" std::strings are present here.
407 AC_DEFUN(LYX_CXX_GOOD_STD_STRING,[
408 AC_REQUIRE([AC_PROG_CXX])
409 AC_CACHE_CHECK([whether the systems std::string is really good],
410 [lyx_cv_std_string_good],
415 // From a std::string that is supposed to be close to the
416 // standard we require at least three things:
417 // - clear() and erase()
418 // - the strncmp of compare()
420 string a("hello there");
424 int t = a.compare(a.length() - 1, 1, s);
428 lyx_cv_std_string_good=yes
430 lyx_cv_std_string_good=no
434 if test x$lyx_cv_std_string_good = xyes ; then
435 AC_DEFINE(STD_STRING_IS_GOOD, 1,
436 [Define if the systems std::string is really good.])
441 dnl NOT USED CURRENTLY*************************************
443 AC_DEFUN(LYX_CXX_PARTIAL, [
444 AC_REQUIRE([AC_PROG_CXX])
445 AC_CACHE_CHECK([if C++ compiler supports partial specialization],
446 [lyx_cv_cxx_partial_specialization],
449 template<class T, class K>
453 template<class T> class k<void,T> { };
458 lyx_cv_cxx_partial_specialization=yes
460 lyx_cv_cxx_partial_specialization=no
463 if test x$lyx_cv_cxx_partial_specialization = xyes ; then
464 AC_DEFINE(HAVE_PARTIAL_SPECIALIZATION, 1,
465 [Defined if your compiler supports partial specialization.])
470 dnl Usage: LYX_CXX_CHEADERS : checks whether the C++ compiler
471 dnl provides wrappers for C headers and use our alternate version otherwise.
472 AC_DEFUN(LYX_CXX_CHEADERS,[
473 AC_CACHE_CHECK(for C headers wrappers,lyx_cv_cxx_cheaders,
483 #include <ctime>],[lyx_cv_cxx_cheaders=yes],[lyx_cv_cxx_cheaders=no])])
484 if test $lyx_cv_cxx_cheaders = no ; then
485 LYX_ADD_INC_DIR(lyx_cppflags,\$(top_srcdir)/src/cheaders)
488 dnl Usage: LYX_CXX_GLOBAL_CSTD: checks whether C library functions
489 dnl are already in the global namespace
490 AC_DEFUN(LYX_CXX_GLOBAL_CSTD,[
491 AC_CACHE_CHECK(whether C library functions are already in the global namespace,
492 lyx_cv_cxx_global_cstd,
498 ],[lyx_cv_cxx_global_cstd=no],[lyx_cv_cxx_global_cstd=yes])])
499 if test x$lyx_cv_cxx_global_cstd = xyes; then
500 AC_DEFINE(CXX_GLOBAL_CSTD,1,
501 [Define if your C++ compiler puts C library functions in the global namespace])
505 dnl Usage: LYX_WITH_DIR(dir-name,desc,dir-var-name,default-value,
506 dnl [default-yes-value])
507 dnl Adds a --with-'dir-name' option (described by 'desc') and puts the
508 dnl resulting directory name in 'dir-var-name'.
509 AC_DEFUN(LYX_WITH_DIR,[
510 AC_ARG_WITH($1,[ --with-$1 specify $2])
511 AC_MSG_CHECKING([for $2])
512 if test -z "$with_$3"; then
513 AC_CACHE_VAL(lyx_cv_$3, lyx_cv_$3=$4)
515 test "x$with_$3" = xyes && with_$3=$5
518 AC_MSG_RESULT($lyx_cv_$3)])
521 dnl Usage: LYX_LOOP_DIR(value,action)
522 dnl Executes action for values of variable `dir' in `values'. `values' can
523 dnl use ":" as a separator.
524 AC_DEFUN(LYX_LOOP_DIR,[
525 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
526 for dir in `eval "echo $1"`; do
527 if test ! "$dir" = NONE; then
528 test ! -d "$dir" && AC_MSG_ERROR([\"$dir\" is not a directory])
536 dnl Usage: LYX_ADD_LIB_DIR(var-name,dir) Adds a -L directive to variable
538 AC_DEFUN(LYX_ADD_LIB_DIR,[
540 if test "`(uname) 2>/dev/null`" = SunOS &&
541 uname -r | grep '^5' >/dev/null; then
542 if test $ac_cv_prog_gxx = yes ; then
543 $1="${$1} -Wl[,]-R$2"
550 dnl Usage: LYX_ADD_INC_DIR(var-name,dir) Adds a -I directive to variable
552 AC_DEFUN(LYX_ADD_INC_DIR,[$1="${$1} -I$2 "])
554 ### Check for a headers existence and location iff it exists
555 ## This is supposed to be a generalised version of LYX_STL_STRING_FWD
556 ## It almost works. I've tried a few variations but they give errors
557 ## of one sort or other: bad substitution or file not found etc. The
558 ## actual header _is_ found though and the cache variable is set however
559 ## the reported setting (on screen) is equal to $ac_safe for some unknown
561 ## Additionally, autoheader can't figure out what to use as the name in
562 ## the config.h.in file so we need to write our own entries there -- one for
563 ## each header in the form PATH_HEADER_NAME_H
565 AC_DEFUN(LYX_PATH_HEADER,
566 [ AC_CHECK_HEADER($1,[
567 ac_tr_safe=PATH_`echo $ac_safe | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
568 ### the only remaining problem is getting the second parameter to this
569 ### AC_CACHE_CACHE to print correctly. Currently it just results in value
570 ### of $ac_safe being printed.
571 AC_CACHE_CHECK([path to $1],[lyx_cv_path2_$ac_safe],
572 [ cat > conftest.$ac_ext <<EOF
573 #line __oline__ "configure"
574 #include "confdefs.h"
578 lyx_path_header_path=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \
579 grep $1 2>/dev/null | \
580 sed -e 's/.*\(".*$1"\).*/\1/' -e "1q"`
581 eval "lyx_cv_path2_${ac_safe}=\$lyx_path_header_path"
583 AC_DEFINE_UNQUOTED($ac_tr_safe, $lyx_path_header_path, [dummy])])
585 ### end of LYX_PATH_HEADER
587 ### Check which frontend we want to use. The default is XForms
589 AC_DEFUN(LYX_USE_FRONTEND,
590 [AC_MSG_CHECKING([what frontend should be used as main GUI])
591 AC_ARG_WITH(frontend,
592 [ --with-frontend=THIS Use THIS frontend as main GUI:
593 Possible values: xforms, qt],
594 [lyx_use_frontend="$withval"], [lyx_use_frontend="xforms"])
595 AC_MSG_RESULT($lyx_use_frontend)
597 AC_SUBST(FRONTEND_GUILIB)
598 AC_SUBST(FRONTEND_LDFLAGS)
599 AC_SUBST(FRONTEND_INCLUDES)
600 AC_SUBST(FRONTEND_LIBS)
605 ## ------------------------------------------------------------------------
606 ## Find a file (or one of more files in a list of dirs)
607 ## ------------------------------------------------------------------------
609 AC_DEFUN(AC_FIND_FILE,
616 if test -r "$i/$j"; then
624 dnl just a wrapper to clean up configure.in
625 AC_DEFUN(LYX_PROG_LIBTOOL,
627 AC_REQUIRE([AC_ENABLE_SHARED])
628 AC_REQUIRE([AC_ENABLE_STATIC])
629 dnl libtool is only for C, so I must force him
630 dnl to find the correct flags for C++
632 ac_save_cflags="$CFLAGS"
635 AM_PROG_LIBTOOL dnl for libraries
637 CFLAGS="$ac_save_cflags"