mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-29 00:01:12 +00:00
a4fea3f2c3
We shipped 2.27 with libio.h and _G_config.h still installed but issuing warnings when used. Let's stop installing them early in 2.28 so that we have plenty of time to think of another plan if there are problems. The public stdio.h had a genuine dependency on libio.h for the complete definitions of FILE and cookie_io_functions_t, and a genuine dependency on _G_config.h for the complete definitions of fpos_t and fpos64_t; these are moved to single-type headers. bits/types/struct_FILE.h also provides a handful of accessor and bitflags macros so that code is not duplicated between bits/stdio.h and libio.h. All the other _IO_ and _G_ names used by the public stdio.h can be replaced with either public names or __-names. In order to minimize the risk of breaking our own compatibility code, bits/types/struct_FILE.h preserves the _IO_USE_OLD_IO_FILE mechanism exactly as it was in libio.h, but you have to define _LIBC to use it, or it'll error out. Similarly, _IO_lock_t_defined is preserved exactly, but will error out if used without defining _LIBC. Internally, include/stdio.h continues to include libio.h, and libio.h scrupulously provides every _IO_* and _G_* name that it always did, perhaps now defined in terms of the public names. This is how this patch avoids touching dozens of files throughout glibc and becoming entangled with the _IO_MTSAFE_IO mess. The remaining patches in this series eliminate most of the _G_ names. Tested on x86_64-linux; in addition to the test suite, I installed the library in a sysroot and verified that a simple program that uses stdio.h could be compiled against the installed library, and I also verified that installed stripped libraries are unchanged. * libio/bits/types/__fpos_t.h, libio/bits/types/__fpos64_t.h: New single-type headers split from _G_config.h. * libio/bits/types/cookie_io_functions_t.h * libio/bits/types/struct_FILE.h New single-type headers split from libio.h. * libio/Makefile: Install the above new headers. Don't install libio.h, _G_config.h, bits/libio.h, bits/_G_config.h, or bits/libio-ldbl.h. * libio/_G_config.h, libio/libio.h: Delete file. * libio/bits/libio.h: Remove improper-inclusion guard. Include stdio.h and don't repeat anything that it does. Define _IO_fpos_t as __fpos_t, _IO_fpos64_t as __fpos64_t, _IO_BUFSIZ as BUFSIZ, _IO_va_list as __gnuc_va_list, __io_read_fn as cookie_read_function_t, __io_write_fn as cookie_write_function_t, __io_seek_fn as cookie_seek_function_t, __io_close_fn as cookie_close_function_t, and _IO_cookie_io_functions_t as cookie_io_functions_t. Define _STDIO_USES_IOSTREAM, __HAVE_COLUMN, and _IO_file_flags here, in the "compatibility defines" section. Remove an #if 0 block. Use the "body" macros from bits/types/struct_FILE.h to define _IO_getc_unlocked, _IO_putc_unlocked, _IO_feof_unlocked, and _IO_ferror_unlocked. Move prototypes of __uflow and __overflow... * libio/stdio.h: ...here. Don't include bits/libio.h. Don't define _STDIO_USES_IOSTREAM. Get __gnuc_va_list directly from stdarg.h. Include bits/types/__fpos_t.h, bits/types/__fpos64_t.h, bits/types/struct_FILE.h, and, when __USE_GNU, bits/types/cookie_io_functions_t.h. Use __gnuc_va_list, not _G_va_list; __fpos_t, not _G_fpos_t; __fpos64_t, not _G_fpos64_t; FILE, not struct _IO_FILE; cookie_io_functions_t, not _IO_cookie_io_functions_t; __ssize_t, not _IO_ssize_t. Unconditionally define BUFSIZ as 8192 and EOF as (-1). * libio/bits/stdio.h: Add multiple-include guard. Use the "body" macros from bits/types/struct_FILE.h instead of _IO_* macros from libio.h; use __gnuc_va_list instead of va_list and __ssize_t instead of _IO_ssize_t. * libio/bits/stdio2.h: Similarly. * libio/iolibio.h: Add multiple-include guard. Include bits/libio.h after stdio.h. * libio/libioP.h: Add multiple-include guard. Include stdio.h and bits/libio.h before iolibio.h. * include/bits/types/__fpos_t.h, include/bits/types/__fpos64_t.h * include/bits/types/cookie_io_functions_t.h * include/bits/types/struct_FILE.h: New wrappers. * bits/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h: Get definitions of _G_fpos_t and _G_fpos64_t from bits/types/__fpos_t.h and bits/types/__fpos64_t.h respectively. Remove improper-inclusion guards. * conform/data/stdio.h-data: Update expectations of va_list. * scripts/check-installed-headers.sh: Remove special case for libio.h and _G_config.h.
174 lines
5.9 KiB
Bash
174 lines
5.9 KiB
Bash
#! /bin/sh
|
|
# Copyright (C) 2016-2018 Free Software Foundation, Inc.
|
|
# This file is part of the GNU C Library.
|
|
#
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
#
|
|
# The GNU C Library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with the GNU C Library; if not, see
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
# Check installed headers for cleanliness. For each header, confirm
|
|
# that it's possible to compile a file that includes that header and
|
|
# does nothing else, in several different compilation modes. Also,
|
|
# scan the header for a set of obsolete typedefs that should no longer
|
|
# appear.
|
|
|
|
# These compilation switches assume GCC or compatible, which is probably
|
|
# fine since we also assume that when _building_ glibc.
|
|
c_modes="-std=c89 -std=gnu89 -std=c11 -std=gnu11"
|
|
cxx_modes="-std=c++98 -std=gnu++98 -std=c++11 -std=gnu++11"
|
|
|
|
# An exhaustive test of feature selection macros would take far too long.
|
|
# These are probably the most commonly used three.
|
|
lib_modes="-D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1 -D_XOPEN_SOURCE=700"
|
|
|
|
# sys/types.h+bits/types.h have to define the obsolete types.
|
|
# rpc(svc)/* have the obsolete types too deeply embedded in their API
|
|
# to remove.
|
|
skip_obsolete_type_check='*/sys/types.h|*/bits/types.h|*/rpc/*|*/rpcsvc/*'
|
|
obsolete_type_re=\
|
|
'\<((__)?(quad_t|u(short|int|long|_(char|short|int([0-9]+_t)?|long|quad_t))))\>'
|
|
|
|
if [ $# -lt 3 ]; then
|
|
echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
|
|
exit 2
|
|
fi
|
|
case "$1" in
|
|
(c)
|
|
lang_modes="$c_modes"
|
|
cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.c)
|
|
already="$skip_obsolete_type_check"
|
|
;;
|
|
(c++)
|
|
lang_modes="$cxx_modes"
|
|
cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.cc)
|
|
# The obsolete-type check can be skipped for C++; it is
|
|
# sufficient to do it for C.
|
|
already="*"
|
|
;;
|
|
(*)
|
|
echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
|
|
exit 2;;
|
|
esac
|
|
shift
|
|
cc_cmd="$1"
|
|
shift
|
|
trap "rm -f '$cih_test_c'" 0
|
|
|
|
failed=0
|
|
is_x86_64=unknown
|
|
is_x32=unknown
|
|
for header in "$@"; do
|
|
# Skip various headers for which this test gets a false failure.
|
|
case "$header" in
|
|
# bits/* are not meant to be included directly and usually #error
|
|
# out if you try it.
|
|
# regexp.h is a stub containing only an #error.
|
|
# Sun RPC's .x files are traditionally installed in
|
|
# $prefix/include/rpcsvc, but they are not C header files.
|
|
(bits/* | regexp.h | rpcsvc/*.x)
|
|
continue;;
|
|
|
|
# All extant versions of sys/elf.h contain nothing more than an
|
|
# exhortation (either a #warning or an #error) to use sys/procfs.h
|
|
# instead, plus an inclusion of that header.
|
|
(sys/elf.h)
|
|
continue;;
|
|
|
|
# sys/sysctl.h is unsupported for x32.
|
|
(sys/sysctl.h)
|
|
case "$is_x32" in
|
|
(yes) continue;;
|
|
(no) ;;
|
|
(unknown)
|
|
cat >"$cih_test_c" <<EOF
|
|
#if defined __x86_64__ && defined __ILP32__
|
|
# error "is x32"
|
|
#endif
|
|
EOF
|
|
if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
|
|
then
|
|
is_x32=no
|
|
else
|
|
is_x32=yes
|
|
continue
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
# sys/vm86.h is "unsupported on x86-64" and errors out on that target.
|
|
(sys/vm86.h)
|
|
case "$is_x86_64" in
|
|
(yes) continue;;
|
|
(no) ;;
|
|
(unknown)
|
|
cat >"$cih_test_c" <<EOF
|
|
#if defined __x86_64__ && __x86_64__
|
|
#error "is x86-64"
|
|
#endif
|
|
EOF
|
|
if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
|
|
then
|
|
is_x86_64=no
|
|
else
|
|
is_x86_64=yes
|
|
continue
|
|
fi
|
|
;;
|
|
esac
|
|
esac
|
|
|
|
echo :: "$header"
|
|
for lang_mode in "" $lang_modes; do
|
|
for lib_mode in "" $lib_modes; do
|
|
echo :::: $lang_mode $lib_mode
|
|
if [ -z "$lib_mode" ]; then
|
|
expanded_lib_mode='/* default library mode */'
|
|
else
|
|
expanded_lib_mode=$(echo : $lib_mode | \
|
|
sed 's/^: -D/#define /; s/=/ /')
|
|
fi
|
|
cat >"$cih_test_c" <<EOF
|
|
/* These macros may have been defined on the command line. They are
|
|
inappropriate for this test. */
|
|
#undef _LIBC
|
|
#undef _GNU_SOURCE
|
|
/* The library mode is selected here rather than on the command line to
|
|
ensure that this selection wins. */
|
|
$expanded_lib_mode
|
|
#include <$header>
|
|
int avoid_empty_translation_unit;
|
|
EOF
|
|
if $cc_cmd -fsyntax-only $lang_mode "$cih_test_c" 2>&1
|
|
then
|
|
includes=$($cc_cmd -fsyntax-only -H $lang_mode \
|
|
"$cih_test_c" 2>&1 | sed -ne 's/^[.][.]* //p')
|
|
for h in $includes; do
|
|
# Don't repeat work.
|
|
eval 'case "$h" in ('"$already"') continue;; esac'
|
|
|
|
if grep -qE "$obsolete_type_re" "$h"; then
|
|
echo "*** Obsolete types detected:"
|
|
grep -HE "$obsolete_type_re" "$h"
|
|
failed=1
|
|
fi
|
|
already="$already|$h"
|
|
done
|
|
else
|
|
failed=1
|
|
fi
|
|
done
|
|
done
|
|
done
|
|
exit $failed
|