2012/5/13 Austin Clements <amdragon@mit.edu>: > Quoth Tomi Ollila on May 10 at 8:12 pm: >> Some C compilers are stricter when it comes to (tentative) definition >> of a variable -- in those compilers introducing variable without 'extern' >> keyword always allocates new 'storage' to the variable and linking all >> these modules fails due to duplicate symbols. >> >> This change uses some macro trickery to avoid writing every variable twice. >> >> This is reimplementation of Charlie Allom's patch: >> id:"1336481467-66356-1-git-send-email-charlie@mediasp.com" >> >> combining information from other change made by Ali Polatel. >> --- >> >> Charlie: could you test whether this patch actually work ? :) >> >> Everyone: what do you think of the "hiding extern" macro trick ? > > This seems like a hacky and nonstandard way to do this. Granted, the > standard way to do this---always declare variables extern in .h files > and also give a non-extern definition in exactly one .c file---is more > verbose, but nobody will be surprised or confused by it. I fully agree or otherwise I'd suggest using: http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h >> bindings/ruby/defs.h | 56 +++++++++++++++++++++++++++---------------------- >> bindings/ruby/init.c | 2 + >> 2 files changed, 33 insertions(+), 25 deletions(-) >> >> diff --git a/bindings/ruby/defs.h b/bindings/ruby/defs.h >> index 85d8205..2531760 100644 >> --- a/bindings/ruby/defs.h >> +++ b/bindings/ruby/defs.h >> @@ -24,31 +24,37 @@ >> #include <ruby.h> >> #include "notmuch.h" >> >> -VALUE notmuch_rb_cDatabase; >> -VALUE notmuch_rb_cDirectory; >> -VALUE notmuch_rb_cFileNames; >> -VALUE notmuch_rb_cQuery; >> -VALUE notmuch_rb_cThreads; >> -VALUE notmuch_rb_cThread; >> -VALUE notmuch_rb_cMessages; >> -VALUE notmuch_rb_cMessage; >> -VALUE notmuch_rb_cTags; >> - >> -VALUE notmuch_rb_eBaseError; >> -VALUE notmuch_rb_eDatabaseError; >> -VALUE notmuch_rb_eMemoryError; >> -VALUE notmuch_rb_eReadOnlyError; >> -VALUE notmuch_rb_eXapianError; >> -VALUE notmuch_rb_eFileError; >> -VALUE notmuch_rb_eFileNotEmailError; >> -VALUE notmuch_rb_eNullPointerError; >> -VALUE notmuch_rb_eTagTooLongError; >> -VALUE notmuch_rb_eUnbalancedFreezeThawError; >> -VALUE notmuch_rb_eUnbalancedAtomicError; >> - >> -ID ID_call; >> -ID ID_db_create; >> -ID ID_db_mode; >> +#ifdef RUBY_INIT_C >> +#define extern >> +#endif >> + >> +extern VALUE notmuch_rb_cDatabase; >> +extern VALUE notmuch_rb_cDirectory; >> +extern VALUE notmuch_rb_cFileNames; >> +extern VALUE notmuch_rb_cQuery; >> +extern VALUE notmuch_rb_cThreads; >> +extern VALUE notmuch_rb_cThread; >> +extern VALUE notmuch_rb_cMessages; >> +extern VALUE notmuch_rb_cMessage; >> +extern VALUE notmuch_rb_cTags; >> + >> +extern VALUE notmuch_rb_eBaseError; >> +extern VALUE notmuch_rb_eDatabaseError; >> +extern VALUE notmuch_rb_eMemoryError; >> +extern VALUE notmuch_rb_eReadOnlyError; >> +extern VALUE notmuch_rb_eXapianError; >> +extern VALUE notmuch_rb_eFileError; >> +extern VALUE notmuch_rb_eFileNotEmailError; >> +extern VALUE notmuch_rb_eNullPointerError; >> +extern VALUE notmuch_rb_eTagTooLongError; >> +extern VALUE notmuch_rb_eUnbalancedFreezeThawError; >> +extern VALUE notmuch_rb_eUnbalancedAtomicError; >> + >> +extern ID ID_call; >> +extern ID ID_db_create; >> +extern ID ID_db_mode; >> + >> +#undef extern >> >> /* RSTRING_PTR() is new in ruby-1.9 */ >> #if !defined(RSTRING_PTR) >> diff --git a/bindings/ruby/init.c b/bindings/ruby/init.c >> index 3fe60fb..b2dc7f6 100644 >> --- a/bindings/ruby/init.c >> +++ b/bindings/ruby/init.c >> @@ -18,7 +18,9 @@ >> * Author: Ali Polatel <alip@exherbo.org> >> */ >> >> +#define RUBY_INIT_C >> #include "defs.h" >> +#undef RUBY_INIT_C >> >> /* >> * Document-module: Notmuch > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch