source: git/configure.ac @ 83aeea7

stereo-2025
Last change on this file since 83aeea7 was 3d848a3, checked in by Olly Betts <olly@…>, 6 months ago

Enable SSE2 by default on 32-bit x86

We keep hitting testcase failures due to excess precision from 387 FP
instructions, and the time spent adjusting testcases to avoid these
would be better spent on new features, etc.

Intel CPUs without SSE2 were discontinued ~18 years ago so it seems very
unlikely anyone is actually still using one for Survex.

  • Property mode set to 100644
File size: 12.9 KB
RevLine 
[c746b4d]1dnl Process this file with autoconf to produce a configure script
[483ac4e]2
[a884696]3dnl Need autoconf 2.50 or later for AC_ARG_VAR.  2.59 has been around for
4dnl long enough, that we might as well just require that.
5AC_PREREQ(2.59)
[3ca3814]6AC_INIT([survex], [1.4.15], [https://trac.survex.com/])
[6e0cdc2c]7AM_INIT_AUTOMAKE([1.5 gnu -Wall -Wportability -Werror])
[191536f]8RELEASE=1
[79b37a4c]9
[5636835]10AC_SUBST(RELEASE)
[e02a6a6]11AC_CONFIG_HEADERS([config.h])
[5b7b184]12AC_CONFIG_SRCDIR([src/aven.cc])
[96cc0ab]13
[f78ff43]14COPYRIGHT_MSG="Copyright (C) 1990-2025 Olly Betts"
[920b066]15AVEN_COPYRIGHT_MSG="Copyright (C) 1999-2003,2005,2006 Mark R. Shinwell"
[55302e3]16
[8c05f13]17AC_DEFINE_UNQUOTED(COPYRIGHT_MSG, ["$COPYRIGHT_MSG"], [Copyright Message])
18AC_DEFINE_UNQUOTED(AVEN_COPYRIGHT_MSG, ["$AVEN_COPYRIGHT_MSG"],
[99f252b]19                   [Copyright Message for Aven])
20
21AC_SUBST(COPYRIGHT_MSG)
22AC_SUBST(AVEN_COPYRIGHT_MSG)
[706b033]23
[5627cbb]24COPYRIGHT_MSG_UTF8=`echo "$COPYRIGHT_MSG"|sed 's/(C)/©/'`
25AVEN_COPYRIGHT_MSG_UTF8=`echo "$AVEN_COPYRIGHT_MSG"|sed 's/(C)/©/'`
26
27AC_DEFINE_UNQUOTED(COPYRIGHT_MSG_UTF8, ["$COPYRIGHT_MSG_UTF8"],
28                   [Copyright Message in UTF-8])
29AC_DEFINE_UNQUOTED(AVEN_COPYRIGHT_MSG_UTF8, ["$AVEN_COPYRIGHT_MSG_UTF8"],
30                   [Copyright Message for Aven in UTF-8])
31
[1d43ee5]32dnl set PRETTYPACKAGE to PACKAGE with the first character capitalised
[21fbe7d]33PRETTYPACKAGE=`echo "$PACKAGE"|cut -b1|tr a-z A-Z``echo "$PACKAGE"|cut -b2-`
[82afbc4]34AC_DEFINE_UNQUOTED(PRETTYPACKAGE, "$PRETTYPACKAGE",
[99f252b]35                   [Name of package (capitalised)])
[aa931b2]36AC_SUBST(PRETTYPACKAGE)
37
[e2546c0]38dnl set COMMAVERSION to VERSION with the dots replaced by commas -
39dnl e.g. "0,99" or "1,0,22"
[21fbe7d]40COMMAVERSION=`echo "$VERSION"|tr '.' ','`
[e2546c0]41AC_DEFINE_UNQUOTED(COMMAVERSION, $COMMAVERSION,
[1db3fa5]42                   [Version number of package (comma-separated)])
[e2546c0]43AC_SUBST(COMMAVERSION)
44
[d0a7bba]45PKGDOCDIR='${prefix}/share/doc/${PACKAGE}'
[4b4bd47]46AC_ARG_ENABLE(docdir,
47[  --enable-docdir=DIR Set directory for installing documentation to DIR],
[21fbe7d]48[case $enableval in
[4b4bd47]49 yes|no)
50  AC_MSG_ERROR([configure: Syntax: configure --enable-docdir=DIR]) ;;
51esac
[ab27074]52PKGDOCDIR="$enableval"
[4b4bd47]53]
54)
[e2ac794]55PKGDOCDIR_EXPANDED=`
[21fbe7d]56 test NONE = "$prefix" && prefix="$ac_default_prefix"
57 test NONE = "$exec_prefix" && exec_prefix="$prefix"
58 eval echo "$PKGDOCDIR"
[e2ac794]59`
[4b4bd47]60AC_SUBST(PKGDOCDIR)
[9b579156]61AC_SUBST(PKGDOCDIR_EXPANDED)
[4b4bd47]62
[4d0204a]63AC_CANONICAL_HOST
[984f49e]64
[55302e3]65dnl Checks for programs.
66AC_PROG_CC
[f78ad72]67AC_PROG_CPP
[5809313]68
[f665d6e]69AC_PROG_CXX
70AC_PROG_CXXCPP
[039fb01]71
[4a7c2f0d]72dnl Probe for any options needed to enable C++11 support.
73AX_CXX_COMPILE_STDCXX_11
74
[c13d1930]75AM_PROG_CC_C_O
76
[0177571]77AC_LANG([C])
[55302e3]78
[96cc0ab]79AC_EXEEXT
80AC_OBJEXT
81
[2032841]82mswindows=no
[559cd60]83macos=no
[21fbe7d]84case $host_os in
[559cd60]85darwin*) macos=yes ;;
[4d0204a]86*mingw*|*cygwin*|windows*) mswindows=yes ;;
87esac
88
[21c226e]89AC_C_BIGENDIAN
[bd63572]90
[c746b4d]91AC_ARG_VAR(STRIP, [Command for discarding symbols from object files])
[4a6f8f6]92AC_PATH_TOOL(STRIP, strip, [echo "not stripping "])
[55302e3]93
[647407d]94AC_CHECK_LIB(m, sqrt)
95
[3d848a3]96dnl x86 has excess precision issues with 387 FP instructions, which are
97dnl avoided by using SSE instructions instead.  By default we require SSE2
98dnl which for Intel means a Pentium 4 which was launched in 2000; Pentium
99dnl 3 was finally discontinued in 2007.
100AC_ARG_ENABLE([sse],
101[AS_HELP_STRING([--disable-sse],
102                [disable use of SSE FP instructions on x86])]
103[AS_HELP_STRING([[--enable-sse[=sse|sse2]]],
104                [set which SSE FP instructions to use on x86 (default: sse2)])],
105  [case ${enableval} in
106    sse|sse2|yes|no) ;;
107    *) AC_MSG_ERROR([bad value ${enableval} for --enable-sse or --disable-sse]) ;;
108  esac],
109  [enable_sse=yes])
110
111AC_MSG_CHECKING([whether to use SSE instructions on x86])
112case $host_cpu in
113  i*86)
114    if test "$enable_sse" = no ; then
115      AC_MSG_RESULT([no - WARNING: Testsuite will probably fail])
116      if test yes = "$msvc"; then
117        dnl MSVC defaults to SSE2.
118        AM_CXXFLAGS="$AM_CXXFLAGS -arch:IA32"
119      fi
120    else
121      dnl Default to sse2.
122      test "$enable_sse" != yes || enable_sse=sse2
123      if test yes = "$GXX"; then
124        AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
125        dnl We can unconditionally use -mtune=generic as it was added in GCC
126        dnl 4.2, and supported at least as far back as clang 3.0.
127        AM_CXXFLAGS="$AM_CXXFLAGS -mfpmath=sse -m$enable_sse -mtune=generic"
128      elif test yes = "$msvc"; then
129        AC_MSG_RESULT([yes (configure with --disable-sse to disable)])
130        if test sse = "$enable_sse"; then
131          dnl MSVC defaults to SSE2.
132          AM_CXXFLAGS="$AM_CXXFLAGS -arch:SSE"
133        fi
134      else
135        AC_MSG_RESULT([don't know how to for compiler $CXX])
136      fi
137    fi
138    ;;
139  *)
140    AC_MSG_RESULT([non-x86 arch ($host_cpu)]) ;;
141esac
142
[7e2f708]143dnl The wxWidgets libraries we need:
[f31090c]144wx_libs="core,gl"
[7e2f708]145
[a3f519b]146AC_ARG_VAR(WXCONFIG, [Old name for WX_CONFIG, accepted for compatibility])
147AC_ARG_VAR(WX_CONFIG, [wxWidgets configuration script to use to build Aven])
148: ${WX_CONFIG="$WXCONFIG"}
[bd9730c]149
[ab27074]150AM_CONDITIONAL(WIN32, [test yes = "$mswindows"])
[559cd60]151AM_CONDITIONAL(MACOS, [test yes = "$macos"])
[b9bd864]152
[a3f519b]153if test -n "$WX_CONFIG" ; then
154  dnl WX_CONFIG specified - sanity check the value
[f665d6e]155  dnl don't check for --ldflags - older wx-config didn't do that
[7e2f708]156  if (exec >&5 2>&5;$WX_CONFIG --libs --cflags --cxxflags "$wx_libs";exit $?) then
[f665d6e]157    :
[b9bd864]158  else
[5297c43]159    AC_MSG_ERROR(['$WX_CONFIG --libs --cflags --cxxflags "$wx_libs"' does not work, bailing out])
[f665d6e]160  fi
161else
[559cd60]162  if test yes = "$macos" ; then
[f665d6e]163    wxdef=__WXMAC__
164  elif test yes = "$mswindows" ; then
165    wxdef=__WXMSW__
166  else
167    wxdef=__WXGTK__
168  fi
[5297c43]169  dnl See if wx-config exists and is for the correct version.
[034d9a57]170  dnl Fedora install wx3's wx-config as wx-config-3.0, so look for that in
171  dnl preference.
[6aac0b0]172  dnl Arch Linux uses wx-config-gtk3.
173  AC_PATH_PROGS(WX_CONFIG, [wx-config-3.0 wx-config-gtk3 wx-config])
[5297c43]174  if test -n "$WX_CONFIG" ; then
175    if (exec >&5 2>&5;$WX_CONFIG --cflags "$wx_libs"|grep -e -D"$wxdef";exit $?) then
176      :
177    else
178      AC_MSG_ERROR([wxWidgets not for the right toolkit.  Run ./configure WX_CONFIG=/path/to/wx-config])
[b9bd864]179    fi
[5297c43]180  else
[a3f519b]181    AC_MSG_ERROR([wxWidgets not found.  Run ./configure WX_CONFIG=/path/to/wx-config])
[b9bd864]182  fi
[5809313]183fi
[0fd7598]184
[5627cbb]185dnl Unless the user has explicitly specified a --unicode setting, prefer
186dnl --unicode=yes if we can get it.
187case $WX_CONFIG in
188  *--unicode=*) ;;
189  *)
[7e2f708]190    if (exec >&5 2>&5;$WX_CONFIG --unicode=yes --version "$wx_libs";exit $?) ; then
[5627cbb]191      WX_CONFIG="$WX_CONFIG --unicode=yes"
[7e2f708]192    elif (exec >&5 2>&5;$WX_CONFIG --unicode=no --version "$wx_libs";exit $?) ; then
[5627cbb]193      WX_CONFIG="$WX_CONFIG --unicode=no"
194    fi ;;
195esac
[7092fcb]196
[7e2f708]197WX_LIBS=`$WX_CONFIG --libs "$wx_libs"`
[f665d6e]198dnl Needed for nvidia drivers on linux (for some setups anyway).
199AC_CHECK_LIB(Xxf86vm, XF86VidModeQueryVersion, [WX_LIBS="$WX_LIBS -lXxf86vm"], [], [$WX_LIBS])
[cccbf7f]200
201save_LIBS=$LIBS
202dnl Check if we need a library for OpenGL functions.  Usually it's the "GL"
203dnl library, but it's called opengl32 on Microsoft Windows).
204AC_SEARCH_LIBS([glPushMatrix], [GL opengl32], [WX_LIBS="$WX_LIBS $ac_cv_search_glPushMatrix"], [], [$WX_LIBS])
205dnl Check if we need a library for GLU functions.  Usually it's the "GLU"
206dnl library, but it's called glu32 on Microsoft Windows).
207AC_SEARCH_LIBS([gluProject], [GLU glu32], [WX_LIBS="$WX_LIBS $ac_cv_search_gluProject"], [], [$WX_LIBS])
208LIBS=$save_LIBS
209
[f665d6e]210AC_SUBST(WX_LIBS)
[559cd60]211dnl macOS has OpenGL/gl.h.
[ee63994]212AC_CHECK_HEADERS([GL/gl.h OpenGL/gl.h], [], [], [ ])
[559cd60]213dnl The Debian mingw-w64 packages lack GL/glext.h; macOS has OpenGL/glext.h.
[ee63994]214AC_CHECK_HEADERS([GL/glext.h OpenGL/glext.h], [], [], [#include <GL/gl.h>])
[9c0b089]215
[7e2f708]216WX_CFLAGS=`$WX_CONFIG --cflags "$wx_libs"`
[f665d6e]217AC_SUBST(WX_CFLAGS)
[7e2f708]218WX_CXXFLAGS=`$WX_CONFIG --cxxflags "$wx_libs"`
[f665d6e]219AC_SUBST(WX_CXXFLAGS)
220
[0177571]221AC_LANG([C])
[a5d615f]222save_CFLAGS=$CFLAGS
223CFLAGS="$CFLAGS $WX_CFLAGS"
224AC_CHECK_SIZEOF([wxChar], [], [
225  #include <wx/defs.h>
[631fa17]226  #include <wx/chartype.h>
[a5d615f]227])
228CFLAGS=$save_CFLAGS
[30b66b5]229
[40d1db36]230dnl Check for FFmpeg libraries.
231PKG_CHECK_MODULES([FFMPEG], [libavcodec libavformat libswscale libavutil], [
232  AC_DEFINE([WITH_FFMPEG], [1], [Use FFmpeg for movie export])
[f678705]233  save_CXXFLAGS=$CXXFLAGS
234  save_LIBS=$LIBS
[40d1db36]235  CFLAGS="$CFLAGS $FFMPEG_CFLAGS"
236  LIBS="$LIBS $FFMPEG_LIBS"
[f678705]237  AC_CHECK_FUNCS([av_guess_format avio_open avio_close avformat_write_header avcodec_encode_video2 avcodec_free_frame avcodec_open2 avformat_new_stream av_frame_alloc av_frame_free])
238  AC_CHECK_DECLS([AVMEDIA_TYPE_VIDEO], [], [], [#include <libavcodec/avcodec.h>])
239  AC_CHECK_DECLS([AV_CODEC_ID_NONE], [], [], [#include <libavcodec/avcodec.h>])
[ad04c87]240  AC_CHECK_DECLS([AV_PIX_FMT_RGB24], [], [], [#include <libavutil/pixfmt.h>])
[f678705]241  AC_CHECK_DECLS([AV_PIX_FMT_YUV420P], [], [], [#include <libavutil/pixfmt.h>])
242  CXXFLAGS=$save_CXXFLAGS
243  LIBS=$save_LIBS
[4909e7e1]244], [
245  dnl Build without movie export feature.
[9e516d0d]246])
[40d1db36]247AC_SUBST([FFMPEG_LIBS])
248AC_SUBST([FFMPEG_CFLAGS])
[c527c6e]249
[cf62988]250dnl Check for PROJ.
[ab24da7]251PKG_CHECK_MODULES([PROJ], [proj >= 6.2.0], [
[f678705]252], [
[0b5f43d]253  dnl pkg-config support in proj seems quite new, so probe directly if not
[ab24da7]254  dnl found.  We need proj_create_crs_to_crs_from_pj() which was added in
255  dnl 6.2.0.
256  AC_CHECK_LIB([proj], [proj_create_crs_to_crs_from_pj], [
[0b5f43d]257      PROJ_LIBS=-lproj
258      PROJ_CFLAGS=
259    ], [
[cf62988]260      AC_MSG_ERROR([PROJ required for coordinate transformations])
[0b5f43d]261    ])
[f678705]262])
[8c87227]263AC_SUBST([PROJ_LIBS])
[f678705]264AC_SUBST([PROJ_CFLAGS])
[63dc4eb]265
[51eab3b]266dnl Check for GDAL.
267PKG_CHECK_MODULES([GDAL], [gdal >= 2.3], [
[fd36290]268  AC_DEFINE([HAVE_GDAL], [1], [Define to 1 if you have the 'GDAL' library.])
[51eab3b]269], [
[6ad2f09]270  if test "$mswindows" = no ; then
271    AC_MSG_ERROR([GDAL required for geodata handling])
272  else
273    AC_MSG_WARN([GDAL required for geodata handling])
274  fi
[51eab3b]275])
276AC_SUBST([GDAL_LIBS])
277AC_SUBST([GDAL_CFLAGS])
278
[b6f16ea]279dnl Checks for header files.
[ac1beb0]280
[17f4e1e]281AC_CHECK_HEADERS(string.h)
[55302e3]282
[272c294]283AC_CHECK_FUNCS([popen hypot mmap])
[f66c708]284
[e02a6a6]285dnl Much faster than using getc()/putc(), at least on Linux.
286AC_CHECK_FUNCS([getc_unlocked putc_unlocked])
[0a85859]287
[c891a7e]288AC_CHECK_FUNCS([setenv unsetenv])
289
[725d3b1]290AC_CHECK_FUNCS([fmemopen])
291
[dba56bb]292dnl Microsoft-specific functions which support positional argument specifiers.
293AC_CHECK_FUNCS([_vfprintf_p _vsprintf_p])
294
[d1aefbc]295AC_PATH_PROG([SPHINX_BUILD], [sphinx-build], [$MISSING sphinx-build])
296AC_ARG_VAR([SPHINX_BUILD], [sphinx-build from python3-sphinx])
[788ed2e]297
[f15ee00]298AC_PATH_PROG([MSGFMT], [msgfmt], [$MISSING msgfmt])
299AC_ARG_VAR([MSGFMT], [msgfmt from gettext])
300
[71aa081]301AC_ARG_ENABLE([werror],
[d583ee2]302  [AS_HELP_STRING([--enable-werror], [enable treating compiler warnings as errors [default=no]])],
[71aa081]303  [case ${enableval} in
304    yes|no) ;;
305  *) AC_MSG_ERROR([bad value ${enableval} for --enable-werror]) ;;
306  esac],
307  [enable_werror=no])
308
309dnl Put -Werror or equivalent in its own make variable so that it can easily
310dnl be overridden by `make WERROR=` if needed during development (e.g. if
311dnl you want to get a full list of compile warnings to fix rather than
312dnl stopping at the first file with warnings).
313WERROR=
314AC_SUBST([WERROR])
315
[b4fe9fb]316dnl extra warning flags for building with GCC
[ab27074]317if test yes = "$GCC"; then
[71aa081]318  WERROR=-Werror
[ab27074]319  if test yes = "$cross_compiling"; then
[331b3aa]320dnl    AM_CFLAGS="$AM_CFLAGS -Werror -Wall -Wunused -Wpointer-arith\
321dnl      -Wwrite-strings -Wcast-align"
[75f9a82]322dnl -Wsign-compare causes a warning with the mingw FD_SET macro, so we have
323dnl to disable it for mingw builds.
[331b3aa]324    AM_CFLAGS="$AM_CFLAGS -Wall -Wunused -Wpointer-arith\
[1809849]325      -Wwrite-strings -Wcast-align"
[b960c63]326    AM_CXXFLAGS="$AM_CXXFLAGS -Wall -Wunused -Wpointer-arith\
[75f9a82]327      -Wwrite-strings -Wcast-align -Wno-sign-compare"
[d5bd3a7]328  else
[ab27074]329    AM_CFLAGS="$AM_CFLAGS -Wall -W -Wunused -Wshadow -Wpointer-arith\
330      -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wnested-externs\
[c70e8d2]331      -Wcast-align"
[41cfc8c]332    AM_CXXFLAGS="$AM_CXXFLAGS -Wall -W -Wunused -Wshadow -Wpointer-arith\
[0580c6a]333      -Wwrite-strings -Wcast-align"
[d5bd3a7]334  fi
[b9bd864]335  dnl too many complaints from headers, etc: -Wconversion
[96cc0ab]336fi
[b4fe9fb]337AC_SUBST(AM_CFLAGS)
338AC_SUBST(AM_CXXFLAGS)
[55302e3]339
[71aa081]340if test x$enable_werror != xyes; then
341  WERROR=
342fi
343
[8c0bfb4]344dnl See if large file support is available.  Survex is unlikely to need to
345dnl process files > 2GB in size, but LFS is also needed for stat() to work
346dnl on filing systems which return 64 bit inode values, such as CIFS mounts.
347AC_SYS_LARGEFILE
348
[5341d94]349AC_ARG_ENABLE(profiling,
350[  --enable-profiling Build binaries to generate profiling information],
[21fbe7d]351[case $enableval in
[984f49e]352  yes) AM_CXXFLAGS="$AM_CXXFLAGS -pg"
[b4fe9fb]353       AM_CFLAGS="$AM_CFLAGS -pg"
[5876fcb]354       AC_MSG_RESULT(building binaries to generate profiling information);;
[5341d94]355  no) ;;
[ab27074]356  *) AC_MSG_ERROR(bad value $enableval for --enable-profiling) ;;
[5341d94]357esac])
358
[5636835]359EXTRA_TEXT="AUTHORS COPYING NEWS TODO ChangeLog"
360AC_SUBST(EXTRA_TEXT)
361
[96c5d34]362AC_SUBST_FILE(DESC)
363DESC=desc.txt
364AC_SUBST_FILE(AVENDESC)
365AVENDESC=desc-aven.txt
366
[f665d6e]367dnl Don't define DATADIR if building for MS Windows - it won't be used, and
368dnl can conflict with the DATADIR typedef in objidl.h
[4d0204a]369if test no = "$mswindows"; then
370  AC_DEFINE_DIR(DATADIR, datadir, [Location of platform independent support files])
371fi
[18f4759]372
[e02a6a6]373AH_BOTTOM(
374[/* Use getc_unlocked() and putc_unlocked() where available, since they are
375 * faster, and we don't multithread file accesses.
376 */
377
378#ifdef HAVE_GETC_UNLOCKED
379# define GETC(F) getc_unlocked(F)
380#else
381# define GETC(F) getc(F)
382#endif
383#ifdef HAVE_PUTC_UNLOCKED
384# define PUTC(C, F) putc_unlocked(C, F)
385#else
386# define PUTC(C, F) putc(C, F)
387#endif
[a17d22fc]388
389#ifndef __cplusplus
390/* C23 added bool, false and true as keywords - let's emulate that and
391 * avoid every C file which uses these needing to include <stdbool.h>.
392 */
393# include <stdbool.h>
394#endif
[e02a6a6]395])
396
[f542bda]397AC_CONFIG_FILES([
398 Makefile src/Makefile doc/Makefile lib/Makefile lib/icons/Makefile
[09dfd18]399 lib/images/Makefile
[d1aefbc]400 tests/Makefile vim/Makefile survex.iss doc/index.htm
[df10c51]401 survex.spec lib/Info.plist
[f542bda]402 ])
403AC_OUTPUT
[d959ab2]404dnl FIXME update msvc makefile for 1.2 branch
[cf733ae]405dnl src/msvc/config.h
Note: See TracBrowser for help on using the repository browser.