https://bugs.openldap.org/show_bug.cgi?id=9215
Bug ID: 9215 Summary: Embedded _XOPEN_SOURCE breaks Solaris build [regression] Product: OpenLDAP Version: unspecified Hardware: All OS: All Status: UNCONFIRMED Severity: normal Priority: --- Component: libraries Assignee: bugs@openldap.org Reporter: grapvar@gmail.com Target Milestone: ---
The commit [2020-03-26 57b7003 | thr_posix.c: fix implicit function declaration for 'pthread_setconcurrency']
introduced in the bug 8676, comment 8:
--- a/libraries/libldap_r/thr_posix.c +++ b/libraries/libldap_r/thr_posix.c @@ -15,4 +15,6 @@ */
+#define _XOPEN_SOURCE 500 /* For pthread_setconcurrency() on glibc */
#include "portable.h"
breaks build on Solaris (likely any version; irrelevant compiling options omitted):
| cc ... -c ../../../libraries/libldap_r/thr_posix.c -o .libs/thr_posix.o | "/usr/include/sys/feature_tests.h", line 354: #error: "Compiler or options invalid for pre-UNIX 03 X/Open applications and pre-2001 POSIX applications"
The system headers bear in mind:
"If you are using c99-compatible compiler ..."
and we all are using such compilers in 2020, isn't it?
"... and want to use X/Open CAE, it must be at least Issue 6"
i.e., not the Issue 5 (_XOPEN_SOURCE=500).
This part of system headers came from the times when Solaris was Sun yet. Given the long respectful history of Sun's commitment to standard conformance, I trust this assertion.
The problem, however, is not an incorrect X/Open version this patch employs.
1st of all, this patch is a system-specific hack, that targets not even GNU-based systems, but, I suppose, specifically, GNU linux, maybe, even specific version and distro. E.g., there are no problems with pthread_setconcurrency() visibility on Solaris.
2nd of all, the influence of configuration macros _XOPEN_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_VERSION, _XOPEN_SOURCE_EXTENDED, __EXTENSIONS__ etc is very system- and compiler- specific, and embedding these macros directly in a source is likely to cause problems.
I believe the best course of action is to put a test in autoconf to check what is the best way to achieve pthread_setconcurrency() visibility on any given system.