From 070df387061a6e1757d9366870b414cf3570dff8 Mon Sep 17 00:00:00 2001 From: Kai Krueger Date: Sun, 15 Jan 2012 07:23:52 +0000 Subject: [PATCH] use autoconf / automake to find libraries and make it more portable --- Makefile | 95 ------------- Makefile.am | 28 ++++ autogen.sh | 2 + configure.ac | 57 ++++++++ daemon.c | 12 +- daemon.h | 8 +- iniparser3.0b/Makefile | 62 --------- iniparser3.0b/Makefile.am | 3 + m4/ax_lib_mapnik.m4 | 151 ++++++++++++++++++++ m4/ax_pthread.m4 | 282 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 536 insertions(+), 164 deletions(-) delete mode 100644 Makefile create mode 100644 Makefile.am create mode 100755 autogen.sh create mode 100644 configure.ac delete mode 100644 iniparser3.0b/Makefile create mode 100644 iniparser3.0b/Makefile.am create mode 100644 m4/ax_lib_mapnik.m4 create mode 100644 m4/ax_pthread.m4 diff --git a/Makefile b/Makefile deleted file mode 100644 index c7e50b8..0000000 --- a/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -UNAME := $(shell uname) -OSARCH= $(shell uname -m) - -APXS = $(shell which apxs || which apxs2 || echo "need apxs"; exit 1) -$(if $(wildcard $(APXS)),,$(error "cannot find apxs or apxs2")) - -builddir = . -top_dir:=$(shell ${APXS} -q exp_installbuilddir) -top_dir:=$(shell /usr/bin/dirname ${top_dir}) - -top_srcdir = ${top_dir} -top_builddir = ${top_dir} - -include ${top_builddir}/build/special.mk - -CXX := g++ -CXXFLAGS += -Wall - -APACHECTL = $(shell which apachectl || which apache2ctl) -EXTRA_CFLAGS = -I$(builddir) - -EXTRA_CPPFLAGS += -g -O2 -Wall - -all: local-shared-build renderd speedtest render_list render_old convert_meta render_expired - -install: ${DESTDIR}/etc/renderd.conf - - -${DESTDIR}/etc/renderd.conf: -ifeq ($(UNAME), Darwin) - cp renderd.conf ${DESTDIR}/etc/renderd.conf -else - cp -u renderd.conf ${DESTDIR}/etc/renderd.conf -endif - - -clean: - rm -f *.o *.lo *.slo *.la .libs/* - rm -f renderd render_expired render_list speedtest render_old convert_meta - make -C iniparser3.0b veryclean - -RENDER_CPPFLAGS += -g -O2 -Wall -RENDER_CPPFLAGS += -I/usr/local/include/mapnik -I/usr/local/include/ -RENDER_CPPFLAGS += $(shell freetype-config --cflags) - -RENDER_LDFLAGS += -g -RENDER_LDFLAGS += -lpthread - -ifeq ($(OSARCH), x86_64) -RENDER_LDFLAGS += -L/usr/local/lib64 -else -RENDER_LDFLAGS += -L/usr/local/lib -endif - -RENDER_LDFLAGS += -lmapnik -Liniparser3.0b -liniparser - -ifeq ($(UNAME), Darwin) -RENDER_LDFLAGS += -licuuc -lboost_regex -endif - -renderd: store.c daemon.c gen_tile.cpp dir_utils.c protocol.h render_config.h dir_utils.h store.h iniparser3.0b/libiniparser.a - $(CXX) -o $@ $^ $(RENDER_LDFLAGS) $(RENDER_CPPFLAGS) - -speedtest: render_config.h protocol.h dir_utils.c dir_utils.h - -render_list: render_config.h protocol.h dir_utils.c dir_utils.h render_list.c - $(CC) $(EXTRA_CPPFLAGS) -o $@ $^ -lpthread - -render_expired: render_config.h protocol.h dir_utils.c dir_utils.h render_expired.c - $(CC) $(EXTRA_CPPFLAGS) -o $@ $^ -lpthread - -render_old: render_config.h protocol.h dir_utils.c dir_utils.h render_old.c - $(CC) $(EXTRA_CPPFLAGS) -o $@ $^ -lpthread - -convert_meta: render_config.h protocol.h dir_utils.c dir_utils.h store.c - -iniparser: iniparser3.0b/libiniparser.a - -iniparser3.0b/libiniparser.a: iniparser3.0b/src/iniparser.c - make -C iniparser3.0b libiniparser.a - -MYSQL_CFLAGS += -g -O2 -Wall -MYSQL_CFLAGS += $(shell mysql_config --cflags) - -MYSQL_LDFLAGS += $(shell mysql_config --libs) - -mysql2file: mysql2file.c - $(CC) $(MYSQL_CFLAGS) $(MYSQL_LDFLAGS) -o $@ $^ - -deb: - debuild - -# Not sure why this is not created automatically -.deps: - touch .deps diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..86d4863 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,28 @@ +AUTOMAKE_OPTIONS = foreign +SUBDIRS = iniparser3.0b + +ACLOCAL_AMFLAGS = -I m4 + +AM_CPPFLAGS = $(FT2_CFLAGS) $(PTHREAD_CFLAGS) + +bin_PROGRAMS = render_old render_expired render_list speedtest render_old renderd convert_meta + +renderd_SOURCES = protocol.h store.c daemon.h daemon.c gen_tile.h gen_tile.cpp dir_utils.c render_config.h dir_utils.h store.h iniparser3.0b/libiniparser.la +renderd_LDADD = $(FT2_LIBS) $(PTHREAD_CFLAGS) $(MAPNIK_LDFLAGS) -Liniparser3.0b/.libs -liniparser +speedtest_SOURCES = render_config.h protocol.h dir_utils.c dir_utils.h speedtest.cpp +render_list_SOURCES = render_config.h protocol.h dir_utils.c dir_utils.h render_list.c +render_list_LDADD = $(PTHREAD_CFLAGS) +render_expired_SOURCES = render_config.h protocol.h dir_utils.c dir_utils.h render_expired.c +render_expired_LDADD = $(PTHREAD_CFLAGS) +render_old_SOURCES = render_config.h protocol.h dir_utils.c dir_utils.h render_old.c +render_old_LDADD = $(PTHREAD_CFLAGS) +convert_meta_SOURCES = render_config.h protocol.h dir_utils.c dir_utils.h store.c convert_meta.c + +all-local: + $(APXS) -c $(DEF_LDLIBS) $(AM_CFLAGS) $(AM_LDFLAGS) @srcdir@/mod_tile.c @srcdir@/store.c @srcdir@/dir_utils.c + +install-exec-local: + mkdir -p $(DESTDIR)`$(APXS) -q LIBEXECDIR` + $(APXS) -S LIBEXECDIR=$(DESTDIR)`$(APXS) -q LIBEXECDIR` -c -i $(DEF_LDLIBS) $(AM_CFLAGS) $(AM_LDFLAGS) @srcdir@/mod_tile.c @srcdir@/store.c @srcdir@/dir_utils.c + + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..a284ec9 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,2 @@ +#!/bin/sh +autoreconf -vfi \ No newline at end of file diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..25f462c --- /dev/null +++ b/configure.ac @@ -0,0 +1,57 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.68]) +AX_CONFIG_NICE +AC_INIT(mod_tile, 0.1, http://trac.openstreetmap.org) +AM_INIT_AUTOMAKE(mod_tile,0.1) +LT_INIT +AC_CONFIG_SRCDIR([convert_meta.c]) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CC_C99 + +# Checks for libraries. + +# Checks for header files. +AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/socket.h sys/time.h syslog.h unistd.h utime.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_INLINE +AC_TYPE_MODE_T +AC_TYPE_SIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T + +# Checks for library functions. +AC_FUNC_MALLOC +AC_FUNC_MKTIME +AC_CHECK_FUNCS([bzero gethostbyname gettimeofday inet_ntoa memset mkdir pow select socket strchr strdup strerror strrchr strstr strtol strtoul utime]) +AC_CHECK_FT2 +AX_PTHREAD(,[AC_MSG_ERROR([no])]) +AX_LIB_MAPNIK + +AC_ARG_WITH(apxs, + [ --with-apxs=PATH path to Apache apxs], + [ + if test "$withval" = "yes"; then + AC_CHECK_PROGS(APXS, apxs2 /usr/sbin/apxs2, reject) + else + APXS=$withval + AC_SUBST(APXS) + fi + ], + [ + AC_CHECK_PROGS(APXS, apxs2 /usr/sbin/apxs2, reject) + ]) +if test "$APXS" = "reject"; then + AC_MSG_ERROR([Could not find apxs on the path.]) +fi + +AC_CONFIG_FILES(Makefile iniparser3.0b/Makefile) +AC_OUTPUT diff --git a/daemon.c b/daemon.c index 0f91e24..c8a7a56 100644 --- a/daemon.c +++ b/daemon.c @@ -25,9 +25,9 @@ #define PIDFILE "/var/run/renderd/renderd.pid" -extern "C" { +// extern "C" { #include "iniparser3.0b/src/iniparser.h" -} +// } static pthread_t *render_threads; static pthread_t *slave_threads; @@ -308,8 +308,8 @@ enum protoCmd rx_request(const struct protocol *req, int fd) // Upgrade version 1 to version 2 if (req->ver == 1) { - reqnew = (struct protocol *)malloc(sizeof(protocol)); - memcpy(reqnew, req, sizeof(protocol_v1)); + reqnew = (struct protocol *)malloc(sizeof(struct protocol)); + memcpy(reqnew, req, sizeof(struct protocol_v1)); reqnew->xmlname[0] = 0; req = reqnew; } @@ -721,8 +721,8 @@ void *slave_thread(void * arg) { struct protocol * resp; struct protocol * req_slave; - req_slave = (struct protocol *)malloc(sizeof(protocol)); - resp = (struct protocol *)malloc(sizeof(protocol)); + req_slave = (struct protocol *)malloc(sizeof(struct protocol)); + resp = (struct protocol *)malloc(sizeof(struct protocol)); bzero(req_slave, sizeof(struct protocol)); bzero(resp, sizeof(struct protocol)); diff --git a/daemon.h b/daemon.h index d1c39dd..9c2b6b4 100644 --- a/daemon.h +++ b/daemon.h @@ -1,6 +1,10 @@ #ifndef DAEMON_H #define DEEMON_H +#ifdef __cplusplus +extern "C" { +#endif + #include /* for PATH_MAX */ #include "protocol.h" @@ -45,5 +49,7 @@ typedef struct { void statsRenderFinish(int z, long time); void request_exit(void); - +#ifdef __cplusplus +} +#endif #endif diff --git a/iniparser3.0b/Makefile b/iniparser3.0b/Makefile deleted file mode 100644 index 2dd9e83..0000000 --- a/iniparser3.0b/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -# -# iniparser Makefile -# - -# Compiler settings -CC = gcc -CFLAGS = -O2 -fPIC -Wall -ansi -pedantic - -# Ar settings to build the library -AR = ar -ARFLAGS = rcv - -SHLD = ${CC} ${CFLAGS} -LDSHFLAGS = -shared -Wl,-Bsymbolic -Wl,-rpath -Wl,/usr/lib -Wl,-rpath,/usr/lib -LDFLAGS = -Wl,-rpath -Wl,/usr/lib -Wl,-rpath,/usr/lib - -# Set RANLIB to ranlib on systems that require it (Sun OS < 4, Mac OSX) -# for other systems this should do no harm... -RANLIB = ranlib - -RM = rm -f - - -# Implicit rules - -SUFFIXES = .o .c .h .a .so .sl - -COMPILE.c=$(CC) $(CFLAGS) -c -.c.o: - @(echo "compiling $< ...") - @($(COMPILE.c) -o $@ $<) - - -SRCS = src/iniparser.c \ - src/dictionary.c - -OBJS = $(SRCS:.c=.o) - - -default: libiniparser.a libiniparser.so - -libiniparser.a: $(OBJS) - @($(AR) $(ARFLAGS) libiniparser.a $(OBJS)) - @($(RANLIB) libiniparser.a) - -libiniparser.so: $(OBJS) - @$(SHLD) $(LDSHFLAGS) -o $@.0 $(OBJS) $(LDFLAGS) \ - -Wl,-soname=`basename $@`.0 - -clean: - $(RM) $(OBJS) - -veryclean: - $(RM) $(OBJS) libiniparser.a libiniparser.so* - rm -rf ./html ; mkdir html - cd test ; $(MAKE) veryclean - -docs: - @(cd doc ; $(MAKE)) - -check: - @(cd test ; $(MAKE)) diff --git a/iniparser3.0b/Makefile.am b/iniparser3.0b/Makefile.am new file mode 100644 index 0000000..d7e95a8 --- /dev/null +++ b/iniparser3.0b/Makefile.am @@ -0,0 +1,3 @@ +lib_LTLIBRARIES = libiniparser.la +libiniparser_la_SOURCES = src/iniparser.c src/dictionary.c +libiniparser_la_LDFLAGS = -version-info 3 \ No newline at end of file diff --git a/m4/ax_lib_mapnik.m4 b/m4/ax_lib_mapnik.m4 new file mode 100644 index 0000000..30a1c80 --- /dev/null +++ b/m4/ax_lib_mapnik.m4 @@ -0,0 +1,151 @@ +# SYNOPSIS +# +# AX_LIB_MAPNIK([MINIMUM-VERSION]) +# +# DESCRIPTION +# +# This macro provides tests of availability of mapnik 'libmapnik' library +# of particular version or newer. +# +# AX_LIB_MAPNIK macro takes only one argument which is optional. If +# there is no required version passed, then macro does not run version +# test. +# +# The --with-mapnik option takes one of three possible values: +# +# no - do not check for mapnik library +# +# yes - do check for mapnik library in standard locations (xml2-config +# should be in the PATH) +# +# path - complete path to mapnik-config utility, use this option if mapnik-config +# can't be found in the PATH +# +# This macro calls: +# +# AC_SUBST(MAPNIK_CFLAGS) +# AC_SUBST(MAPNIK_LDFLAGS) +# AC_SUBST(MAPNIK_VERSION) +# +# And sets: +# +# HAVE_MAPNIK +# +# LICENSE +# +# Copyright (c) 2012 +# Copyright (c) 2009 Hartmut Holzgraefe +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. + +AC_DEFUN([AX_LIB_MAPNIK], +[ + AC_ARG_WITH([libmapnik], + AC_HELP_STRING([--with-libmapnik=@<:@ARG@:>@], + [use mapnik library @<:@default=yes@:>@, optionally specify path to mapnik-config] + ), + [ + if test "$withval" = "no"; then + want_libmapnik="no" + elif test "$withval" = "yes"; then + want_libmapnik="yes" + else + want_libmapnik="yes" + MAPNIK_CONFIG="$withval" + fi + ], + [want_libmapnik="yes"] + ) + + MAPNIK_CFLAGS="" + MAPNIK_LDFLAGS="" + MAPNIK_VERSION="" + + dnl + dnl Check mapnik libraries (libmapnik) + dnl + + if test "$want_libmapnik" = "yes"; then + + if test -z "$MAPNIK_CONFIG" -o test; then + AC_PATH_PROG([MAPNIK_CONFIG], [mapnik-config], []) + fi + + if test ! -x "$MAPNIK_CONFIG"; then + AC_MSG_ERROR([$MAPNIK_CONFIG does not exist or it is not an exectuable file]) + MAPNIK_CONFIG="no" + found_libmapnik="no" + fi + + if test "$MAPNIK_CONFIG" != "no"; then + AC_MSG_CHECKING([for mapnik libraries]) + + MAPNIK_CFLAGS="`$MAPNIK_CONFIG --cflags`" + MAPNIK_LDFLAGS="`$MAPNIK_CONFIG --libs`" + + MAPNIK_VERSION=`$MAPNIK_CONFIG --version` + + AC_DEFINE([HAVE_MAPNIK], [1], + [Define to 1 if mapnik libraries are available]) + + found_libmapnik="yes" + AC_MSG_RESULT([yes]) + else + found_libmapnik="no" + AC_MSG_RESULT([no]) + fi + fi + + dnl + dnl Check if required version of mapnik is available + dnl + + + libmapnik_version_req=ifelse([$1], [], [], [$1]) + + + if test "$found_libmapnik" = "yes" -a -n "$libmapnik_version_req"; then + + AC_MSG_CHECKING([if mapnik version is >= $libmapnik_version_req]) + + dnl Decompose required version string of mapnik + dnl and calculate its number representation + libxml2_version_req_major=`expr $libxml2_version_req : '\([[0-9]]*\)'` + libxml2_version_req_minor=`expr $libxml2_version_req : '[[0-9]]*\.\([[0-9]]*\)'` + libxml2_version_req_micro=`expr $libxml2_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$libxml2_version_req_micro" = "x"; then + libxml2_version_req_micro="0" + fi + + libxml2_version_req_number=`expr $libxml2_version_req_major \* 1000000 \ + \+ $libxml2_version_req_minor \* 1000 \ + \+ $libxml2_version_req_micro` + + dnl Decompose version string of installed PostgreSQL + dnl and calculate its number representation + libxml2_version_major=`expr $XML2_VERSION : '\([[0-9]]*\)'` + libxml2_version_minor=`expr $XML2_VERSION : '[[0-9]]*\.\([[0-9]]*\)'` + libxml2_version_micro=`expr $XML2_VERSION : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$libxml2_version_micro" = "x"; then + libxml2_version_micro="0" + fi + + libxml2_version_number=`expr $libxml2_version_major \* 1000000 \ + \+ $libxml2_version_minor \* 1000 \ + \+ $libxml2_version_micro` + + libxml2_version_check=`expr $libxml2_version_number \>\= $libxml2_version_req_number` + if test "$libxml2_version_check" = "1"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi + + AC_SUBST([MAPNIK_VERSION]) + AC_SUBST([MAPNIK_CFLAGS]) + AC_SUBST([MAPNIK_LDFLAGS]) +]) + diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 new file mode 100644 index 0000000..e0fc186 --- /dev/null +++ b/m4/ax_pthread.m4 @@ -0,0 +1,282 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 11 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + *-darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include + static void routine(void* a) {a=0;} + static void* start_routine(void* a) {return a;}], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th,0,start_routine,0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0); ], + [ax_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl AX_PTHREAD +