1 | #!/bin/sh |
---|
2 | # |
---|
3 | # modified for dgux by hassey@dg-rtp.dg.com based on |
---|
4 | # |
---|
5 | # fixinc.svr4 written by Ron Guilmette (rfg@ncd.com). |
---|
6 | # |
---|
7 | # This file is part of GNU CC. |
---|
8 | # |
---|
9 | # GNU CC is free software; you can redistribute it and/or modify |
---|
10 | # it under the terms of the GNU General Public License as published by |
---|
11 | # the Free Software Foundation; either version 2, or (at your option) |
---|
12 | # any later version. |
---|
13 | # |
---|
14 | # GNU CC is distributed in the hope that it will be useful, |
---|
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
17 | # GNU General Public License for more details. |
---|
18 | # |
---|
19 | # You should have received a copy of the GNU General Public License |
---|
20 | # along with GNU CC; see the file COPYING. If not, write to |
---|
21 | # the Free Software Foundation, 59 Temple Place - Suite 330, |
---|
22 | # Boston, MA 02111-1307, USA. |
---|
23 | # |
---|
24 | # |
---|
25 | # See README-fixinc for more information. |
---|
26 | |
---|
27 | # Directory containing the original header files. |
---|
28 | INPUT=${2-${INPUT-/usr/include}} |
---|
29 | |
---|
30 | # Fail if no arg to specify a directory for the output. |
---|
31 | if [ x$1 = x ] |
---|
32 | then echo fixincludes: no output directory specified |
---|
33 | exit 1 |
---|
34 | fi |
---|
35 | |
---|
36 | # Directory in which to store the results. |
---|
37 | LIB=${1?"fixincludes: output directory not specified"} |
---|
38 | |
---|
39 | # Make sure it exists. |
---|
40 | if [ ! -d $LIB ]; then |
---|
41 | mkdir $LIB || exit 1 |
---|
42 | fi |
---|
43 | |
---|
44 | ORIG_DIR=`pwd` |
---|
45 | |
---|
46 | # Make LIB absolute if it is relative. |
---|
47 | # Don't do this if not necessary, since may screw up automounters. |
---|
48 | case $LIB in |
---|
49 | /*) |
---|
50 | ;; |
---|
51 | *) |
---|
52 | cd $LIB; LIB=`${PWDCMD-pwd}` |
---|
53 | ;; |
---|
54 | esac |
---|
55 | |
---|
56 | echo 'Building fixincludes in ' ${LIB} |
---|
57 | |
---|
58 | # Determine whether this filesystem has symbolic links. |
---|
59 | if ln -s X $LIB/ShouldNotExist 2>/dev/null; then |
---|
60 | rm -f $LIB/ShouldNotExist |
---|
61 | LINKS=true |
---|
62 | else |
---|
63 | LINKS=false |
---|
64 | fi |
---|
65 | |
---|
66 | echo 'Making directories:' |
---|
67 | cd ${INPUT} |
---|
68 | if $LINKS; then |
---|
69 | files=`ls -LR | sed -n s/:$//p` |
---|
70 | else |
---|
71 | files=`find . -type d -print | sed '/^.$/d'` |
---|
72 | fi |
---|
73 | for file in $files; do |
---|
74 | rm -rf $LIB/$file |
---|
75 | if [ ! -d $LIB/$file ] |
---|
76 | then mkdir $LIB/$file |
---|
77 | fi |
---|
78 | done |
---|
79 | |
---|
80 | # treetops gets an alternating list |
---|
81 | # of old directories to copy |
---|
82 | # and the new directories to copy to. |
---|
83 | treetops="${INPUT} ${LIB}" |
---|
84 | |
---|
85 | if $LINKS; then |
---|
86 | echo 'Making internal symbolic directory links' |
---|
87 | for file in $files; do |
---|
88 | dest=`ls -ld $file | sed -n 's/.*-> //p'` |
---|
89 | if [ "$dest" ]; then |
---|
90 | cwd=`pwd` |
---|
91 | # In case $dest is relative, get to $file's dir first. |
---|
92 | cd ${INPUT} |
---|
93 | cd `echo ./$file | sed -n 's&[^/]*$&&p'` |
---|
94 | # Check that the target directory exists. |
---|
95 | # Redirections changed to avoid bug in sh on Ultrix. |
---|
96 | (cd $dest) > /dev/null 2>&1 |
---|
97 | if [ $? = 0 ]; then |
---|
98 | cd $dest |
---|
99 | # X gets the dir that the link actually leads to. |
---|
100 | x=`pwd` |
---|
101 | # If link leads back into ${INPUT}, |
---|
102 | # make a similar link here. |
---|
103 | if expr $x : "${INPUT}/.*" > /dev/null; then |
---|
104 | # Y gets the actual target dir name, relative to ${INPUT}. |
---|
105 | y=`echo $x | sed -n "s&${INPUT}/&&p"` |
---|
106 | # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}. |
---|
107 | dots=`echo "$file" | |
---|
108 | sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'` |
---|
109 | echo $file '->' $dots$y ': Making link' |
---|
110 | rm -fr ${LIB}/$file > /dev/null 2>&1 |
---|
111 | ln -s $dots$y ${LIB}/$file > /dev/null 2>&1 |
---|
112 | else |
---|
113 | # If the link is to outside ${INPUT}, |
---|
114 | # treat this directory as if it actually contained the files. |
---|
115 | # This line used to have $dest instead of $x. |
---|
116 | # $dest seemed to be wrong for links found in subdirectories |
---|
117 | # of ${INPUT}. Does this change break anything? |
---|
118 | treetops="$treetops $x ${LIB}/$file" |
---|
119 | fi |
---|
120 | fi |
---|
121 | cd $cwd |
---|
122 | fi |
---|
123 | done |
---|
124 | fi |
---|
125 | |
---|
126 | # Completely replace <_int_varargs.h> with a file that defines |
---|
127 | # va_list and gnuc_va_list |
---|
128 | |
---|
129 | file=_int_varargs.h |
---|
130 | if [ -r ${INPUT}/$file ]; then |
---|
131 | echo Replacing $file |
---|
132 | cat > ${LIB}/$file << EOF |
---|
133 | /* This file was generated by fixinc.dgux. */ |
---|
134 | #ifndef __INT_VARARGS_H |
---|
135 | #define __INT_VARARGS_H |
---|
136 | |
---|
137 | #if defined(__m88k__) && defined (__DGUX__) |
---|
138 | #ifndef __GNUC_VA_LIST |
---|
139 | #define __GNUC_VA_LIST |
---|
140 | typedef struct |
---|
141 | { |
---|
142 | int __va_arg; /* argument number */ |
---|
143 | int *__va_stk; /* start of args passed on stack */ |
---|
144 | int *__va_reg; /* start of args passed in regs */ |
---|
145 | } __gnuc_va_list; |
---|
146 | #endif /* not __GNUC_VA_LIST */ |
---|
147 | #endif /* 88k && dgux */ |
---|
148 | |
---|
149 | #ifndef _VA_LIST_ |
---|
150 | #define _VA_LIST_ |
---|
151 | typedef __gnuc_va_list va_list; |
---|
152 | #endif /* _VA_LIST_ */ |
---|
153 | |
---|
154 | #endif /* __INT_VARARGS_H */ |
---|
155 | |
---|
156 | EOF |
---|
157 | chmod a+r ${LIB}/$file |
---|
158 | fi |
---|
159 | |
---|
160 | echo 'Removing unneeded directories:' |
---|
161 | cd $LIB |
---|
162 | files=`find . -type d -print | sort -r` |
---|
163 | for file in $files; do |
---|
164 | rmdir $LIB/$file > /dev/null 2>&1 |
---|
165 | done |
---|
166 | |
---|
167 | if $LINKS; then |
---|
168 | echo 'Making internal symbolic non-directory links' |
---|
169 | cd ${INPUT} |
---|
170 | files=`find . -type l -print` |
---|
171 | for file in $files; do |
---|
172 | dest=`ls -ld $file | sed -n 's/.*-> //p'` |
---|
173 | if expr "$dest" : '[^/].*' > /dev/null; then |
---|
174 | target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"` |
---|
175 | if [ -f $target ]; then |
---|
176 | ln -s $dest ${LIB}/$file >/dev/null 2>&1 |
---|
177 | fi |
---|
178 | fi |
---|
179 | done |
---|
180 | fi |
---|
181 | |
---|
182 | cd ${ORIG_DIR} |
---|
183 | |
---|
184 | exit 0 |
---|
185 | |
---|