This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Add _DEFAULT_SOURCE feature test macro.
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: Roland McGrath <roland at hack dot frob dot com>
- Cc: <libc-alpha at sourceware dot org>
- Date: Tue, 17 Dec 2013 22:00:40 +0000
- Subject: Add _DEFAULT_SOURCE feature test macro.
- Authentication-results: sourceware.org; auth=none
- References: <Pine dot LNX dot 4 dot 64 dot 1312052315530 dot 16480 at digraph dot polyomino dot org dot uk> <20131216225338 dot 6FA7E7442E at topped-with-meat dot com>
On Mon, 16 Dec 2013, Roland McGrath wrote:
> In the past, I'm pretty sure I've seen (non-GNU) packages that use
> -D_BSD_SOURCE -D_SVID_SOURCE to get "common" extensions without getting
> GNU extensions (some of which have names that might be more likely to
> have been used by applications--getline was a common case, at least
> before it was added to POSIX). So perhaps there is a need for something
> like that. I guess we could start (after removing __FAVOR_BSD stuff)
> with an analysis of what names are enabled by _GNU_SOURCE but not the
> others.
There are hundreds of __USE_GNU conditionals - for a long time it's been
the normal conditional for anything new and non-POSIX added to a header -
so I don't think such an analysis would be particularly meaningful.
This patch adds a feature test macro _DEFAULT_SOURCE to enable the
default set of header declarations.
The intention is: if _DEFAULT_SOURCE is not used there is no change to
the set of __USE_* macros glibc defines; if it's used on its own, and
without compiler options such as -std=c99 that define __STRICT_ANSI__,
again, there is no change; if it's used together with the macros it
approximately (i.e., apart from __USE_POSIX_IMPLICITLY) implies
(-D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L), again, there
is no change. Otherwise, it causes the relevant features to be
enabled, even if __STRICT_ANSI__, or another feature test macro, would
cause them to be disabled.
This macro deliberately bundles the POSIX.1-2008 (non-X/Open)
functionality with the BSD/SVID/"misc" functionality, rather than
defining a macro that gives just the latter, as many of the header
cleanups resulting from removing _BSD_SOURCE and _SVID_SOURCE support
are only possible when BSD/SVID/"misc" is always bundled with
POSIX.1-2008.
Tested x86_64.
2013-12-17 Joseph Myers <joseph@codesourcery.com>
* include/features.h: Update comment documenting feature test
macros. Mention _DEFAULT_SOURCE in comment.
[_GNU_SOURCE] (_DEFAULT_SOURCE): Undefine and redefine.
[_DEFAULT_SOURCE]: Undefine and redefine _DEFAULT_SOURCE,
_BSD_SOURCE and _SVID_SOURCE.
[!__STRICT_ANSI__ && !_ISOC99_SOURCE && !_POSIX_SOURCE &&
!_POSIX_C_SOURCE && !_XOPEN_SOURCE && !_BSD_SOURCE &&
!_SVID_SOURCE]: Likewise.
[_DEFAULT_SOURCE && !_POSIX_SOURCE && !_POSIX_C_SOURCE]
(__USE_POSIX_IMPLICITLY): Define.
[_DEFAULT_SOURCE && !_POSIX_SOURCE && !_POSIX_C_SOURCE]
(_POSIX_SOURCE): Undefine and redefine.
[_DEFAULT_SOURCE && !_POSIX_SOURCE && !_POSIX_C_SOURCE]
(_POSIX_C_SOURCE): Likewise.
* manual/creature.texi (_DEFAULT_SOURCE): Document.
(Feature Test Macros): Update documentation of default features.
diff --git a/NEWS b/NEWS
index 7886834..61e40cb 100644
--- a/NEWS
+++ b/NEWS
@@ -101,6 +101,11 @@ Version 2.19
* Support for STT_GNU_IFUNC symbols added for ppc32/power4+ and ppc64.
+* A new feature test macro _DEFAULT_SOURCE is available to enable the same
+ set of header declarations that are enabled by default, even when other
+ feature test macros or compiler options such as -std=c99 would otherwise
+ disable some of those declarations.
+
* The _BSD_SOURCE feature test macro no longer enables BSD interfaces that
conflict with POSIX. The libbsd-compat library (which was a dummy library
that did nothing) has also been removed.
diff --git a/include/features.h b/include/features.h
index cff8bfc..6acd5c8 100644
--- a/include/features.h
+++ b/include/features.h
@@ -41,17 +41,21 @@
_SVID_SOURCE ISO C, POSIX, and SVID things.
_ATFILE_SOURCE Additional *at interfaces.
_GNU_SOURCE All of the above, plus GNU extensions.
+ _DEFAULT_SOURCE The default set of features (taking precedence over
+ __STRICT_ANSI__).
_REENTRANT Select additionally reentrant object.
_THREAD_SAFE Same as _REENTRANT, often used by other systems.
_FORTIFY_SOURCE If set to numeric value > 0 additional security
measures are defined, according to level.
- The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
- If none of these are defined, the default is to have _SVID_SOURCE,
- _BSD_SOURCE, and _POSIX_SOURCE set to one and _POSIX_C_SOURCE set to
- 200112L. If more than one of these are defined, they accumulate.
- For example __STRICT_ANSI__, _POSIX_SOURCE and _POSIX_C_SOURCE
- together give you ISO C, 1003.1, and 1003.2, but nothing else.
+ The `-ansi' switch to the GNU C compiler, and standards conformance
+ options such as `-std=c99', define __STRICT_ANSI__. If none of
+ these are defined, or if _DEFAULT_SOURCE is defined, the default is
+ to have _SVID_SOURCE, _BSD_SOURCE, and _POSIX_SOURCE set to one and
+ _POSIX_C_SOURCE set to 200809L. If more than one of these are
+ defined, they accumulate. For example __STRICT_ANSI__,
+ _POSIX_SOURCE and _POSIX_C_SOURCE together give you ISO C, 1003.1,
+ and 1003.2, but nothing else.
These are defined by this file and are used by the
header files to decide what to declare or define:
@@ -160,6 +164,8 @@
# define _XOPEN_SOURCE_EXTENDED 1
# undef _LARGEFILE64_SOURCE
# define _LARGEFILE64_SOURCE 1
+# undef _DEFAULT_SOURCE
+# define _DEFAULT_SOURCE 1
# undef _BSD_SOURCE
# define _BSD_SOURCE 1
# undef _SVID_SOURCE
@@ -168,12 +174,19 @@
# define _ATFILE_SOURCE 1
#endif
-/* If nothing (other than _GNU_SOURCE) is defined,
- define _BSD_SOURCE and _SVID_SOURCE. */
-#if (!defined __STRICT_ANSI__ && !defined _ISOC99_SOURCE && \
- !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE && \
- !defined _XOPEN_SOURCE && !defined _BSD_SOURCE && !defined _SVID_SOURCE)
+/* If nothing (other than _GNU_SOURCE and _DEFAULT_SOURCE) is defined,
+ define _DEFAULT_SOURCE, _BSD_SOURCE and _SVID_SOURCE. */
+#if (defined _DEFAULT_SOURCE \
+ || (!defined __STRICT_ANSI__ \
+ && !defined _ISOC99_SOURCE \
+ && !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE \
+ && !defined _XOPEN_SOURCE \
+ && !defined _BSD_SOURCE && !defined _SVID_SOURCE))
+# undef _DEFAULT_SOURCE
+# define _DEFAULT_SOURCE 1
+# undef _BSD_SOURCE
# define _BSD_SOURCE 1
+# undef _SVID_SOURCE
# define _SVID_SOURCE 1
#endif
@@ -204,8 +217,18 @@
# define __USE_ISOCXX11 1
#endif
-/* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2
- (and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined). */
+/* If none of the ANSI/POSIX macros are defined, or if _DEFAULT_SOURCE
+ is defined, use POSIX.1-2008 (or another version depending on
+ _XOPEN_SOURCE). */
+#ifdef _DEFAULT_SOURCE
+# if !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE
+# define __USE_POSIX_IMPLICITLY 1
+# endif
+# undef _POSIX_SOURCE
+# define _POSIX_SOURCE 1
+# undef _POSIX_C_SOURCE
+# define _POSIX_C_SOURCE 200809L
+#endif
#if ((!defined __STRICT_ANSI__ || (_XOPEN_SOURCE - 0) >= 500) && \
!defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE)
# define _POSIX_SOURCE 1
diff --git a/manual/creature.texi b/manual/creature.texi
index 3b7e77c..bbf16b7 100644
--- a/manual/creature.texi
+++ b/manual/creature.texi
@@ -190,6 +190,21 @@ precedence.
@comment (none)
@comment GNU
+@defvr Macro _DEFAULT_SOURCE
+If you define this macro, most features are included apart from
+X/Open, LFS and GNU extensions; the effect is similar to defining
+@code{_POSIX_C_SOURCE} to @code{200809L} and @code{_POSIX_SOURCE},
+@code{_SVID_SOURCE}, and @code{_BSD_SOURCE} to 1. Defining this
+macro, on its own and without using compiler options such as
+@option{-ansi} or @option{-std=c99}, has the same effect as not
+defining any feature test macros; defining it together with other
+feature test macros, or when options such as @option{-ansi} are used,
+enables those features even when the other options would otherwise
+cause them to be disabled.
+@end defvr
+
+@comment (none)
+@comment GNU
@defvr Macro _REENTRANT
@defvrx Macro _THREAD_SAFE
If you define one of these macros, reentrant versions of several functions get
@@ -204,10 +219,10 @@ it must have been specified to compile as thread safe.
@end defvr
We recommend you use @code{_GNU_SOURCE} in new programs. If you don't
-specify the @samp{-ansi} option to GCC and don't define any of these
-macros explicitly, the effect is the same as defining
-@code{_POSIX_C_SOURCE} to 2 and @code{_POSIX_SOURCE},
-@code{_SVID_SOURCE}, and @code{_BSD_SOURCE} to 1.
+specify the @samp{-ansi} option to GCC, or other conformance options
+such as @option{-std=c99}, and don't define any of these macros
+explicitly, the effect is the same as defining @code{_DEFAULT_SOURCE}
+to 1.
When you define a feature test macro to request a larger class of features,
it is harmless to define in addition a feature test macro for a subset of
--
Joseph S. Myers
joseph@codesourcery.com