unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] ruby: extern linkage portability improvement
@ 2012-05-10 17:12 Tomi Ollila
  2012-05-13 17:19 ` Austin Clements
  2012-05-14 12:42 ` Charlie Allom
  0 siblings, 2 replies; 6+ messages in thread
From: Tomi Ollila @ 2012-05-10 17:12 UTC (permalink / raw)
  To: notmuch; +Cc: Tomi Ollila

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 ?

 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
-- 
1.7.8.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] ruby: extern linkage portability improvement
  2012-05-10 17:12 [PATCH] ruby: extern linkage portability improvement Tomi Ollila
@ 2012-05-13 17:19 ` Austin Clements
  2012-05-15 15:08   ` Ali Polatel
  2012-05-14 12:42 ` Charlie Allom
  1 sibling, 1 reply; 6+ messages in thread
From: Austin Clements @ 2012-05-13 17:19 UTC (permalink / raw)
  To: Tomi Ollila; +Cc: notmuch

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.

>  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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] ruby: extern linkage portability improvement
  2012-05-10 17:12 [PATCH] ruby: extern linkage portability improvement Tomi Ollila
  2012-05-13 17:19 ` Austin Clements
@ 2012-05-14 12:42 ` Charlie Allom
  1 sibling, 0 replies; 6+ messages in thread
From: Charlie Allom @ 2012-05-14 12:42 UTC (permalink / raw)
  To: Tomi Ollila; +Cc: notmuch

On Thu, May 10, 2012 at 08:12:44PM +0300, Tomi Ollila <tomi.ollila@iki.fi> wrote:
> 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 ? :)

Hi Tomi,

This works for me.

  C.
--
 +442077294797
 http://mediasp.com/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] ruby: extern linkage portability improvement
  2012-05-13 17:19 ` Austin Clements
@ 2012-05-15 15:08   ` Ali Polatel
  2012-05-15 15:31     ` Tomi Ollila
  0 siblings, 1 reply; 6+ messages in thread
From: Ali Polatel @ 2012-05-15 15:08 UTC (permalink / raw)
  To: Austin Clements; +Cc: Tomi Ollila, notmuch

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] ruby: extern linkage portability improvement
  2012-05-15 15:08   ` Ali Polatel
@ 2012-05-15 15:31     ` Tomi Ollila
  2012-06-24 11:20       ` David Bremner
  0 siblings, 1 reply; 6+ messages in thread
From: Tomi Ollila @ 2012-05-15 15:31 UTC (permalink / raw)
  To: Ali Polatel, Austin Clements; +Cc: notmuch

On Tue, May 15 2012, Ali Polatel <alip@exherbo.org> wrote:

> 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

Yes...

(Hmm, I hope no-one got confused that the trick was mine and not yours :)

So, the patch you provided in github would be good...

Tomi

>
>>> .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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] ruby: extern linkage portability improvement
  2012-05-15 15:31     ` Tomi Ollila
@ 2012-06-24 11:20       ` David Bremner
  0 siblings, 0 replies; 6+ messages in thread
From: David Bremner @ 2012-06-24 11:20 UTC (permalink / raw)
  To: Tomi Ollila, Ali Polatel, Austin Clements; +Cc: notmuch

Tomi Ollila <tomi.ollila@iki.fi> writes:

>
> (Hmm, I hope no-one got confused that the trick was mine and not yours :)
>
> So, the patch you provided in github would be good...
>
> Tomi
>

Hi Gang;

This ruby portability patch seems to have stalled. What is the current
proposal?

d

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-06-24 11:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-10 17:12 [PATCH] ruby: extern linkage portability improvement Tomi Ollila
2012-05-13 17:19 ` Austin Clements
2012-05-15 15:08   ` Ali Polatel
2012-05-15 15:31     ` Tomi Ollila
2012-06-24 11:20       ` David Bremner
2012-05-14 12:42 ` Charlie Allom

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).