1# 2# CDDL HEADER START 3# 4# The contents of this file are subject to the terms of the 5# Common Development and Distribution License (the "License"). 6# You may not use this file except in compliance with the License. 7# 8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9# or http://www.opensolaris.org/os/licensing. 10# See the License for the specific language governing permissions 11# and limitations under the License. 12# 13# When distributing Covered Code, include this CDDL HEADER in each 14# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15# If applicable, add the following below this CDDL HEADER, with the 16# fields enclosed by brackets "[]" replaced with your own identifying 17# information: Portions Copyright [yyyy] [name of copyright owner] 18# 19# CDDL HEADER END 20# 21 22# 23# Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24# Use is subject to license terms. 25# 26 27if [ $# != 1 ]; then 28 echo expected one argument: '<'dtrace-path'>' 29 exit 2 30fi 31 32dtrace=$1 33CC=`which gcc` 34CFLAGS= 35 36doit() 37{ 38 file=$1 39 ofile=$2 40 errfile=$3 41 cfile=${TMPDIR:-/tmp}/inc.$$.$file.c 42 cofile=${TMPDIR:-/tmp}/inc.$$.$file 43 cat > $cfile <<EOF 44#include <sys/$file> 45void 46main() 47{} 48EOF 49 if $CC $CFLAGS -o $cofile $cfile >/dev/null 2>&1; then 50 $dtrace -xerrtags -C -s /dev/stdin \ 51 >/dev/null 2>$errfile <<EOF 52#include <sys/$file> 53BEGIN 54{ 55 exit(0); 56} 57EOF 58 if [ $? -ne 0 ]; then 59 echo $inc failed: `cat $errfile | head -1` > $ofile 60 else 61 echo $inc succeeded > $ofile 62 fi 63 rm -f $errfile 64 fi 65 66 rm -f $cofile $cfile 2>/dev/null 67} 68 69if [ ! -x $CC ]; then 70 echo "$0: bad compiler: $CC" >& 2 71 exit 1 72fi 73 74concurrency=`psrinfo | wc -l` 75let concurrency=concurrency*4 76let i=0 77 78files=/usr/include/sys/*.h 79 80# 81# There are a few files in /usr/include/sys that are known to be bad -- usually 82# because they include static globals (!) or function bodies (!!) in the header 83# file. Hopefully these remain sufficiently few that the O(#files * #badfiles) 84# algorithm, below, doesn't become a problem. (And yes, writing scripts in 85# something other than ksh would probably be a good idea.) If this script 86# becomes a problem, kindly fix it by reducing the number of bad files! (That 87# is, fix it by fixing the broken file, not the broken script.) 88# 89badfiles="\ 90 bootconf.h \ 91 bootstat.h \ 92 ctype.h \ 93 dtrace.h \ 94 dumphdr.h \ 95 exacct_impl.h \ 96 fasttrap.h \ 97 hook_event.h \ 98 iscsi_authclient.h \ 99 kiconv_ja.h \ 100 kiconv_ja_jis_to_unicode.h \ 101 kiconv_ja_unicode_to_jis.h \ 102 kobj.h \ 103 kobj_impl.h \ 104 ksyms.h \ 105 lockstat.h \ 106 neti.h \ 107 rds.h \ 108 ser_sync.h \ 109 smbios_impl.h \ 110 smedia.h \ 111 sockfilter.h \ 112 stat.h \ 113 u8_textprep_data.h \ 114 utsname.h \ 115 vnic.h" 116 117for inc in $files; do 118 file=`basename $inc` 119 for bad in $badfiles; do 120 if [ "$file" = "$bad" ]; then 121 continue 2 122 fi 123 done 124 125 ofile=${TMPDIR:-/tmp}/inc.$file.$$.out 126 errfile=${TMPDIR:-/tmp}/inc.$file.$$.err 127 doit $file $ofile $errfile & 128 let i=i+1 129 130 if [ $i -eq $concurrency ]; then 131 # 132 # This isn't optimal -- it creates a highly fluctuating load 133 # as we wait for all work to complete -- but it's an easy 134 # way of parallelizing work. 135 # 136 wait 137 let i=0 138 fi 139done 140 141wait 142 143bigofile=${TMPDIR:-/tmp}/inc.$$.out 144 145for inc in $files; do 146 file=`basename $inc` 147 ofile=${TMPDIR:-/tmp}/inc.$file.$$.out 148 149 if [ -f $ofile ]; then 150 cat $ofile >> $bigofile 151 rm $ofile 152 fi 153done 154 155status=$(grep "failed:" $bigofile | wc -l) 156cat $bigofile 157rm -f $bigofile 158exit $status 159