1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

build: include standards macros for all AST code (re: 7fb814e1)

Turns out that the standards macros set by features/standards (such
as _GNU_SOURCE for Linux or _DARWIN_SOURCE for macOS) were still
*not* included for most C source files! Instead, they were
selectively included for some files only, sometimes via
FEATURE/standards (the output of features/standards), sometimes
via ast_standards.h which is copied from FEATURE/standards.

Consequently, there were still inconsistencies in the system header
interfaces exposed on Linux, macOS, Solaris, et al. It's no wonder
it sometimes took so much hackery to keep everything building.

Of course, making this consistent had to break things somewhere.
Breakage occurred on 32-bit Linux due to a lot of ugly hackery
involving direct use of internal GNU types like off64_t and
functions like fseek64(). This is now all removed and they are
activated by setting the appropriate feature macro instead, so
these types and functions can be used with their standard names
(off_t, fseek, etc.)

Before committing I've tested these changes on the following
i386/x86_64 systems: Linux (glibc 32 and 64 bit, musl libc 64 bit),
Solaris (32 and 64 bit), illumos (32 and 64 bit), FreeBSD (64 bit),
macOS (64 bit), Cygwin (32 bit), and Haiku (64 bit).

(Note: ast_standards.h is copied from FEATURE/standards, whereas
ast_common.h is copied from FEATURE/common.)

src/lib/libast/include/ast_std.h,
src/lib/libast/stdio/stdhdr.h:
- Include <ast_standards.h> first. This should cause all the AST
  and dependent code (such as ksh) to get the standards macros.

src/lib/libast/features/standards:
- For GNU (glibc), #define _FILE_OFFSET_BITS 64 to get large file
  support with 64-bit offsets.
- Stop GNU and Cygwin <string.h> form defining the GNU version of
  basename(3); on Cygwin, that declaration conflicts with the AST
  version (and with POSIX) by using a const char* argument instead
  of char*. It is deactivated by defining the macro 'basename' (as
  'basename'); this causes GNU string.h to consider it to be
  already defined by the standard libgen.h header.

All other changed files:
- Remove direct use of *64* types and functions and a lot of
  related hackery.
This commit is contained in:
Martijn Dekker 2022-01-19 01:40:32 +00:00
parent fb8e239cb4
commit 289dd46c05
43 changed files with 78 additions and 872 deletions

View file

@ -1,43 +1,6 @@
iff AST_SYS
ref -D_def_map_ast
print #if __mips == 2 && !defined(_NO_LARGEFILE64_SOURCE)
print #define _NO_LARGEFILE64_SOURCE 1
print #endif
print #if !defined(_NO_LARGEFILE64_SOURCE) && _typ_off64_t && _lib_lseek64 && _lib_stat64
print #if !defined(_LARGEFILE64_SOURCE)
print #define _LARGEFILE64_SOURCE 1
print #endif
print #if !defined(_LARGEFILE_SOURCE)
print #define _LARGEFILE_SOURCE 1
print #endif
print #if !defined(_LARGE_FILE_API)
print #define _LARGE_FILE_API 1
print #endif
print #else
print #undef _LARGEFILE64_SOURCE
print #undef _LARGEFILE_SOURCE
print #undef _LARGE_FILE_API
print #undef _typ_ino64_t
print #undef _typ_off64_t
print #undef _typ_struct_dirent64
print #undef _lib_creat64
print #undef _lib_fstat64
print #undef _lib_fstatvfs64
print #undef _lib_ftruncate64
print #undef _lib_lseek64
print #undef _lib_lstat64
print #undef _lib_mmap64
print #undef _lib_open64
print #undef _lib_readdir64
print #undef _lib_stat64
print #undef _lib_statvfs64
print #undef _lib_truncate64
print #endif
print #if !_lib_readdir64
print #undef _typ_ino64_t
print #endif
header stdlib.h
header stddef.h
header sys/types.h