Blame scripts/check-installed-headers.sh

Packit Service 82fcde
#! /bin/sh
Packit Service 82fcde
# Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit Service 82fcde
# This file is part of the GNU C Library.
Packit Service 82fcde
#
Packit Service 82fcde
# The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
# modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
# License as published by the Free Software Foundation; either
Packit Service 82fcde
# version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
#
Packit Service 82fcde
# The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
# Lesser General Public License for more details.
Packit Service 82fcde
#
Packit Service 82fcde
# You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
# License along with the GNU C Library; if not, see
Packit Service 82fcde
# <http://www.gnu.org/licenses/>.
Packit Service 82fcde
Packit Service 82fcde
# Check installed headers for cleanliness.  For each header, confirm
Packit Service 82fcde
# that it's possible to compile a file that includes that header and
Packit Service 82fcde
# does nothing else, in several different compilation modes.  Also,
Packit Service 82fcde
# scan the header for a set of obsolete typedefs that should no longer
Packit Service 82fcde
# appear.
Packit Service 82fcde
Packit Service 82fcde
# These compilation switches assume GCC or compatible, which is probably
Packit Service 82fcde
# fine since we also assume that when _building_ glibc.
Packit Service 82fcde
c_modes="-std=c89 -std=gnu89 -std=c11 -std=gnu11"
Packit Service 82fcde
cxx_modes="-std=c++98 -std=gnu++98 -std=c++11 -std=gnu++11"
Packit Service 82fcde
Packit Service 82fcde
# An exhaustive test of feature selection macros would take far too long.
Packit Service 82fcde
# These are probably the most commonly used three.
Packit Service 82fcde
lib_modes="-D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1 -D_XOPEN_SOURCE=700"
Packit Service 82fcde
Packit Service 82fcde
# sys/types.h+bits/types.h have to define the obsolete types.
Packit Service 82fcde
# rpc(svc)/* have the obsolete types too deeply embedded in their API
Packit Service 82fcde
# to remove.
Packit Service 82fcde
skip_obsolete_type_check='*/sys/types.h|*/bits/types.h|*/rpc/*|*/rpcsvc/*'
Packit Service 82fcde
obsolete_type_re=\
Packit Service 82fcde
'\<((__)?(quad_t|u(short|int|long|_(char|short|int([0-9]+_t)?|long|quad_t))))\>'
Packit Service 82fcde
Packit Service 82fcde
if [ $# -lt 3 ]; then
Packit Service 82fcde
    echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
Packit Service 82fcde
    exit 2
Packit Service 82fcde
fi
Packit Service 82fcde
case "$1" in
Packit Service 82fcde
    (c)
Packit Service 82fcde
        lang_modes="$c_modes"
Packit Service 82fcde
        cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.c)
Packit Service 82fcde
        already="$skip_obsolete_type_check"
Packit Service 82fcde
    ;;
Packit Service 82fcde
    (c++)
Packit Service 82fcde
        lang_modes="$cxx_modes"
Packit Service 82fcde
        cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.cc)
Packit Service 82fcde
        # The obsolete-type check can be skipped for C++; it is
Packit Service 82fcde
        # sufficient to do it for C.
Packit Service 82fcde
        already="*"
Packit Service 82fcde
    ;;
Packit Service 82fcde
    (*)
Packit Service 82fcde
        echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
Packit Service 82fcde
        exit 2;;
Packit Service 82fcde
esac
Packit Service 82fcde
shift
Packit Service 82fcde
cc_cmd="$1"
Packit Service 82fcde
shift
Packit Service 82fcde
trap "rm -f '$cih_test_c'" 0
Packit Service 82fcde
Packit Service 82fcde
failed=0
Packit Service 82fcde
is_x86_64=unknown
Packit Service 82fcde
is_x32=unknown
Packit Service 82fcde
for header in "$@"; do
Packit Service 82fcde
    # Skip various headers for which this test gets a false failure.
Packit Service 82fcde
    case "$header" in
Packit Service 82fcde
        # bits/* are not meant to be included directly and usually #error
Packit Service 82fcde
        # out if you try it.
Packit Service 82fcde
        # regexp.h is a stub containing only an #error.
Packit Service 82fcde
        # Sun RPC's .x files are traditionally installed in
Packit Service 82fcde
        # $prefix/include/rpcsvc, but they are not C header files.
Packit Service 82fcde
        (bits/* | regexp.h | rpcsvc/*.x)
Packit Service 82fcde
            continue;;
Packit Service 82fcde
Packit Service 82fcde
        # All extant versions of sys/elf.h contain nothing more than an
Packit Service 82fcde
        # exhortation (either a #warning or an #error) to use sys/procfs.h
Packit Service 82fcde
        # instead, plus an inclusion of that header.
Packit Service 82fcde
        (sys/elf.h)
Packit Service 82fcde
            continue;;
Packit Service 82fcde
Packit Service d4d909
        # Skip Fortran headers.
Packit Service d4d909
        (finclude/*)
Packit Service d4d909
            continue;;
Packit Service d4d909
Packit Service 82fcde
	# sys/sysctl.h is unsupported for x32.
Packit Service 82fcde
	(sys/sysctl.h)
Packit Service 82fcde
            case "$is_x32" in
Packit Service 82fcde
                (yes) continue;;
Packit Service 82fcde
                (no)  ;;
Packit Service 82fcde
                (unknown)
Packit Service 82fcde
                    cat >"$cih_test_c" <
Packit Service 82fcde
#if defined __x86_64__ && defined __ILP32__
Packit Service 82fcde
# error "is x32"
Packit Service 82fcde
#endif
Packit Service 82fcde
EOF
Packit Service 82fcde
                    if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
Packit Service 82fcde
                    then
Packit Service 82fcde
                        is_x32=no
Packit Service 82fcde
                    else
Packit Service 82fcde
                        is_x32=yes
Packit Service 82fcde
                        continue
Packit Service 82fcde
                    fi
Packit Service 82fcde
                ;;
Packit Service 82fcde
            esac
Packit Service 82fcde
	    ;;
Packit Service 82fcde
Packit Service 82fcde
        # sys/vm86.h is "unsupported on x86-64" and errors out on that target.
Packit Service 82fcde
        (sys/vm86.h)
Packit Service 82fcde
            case "$is_x86_64" in
Packit Service 82fcde
                (yes) continue;;
Packit Service 82fcde
                (no)  ;;
Packit Service 82fcde
                (unknown)
Packit Service 82fcde
                    cat >"$cih_test_c" <
Packit Service 82fcde
#if defined __x86_64__ && __x86_64__
Packit Service 82fcde
#error "is x86-64"
Packit Service 82fcde
#endif
Packit Service 82fcde
EOF
Packit Service 82fcde
                    if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
Packit Service 82fcde
                    then
Packit Service 82fcde
                        is_x86_64=no
Packit Service 82fcde
                    else
Packit Service 82fcde
                        is_x86_64=yes
Packit Service 82fcde
                        continue
Packit Service 82fcde
                    fi
Packit Service 82fcde
                ;;
Packit Service 82fcde
            esac
Packit Service 82fcde
            ;;
Packit Service 82fcde
    esac
Packit Service 82fcde
Packit Service 82fcde
    echo :: "$header"
Packit Service 82fcde
    for lang_mode in "" $lang_modes; do
Packit Service 82fcde
        for lib_mode in "" $lib_modes; do
Packit Service 82fcde
            echo :::: $lang_mode $lib_mode
Packit Service 82fcde
            if [ -z "$lib_mode" ]; then
Packit Service 82fcde
                expanded_lib_mode='/* default library mode */'
Packit Service 82fcde
            else
Packit Service 82fcde
                expanded_lib_mode=$(echo : $lib_mode | \
Packit Service 82fcde
                    sed 's/^: -D/#define /; s/=/ /')
Packit Service 82fcde
            fi
Packit Service 82fcde
            cat >"$cih_test_c" <
Packit Service 82fcde
/* These macros may have been defined on the command line.  They are
Packit Service 82fcde
   inappropriate for this test.  */
Packit Service 82fcde
#undef _LIBC
Packit Service 82fcde
#undef _GNU_SOURCE
Packit Service 82fcde
/* The library mode is selected here rather than on the command line to
Packit Service 82fcde
   ensure that this selection wins. */
Packit Service 82fcde
$expanded_lib_mode
Packit Service 82fcde
#include <$header>
Packit Service 82fcde
int avoid_empty_translation_unit;
Packit Service 82fcde
EOF
Packit Service 82fcde
            if $cc_cmd -fsyntax-only $lang_mode "$cih_test_c" 2>&1
Packit Service 82fcde
            then
Packit Service 82fcde
                includes=$($cc_cmd -fsyntax-only -H $lang_mode \
Packit Service 82fcde
                              "$cih_test_c" 2>&1 | sed -ne 's/^[.][.]* //p')
Packit Service 82fcde
                for h in $includes; do
Packit Service 82fcde
                    # Don't repeat work.
Packit Service 82fcde
                    eval 'case "$h" in ('"$already"') continue;; esac'
Packit Service 82fcde
Packit Service 82fcde
                    if grep -qE "$obsolete_type_re" "$h"; then
Packit Service 82fcde
                        echo "*** Obsolete types detected:"
Packit Service 82fcde
                        grep -HE "$obsolete_type_re" "$h"
Packit Service 82fcde
                        failed=1
Packit Service 82fcde
                    fi
Packit Service 82fcde
                    already="$already|$h"
Packit Service 82fcde
                done
Packit Service 82fcde
            else
Packit Service 82fcde
                failed=1
Packit Service 82fcde
            fi
Packit Service 82fcde
        done
Packit Service 82fcde
    done
Packit Service 82fcde
done
Packit Service 82fcde
exit $failed