| #!/bin/sh |
| # |
| # modified for dgux by hassey@dg-rtp.dg.com based on |
| # |
| # fixinc.svr4 written by Ron Guilmette (rfg@ncd.com). |
| # |
| # This file is part of GNU CC. |
| # |
| # GNU CC is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 2, or (at your option) |
| # any later version. |
| # |
| # GNU CC is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with GNU CC; see the file COPYING. If not, write to |
| # the Free Software Foundation, 59 Temple Place - Suite 330, |
| # Boston, MA 02111-1307, USA. |
| # |
| # |
| # See README-fixinc for more information. |
| |
| # Directory containing the original header files. |
| INPUT=${2-${INPUT-/usr/include}} |
| |
| # Fail if no arg to specify a directory for the output. |
| if [ x$1 = x ] |
| then echo fixincludes: no output directory specified |
| exit 1 |
| fi |
| |
| # 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 1 |
| fi |
| |
| ORIG_DIR=`pwd` |
| |
| # Make LIB absolute if it is relative. |
| # Don't do this if not necessary, since may screw up automounters. |
| case $LIB in |
| /*) |
| ;; |
| *) |
| cd $LIB; LIB=`${PWDCMD-pwd}` |
| ;; |
| esac |
| |
| echo 'Building fixincludes in ' ${LIB} |
| |
| # Determine whether this filesystem has symbolic links. |
| if ln -s X $LIB/ShouldNotExist 2>/dev/null; then |
| rm -f $LIB/ShouldNotExist |
| LINKS=true |
| else |
| LINKS=false |
| fi |
| |
| echo 'Making directories:' |
| cd ${INPUT} |
| if $LINKS; then |
| files=`ls -LR | sed -n s/:$//p` |
| else |
| files=`find . -type d -print | sed '/^.$/d'` |
| fi |
| for file in $files; do |
| rm -rf $LIB/$file |
| if [ ! -d $LIB/$file ] |
| then mkdir $LIB/$file |
| fi |
| done |
| |
| # 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 internal symbolic directory links' |
| for file in $files; do |
| dest=`ls -ld $file | sed -n 's/.*-> //p'` |
| if [ "$dest" ]; then |
| cwd=`pwd` |
| # 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=`pwd` |
| # If link leads back into ${INPUT}, |
| # make a similar link here. |
| if expr $x : "${INPUT}/.*" > /dev/null; then |
| # Y gets the actual target dir name, relative to ${INPUT}. |
| y=`echo $x | sed -n "s&${INPUT}/&&p"` |
| # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}. |
| dots=`echo "$file" | |
| sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'` |
| echo $file '->' $dots$y ': Making link' |
| rm -fr ${LIB}/$file > /dev/null 2>&1 |
| ln -s $dots$y ${LIB}/$file > /dev/null 2>&1 |
| else |
| # If the link is to outside ${INPUT}, |
| # treat this directory as if it actually contained the files. |
| # This line used to have $dest instead of $x. |
| # $dest seemed to be wrong for links found in subdirectories |
| # of ${INPUT}. Does this change break anything? |
| treetops="$treetops $x ${LIB}/$file" |
| fi |
| fi |
| cd $cwd |
| fi |
| done |
| fi |
| |
| # Completely replace <_int_varargs.h> with a file that defines |
| # va_list and gnuc_va_list |
| |
| file=_int_varargs.h |
| if [ -r ${INPUT}/$file ]; then |
| echo Replacing $file |
| cat > ${LIB}/$file << EOF |
| /* This file was generated by fixinc.dgux. */ |
| #ifndef __INT_VARARGS_H |
| #define __INT_VARARGS_H |
| |
| #if defined(__m88k__) && defined (__DGUX__) |
| #ifndef __GNUC_VA_LIST |
| #define __GNUC_VA_LIST |
| typedef struct |
| { |
| int __va_arg; /* argument number */ |
| int *__va_stk; /* start of args passed on stack */ |
| int *__va_reg; /* start of args passed in regs */ |
| } __gnuc_va_list; |
| #endif /* not __GNUC_VA_LIST */ |
| #endif /* 88k && dgux */ |
| |
| #ifndef _VA_LIST_ |
| #define _VA_LIST_ |
| typedef __gnuc_va_list va_list; |
| #endif /* _VA_LIST_ */ |
| |
| #endif /* __INT_VARARGS_H */ |
| |
| EOF |
| chmod a+r ${LIB}/$file |
| fi |
| |
| echo 'Removing unneeded directories:' |
| cd $LIB |
| files=`find . -type d -print | sort -r` |
| for file in $files; do |
| rmdir $LIB/$file > /dev/null 2>&1 |
| done |
| |
| if $LINKS; then |
| echo 'Making internal symbolic non-directory links' |
| cd ${INPUT} |
| files=`find . -type l -print` |
| for file in $files; do |
| dest=`ls -ld $file | sed -n 's/.*-> //p'` |
| if expr "$dest" : '[^/].*' > /dev/null; then |
| target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"` |
| if [ -f $target ]; then |
| ln -s $dest ${LIB}/$file >/dev/null 2>&1 |
| fi |
| fi |
| done |
| fi |
| |
| cd ${ORIG_DIR} |
| |
| exit 0 |
| |