]> git.ipfire.org Git - thirdparty/glibc.git/blob - scripts/check-installed-headers.sh
1f4496446c74b3cf74e37aba9ec3f833a91e1e0b
[thirdparty/glibc.git] / scripts / check-installed-headers.sh
1 #! /bin/sh
2 # Copyright (C) 2016-2019 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 # <http://www.gnu.org/licenses/>.
18
19 # Check installed headers for cleanliness. For each header, confirm
20 # that it's possible to compile a file that includes that header and
21 # does nothing else, in several different compilation modes. Also,
22 # scan the header for a set of obsolete typedefs that should no longer
23 # appear.
24
25 # These compilation switches assume GCC or compatible, which is probably
26 # fine since we also assume that when _building_ glibc.
27 c_modes="-std=c89 -std=gnu89 -std=c11 -std=gnu11"
28 cxx_modes="-std=c++98 -std=gnu++98 -std=c++11 -std=gnu++11"
29
30 # An exhaustive test of feature selection macros would take far too long.
31 # These are probably the most commonly used three.
32 lib_modes="-D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1 -D_XOPEN_SOURCE=700"
33
34 # sys/types.h+bits/types.h have to define the obsolete types.
35 # rpc(svc)/* have the obsolete types too deeply embedded in their API
36 # to remove.
37 skip_obsolete_type_check='*/sys/types.h|*/bits/types.h|*/rpc/*|*/rpcsvc/*'
38 obsolete_type_re=\
39 '\<((__)?(quad_t|u(short|int|long|_(char|short|int([0-9]+_t)?|long|quad_t))))\>'
40
41 if [ $# -lt 3 ]; then
42 echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
43 exit 2
44 fi
45 case "$1" in
46 (c)
47 lang_modes="$c_modes"
48 cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.c)
49 already="$skip_obsolete_type_check"
50 ;;
51 (c++)
52 lang_modes="$cxx_modes"
53 cih_test_c=$(mktemp ${TMPDIR-/tmp}/cih_test_XXXXXX.cc)
54 # The obsolete-type check can be skipped for C++; it is
55 # sufficient to do it for C.
56 already="*"
57 ;;
58 (*)
59 echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
60 exit 2;;
61 esac
62 shift
63 cc_cmd="$1"
64 shift
65 trap "rm -f '$cih_test_c'" 0
66
67 failed=0
68 is_x86_64=unknown
69 is_x32=unknown
70 for header in "$@"; do
71 # Skip various headers for which this test gets a false failure.
72 case "$header" in
73 # bits/* are not meant to be included directly and usually #error
74 # out if you try it.
75 # regexp.h is a stub containing only an #error.
76 # Sun RPC's .x files are traditionally installed in
77 # $prefix/include/rpcsvc, but they are not C header files.
78 (bits/* | regexp.h | rpcsvc/*.x)
79 continue;;
80
81 # All extant versions of sys/elf.h contain nothing more than an
82 # exhortation (either a #warning or an #error) to use sys/procfs.h
83 # instead, plus an inclusion of that header.
84 (sys/elf.h)
85 continue;;
86
87 # Skip Fortran headers.
88 (finclude/*)
89 continue;;
90
91 # sys/sysctl.h is unsupported for x32.
92 (sys/sysctl.h)
93 case "$is_x32" in
94 (yes) continue;;
95 (no) ;;
96 (unknown)
97 cat >"$cih_test_c" <<EOF
98 #if defined __x86_64__ && defined __ILP32__
99 # error "is x32"
100 #endif
101 EOF
102 if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
103 then
104 is_x32=no
105 else
106 is_x32=yes
107 continue
108 fi
109 ;;
110 esac
111 ;;
112
113 # sys/vm86.h is "unsupported on x86-64" and errors out on that target.
114 (sys/vm86.h)
115 case "$is_x86_64" in
116 (yes) continue;;
117 (no) ;;
118 (unknown)
119 cat >"$cih_test_c" <<EOF
120 #if defined __x86_64__ && __x86_64__
121 #error "is x86-64"
122 #endif
123 EOF
124 if $cc_cmd -fsyntax-only "$cih_test_c" > /dev/null 2>&1
125 then
126 is_x86_64=no
127 else
128 is_x86_64=yes
129 continue
130 fi
131 ;;
132 esac
133 ;;
134 esac
135
136 echo :: "$header"
137 for lang_mode in "" $lang_modes; do
138 for lib_mode in "" $lib_modes; do
139 echo :::: $lang_mode $lib_mode
140 if [ -z "$lib_mode" ]; then
141 expanded_lib_mode='/* default library mode */'
142 else
143 expanded_lib_mode=$(echo : $lib_mode | \
144 sed 's/^: -D/#define /; s/=/ /')
145 fi
146 cat >"$cih_test_c" <<EOF
147 /* These macros may have been defined on the command line. They are
148 inappropriate for this test. */
149 #undef _LIBC
150 #undef _GNU_SOURCE
151 /* The library mode is selected here rather than on the command line to
152 ensure that this selection wins. */
153 $expanded_lib_mode
154 #include <$header>
155 int avoid_empty_translation_unit;
156 EOF
157 if $cc_cmd -fsyntax-only $lang_mode "$cih_test_c" 2>&1
158 then
159 includes=$($cc_cmd -fsyntax-only -H $lang_mode \
160 "$cih_test_c" 2>&1 | sed -ne 's/^[.][.]* //p')
161 for h in $includes; do
162 # Don't repeat work.
163 eval 'case "$h" in ('"$already"') continue;; esac'
164
165 if grep -qE "$obsolete_type_re" "$h"; then
166 echo "*** Obsolete types detected:"
167 grep -HE "$obsolete_type_re" "$h"
168 failed=1
169 fi
170 already="$already|$h"
171 done
172 else
173 failed=1
174 fi
175 done
176 done
177 done
178 exit $failed