[Libevent-users] Re: [PATCHES] libevent portability, Sun C compiler

Shanti Subramanyam Shanti.Subramanyam at Sun.COM
Wed Jan 3 13:37:38 EST 2007


Emil,
  Thanks very much for your patches.
  We have finally built libevent successfully on Solaris 10 using Sun  
Studio 11 compiler (downloadable for free) and here are the changes  
that had to be made :

1) Edit http.c and event_tagging.c to change '__inline' to 'inline'  
as mentioned previously

2) Edit event.h to add the following :

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

3) I did not make any changes to configure.in (couldn't get your  
suggested changes to work).
      Instead, call configure as follows :
       ./configure CFLAGS= "-fast -xipo -xtarget=generic" LDFLAGS="- 
lnsl -lresolv"


1) and 2) above needs to be fixed in the generic source tree. It  
would also be great if test/regress.gen.* were supplied, so that one  
doesn't require python to be installed.

Shanti


On Jan 2, 2007, at 6:25 PM, Emil Mikulic wrote:

> [sorry for the re-post, the first one went out without a Subject:  
> header
> because my fingers got ahead of me...]
>
> Hi there,
>
> I'm building libevent (SVN HEAD) with Sun C 5.8:
>
> $ cc -V
> cc: Sun C 5.8 Patch 121015-03 2006/10/18
> usage: cc [ options] files.  Use 'cc -flags' for details
> $ uname -srvmp
> SunOS 5.10 Generic_118822-30 sun4u sparc
>
> I've run into a handful of minor portability issues:
>
>
>
> ______________________________________________________________________ 
> __
> 0) Minor glitch in autogen.sh:
>
> --- autogen.sh  (revision 305)
> +++ autogen.sh  (working copy)
> @@ -1,6 +1,6 @@
>  #!/bin/sh
>  LIBTOOLIZE=libtoolize
> -if [ "$(uname)" == "Darwin" ] ; then
> +if [ "$(uname)" = "Darwin" ] ; then
>    LIBTOOLIZE=glibtoolize
>  fi
>  aclocal && \
>
>
>
> ______________________________________________________________________ 
> __
> 1) As Shanti already pointed out in
> http://monkeymail.org/archives/libevent-users/2006-December/ 
> 000439.html,
> two files use __inline.  I believe this is non-standard (a GCC-ism)  
> and
> chokes the Sun compiler.  Other files already use the more standard
> "inline":
>
> emil at goanna:~/levent/trunk/libevent> grep inline *
> buffer.c:static inline void
> evdns.c:static inline int
> event_tagging.c:static int __inline
> http.c:static __inline void
> rtsig.c:static inline int
> rtsig.c:static inline int
> rtsig.c:static inline int
> rtsig.c:static inline int
>
> Could you please commit something like the following?
>
> Index: http.c
> ===================================================================
> --- http.c      (revision 305)
> +++ http.c      (working copy)
> @@ -1512,7 +1512,7 @@
>
>  /* Requires that headers and response code are already set up */
>
> -static __inline void
> +static inline void
>  evhttp_send(struct evhttp_request *req, struct evbuffer *databuf)
>  {
>         struct evhttp_connection *evcon = req->evcon;
> Index: event_tagging.c
> ===================================================================
> --- event_tagging.c     (revision 305)
> +++ event_tagging.c     (working copy)
> @@ -149,7 +149,7 @@
>             EVBUFFER_LENGTH(_buf));
>  }
>
> -static int __inline
> +static int inline
>  decode_int_internal(u_int32_t *pnumber, struct evbuffer *evbuf,  
> int dodrain)
>  {
>         u_int32_t number = 0;
>
>
>
> ______________________________________________________________________ 
> __
> 2) __func__ is not detected correctly by configure:
> $ ./configure
> [...]
> checking whether our compiler supports __func__... no
> checking whether our compiler supports __FUNCTION__... no
> [...]
>
> from config.log:
> | int
> | main ()
> | {
> | void foo() { const char *cp = __func__; }
> |   ;
> |   return 0;
> | }
> [...]
> "conftest.c", line 63: syntax error before or at: {
> "conftest.c", line 64: warning: syntax error:  empty declaration
> "conftest.c", line 65: syntax error before or at: return
> "conftest.c", line 65: warning: syntax error:  empty declaration
>
> I would suggest:
> --- configure.in        (revision 305)
> +++ configure.in        (working copy)
> @@ -355,12 +355,12 @@
>
>  AC_MSG_CHECKING([whether our compiler supports __func__])
>  AC_TRY_COMPILE([],
> - [void foo() { const char *cp = __func__; }],
> + [const char *cp = __func__;],
>   AC_MSG_RESULT([yes]),
>   AC_MSG_RESULT([no])
>   AC_MSG_CHECKING([whether our compiler supports __FUNCTION__])
>   AC_TRY_COMPILE([],
> -   [void foo() { const char *cp = __FUNCTION__; }],
> +   [const char *cp = __FUNCTION__;],
>     AC_MSG_RESULT([yes])
>     AC_DEFINE(__func__, __FUNCTION__,
>           [Define to appropriate substitue if compiler doesnt have  
> __func__]),
>
> Yielding:
> $ ./configure
> [...]
> checking whether our compiler supports __func__... yes
>
> (from previous discussions with the GNUPG maintainers, my  
> understanding
> is that __func__ is standard C99 while __FUNCTION__ is a GCC-ism)
>
>
>
> ______________________________________________________________________ 
> __
> 3) event.h uses u_int8_t and friends instead of
>                 uint8_t and friends
>
> None of the Solaris system headers define the u_* variants.
> Should all instances of u_* in event.h be changed to u* ?
>
>
>
> ______________________________________________________________________ 
> __
> 4) http.c uses MIN() without declaring it as evdns.c does:
> emil at goanna:~/levent/trunk/libevent> gmake http.o
> cc -DHAVE_CONFIG_H -I. -I. -I. -Icompat     -g -c http.c
> "http.c", line 871: warning: implicit function declaration: MIN
>
> Fix:
> --- http.c      (revision 305)
> +++ http.c      (working copy)
> @@ -73,6 +73,9 @@
>  #undef timeout_pending
>  #undef timeout_initialized
>
> +#undef MIN
> +#define MIN(a,b) ((a)<(b)?(a):(b))
> +
>  #include "event.h"
>  #include "evhttp.h"
>  #include "log.h"
>
>
>
> ______________________________________________________________________ 
> __
> 5) As Shanti pointed out in the aforementioned mailing list post, the
> build breaks on libevent/sample/event-test:
>
> emil at goanna:~/levent/trunk/libevent/sample> gmake
> /bin/bash ../libtool --tag=CC --mode=link cc  -I../compat   -o  
> event-test  event-test.o ../libevent.la -lsocket
> cc -I../compat -o .libs/event-test event-test.o  ../.libs/ 
> libevent.so -lsocket -R/usr/local/lib
> Undefined                       first referenced
>  symbol                             in file
> inet_aton                           ../.libs/libevent.so
> ld: fatal: Symbol referencing errors. No output written to .libs/ 
> event-test
>
> Solaris needs -lresolv as well as -lsocket.
>
> I would suggest:
> --- configure.in        (revision 305)
> +++ configure.in        (working copy)
> @@ -36,6 +36,7 @@
>
>  dnl Checks for libraries.
>  AC_CHECK_LIB(socket, socket)
> +AC_CHECK_LIB(resolv, inet_aton)
>
>  dnl Checks for header files.
>  AC_HEADER_STDC
>
> -- 
> Emil Mikulic, UNIX System Administrator               | Ext: 55202
> Technical Services Group                              | PGP: 8E4C5D35
> Computer Science, RMIT University                     | Room 10.10.17



More information about the Libevent-users mailing list