features.h: fix build when BSD headers are not in include path

In our C library we try to provide a "clean" POSIX/ISO-C set of include
files that strictly conforming applications can use. However, we also
want to provide some extensions that are commonly available in BSD or
GNU systems.

These are normally provided in a separate directory
(headers/compatibility/bsd) and additionally guarded by compiler defines
that can either be explicitly set, or enabled by default if the language
standard (selected from the compiler command line) is one with GNU
extensions (this is the default for GCC). This is controlled by a header
file called features.h.

However, for some headers it is not so simple to split the GNU
extensions apart from the other parts of the file, because it's not just
extra functions, but additional flags and defines.

So, we need the "features.h" mechanism to be available even in the base
set of headers, but not enable anything if the BSD headers are not in
the search path. The simplest way to achieve this is to have an empty
features.h in the base set of headers, that can then be overriden by the
one in headers/compatibility/bsd if needed.

Fixes #18732

Change-Id: Ia54d1206c2fba378ae276ed4232aee8443180afb
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7287
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
This commit is contained in:
Adrien Destugues 2024-01-02 13:03:10 +01:00 committed by waddlesplash
parent 4fc18643b9
commit 8d27b645e7
5 changed files with 17 additions and 2 deletions

12
headers/posix/features.h Normal file
View File

@ -0,0 +1,12 @@
/*
* Copyright 2024 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
/* This header is empty. It is there so that #include <features.h> in other headers in this
* directory will work, regardless of the presence of headers/bsd/ in the include search path.
*
* When headers/bsd is not in the search path, no extra features should be enabled (strict POSIX
* and ANSI C compatibility). When headers/bsd is in the search path, features are enabled
* depending on the C standard selected by the compiler command line.
*/

View File

@ -22,7 +22,7 @@
#ifndef _REGEX_H
#define _REGEX_H 1
#include <compatibility/bsd/features.h>
#include <features.h>
#include <sys/types.h>
/* Allow the use in C++ code. */

View File

@ -2,6 +2,8 @@ SubDir HAIKU_TOP src bin keymap ;
UsePrivateHeaders shared storage ;
SubDirSysHdrs $(HAIKU_TOP) headers compatibility bsd ;
BinCommand keymap :
main.cpp
Keymap.cpp

View File

@ -2,6 +2,7 @@ SubDir HAIKU_TOP src kits mail ;
UsePrivateHeaders mail shared ;
UsePublicHeaders [ FDirName add-ons mail_daemon ] ;
SubDirSysHdrs $(HAIKU_TOP) headers compatibility bsd ;
if $(CHECK_MALLOC) {
SubDirC++Flags -D_NO_INLINE_ASM -fcheck-memory-usage ;

View File

@ -1,7 +1,7 @@
SubDir HAIKU_TOP src system libroot posix glibc regex ;
SubDirHdrs $(HAIKU_TOP) headers ;
SubDirCcFlags -D_REGEX_RE_COMP -D__USE_GNU -DHAVE_STDBOOL_H ;
SubDirCcFlags -D_REGEX_RE_COMP -D_DEFAULT_SOURCE -DHAVE_STDBOOL_H ;
local architectureObject ;
for architectureObject in [ MultiArchSubDirSetup ] {