pyconfig.h and freebsd10: _POSIX_C_SOURCE and _XOPEN_SOURCE

David Chisnall theraven at freebsd.org
Thu Jan 26 16:56:17 UTC 2012


On 26 Jan 2012, at 14:00, David Schultz wrote:

> On Thu, Jan 26, 2012, David Chisnall wrote:
>> 
>> On 26 Jan 2012, at 04:47, Eitan Adler wrote:
>>> What about patching python to only define the POSIX macros iff glibc
>>> is being used (and getting this upstreamed) ?
> 
> That's a good strategy regardless.  As long as python is doing
> something bogus, it could easily break in the future.
> 
>> Index: include/xlocale.h
> [...]
>> +/*
>> + * If people turned off POSIX2008 stuff, but still explicitly included the
>> + * xlocale.h header, then assume that they actually do want these functions and
>> + * define them.
>> + */
>> +#ifndef __X_LOCALE_DEFINED
>> +#define __X_LOCALE_DEFINED
>> 
>> +#define LC_COLLATE_MASK  (1<<0)
>> +#define LC_CTYPE_MASK    (1<<1)
>> +#define LC_MESSAGES_MASK (1<<2)
>> +#define LC_MONETARY_MASK (1<<3)
>> +#define LC_NUMERIC_MASK  (1<<4)
>> +#define LC_TIME_MASK     (1<<5)
>> +#define LC_ALL_MASK      (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | \
>> +		LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
>> +#define LC_GLOBAL_LOCALE ((locale_t)-1)
>> +
>> +typedef struct	_xlocale *locale_t;
>> +locale_t	newlocale(int mask, const char *locale, locale_t base);
>> +locale_t	duplocale(locale_t base);
>> +int		freelocale(locale_t loc);
>> +const char	*querylocale(int mask, locale_t loc);
>> +locale_t	uselocale(locale_t loc);
>> +
>> +#endif /* __X_LOCALE_DEFINED */
> 
> It would be preferable not to have two copies of all the
> definitions and declarations in the source.  This is often handled
> with separate headers like sys/_timeval.h and sys/_types.h.
> Perhaps that's too many hoops to jump through just to cope with
> buggy applications.  (Incidentally, I noticed that the LC_* macros
> are in a slightly different order from the LC_*_MASK macros.  For
> that reason, and only that reason, it's not possible to define the
> latter in terms of the former.)
> 
> Would it suffice, perhaps, to simply change the xlocale
> declarations to use type `struct _xlocale' instead of locale_t?
> That won't fix apps that expect the LC_*_MASK macros to be
> defined, but it looks like it will at least make the header
> compile in a strict POSIX environment, and it avoids the 
> duplication.

Yup, that would probably be fine.

> By the way, struct _xlocale needs another underscore in front of
> it.  Names prefixed with a single underscore and a lowercase
> letter are in the application's namespace.

It is struct _xlocale on Darwin, where this API was introduced as an extension before making it into POSIX, so I kept the name in case anyone depends on this.

David


More information about the freebsd-standards mailing list