pyconfig.h and freebsd10: _POSIX_C_SOURCE and _XOPEN_SOURCE

David Chisnall theraven at freebsd.org
Thu Jan 26 11:34:06 UTC 2012


On 26 Jan 2012, at 04:47, Eitan Adler wrote:

> On Wed, Jan 25, 2012 at 3:51 PM, Andriy Gapon <avg at freebsd.org> wrote:
>> on 25/01/2012 15:23 David Chisnall said the following:
>>> On 22 Jan 2012, at 19:25, David Schultz wrote:
>>>> Technically it's a problem with python.  If you ask for a strict
>>>> POSIX environment (doesn't matter what version) and also #include
>>>> a non-POSIX header, there's no guarantee about what you'll get.
>>>> I've CC'd the xlocale author in case he wants to comment or
>>>> voluntarily make xlocale work in an otherwise strict POSIX
>>>> environment, but that's not officially supported.
>>> 
>>> The problem is really with glibc, which uses these macros in the opposite way to everyone else (glibc thinks defining these macros means expose functionality from this standard, don't expose it otherwise, everyone else thinks they mean expose only the things defined by this standard).  This makes writing portable code a pain and, while I'd usually be keen to blame Python for everything, in this case I sympathise with their problem.
>> 
>> Thank you for the insights.
>> 
>>> Would defining locale_t and the related functions in xlocale.h if we are in a mode where they are not normally exposed fix the problem?
>> 
>> I think that this should work.
> 
> What about patching python to only define the POSIX macros iff glibc
> is being used (and getting this upstreamed) ?

That would be ideal, but I'd prefer that we did anything that we can within the standard to ensure that people who do silly thing that work on other platforms don't end up saying 'FreeBSD sucks!' because of their code.  Please can you someone verify that this patch fixes the problem?  

David

Index: include/locale.h
===================================================================
--- include/locale.h	(revision 230510)
+++ include/locale.h	(working copy)
@@ -79,7 +79,8 @@
 char		*setlocale(int, const char *);
 __END_DECLS
 
-#if __POSIX_VISIBLE >= 200809
+#if __POSIX_VISIBLE >= 200809 && !defined(__X_LOCALE_DEFINED)
+#define __X_LOCALE_DEFINED
 
 #define LC_COLLATE_MASK  (1<<0)
 #define LC_CTYPE_MASK    (1<<1)
Index: include/xlocale.h
===================================================================
--- include/xlocale.h	(revision 230510)
+++ include/xlocale.h	(working copy)
@@ -35,7 +35,33 @@
 #include <locale.h>
 
 __BEGIN_DECLS
+/*
+ * 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 */
+
 /*
  * Extended locale versions of the locale-aware functions from string.h.
  *



More information about the freebsd-standards mailing list