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