[syslog-ng] linking changes

Balazs Scheidler bazsi at balabit.hu
Thu Feb 24 10:31:45 CET 2011


Hi,

On Wed, 2011-02-23 at 17:29 +0100, Corinna Vinschen wrote:
> On Feb 23 16:09, Balazs Scheidler wrote:
> > Before making a fool from myself, can you please check if this patch is
> > OK, before commit & push? (against the current HEAD).
> > 
> > My intention was:
> >   * create a static lib for linking with programs (unit tests & pdbtool)
> >   * recompile each source files as a part of the shared library
> > separately
> > 
> > This way:
> >   * no linking of static lib into shared lib happens
> > 
> > Also, a heads up: this will be a problem again in syslog-ng OSE 3.3,
> > where I started to embed dependent libraries into the syslog-ng tree
> > (ivykis, libmongo-client) because those are not yet in widespread use.
> > That's implemented using static libraries and -fPIC, and I don't see an
> > easy solution for that problem, unless of course one obtains and
> > installs those libraries separately.
> 
> ivykis and libmongo-client are not available for Cygwin.  Is there
> no way around using these libs by using conditional compilation?

There's a way, mongodb can be disabled using --disable-mongodb configure
option (but is enabled by default with the bundled libmongo-client
library).

ivykis is not so simple, syslog-ng core depends on that heavily. ivykis
is compiled as a static library (with -fPIC) and then linked into
libsyslog-ng.so

The staticlib is just a convenience library, however I'd like that to be
created by the ivykis configure/automake stuff, and would like to avoid
having to rewrite the build system for ivykis. Also, I wouldn't want to
install ivykis (as a shared object) from the syslog-ng tree, as I could
perhaps break people's setup if ivykis becomes more widely available.
(e.g. installed on the system).

Do you perhaps have an idea how to solve that differently?

> 
> If that's not feasible for some reason, could you please at least allow
> to disable affected modules from building so that not the entire build
> fails just because some modules won't work on some systems?
> 
> > $ git diff
> > diff --git a/modules/dbparser/Makefile.am b/modules/dbparser/Makefile.am
> > index b2ab700..7e4c366 100644
> > --- a/modules/dbparser/Makefile.am
> > +++ b/modules/dbparser/Makefile.am
> > @@ -11,26 +11,30 @@ AM_CPPFLAGS = -I$(top_srcdir)/lib -I../../lib
> >  AM_CFLAGS = @CFLAGS_NOWARN_POINTER_SIGN@
> >  export top_srcdir
> >  
> > -lib_LIBRARIES = libsyslog-ng-patterndb.a
> > +noinst_LIBRARIES = libsyslog-ng-patterndb.a
> >  libsyslog_ng_patterndb_a_SOURCES = radix.c radix.h \
> >         patterndb.c patterndb.h patterndb-int.h \
> >         timerwheel.c timerwheel.h \
> >         patternize.c patternize.h
> > -libsyslog_ng_patterndb_a_CFLAGS = $(AM_CFLAGS) -fPIC
> >  
> > +# we're not linking against the .a file as this is not supported on Cygwin,
> > +# even if we compile it using -fPIC.  Therefore the .a file is only used to
> > +# link programs, and the dbparser.so gets those files as source files,
> > +# thereby recompiling them twice.
> >  module_LTLIBRARIES = libdbparser.la
> >  libdbparser_la_SOURCES = \
> >         dbparser.c dbparser.h \
> > -       dbparser-grammar.y dbparser-parser.c dbparser-parser.h dbparser-plugin.c
> > +       dbparser-grammar.y dbparser-parser.c dbparser-parser.h dbparser-plugin.c \
> > +       $(libsyslog_ng_patterndb_a_SOURCES)
> >  
> >  libdbparser_la_CPPFLAGS = $(AM_CPPFLAGS)
> > -libdbparser_la_LIBADD = ../../lib/libsyslog-ng.la libsyslog-ng-patterndb.a
> > +libdbparser_la_LIBADD = ../../lib/libsyslog-ng.la
> 
> This fails to build on Cygwin because libdbparser_la_LIBADD is missing a
> @OPENSSL_LIBS@ (needed by patternize.c).
> 
> Amazing but true: Another restriction of the Windows platform is the
> inability to create shared libs with undefined symbols.  All symbols must
> be resolvable at link time.
> 
> >  libdbparser_la_LDFLAGS = -avoid-version -module -no-undefined
> >  
> >  bin_PROGRAMS = pdbtool
> >  pdbtool_SOURCES = pdbtool.c
> >  pdbtool_CPPFLAGS = $(AM_CPPFLAGS) @OPENSSL_CFLAGS@
> > -pdbtool_LDADD = ../../lib/libsyslog-ng.la libsyslog-ng-patterndb.a @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@
> > +pdbtool_LDADD =  libsyslog-ng-patterndb.a ../../lib/libsyslog-ng.la @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@
> >  
> >  BUILT_SOURCES = dbparser-grammar.y dbparser-grammar.c dbparser-grammar.h
> >  EXTRA_DIST = $(BUILT_SOURCES) radix-find.c dbparser-grammar.ym
> > diff --git a/modules/dbparser/tests/Makefile.am b/modules/dbparser/tests/Makefile.am
> > index 8d3a970..6726121 100644
> > --- a/modules/dbparser/tests/Makefile.am
> > +++ b/modules/dbparser/tests/Makefile.am
> > @@ -1,6 +1,6 @@
> >  AM_CFLAGS = -I$(top_srcdir)/lib -I../../../lib -I$(top_srcdir)/modules/dbparser -I.. @CFLAGS_NOWARN_POINTER_SIGN@
> >  AM_LDFLAGS = -dlpreopen ../../syslogformat/libsyslogformat.la
> > -LDADD = $(top_builddir)/lib/libsyslog-ng.la ../libsyslog-ng-patterndb.a  ../patternize.lo @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@
> > +LDADD = $(top_builddir)/lib/libsyslog-ng.la ../libsyslog-ng-patterndb.a @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@
> 
> I didn't test that, but shouldn't this LDADD be reordered as well, just
> as in the pdbtool_LDADD case?
> 
>   LDADD = ../libsyslog-ng-patterndb.a $(top_builddir)/lib/libsyslog-ng.la @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@

Good catch, also applied.

> 
> Btw., I'm seeing a lot of
> 
>   foo.y: warning: X nonterminals useless in grammar
>   foo.y: warning: Y rules useless in grammar
> 
> messages.  Aren't the grep calls in build/lex-rules.am wrong?
> 
>   grep -E -v "warning: (nonterminals|rules) useless in grammar
> 
> instead of 
> 
>   grep -E -v "warning: (nonterminal|rule) useless in grammar
> 
> ?  Or does the message depend on the version of yacc/bison used, perhaps?

Well, it seems to matter which bison version you are using. 3.3 has a
fix for this (where it accepts both the pural and the singular forms).

-- 
Bazsi




More information about the syslog-ng mailing list