1#
2# $Id$
3#
4# See ./INSTALL for more info
5#
6
7#
8# Release numbering: even numbered dot releases are official ones, and
9# odd numbers are development ones.  The svn version of this file will
10# only (ONLY!) ever (EVER!) contain odd numbers, so I'll always know if
11# a particular user has the dist or svn release.
12#
13
14AC_PREREQ(2.2)
15AC_INIT([libxo], [0.6.1], [phil@juniper.net])
16AM_INIT_AUTOMAKE([-Wall -Werror foreign -Wno-portability])
17
18# Support silent build rules.  Requires at least automake-1.11.
19# Disable with "configure --disable-silent-rules" or "make V=1"
20m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
21
22AC_PROG_CC
23AM_PROG_AR
24AC_PROG_INSTALL
25AC_CONFIG_MACRO_DIR([m4])
26AC_PROG_LN_S
27
28# Must be after AC_PROG_AR
29LT_INIT([dlopen shared])
30
31AC_PATH_PROG(BASENAME, basename, /usr/bin/basename)
32AC_PATH_PROG(BISON, bison, /usr/bin/bison)
33AC_PATH_PROG(CAT, cat, /bin/cat)
34AC_PATH_PROG(CHMOD, chmod, /bin/chmod)
35AC_PATH_PROG(CP, cp, /bin/cp)
36AC_PATH_PROG(DIFF, diff, /usr/bin/diff)
37AC_PATH_PROG(MKDIR, mkdir, /bin/mkdir)
38AC_PATH_PROG(MV, mv, /bin/mv)
39AC_PATH_PROG(RM, rm, /bin/rm)
40AC_PATH_PROG(SED, sed, /bin/sed)
41
42AC_STDC_HEADERS
43
44# Checks for typedefs, structures, and compiler characteristics.
45AC_C_INLINE
46AC_TYPE_SIZE_T
47
48# Checks for library functions.
49AC_FUNC_ALLOCA
50AC_FUNC_MALLOC
51AC_FUNC_REALLOC
52AC_CHECK_FUNCS([bzero memmove strchr strcspn strerror strspn])
53AC_CHECK_FUNCS([sranddev srand strlcpy])
54AC_CHECK_FUNCS([fdopen getrusage])
55AC_CHECK_FUNCS([gettimeofday ctime])
56AC_CHECK_FUNCS([getpass])
57AC_CHECK_FUNCS([getprogname])
58AC_CHECK_FUNCS([sysctlbyname])
59AC_CHECK_FUNCS([flock])
60AC_CHECK_FUNCS([asprintf])
61AC_CHECK_FUNCS([__flbf])
62AC_CHECK_FUNCS([sysctlbyname])
63
64
65AC_CHECK_HEADERS([dlfcn.h])
66AC_CHECK_HEADERS([dlfcn.h])
67AC_CHECK_HEADERS([stdio_ext.h])
68AC_CHECK_HEADERS([tzfile.h])
69AC_CHECK_HEADERS([stdtime/tzfile.h])
70AC_CHECK_FUNCS([dlfunc])
71
72AC_CHECK_HEADERS([sys/time.h])
73AC_CHECK_HEADERS([ctype.h errno.h stdio.h stdlib.h])
74AC_CHECK_HEADERS([string.h sys/param.h unistd.h ])
75AC_CHECK_HEADERS([sys/sysctl.h])
76AC_CHECK_HEADERS([threads.h])
77AC_CHECK_HEADERS([monitor.h])
78
79dnl humanize_number(3) is a great function, but it's not standard.
80dnl Note Macosx has the function in libutil.a but doesn't ship the
81dnl header file, so I'll need to carry my own implementation.  See:
82dnl    https://devforums.apple.com/thread/271121
83AC_CHECK_HEADERS([libutil.h])
84AC_CHECK_LIB([util], [humanize_number],
85     [HAVE_HUMANIZE_NUMBER=$ac_cv_header_libutil_h],
86     [HAVE_HUMANIZE_NUMBER=no])
87
88AC_MSG_RESULT(humanize_number results: :${HAVE_HUMANIZE_NUMBER}:${ac_cv_header_libutil_h}:)
89
90if test "$HAVE_HUMANIZE_NUMBER" = "yes"; then
91    AC_DEFINE([HAVE_HUMANIZE_NUMBER], [1], [humanize_number(3)])
92fi
93
94AM_CONDITIONAL([HAVE_HUMANIZE_NUMBER], [test "$HAVE_HUMANIZE_NUMBER" = "yes"])
95
96AC_ARG_ENABLE([gettext],
97    [  --disable-gettext  Turn off support for gettext],
98    [GETTEXT_ENABLE=$enableval],
99    [GETTEXT_ENABLE=yes])
100
101dnl Looking for gettext(), assumably in libintl
102AC_ARG_WITH(gettext,
103        [  --with-gettext=[PFX]           Specify location of gettext installation],
104        [GETTEXT_PREFIX=$withval],
105	[GETTEXT_PREFIX=/usr],
106)
107
108HAVE_GETTEXT=no
109
110if test "$GETTEXT_ENABLE" != "no"; then
111
112  AC_MSG_CHECKING([gettext in ${GETTEXT_PREFIX}])
113
114  _save_cflags="$CFLAGS"
115  CFLAGS="$CFLAGS -I${GETTEXT_PREFIX}/include -L${GETTEXT_PREFIX}/lib -Werror -lintl"
116  AC_LINK_IFELSE([AC_LANG_SOURCE([[#include <libintl.h>]
117             [int main() {char *cp = dgettext(NULL, "xx"); return 0; }]])],
118             [HAVE_GETTEXT=yes],
119             [HAVE_GETTEXT=no])
120  CFLAGS="$_save_cflags"
121
122  AC_MSG_RESULT([$HAVE_GETTEXT])
123
124  if test "$HAVE_GETTEXT" != "yes"; then
125      GETTEXT_PREFIX=/opt/local
126      AC_MSG_CHECKING([gettext in ${GETTEXT_PREFIX}])
127
128      _save_cflags="$CFLAGS"
129      CFLAGS="$CFLAGS -I${GETTEXT_PREFIX}/include -L${GETTEXT_PREFIX}/lib -Werror -lintl"
130      AC_LINK_IFELSE([AC_LANG_SOURCE([[#include <libintl.h>]
131                 [int main() {char *cp = dgettext(NULL, "xx"); return 0; }]])],
132                 [HAVE_GETTEXT=yes],
133                 [HAVE_GETTEXT=no])
134      CFLAGS="$_save_cflags"
135
136      AC_MSG_RESULT([$HAVE_GETTEXT])
137  fi
138fi
139
140if test "$HAVE_GETTEXT" = "yes"; then
141    AC_DEFINE([HAVE_GETTEXT], [1], [gettext(3)])
142    GETTEXT_CFLAGS="-I${GETTEXT_PREFIX}/include"
143    GETTEXT_LIBS="-L${GETTEXT_PREFIX}/lib -lintl"
144else
145    GETTEXT_PREFIX=none
146    GETTEXT_CFLAGS=
147    GETTEXT_LIBS=
148fi
149AC_SUBST(GETTEXT_CFLAGS)
150AC_SUBST(GETTEXT_LIBS)
151
152GETTEXT_LIBDIR=${GETTEXT_PREFIX}/lib
153AC_SUBST(GETTEXT_LIBDIR)
154if test -x ${GETTEXT_PREFIX}/bin/msgfmt ; then
155    GETTEXT_BINDIR=${GETTEXT_PREFIX}/bin
156elif test -x ${GETTEXT_PREFIX}/local/bin/msgfmt ; then
157    GETTEXT_BINDIR=${GETTEXT_PREFIX}/local/bin
158else
159    AC_MSG_NOTICE("could not find msgfmt tool")
160    # Use a (bad) fall back value
161    GETTEXT_BINDIR=${GETTEXT_PREFIX}/bin
162fi
163AC_SUBST(GETTEXT_BINDIR)
164
165AM_CONDITIONAL([HAVE_GETTEXT], [test "$HAVE_GETTEXT" = "yes"])
166
167dnl Looking for how to do thread-local variables
168AC_ARG_WITH(threads,
169        [  --with-threads=[STYLE]           Specify style of thread-local support (none)],
170        [THREAD_LOCAL=$withval],
171	[THREAD_LOCAL=unknown],
172)
173
174AC_MSG_CHECKING([thread-locals are ${THREAD_LOCAL}])
175
176if test "$THREAD_LOCAL" = "unknown"; then
177     AC_LINK_IFELSE([AC_LANG_SOURCE([[]
178           [__thread int foo; int main() { foo++; return foo; }]])],
179           [THREAD_LOCAL=before],
180           [THREAD_LOCAL=unknown])
181
182    AC_MSG_RESULT([$THREAD_LOCAL])
183fi
184
185if test "$THREAD_LOCAL" = "unknown"; then
186    AC_LINK_IFELSE([AC_LANG_SOURCE([[]
187           [int __thread foo; int main() { foo++; return foo; }]])],
188           [THREAD_LOCAL=after],
189           [THREAD_LOCAL=unknown])
190    AC_MSG_RESULT([$THREAD_LOCAL])
191fi
192
193if test "$THREAD_LOCAL" = "unknown"; then
194    AC_LINK_IFELSE([AC_LANG_SOURCE([[]
195           [__declspec(int) foo; int main() { foo++; return foo; }]])],
196           [THREAD_LOCAL=declspec],
197           [THREAD_LOCAL=unknown])
198    AC_MSG_RESULT([$THREAD_LOCAL])
199fi
200
201if test "$THREAD_LOCAL" != "unknown"; then
202    AC_DEFINE_UNQUOTED([HAVE_THREAD_LOCAL],
203              THREAD_LOCAL_${THREAD_LOCAL}, [thread-local setting])
204fi
205
206dnl Looking for libcrypto....
207AC_CHECK_LIB([crypto], [MD5_Init])
208AM_CONDITIONAL([HAVE_LIBCRYPTO], [test "$HAVE_LIBCRYPTO" != "no"])
209
210AC_CHECK_MEMBER([struct sockaddr_un.sun_len],
211    [HAVE_SUN_LEN=yes ;
212        AC_DEFINE([HAVE_SUN_LEN], [1], [Have struct sockaddr_un.sun_len])],
213    [HAS_SUN_LEN=no], [[#include <sys/un.h>]])
214
215AC_CHECK_DECLS([__isthreaded], [], [], [#include <stdio.h>])
216HAVE_ISTHREADED=${ac_cv_have_decl___isthreaded}
217
218dnl
219dnl Some packages need to be checked against version numbers so we
220dnl define a function here for later use
221dnl
222AC_DEFUN([VERSION_TO_NUMBER],
223[`$1 | sed -e 's/lib.* //' | awk 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}'`])
224
225LIBSLAX_CONFIG_PREFIX=""
226LIBSLAX_SRC=""
227
228AC_ARG_WITH(libslax-prefix,
229        [  --with-libslax-prefix=[PFX]           Specify location of libslax config],
230        LIBSLAX_CONFIG_PREFIX=$withval
231)
232
233AC_MSG_CHECKING(for libslax)
234if test "x$LIBSLAX_CONFIG_PREFIX" != "x"
235then
236        SLAX_CONFIG=${LIBSLAX_CONFIG_PREFIX}/bin/slax-config
237else
238        SLAX_CONFIG=slax-config
239fi
240
241dnl
242dnl make sure slax-config is executable,
243dnl test version and init our variables
244dnl
245
246if ${SLAX_CONFIG} --libs > /dev/null 2>&1
247then
248	LIBSLAX_VERSION=`$SLAX_CONFIG --version`
249	SLAX_BINDIR="`$SLAX_CONFIG --bindir | head -1`"
250	SLAX_OXTRADOCDIR="`$SLAX_CONFIG --oxtradoc | head -1`"
251	AC_MSG_RESULT($LIBSLAX_VERSION found)
252	HAVE_OXTRADOC=yes
253else
254	LIBSLAX_VERSION=
255	SLAX_BINDIR=
256	SLAX_OXTRADOCDIR=
257	AC_MSG_RESULT([no])
258	HAVE_OXTRADOC=no
259fi
260AM_CONDITIONAL([HAVE_OXTRADOC], [test "$HAVE_OXTRADOC" != "no"])
261
262AC_SUBST(SLAX_BINDIR)
263AC_SUBST(SLAX_OXTRADOCDIR)
264
265AC_MSG_CHECKING([whether to build with warnings])
266AC_ARG_ENABLE([warnings],
267    [  --enable-warnings    Turn on compiler warnings],
268    [LIBXO_WARNINGS=$enableval],
269    [LIBXO_WARNINGS=no])
270AC_MSG_RESULT([$LIBXO_WARNINGS])
271AM_CONDITIONAL([LIBXO_WARNINGS_HIGH], [test "$LIBXO_WARNINGS" != "no"])
272
273AC_MSG_CHECKING([whether to build with debugging])
274AC_ARG_ENABLE([debug],
275    [  --enable-debug    Turn on debugging],
276    [LIBXO_DEBUG=yes; AC_DEFINE([LIBXO_DEBUG], [1], [Enable debugging])],
277    [LIBXO_DEBUG=no])
278AC_MSG_RESULT([$LIBXO_DEBUG])
279AM_CONDITIONAL([LIBXO_DEBUG], [test "$LIBXO_DEBUG" != "no"])
280
281AC_MSG_CHECKING([whether to build with text-only rendering])
282AC_ARG_ENABLE([text-only],
283    [  --enable-text-only    Turn on text-only rendering],
284    [LIBXO_TEXT_ONLY=yes; AC_DEFINE([LIBXO_TEXT_ONLY], [1], [Enable text-only rendering])],
285    [LIBXO_TEXT_ONLY=no])
286AC_MSG_RESULT([$LIBXO_TEXT_ONLY])
287AM_CONDITIONAL([LIBXO_TEXT_ONLY], [test "$LIBXO_TEXT_ONLY" != "no"])
288
289AC_MSG_CHECKING([whether to build with local wcwidth implementation])
290AC_ARG_ENABLE([wcwidth],
291    [  --disable-wcwidth        Disable local wcwidth implementation],
292    [LIBXO_WCWIDTH=$enableval],
293    [LIBXO_WCWIDTH=yes])
294AC_MSG_RESULT([$LIBXO_WCWIDTH])
295if test "${LIBXO_WCWIDTH}" != "no"; then
296  AC_DEFINE([LIBXO_WCWIDTH], [1], [Enable local wcwidth implementation])
297fi
298
299AC_MSG_CHECKING([retain hash bucket size])
300AC_ARG_WITH(retain-size,
301        [  --with-retain-size=[DIR]           Specify retain hash bucket size (in bits)],
302        [XO_RETAIN_SIZE=$withval],
303        [XO_RETAIN_SIZE=default]
304)
305
306AC_MSG_RESULT([$XO_RETAIN_SIZE])
307if test "${XO_RETAIN_SIZE}" != "default"; then
308  AC_DEFINE_UNQUOTED([XO_RETAIN_SIZE], ${XO_RETAIN_SIZE}, [Retain hash bucket size])
309fi
310
311AC_CHECK_LIB([m], [lrint])
312AM_CONDITIONAL([HAVE_LIBM], [test "$HAVE_LIBM" != "no"])
313
314AC_MSG_CHECKING([compiler for gcc])
315HAVE_GCC=no
316if test "${CC}" != ""; then
317    HAVE_GCC=`${CC} --version 2>&1 | grep GCC`
318    if test "${HAVE_GCC}" != ""; then
319        HAVE_GCC=yes
320    else
321        HAVE_GCC=no
322    fi
323fi
324AC_MSG_RESULT([$HAVE_GCC])
325AM_CONDITIONAL([HAVE_GCC], [test "$HAVE_GCC" = "yes"])
326
327AC_MSG_CHECKING([whether to build with printflike])
328AC_ARG_ENABLE([printflike],
329    [  --enable-printflike    Enable use of GCC __printflike attribute],
330    [HAVE_PRINTFLIKE=yes;
331           AC_DEFINE([HAVE_PRINTFLIKE], [1], [Support printflike])],
332    [HAVE_PRINTFLIKE=no])
333AC_MSG_RESULT([$HAVE_PRINTFLIKE])
334AM_CONDITIONAL([HAVE_PRINTFLIKE], [test "$HAVE_PRINTFLIKE" != ""])
335
336AC_MSG_CHECKING([whether to build with LIBXO_OPTIONS])
337AC_ARG_ENABLE([libxo-options],
338    [  --disable-libxo-options  Turn off support for LIBXO_OPTIONS],
339    [LIBXO_OPTS=$enableval],
340    [LIBXO_OPTS=yes])
341AC_MSG_RESULT([$LIBXO_OPTS])
342AM_CONDITIONAL([NO_LIBXO_OPTIONS], [test "$LIBXO_OPTS" != "yes"])
343
344case $host_os in
345     darwin*)
346        LIBTOOL=glibtool
347	XO_LIBEXT=dylib
348	;;
349     Linux*|linux*)
350        CFLAGS="-D_GNU_SOURCE $CFLAGS"
351	LDFLAGS=-ldl
352	XO_LIBEXT=so
353	;;
354     cygwin*|CYGWIN*)
355	LDFLAGS=-no-undefined
356	XO_LIBEXT=ddl
357	;;
358esac
359
360case $prefix in
361     NONE)
362	prefix=/usr/local
363	;;
364esac
365
366XO_LIBS=-lxo
367XO_SRCDIR=${srcdir}
368XO_LIBDIR=${libdir}
369XO_BINDIR=${bindir}
370XO_INCLUDEDIR=${includedir}
371XO_CFLAGS="${CFLAGS}"
372
373AC_SUBST(XO_LIBS)
374AC_SUBST(XO_SRCDIR)
375AC_SUBST(XO_LIBDIR)
376AC_SUBST(XO_BINDIR)
377AC_SUBST(XO_INCLUDEDIR)
378AC_SUBST(XO_LIBEXT)
379AC_SUBST(XO_CFLAGS)
380
381AC_ARG_WITH(encoder-dir,
382        [  --with-encoder-dir=[DIR]           Specify location of encoder libraries],
383        [XO_ENCODERDIR=$withval],
384        [XO_ENCODERDIR=$libdir/libxo/encoder]
385)
386AC_SUBST(XO_ENCODERDIR)
387
388AC_ARG_WITH(share-dir,
389        [  --with-share-dir=[DIR]           Specify location of shared files],
390        [XO_SHAREDIR=$withval],
391        [XO_SHAREDIR=$datarootdir/libxo]
392)
393XO_SHAREDIR=`echo $XO_SHAREDIR | sed "s;\\${prefix};$prefix;"`
394AC_SUBST(XO_SHAREDIR)
395
396dnl for the spec file
397RELDATE=`date +'%Y-%m-%d%n'`
398AC_SUBST(RELDATE)
399
400AC_MSG_RESULT(Using configure dir $ac_abs_confdir)
401
402if test -d $ac_abs_confdir/.git ; then
403  extra=`git branch | awk '/\*/ { print $2 }'`
404  if test "$extra" != "" -a "$extra" != "master"
405  then
406      LIBXO_VERSION_EXTRA="-git-$extra"
407  fi
408fi
409
410LIBXO_VERSION=$PACKAGE_VERSION
411LIBXO_VERSION_NUMBER=VERSION_TO_NUMBER(echo $PACKAGE_VERSION)
412AC_SUBST(LIBXO_VERSION)
413AC_SUBST(LIBXO_VERSION_NUMBER)
414AC_SUBST(LIBXO_VERSION_EXTRA)
415
416AC_DEFINE_UNQUOTED(LIBXO_VERSION, ["$LIBXO_VERSION"],
417    [Version number as dotted value])
418AC_DEFINE_UNQUOTED(LIBXO_VERSION_NUMBER, [$LIBXO_VERSION_NUMBER],
419    [Version number as a number])
420AC_DEFINE_UNQUOTED(LIBXO_VERSION_STRING, ["$LIBXO_VERSION_NUMBER"],
421    [Version number as string])
422AC_DEFINE_UNQUOTED(LIBXO_VERSION_EXTRA, ["$LIBXO_VERSION_EXTRA"],
423    [Version number extra information])
424
425AC_CONFIG_HEADERS([libxo/xo_config.h])
426AC_CONFIG_FILES([
427  Makefile
428  libxo-config
429  xohtml/xohtml.sh
430  libxo/Makefile
431  libxo/add.man
432  encoder/Makefile
433  encoder/cbor/Makefile
434  encoder/test/Makefile
435  xo/Makefile
436  xolint/Makefile
437  xohtml/Makefile
438  xopo/Makefile
439  packaging/libxo.pc
440  doc/Makefile
441  tests/Makefile
442  tests/core/Makefile
443  tests/gettext/Makefile
444  tests/xo/Makefile
445  packaging/libxo.spec
446  packaging/libxo.rb.base
447])
448AC_OUTPUT
449
450AC_MSG_NOTICE([summary of build options:
451
452  libxo version:    ${VERSION} ${LIBXO_VERSION_EXTRA}
453  host type:        ${host} / ${host_os}
454  install prefix:   ${prefix}
455  srcdir:           ${XO_SRCDIR}
456  libdir:           ${XO_LIBDIR}
457  bindir:           ${XO_BINDIR}
458  includedir:       ${XO_INCLUDEDIR}
459  share dir:        ${XO_SHAREDIR}
460  extensions dir:   ${XO_ENCODERDIR}
461  oxtradoc dir:     ${SLAX_OXTRADOCDIR}
462
463  compiler:         ${CC} (${HAVE_GCC:-no})
464  compiler flags:   ${CFLAGS}
465  library types:    Shared=${enable_shared}, Static=${enable_static}
466
467  warnings:         ${LIBXO_WARNINGS:-no}
468  debug:            ${LIBXO_DEBUG:-no}
469  printf-like:      ${HAVE_PRINTFLIKE:-no}
470  libxo-options:    ${LIBXO_OPTS:-no}
471  text-only:        ${LIBXO_TEXT_ONLY:-no}
472  gettext:          ${HAVE_GETTEXT:-no} (${GETTEXT_PREFIX})
473  isthreaded:       ${HAVE_ISTHREADED:-no}
474  thread-local:     ${THREAD_LOCAL:-no}
475  local wcwidth:    ${LIBXO_WCWIDTH:-no}
476  retain size:      ${XO_RETAIN_SIZE:-no}
477])
478