📄 fixincludes
字号:
#! /bin/sh# Install modified versions of certain ANSI-incompatible system header files# which are fixed to work correctly with ANSI C# and placed in a directory that GNU C will search.# See README-fixinc for more information.# Directory where gcc sources (and sometimes special include files) live.# fixincludes doesn't use this, but fixinc.svr4 does, and I want to make# sure somebody doesn't try to use arg3 for something incompatible. -- gumbySRCDIR=${3-${SRCDIR-.}}# Directory containing the original header files.# (This was named INCLUDES, but that conflicts with a name in Makefile.in.)INPUT=${2-${INPUT-/usr/include}}# This prevents /bin/ex from failing if the current terminal type is# unrecognizable.TERM=unknownexport TERM# This prevents two problems:# Either ex might find a .exrc file and get confused,# or ex might complain if the EXINIT variable is invalid. # We know there is no .exrc in the GCC source.# `set' is a no-op ex command.EXINIT=setexport EXINIT# Define PWDCMD as a command to use to get the working dir# in the form that we want.PWDCMD=pwdcase "`pwd`" in//*) # On an Apollo, discard everything before `/usr'. PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'" ;;esac# Directory in which to store the results.LIB=${1?"fixincludes: output directory not specified"}# Make sure it exists.if [ ! -d $LIB ]; then mkdir $LIB || exit 1fi# Make LIB absolute.cd $LIB; LIB=`${PWDCMD}`# Fail if no arg to specify a directory for the output.if [ x$1 = x ]then echo fixincludes: no output directory specifiedexit 1fiecho Building fixed headers in ${LIB}# Determine whether this system has symbolic links.if ln -s X $LIB/ShouldNotExist 2>/dev/null; then rm -f $LIB/ShouldNotExist LINKS=trueelse LINKS=falsefiecho Finding directories and links to directoriescd ${INPUT}# Find all directories and all symlinks that point to directories.# Put the list in $files.# Each time we find a symlink, add it to newdirs# so that we do another find within the dir the link points to.# Note that $files may have duplicates in it;# later parts of this file are supposed to ignore them.dirs="."levels=2while [ -n "$dirs" ] && [ $levels -gt 0 ]do levels=`expr $levels - 1` newdirs= for d in $dirs do echo " Searching $INPUT/$d" if [ "$d" != . ] then d=$d/. fi # Find all directories under $d, relative to $d, excluding $d itself. files="$files `find $d -type d -print | \ sed -e '/\/\.$/d' -e '/^\.$/d'`" # Find all links to directories. # Using `-exec test -d' in find fails on some systems, # and trying to run test via sh fails on others, # so this is the simplest alternative left. # First find all the links, then test each one. theselinks= $LINKS && \ theselinks=`find $d -type l -print` for d1 in $theselinks --dummy-- do # If the link points to a directory, # add that dir to $newdirs if [ -d $d1 ] then newdirs="$newdirs $d1" fi done done files="$files $newdirs" dirs="$newdirs"donedirs=echo "All directories (including links to directories):"echo $filesfor file in $files; do rm -rf $LIB/$file if [ ! -d $LIB/$file ] then mkdir $LIB/$file fidonemkdir $LIB/root# treetops gets an alternating list# of old directories to copy# and the new directories to copy to.treetops="${INPUT} ${LIB}"if $LINKS; then echo 'Making symbolic directory links' for file in $files; do dest=`ls -ld $file | sed -n 's/.*-> //p'` if [ "$dest" ]; then cwd=`${PWDCMD}` # In case $dest is relative, get to $file's dir first. cd ${INPUT} cd `echo ./$file | sed -n 's&[^/]*$&&p'` # Check that the target directory exists. # Redirections changed to avoid bug in sh on Ultrix. (cd $dest) > /dev/null 2>&1 if [ $? = 0 ]; then cd $dest # X gets the dir that the link actually leads to. x=`${PWDCMD}` # If a link points to ., make a similar link to . if [ $x = $INPUT ]; then echo $file '->' . ': Making link' rm -fr ${LIB}/$file > /dev/null 2>&1 ln -s . ${LIB}/$file > /dev/null 2>&1 # If link leads back into ${INPUT}, # make a similar link here. elif expr $x : "${INPUT}/.*" > /dev/null; then # Y gets the actual target dir name, relative to ${INPUT}. y=`echo $x | sed -n "s&${INPUT}/&&p"` echo $file '->' $y ': Making link' rm -fr ${LIB}/$file > /dev/null 2>&1 ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1 else # If the link is to a dir $target outside ${INPUT}, # repoint the link at ${INPUT}/root$target # and process $target into ${INPUT}/root$target # treat this directory as if it actually contained the files. echo $file '->' root$x ': Making link' if [ -d $LIB/root$x ] then true else dirname=root$x/ dirmade=. cd $LIB while [ x$dirname != x ]; do component=`echo $dirname | sed -e 's|/.*$||'` mkdir $component >/dev/null 2>&1 cd $component dirmade=$dirmade/$component dirname=`echo $dirname | sed -e 's|[^/]*/||'` done fi rm -fr ${LIB}/$file > /dev/null 2>&1 ln -s ${LIB}/root$x ${LIB}/$file > /dev/null 2>&1 treetops="$treetops $x ${LIB}/root$x" fi fi cd $cwd fi donefiset - $treetopswhile [ $# != 0 ]; do # $1 is an old directory to copy, and $2 is the new directory to copy to. cd ${INPUT} cd $1# The same dir can appear more than once in treetops.# There's no need to scan it more than once. if [ -f $2/DONE ] then files= else touch $2/DONE echo Fixing directory $1 into $2# Check .h files which are symlinks as well as those which are files.# A link to a header file will not be processed by anything but this. if $LINKS; then files=`find . -name '*.h' \( -type f -o -type l \) -print` else files=`find . -name '*.h' -type f -print` fi echo Checking header files fi# Note that BSD43_* are used on recent MIPS systems. for file in $files; do# This call to egrep is essential, since checking a file with egrep# is much faster than actually trying to fix it.# It is also essential that most files *not* match!# Thus, matching every #endif is unacceptable.# But the argument to egrep must be kept small, or many versions of egrep# won't be able to handle it.# rms: I removed `|#[el].*if.*[^/ ]' because it made egrep fail. if egrep '//|[ _]_IO|CTRL|#define.NULL|#[el]*if.*([0-9]|sparc|vax|sun|pyr)' $file > /dev/null; then echo Fixing $file if [ -r $file ]; then cp $file $2/$file >/dev/null 2>&1 \ || echo "Can't copy $file" chmod +w $2/$file# Following two lines removed.# s%^\([ ]*#[ ]*endif[ ]*\)\([^/ ].*\)$%\1/* \2 */%# s%^\([ ]*#[ ]*else[ ]*\)\([^/ ].*\)$%\1/* \2 */% sed -e ' :loop /\\$/ N /\\$/ b loop /\/\// s|//\(.*\)$|/*\1*/| /[ ]_IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ /[ ]BSD43__IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ /#define._IO/ s/'\''x'\''/x/g /#define.BSD43__IO/ s/'\''x'\''/x/g /[^A-Z]CTRL[ ]*(/ s/\([^'\'']\))/'\''\1'\'')/ /#define.CTRL/ s/'\''c'\''/c/g /#define._CTRL/ s/'\''c'\''/c/g /#define.BSD43_CTRL/ s/'\''c'\''/c/g /#[a-z]*if.*[ (]m68k/ s/\([^_]\)m68k/\1__m68k__/g /#[a-z]*if.*[ (]__i386/ s/__i386/__i386__/g /#[a-z]*if.*[ (]i386/ s/\([^_]\)i386/\1__i386__/g /#[a-z]*if.*[ (]sparc/ s/\([^_]\)sparc/\1__sparc__/g /#[a-z]*if.*[ (]mc68000/ s/\([^_]\)mc68000/\1__mc68000__/g /#[a-z]*if.*[ (]vax/ s/\([^_]\)vax/\1__vax__/g /#[a-z]*if.*[ (]sun/ s/\([^_]\)\(sun[a-z0-9]*\)\([^a-z0-9_]\)/\1__\2__\3/g /#[a-z]*if.*[ (]sun/ s/\([^_]\)\(sun[a-z0-9]*\)$/\1__\2__/g /#[a-z]*if.*[ (]ns32000/ s/\([^_]\)ns32000/\1__ns32000__/g /#[a-z]*if.*[ (]pyr/ s/\([^_]\)pyr/\1__pyr__/g /#[a-z]*if.*[ (]is68k/ s/\([^_]\)is68k/\1__is68k__/g /^#define.NULL[ ]/ i\ #undef NULL ' $2/$file > $2/$file.sed mv $2/$file.sed $2/$file if cmp $file $2/$file >/dev/null 2>&1; then echo Deleting $2/$file\; no fixes were needed. rm $2/$file fi fi fi done shift; shiftdonecd ${INPUT}# Fix one other error in this file: a mismatched quote not inside a C comment.file=sundev/vuid_event.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then mkdir ${LIB}/sundev 2>/dev/null cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file comment ex ${LIB}/$file <<EOF g/doesn't/s/doesn't/does not/ wqEOF if cmp $file ${LIB}/$file >/dev/null 2>&1; then echo Deleting ${LIB}/$file\; no fixes were needed. rm ${LIB}/$file fifi# Fix this Sun file to avoid interfering with stddef.h.file=sys/stdtypes.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file ex ${LIB}/$file <<EOF /size_t.*;/ i#ifndef _GCC_SIZE_T#define _GCC_SIZE_T. /size_t/+1 i#endif. /ptrdiff_t.*;/ i#ifndef _GCC_PTRDIFF_T#define _GCC_PTRDIFF_T. /ptrdiff_t/+1 i#endif. /wchar_t.*;/ i#ifndef _GCC_WCHAR_T#define _GCC_WCHAR_T. /wchar_t/+1 i#endif. wqEOF if cmp $file ${LIB}/$file >/dev/null 2>&1; then echo Deleting ${LIB}/$file\; no fixes were needed. rm ${LIB}/$file fifi# Fix this file to avoid interfering with stddef.h, but don't mistakenly# match e.g. ssize_t present in AIX for the ps/2.file=sys/types.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file ex ${LIB}/$file <<EOF /typedef.*[ ]size_t.*;/ i#ifndef _GCC_SIZE_T#define _GCC_SIZE_T. /size_t/+1 i#endif. wqEOF if cmp $file ${LIB}/$file >/dev/null 2>&1; then echo Deleting ${LIB}/$file\; no fixes were needed. rm ${LIB}/$file fifi# Fix an error in this file: the #if says _cplusplus, not the double# underscore __cplusplus that it should befile=tinfo.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then mkdir ${LIB}/rpcsvc 2>/dev/null cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file, __cplusplus macro sed -e 's/[ ]_cplusplus/ __cplusplus/' ${LIB}/$file > ${LIB}/${file}.sed rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file if cmp $file ${LIB}/$file >/dev/null 2>&1; then rm ${LIB}/$file fifi# Fix an error in this file: a missing semi-colon at the end of the statsswtch# structure definition.file=rpcsvc/rstat.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then mkdir ${LIB}/rpcsvc 2>/dev/null cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file, definition of statsswtch ex ${LIB}/$file <<EOF g/boottime$/s//&;/ wqEOF if cmp $file ${LIB}/$file >/dev/null 2>&1; then echo Deleting ${LIB}/$file\; no fixes were needed. rm ${LIB}/$file fifi# Fix an error in this file: a missing semi-colon at the end of the nodeent# structure definition.file=netdnet/dnetdb.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then mkdir ${LIB}/netdnet 2>/dev/null cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file, definition of nodeent ex ${LIB}/$file <<EOF g/char.*na_addr *$/s//&;/ wqEOF if cmp $file ${LIB}/$file >/dev/null 2>&1; then echo Deleting ${LIB}/$file\; no fixes were needed. rm ${LIB}/$file fifi# Check for bad #ifdef line (in Ultrix 4.1)file=sys/file.hif [ -r $file ] && [ ! -r ${LIB}/$file ]; then cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file" chmod +w ${LIB}/$file 2>/dev/nullfiif [ -r ${LIB}/$file ]; then echo Fixing $file, bad \#ifdef line ex ${LIB}/$file <<EOF g/^#ifdef KERNEL && !defined/ s/#ifdef KERNEL && !defined/#if defined(KERNEL) \&\& !defined/ wqEOF if cmp $file ${LIB}/$file >/dev/null 2>&1; then echo Deleting ${LIB}/$file\; no fixes were needed. rm ${LIB}/$file fifi# Remove nested comments created by #endifs in a comment (Ultrix 4.1)# Only needed if commenting out junk after #endif.#file=signal.h#if [ -r $file ] && [ ! -r ${LIB}/$file ]; then# cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"# chmod +w ${LIB}/$file 2>/dev/null#fi##if [ -r ${LIB}/$file ]; then# echo Fixing $file, nested comments
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -