1#! /bin/sh
2# Copyright (C) 2016-2022 Free Software Foundation, Inc.
3# This file is part of the GNU C Library.
4#
5# The GNU C Library is free software; you can redistribute it and/or
6# modify it under the terms of the GNU Lesser General Public
7# License as published by the Free Software Foundation; either
8# version 2.1 of the License, or (at your option) any later version.
9#
10# The GNU C Library is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13# Lesser General Public License for more details.
14#
15# You should have received a copy of the GNU Lesser General Public
16# License along with the GNU C Library; if not, see
17# <https://www.gnu.org/licenses/>.
18
19# For each installed header, confirm that it's possible to compile a
20# file that includes that header and does nothing else, in several
21# different compilation modes.
22
23# These compilation switches assume GCC or compatible, which is probably
24# fine since we also assume that when _building_ glibc.
25c_modes="-std=c89 -std=gnu89 -std=c11 -std=gnu11"
26cxx_modes="-std=c++98 -std=gnu++98 -std=c++11 -std=gnu++11"
27
28# An exhaustive test of feature selection macros would take far too long.
29# These are probably the most commonly used three.
30lib_modes="-D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1 -D_XOPEN_SOURCE=700"
31
32if [ $# -lt 3 ]; then
33    echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
34    exit 2
35fi
36case "$1" in
37    (c)
38        lang_modes="$c_modes"
39        cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.c)
40    ;;
41    (c++)
42        lang_modes="$cxx_modes"
43        cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.cc)
44    ;;
45    (*)
46        echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
47        exit 2;;
48esac
49shift
50cc_cmd="$1"
51shift
52trap "rm -f '$cih_test_c'" 0
53
54failed=0
55is_x86_64=unknown
56for header in "$@"; do
57    # Skip various headers for which this test gets a false failure.
58    case "$header" in
59        # bits/* are not meant to be included directly and usually #error
60        # out if you try it.
61        # regexp.h is a stub containing only an #error.
62        # Sun RPC's .x files are traditionally installed in
63        # $prefix/include/rpcsvc, but they are not C header files.
64        (bits/* | regexp.h | rpcsvc/*.x)
65            continue;;
66
67        # All extant versions of sys/elf.h contain nothing more than an
68        # exhortation (either a #warning or an #error) to use sys/procfs.h
69        # instead, plus an inclusion of that header.
70        (sys/elf.h)
71            continue;;
72
73        # Skip Fortran headers.
74        (finclude/*)
75            continue;;
76
77        # sys/vm86.h is "unsupported on x86-64" and errors out on that target.
78        (sys/vm86.h)
79            case "$is_x86_64" in
80                (yes) continue;;
81                (no)  ;;
82                (unknown)
83                    cat >"$cih_test_c" <<EOF
84#if defined __x86_64__ && __x86_64__
85#error "is x86-64"
86#endif
87EOF
88                    if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
89                    then
90                        is_x86_64=no
91                    else
92                        is_x86_64=yes
93                        continue
94                    fi
95                ;;
96            esac
97            ;;
98    esac
99
100    echo :: "$header"
101    for lang_mode in "" $lang_modes; do
102        for lib_mode in "" $lib_modes; do
103            echo :::: $lang_mode $lib_mode
104            if [ -z "$lib_mode" ]; then
105                expanded_lib_mode='/* default library mode */'
106            else
107                expanded_lib_mode=$(echo : $lib_mode | \
108                    sed 's/^: -D/#define /; s/=/ /')
109            fi
110            cat >"$cih_test_c" <<EOF
111/* These macros may have been defined on the command line.  They are
112   inappropriate for this test.  */
113#undef _LIBC
114#undef _GNU_SOURCE
115/* The library mode is selected here rather than on the command line to
116   ensure that this selection wins. */
117$expanded_lib_mode
118#include <$header>
119int avoid_empty_translation_unit;
120EOF
121            if $cc_cmd -finput-charset=ascii -fsyntax-only $lang_mode \
122		       "$cih_test_c" 2>&1
123            then :
124            else failed=1
125            fi
126        done
127    done
128done
129exit $failed
130