pyconfig.h and freebsd10: _POSIX_C_SOURCE and _XOPEN_SOURCE

David Schultz das at
Thu Jan 26 14:00:31 UTC 2012

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

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.

More information about the freebsd-standards mailing list