build: With LD_LIBRARY_PATH defined, use --disable-new-dtags.
[npth.git] / configure.ac
1 # configure.ac                                          -*- Autoconf -*-
2 # Copyright (C) 2011, 2012 g10 Code GmbH
3 #
4 # This file is part of nPth.
5 #
6 # nPth is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU Lesser General Public License as
8 # published by the Free Software Foundation; either version 2.1 of the
9 # License, or (at your option) any later version.
10 #
11 # nPth is distributed in the hope that it will be useful, but WITHOUT
12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
14 # Public License for more details.
15 #
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this program; if not, see <http://www.gnu.org/licenses/>.
18
19 # Process this file with autoconf to produce a configure script.
20
21 AC_PREREQ([2.67])
22 min_automake_version="1.14"
23
24 # To build a release you need to create a tag with the version number
25 # (git tag -s npth-n.m) and run "./autogen.sh --force".  Please bump
26 # the version number immediately after the release and do another
27 # commit and push so that the git magic is able to work.
28 # See below for the LT versions.
29 m4_define([mym4_package],[npth])
30 m4_define([mym4_major], [1])
31 m4_define([mym4_minor], [7])
32
33 # To start a new development series, i.e a new major or minor number
34 # you need to mark an arbitrary commit before the first beta release
35 # with an annotated tag.  For example a 2.1 branch starts off with
36 # the tag "foo-2.1-base".  This is used as the base for counting
37 # beta numbers before the first release of a series.
38
39 # Below is m4 magic to extract and compute the git revision number,
40 # the decimalized short revision number, a beta version string and a
41 # flag indicating a development version (mym4_isbeta).  Note that the
42 # m4 processing is done by autoconf and not during the configure run.
43 m4_define([mym4_verslist], m4_split(m4_esyscmd([./autogen.sh --find-version] \
44                            mym4_package mym4_major mym4_minor),[:]))
45 m4_define([mym4_isbeta],       m4_argn(2, mym4_verslist))
46 m4_define([mym4_version],      m4_argn(4, mym4_verslist))
47 m4_define([mym4_revision],     m4_argn(7, mym4_verslist))
48 m4_define([mym4_revision_dec], m4_argn(8, mym4_verslist))
49 m4_esyscmd([echo ]mym4_version[>VERSION])
50 AC_INIT([mym4_package],[mym4_version], [https://bugs.gnupg.org])
51 # LT Version numbers, remember to change them just *before* a release.
52 #   (Code changed:                      REVISION++)
53 #   (Interfaces added/removed/changed:  CURRENT++, REVISION=0)
54 #   (Interfaces added:                  AGE++)
55 #   (Interfaces removed:                AGE=0)
56 #
57 LIBNPTH_LT_CURRENT=1
58 LIBNPTH_LT_AGE=1
59 LIBNPTH_LT_REVISION=2
60 ################################################
61
62 AC_SUBST(LIBNPTH_LT_CURRENT)
63 AC_SUBST(LIBNPTH_LT_AGE)
64 AC_SUBST(LIBNPTH_LT_REVISION)
65
66 VERSION_NUMBER=m4_esyscmd(printf "0x%02x%02x00" mym4_major mym4_minor)
67 AC_SUBST(VERSION_NUMBER)
68
69 # If the API is changed in an incompatible way: increment the next counter.
70 NPTH_CONFIG_API_VERSION=1
71 ##############################################
72
73 AC_CONFIG_AUX_DIR([build-aux])
74 AM_INIT_AUTOMAKE([serial-tests dist-bzip2 no-dist-gzip])
75 AM_MAINTAINER_MODE
76 AC_CONFIG_SRCDIR([src/npth.c])
77 AC_CONFIG_HEADERS([config.h])
78 AC_CONFIG_MACRO_DIR([m4])
79 AC_CANONICAL_HOST
80 AM_SILENT_RULES
81
82 # Enable GNU extensions on systems that have them.
83 AC_GNU_SOURCE
84
85 # Taken from mpfr-4.0.1, then modified for LDADD_FOR_TESTS_KLUDGE
86 dnl Under Linux, make sure that the old dtags are used if LD_LIBRARY_PATH
87 dnl is defined. The issue is that with the new dtags, LD_LIBRARY_PATH has
88 dnl the precedence over the run path, so that if a compatible MPFR library
89 dnl is installed in some directory from $LD_LIBRARY_PATH, then the tested
90 dnl MPFR library will be this library instead of the MPFR library from the
91 dnl build tree. Other OS with the same issue might be added later.
92 dnl
93 dnl References:
94 dnl   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732
95 dnl   http://lists.gnu.org/archive/html/libtool/2017-05/msg00000.html
96 dnl
97 dnl We need to check whether --disable-new-dtags is supported as alternate
98 dnl linkers may be used (e.g., with tcc: CC=tcc LD=tcc).
99 dnl
100 case $host in
101   *-*-linux*)
102     if test -n "$LD_LIBRARY_PATH"; then
103       saved_LDFLAGS="$LDFLAGS"
104       LDADD_FOR_TESTS_KLUDGE="-Wl,--disable-new-dtags"
105       LDFLAGS="$LDFLAGS $LDADD_FOR_TESTS_KLUDGE"
106       AC_MSG_CHECKING(whether --disable-new-dtags is supported by the linker)
107       AC_LINK_IFELSE([AC_LANG_SOURCE([[
108 int main (void) { return 0; }
109       ]])],
110       [AC_MSG_RESULT(yes (use it since LD_LIBRARY_PATH is set))],
111       [AC_MSG_RESULT(no)
112        LDADD_FOR_TESTS_KLUDGE=""
113       ])
114       LDFLAGS="$saved_LDFLAGS"
115     fi
116     ;;
117 esac
118 AC_SUBST([LDADD_FOR_TESTS_KLUDGE])
119
120 AH_VERBATIM([_REENTRANT],
121 [#ifndef _REENTRANT
122 # define _REENTRANT 1
123 #endif])
124
125 # Checks for programs.
126 AC_PROG_CC
127
128 run_tests="yes"
129 AC_ARG_ENABLE(tests,
130   AC_HELP_STRING([--disable-tests], [disable tests]),
131          run_tests=$enableval)
132 AM_CONDITIONAL(RUN_TESTS, test "$run_tests" = "yes")
133
134
135 # Don't default to build static libs.
136 LT_PREREQ([2.2.6])
137 LT_INIT([win32-dll disable-static])
138 LT_LANG([Windows Resource])
139
140
141 # For now we hardcode the use of version scripts.  It would be better
142 # to write a test for this or even implement this within libtool.
143 have_ld_version_script=no
144 case "${host}" in
145     *-*-linux*)
146         have_ld_version_script=yes
147         ;;
148     *-*-gnu*)
149         have_ld_version_script=yes
150         ;;
151     *-apple-darwin*)
152         AC_SEARCH_LIBS([dispatch_semaphore_create],[dispatch],
153         [AC_DEFINE([HAVE_LIB_DISPATCH],1,[Defined if we have libdispatch])])
154         ;;
155     *-*-aix*)
156         have_fork_unsafe_semaphore=yes
157         ;;
158     *-*-dragonfly*|*-*-freebsd*|*-*-netbsd*|*-*-hpux*)
159         LIBS="-lpthread $LIBS"
160         AC_SEARCH_LIBS([sem_init],[rt])
161         ;;
162 esac
163
164 AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
165 if test "$have_fork_unsafe_semaphore" = yes; then
166    AC_DEFINE(HAVE_FORK_UNSAFE_SEMAPHORE, 1, [Defined if we have fork-unsafe semaphore])
167 fi
168
169 # Set some default values
170 config_libs="-lnpth $LIBS"
171 have_w32_system=no
172 have_w32ce_system=no
173 have_w64_system=no
174
175 # Define OS macros
176 case "${host}" in
177     x86_64-*mingw32*)
178         have_w64_system=yes
179         ;;
180     *-mingw32ce*)
181         have_w32ce_system=yes
182         ;;
183 esac
184 case "${host}" in
185     *-mingw32ce*|*-mingw32*)
186         have_w32_system=yes
187         ;;
188     *)
189         ;;
190 esac
191
192 if test "$have_w32_system" = yes; then
193    AC_DEFINE(HAVE_W32_SYSTEM,1,
194              [Defined if we run on any kind of W32 API based system])
195 fi
196 AM_CONDITIONAL(HAVE_W32_SYSTEM, test "$have_w32_system" = yes)
197
198 if test "$have_w64_system" = yes; then
199    AC_DEFINE(HAVE_W64_SYSTEM,1,
200              [Defined if we run on a 64 bit W32 API based system])
201 fi
202 AM_CONDITIONAL(HAVE_W64_SYSTEM, test "$have_w64_system" = yes)
203
204 #
205 # Generate values for the DLL version info
206 #
207 if test "$have_w32_system" = yes; then
208     BUILD_ISODATE=`date --iso-8601`
209     changequote(,)dnl
210     BUILD_FILEVERSION=`echo "$VERSION" | sed 's/\([0-9.]*\).*/\1./;s/\./,/g'`
211     changequote([,])dnl
212     BUILD_FILEVERSION="${BUILD_FILEVERSION}git_revision_dec"
213 fi
214 AC_SUBST(BUILD_ISODATE)
215 AC_SUBST(BUILD_FILEVERSION)
216 AC_ARG_ENABLE([build-timestamp],
217   AC_HELP_STRING([--enable-build-timestamp],
218                  [set an explicit build timestamp for reproducibility.
219                   (default is the current time in ISO-8601 format)]),
220      [if test "$enableval" = "yes"; then
221         BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
222       else
223         BUILD_TIMESTAMP="$enableval"
224       fi],
225      [BUILD_TIMESTAMP="<none>"])
226 AC_SUBST(BUILD_TIMESTAMP)
227 AC_DEFINE_UNQUOTED(BUILD_TIMESTAMP, "$BUILD_TIMESTAMP",
228                    [The time this package was configured for a build])
229
230
231 #
232 # Checks for header files.
233 #
234 # fixme: For what do we need the sys/socket test?
235 AC_CHECK_HEADERS([sys/socket.h sys/select.h unistd.h sys/time.h time.h \
236                   signal.h])
237 INSERT_SYS_SELECT_H=
238 if test x"$ac_cv_header_sys_select_h" = xyes; then
239   INSERT_SYS_SELECT_H="include <sys/select.h>"
240 fi
241 AC_SUBST(INSERT_SYS_SELECT_H)
242
243 if test x"$ac_cv_header_sys_time_h" = xyes; then
244   INSERT_SYS_TIME_H="include <sys/time.h>"
245 fi
246 AC_SUBST(INSERT_SYS_TIME_H)
247
248 if test x"$ac_cv_header_time_h" = xyes; then
249   INSERT_TIME_H="include <time.h>"
250 fi
251 AC_SUBST(INSERT_TIME_H)
252
253 if test x"$ac_cv_header_signal_h" = xyes; then
254   INSERT_SIGNAL_H="include <signal.h>"
255 fi
256 AC_SUBST(INSERT_SIGNAL_H)
257
258
259 # Some systems lack socklen_t - provide a replacement.
260 gl_TYPE_SOCKLEN_T
261 case "${host}" in
262   *-*-mingw32*)
263     # socklen_t may or may not be defined depending on what headers
264     # are included.  To be safe we use int as this is the actual type.
265     INSERT_SOCKLEN_T="define _npth_socklen_t int"
266     ;;
267   *)
268     if test ".$gl_cv_socklen_t_equiv" = "."; then
269       INSERT_SOCKLEN_T="define _npth_socklen_t socklen_t"
270     else
271       INSERT_SOCKLEN_T="define _npth_socklen_t ${gl_cv_socklen_t_equiv}"
272     fi
273 esac
274 AC_SUBST(INSERT_SOCKLEN_T)
275
276
277 #
278 # Checks for typedefs, structures, and compiler characteristics.
279 #
280 AC_TYPE_PID_T
281 AC_TYPE_SIZE_T
282 AC_TYPE_SSIZE_T
283
284
285 #
286 # Checks for libraries and functions.
287 #
288 #   We test for pthread_detach because glibc 2.22 includes
289 #   pthread_create but not pthread_detach.
290 if test "$have_w32_system" = no; then
291   AC_SEARCH_LIBS([pthread_detach],[pthread])
292   case "x$ac_cv_search_pthread_detach" in
293     xno)
294       have_pthread=no
295       ;;
296     xnone\ required)
297       have_pthread=yes
298       ;;
299     *)
300       have_pthread=yes
301       config_libs="$config_libs $ac_cv_search_pthread_detach"
302       ;;
303   esac
304   if test "$have_pthread" != no; then
305     AC_DEFINE(HAVE_PTHREAD,1,[Define if we have pthread.])
306     AC_CHECK_TYPE([pthread_rwlock_t])
307     AC_CHECK_FUNCS([pthread_tryjoin_np pthread_setname_np pthread_getname_np])
308     AC_CHECK_FUNCS([pthread_mutex_timedlock])
309     AC_CHECK_FUNCS([pthread_rwlock_rdlock pthread_rwlock_wrlock])
310     AC_CHECK_FUNCS([pthread_rwlock_timedrdlock pthread_rwlock_timedwrlock])
311     AC_CHECK_FUNCS([pthread_rwlock_tryrdlock pthread_rwlock_trywrlock])
312     AC_CHECK_FUNCS([pthread_atfork])
313   fi
314 fi
315
316 INSERT_NO_RWLOCK="undef _NPTH_NO_RWLOCK"
317 if test x"$ac_cv_type_pthread_rwlock_t" = xno; then
318   INSERT_NO_RWLOCK="define _NPTH_NO_RWLOCK 1"
319 fi
320 AC_SUBST(INSERT_NO_RWLOCK)
321
322 case "${host}" in
323     *-*-linux*|*-*-gnu*)
324         INSERT_EXPOSE_RWLOCK_API="define _NPTH_EXPOSE_RWLOCK_API (defined(__USE_UNIX98) || defined(__USE_XOPEN2K))"
325         ;;
326     *)
327         INSERT_EXPOSE_RWLOCK_API="define _NPTH_EXPOSE_RWLOCK_API 1"
328         ;;
329 esac
330 AC_SUBST(INSERT_EXPOSE_RWLOCK_API)
331
332 AC_CHECK_FUNCS([select pselect gettimeofday])
333
334 npth_LIBSOCKET
335 config_libs="$config_libs $LIBSOCKET"
336
337 # Save and restore LIBS so e.g., -lrt, isn't added to it.  Otherwise, *all*
338 # programs in the package would end up linked with that potentially-shared
339 # library, inducing unnecessary run-time overhead.
340 LIB_CLOCK_GETTIME=
341 AC_SUBST([LIB_CLOCK_GETTIME])
342 gl_saved_libs=$LIBS
343 AC_SEARCH_LIBS([clock_gettime], [rt posix4],
344                [if test "$ac_cv_search_clock_gettime" != "none required"; then
345                   LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime
346                   config_libs="$config_libs $LIB_CLOCK_GETTIME"
347                 fi
348                 AC_DEFINE([HAVE_CLOCK_GETTIME],1,
349                   [Define to 1 if you have the `clock_gettime' function.])
350                 ])
351 LIBS=$gl_saved_libs
352
353
354 #
355 # Set NETLIBS
356 #
357 if test "$have_w32ce_system" = yes; then
358    NETLIBS="-lws2 $NETLIBS"
359 elif test "$have_w32_system" = yes; then
360    NETLIBS="-lws2_32 $NETLIBS"
361 fi
362 AC_SUBST(NETLIBS)
363
364
365 #
366 # Substitutions to set generated files in a Emacs buffer to read-only.
367 #
368 AC_SUBST(emacs_local_vars_begin, [['Local][ ][Variables:']])
369 AC_SUBST(emacs_local_vars_read_only, ['buffer-read-only: t'])
370 AC_SUBST(emacs_local_vars_end, ['End:'])
371
372
373 #
374 # Substitution used for npth-config
375 #
376 NPTH_CONFIG_LIBS="$config_libs"
377 NPTH_CONFIG_CFLAGS=""
378 NPTH_CONFIG_HOST="$host"
379 AC_SUBST(NPTH_CONFIG_API_VERSION)
380 AC_SUBST(NPTH_CONFIG_LIBS)
381 AC_SUBST(NPTH_CONFIG_CFLAGS)
382 AC_SUBST(NPTH_CONFIG_HOST)
383
384 #
385 # Last check.
386 #
387 die=no
388 if test "$have_w32_system" = no; then
389   if test "$have_pthread" = "no"; then
390      die=yes
391      AC_MSG_NOTICE([[
392 ***
393 *** You need Pthread to build this program.
394 *** Normally, this library comes with your system.  On Windows, you can use:
395 ***   http://sourceware.org/pthreads-win32/
396 ***]])
397   fi
398 fi
399
400 if test "$die" = "yes"; then
401     AC_MSG_ERROR([[
402 ***
403 *** Required libraries not found. Please consult the above messages
404 *** and install them before running configure again.
405 ***]])
406 fi
407
408 #
409 # Write output
410 #
411 AC_CONFIG_FILES([Makefile
412 npth.pc
413 src/npth.h
414 src/Makefile
415 w32/Makefile
416 tests/Makefile])
417 AC_CONFIG_FILES(npth-config, chmod +x npth-config)
418 AC_OUTPUT
419
420 echo "
421         $PACKAGE_NAME v$PACKAGE_VERSION prepared for make
422
423         Revision: mym4_revision  (mym4_revision_dec)
424         Platform: $host
425 "