Hi, Unless something turns out to be wrong, I'm going to apply the attached patch that (hopefully) fixes the "missing braces around initializer" problem with GCC on Solaris/IRIX [0,1]. I tested it on GNU/Linux as well as on Solaris 2.8 (SunOS 5.8) with GCC 2.95.2.
The previous configure machinery failed to detect situations where braces are needed because GCC only issues a warning, not an error. Thus, `-Werror' must be used for this test. The patch also adds a similar test for `PTHREAD_MUTEX_INITIALIZER', needed on IRIX with GCC. Evidence suggests that similar problems may exist on other proprietary Unices, with other initializer macros [2], but let's just focus on those that have been reported so far. Thanks, Ludovic. [0] http://article.gmane.org/gmane.lisp.guile.bugs/3600 [1] http://article.gmane.org/gmane.lisp.guile.bugs/3608 [2] http://gcc.gnu.org/ml/gcc-patches/2004-11/msg01683.html
--- orig/configure.in +++ mod/configure.in @@ -1090,6 +1090,7 @@ , with_threads=yes) AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT, 0) +AC_SUBST(SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER, 0) case "$with_threads" in "yes" | "pthread" | "pthreads" | "pthread-threads" | "") @@ -1113,23 +1114,42 @@ # On past versions of Solaris, believe 8 through 10 at least, you # had to write "pthread_once_t foo = { PTHREAD_ONCE_INIT };". - # This is contrary to posix: + # This is contrary to POSIX: # http://www.opengroup.org/onlinepubs/000095399/functions/pthread_once.html # Check here if this style is required. # # glibc (2.3.6 at least) works both with or without braces, so the # test checks whether it works without. # + + if test "$GCC" = "yes"; then + # Since GCC only issues a warning for missing braces, so we need + # `-Werror' to catch it. + CFLAGS="-Werror -Wmissing-braces $CFLAGS" + fi + AC_CACHE_CHECK([whether PTHREAD_ONCE_INIT needs braces], guile_cv_need_braces_on_pthread_once_init, - [AC_TRY_COMPILE([#include <pthread.h>], - [pthread_once_t foo = PTHREAD_ONCE_INIT;], + [AC_COMPILE_IFELSE([#include <pthread.h> + pthread_once_t foo = PTHREAD_ONCE_INIT;], [guile_cv_need_braces_on_pthread_once_init=no], [guile_cv_need_braces_on_pthread_once_init=yes])]) if test "$guile_cv_need_braces_on_pthread_once_init" = yes; then SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT=1 fi + # Same problem with `PTHREAD_MUTEX_INITIALIZER', e.g., on IRIX + # 6.5.30m with GCC 3.3. + AC_CACHE_CHECK([whether PTHREAD_MUTEX_INITIALIZER needs braces], + guile_cv_need_braces_on_pthread_mutex_initializer, + [AC_COMPILE_IFELSE([#include <pthread.h> + pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;], + [guile_cv_need_braces_on_pthread_mutex_initializer=no], + [guile_cv_need_braces_on_pthread_mutex_initializer=yes])]) + if test "$guile_cv_need_braces_on_pthread_mutex_initializer" = yes; then + SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER=1 + fi + CFLAGS="$old_CFLAGS" # On Solaris, sched_yield lives in -lrt. --- orig/libguile/gen-scmconfig.c +++ mod/libguile/gen-scmconfig.c @@ -382,6 +382,11 @@ pf ("#define SCM_NEED_BRACES_ON_PTHREAD_ONCE_INIT %d /* 0 or 1 */\n", SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT); + pf ("/* Define to 1 if need braces around PTHREAD_MUTEX_INITIALIZER\n" + " (for IRIX with GCC) */\n"); + pf ("#define SCM_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER %d /* 0 or 1 */\n", + SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER); + #if USE_DLL_IMPORT pf ("\n"); pf ("/* Define some additional CPP macros on Win32 platforms. */\n"); --- orig/libguile/gen-scmconfig.h.in +++ mod/libguile/gen-scmconfig.h.in @@ -29,6 +29,7 @@ #define SCM_I_GSC_USE_PTHREAD_THREADS @SCM_I_GSC_USE_PTHREAD_THREADS@ #define SCM_I_GSC_USE_NULL_THREADS @SCM_I_GSC_USE_NULL_THREADS@ #define SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT @SCM_I_GSC_NEED_BRACES_ON_PTHREAD_ONCE_INIT@ +#define SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER @SCM_I_GSC_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER@ /* Local Variables: --- orig/libguile/pthread-threads.h +++ mod/libguile/pthread-threads.h @@ -43,7 +43,11 @@ /* Mutexes */ -#define SCM_I_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#if SCM_NEED_BRACES_ON_PTHREAD_MUTEX_INITIALIZER +# define SCM_I_PTHREAD_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER } +#else +# define SCM_I_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#endif #define scm_i_pthread_mutex_t pthread_mutex_t #define scm_i_pthread_mutex_init pthread_mutex_init #define scm_i_pthread_mutex_destroy pthread_mutex_destroy
_______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://lists.gnu.org/mailman/listinfo/guile-devel