Move the meat of <features.h> into <sys/cdefs.h>.

This way it's a lot harder for us to screw up (since we should always
be including <sys/cdefs.h> anyway).

Bug: 14659579
Change-Id: I23070fff3296b0d1c683bb5e3a6e214146327d53
diff --git a/libc/include/features.h b/libc/include/features.h
index 52184a8..a279c7f 100644
--- a/libc/include/features.h
+++ b/libc/include/features.h
@@ -29,12 +29,7 @@
 #ifndef _FEATURES_H_
 #define _FEATURES_H_
 
-#if defined(_BSD_SOURCE)
-# define __USE_BSD 1
-#endif
-
-#if defined(_GNU_SOURCE)
-# define __USE_GNU 1
-#endif
+/* Our <features.h> macro fun is all in <sys/cdefs.h>. */
+#include <sys/cdefs.h>
 
 #endif /* _FEATURES_H_ */
diff --git a/libc/include/sched.h b/libc/include/sched.h
index 7624950..6155ab7 100644
--- a/libc/include/sched.h
+++ b/libc/include/sched.h
@@ -28,7 +28,6 @@
 #ifndef _SCHED_H_
 #define _SCHED_H_
 
-#include <features.h>
 #include <sys/cdefs.h>
 #include <sys/time.h>
 
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index c333823..79d8bca 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -355,9 +355,23 @@
 #define __RCSID(_s) /* nothing */
 #define __SCCSID(_s) /* nothing */
 
+/*
+ * _BSD_SOURCE and _GNU_SOURCE are expected to be defined by callers before
+ * any standard header file is included. In those header files we test
+ * against __USE_BSD and __USE_GNU. glibc does this in <features.h> but we
+ * do it in <sys/cdefs.h> instead because that's where our existing
+ * _POSIX_C_SOURCE tests were, and we're already confident that <sys/cdefs.h>
+ * is included everywhere it should be.
+ */
+#if defined(_BSD_SOURCE)
+# define __USE_BSD 1
+#endif
+
+#if defined(_GNU_SOURCE)
+# define __USE_GNU 1
+#endif
+
 /*-
- * The following definitions are an extension of the behavior originally
- * implemented in <sys/_posix.h>, but with a different level of granularity.
  * POSIX.1 requires that the macros we test be defined before any standard
  * header file is included.
  *
diff --git a/libc/include/sys/stat.h b/libc/include/sys/stat.h
index d6044ae..b56ffa4 100644
--- a/libc/include/sys/stat.h
+++ b/libc/include/sys/stat.h
@@ -29,7 +29,6 @@
 #ifndef _SYS_STAT_H_
 #define _SYS_STAT_H_
 
-#include <features.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
 #include <sys/time.h>
diff --git a/libc/include/unistd.h b/libc/include/unistd.h
index c3e655e..34ae2bc 100644
--- a/libc/include/unistd.h
+++ b/libc/include/unistd.h
@@ -25,10 +25,10 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+
 #ifndef _UNISTD_H_
 #define _UNISTD_H_
 
-#include <features.h>
 #include <stddef.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
diff --git a/libm/include/math.h b/libm/include/math.h
index a808d8d..c51f3af 100644
--- a/libm/include/math.h
+++ b/libm/include/math.h
@@ -17,7 +17,6 @@
 #ifndef _MATH_H_
 #define	_MATH_H_
 
-#include <features.h>
 #include <sys/cdefs.h>
 #include <limits.h>
 
diff --git a/tests/getauxval_test.cpp b/tests/getauxval_test.cpp
index 51c9db8..b331150 100644
--- a/tests/getauxval_test.cpp
+++ b/tests/getauxval_test.cpp
@@ -15,7 +15,6 @@
  */
 
 #include <sys/cdefs.h>
-#include <features.h>
 #include <gtest/gtest.h>
 
 // getauxval() was only added as of glibc version 2.16.
diff --git a/tests/time_test.cpp b/tests/time_test.cpp
index 241c4a0..c9ead8d 100644
--- a/tests/time_test.cpp
+++ b/tests/time_test.cpp
@@ -17,7 +17,6 @@
 #include <time.h>
 
 #include <errno.h>
-#include <features.h>
 #include <gtest/gtest.h>
 #include <pthread.h>
 #include <signal.h>
diff --git a/tests/uchar_test.cpp b/tests/uchar_test.cpp
index eca3c5e..c887f8a 100644
--- a/tests/uchar_test.cpp
+++ b/tests/uchar_test.cpp
@@ -19,7 +19,6 @@
 #if defined(__BIONIC__)
 #define HAVE_UCHAR 1
 #elif defined(__GLIBC__)
-#include <features.h>
 #define HAVE_UCHAR __GLIBC_PREREQ(2, 16)
 #endif