Here's how I rolled it: dnl dnl make sure AIXers have the proper compiler case "$host_os" in *aix*) if test -n "${CC}" ; then AC_CHECK_PROGS(CC_R, xlc_r cc_r cc) if test "$CC_R" = cc ; then AC_MSG_ERROR([pthread support requires cc_r (or other suitable compiler) on AIX]) else CC=$CC_R AC_SUBST(CC) fi fi ;; esac dnl dnl Check for pthread support dnl PTHREAD_CFLAGS=error PTHREAD_LDFLAGS=error dnl If it's error, then the user didn't dnl define it. if test "x$PTHREAD_LDFLAGS" = xerror; then AC_CHECK_LIB(pthread, pthread_attr_init, [ PTHREAD_CFLAGS="-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS" PTHREAD_LDFLAGS="-lpthread" ]) fi if test "x$PTHREAD_LDFLAGS" = xerror; then AC_CHECK_LIB(pthreads, pthread_attr_init, [ PTHREAD_CFLAGS="-D_THREAD_SAFE" PTHREAD_LDFLAGS="-lpthreads" ]) fi if test "x$PTHREAD_LDFLAGS" = xerror; then AC_CHECK_LIB(c_r, pthread_attr_init, [ PTHREAD_CFLAGS="-D_THREAD_SAFE -pthread" PTHREAD_LDFLAGS="-pthread" ]) fi if test "x$PTHREAD_LDFLAGS" = xerror; then AC_CHECK_FUNC(pthread_attr_init, [ PTHREAD_CFLAGS="-D_REENTRANT" PTHREAD_LDFLAGS="-lpthread" ]) fi if test $PTHREAD_LDFLAGS = "error"; then AC_MSG_WARN(pthread library NOT found: guessing and hoping for the best....) PTHREAD_CFLAGS="-D_REENTRANT" PTHREAD_LDFLAGS="-lpthread" fi AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_LDFLAG) On Thu, Apr 14, 2005 at 05:03:32PM -0400, Kevin Teich wrote: > Hello, > > I've noticed some strange behavior with the options that configure chooses > for compiling pthread code. I'm on a Red Hat Linux 7.3 machine using > autoconf 2.57 and automake 1.6.3. > > We use the ACX_PTHREAD macro from ac-archive to configure pthread options, > from http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.html . > configure would execute successfully and determine that -pthread was the > correct option for this machine, but our programs would not compile, the > Makefiles generating link errors for undefined pthread symbols. > > The reason for this is that when configure does its test to figure out how > to handle pthreads, it uses a combined compile/link line when testing > various options. The test it does for -pthread is to set CFLAGS to > -pthread and leave LIBS blank, and it generates a test like this: > > gcc -c -o conftest -pthread test.c > > This compiles fine, presumably because gcc breaks this down into two > separate steps: > > gcc -c test.c -pthread > gcc -o conftest test.o -pthread > > So configure sets PTHREAD_CFLAGS to -pthread and PTHREAD_LIBS to nothing. > > But, gcc wants -pthread on both its compile line and its link line. I > don't know enough about gcc to know why, but I've verified it with a tiny > test program on my own. (For the link line, you can acutally use -pthread > or -lpthread.) > > So when the generated makefile starts building stuff, it does it in the > normal two steps. So we'd get something like: > > gcc -c main.c $PTHREADS_CFLAGS (= -pthread) > gcc -o main $PTHREADS_LIBS (= empty) > > And get a link error. So I added some code to the acinclude.m4 that checks > to see if configure determined that -pthread was the thing to use, and if > so, to also add it to PTHREAD_LIBS: > > if test x"$PTHREAD_CFLAGS" = x-pthread; then > PTHREAD_LIBS="-pthread" > fi > > This solved our problem. > > Is this a bug, or a logic error in the ACX_PTHREAD macro, or a > misconfiguration on my part? Did I do the correct thing to fix it, or is > there another work-around? > > Thanks. > > > -- > Kevin Teich > > > > _______________________________________________ > Autoconf mailing list > Autoconf@xxxxxxx > http://lists.gnu.org/mailman/listinfo/autoconf > -- #include <stdio.h> int main(){int a[]={74,117,115,116,32,97,110,111,116,104,101,114,32, \ 67,32,104,97,99,107,101,114,10,0}; int *b=a;while(*b>0)putchar(*b++);} _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf