This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Populate metaconfig branch.
[metaconfig.git] / dist-3.0at70 / mcon / U / mkdep.U
1 ?RCS: $Id: mkdep.U,v 3.0.1.4 1997/02/28 16:13:07 ram Exp $
2 ?RCS:
3 ?RCS: Copyright (c) 1991-1993, Raphael Manfredi
4 ?RCS: 
5 ?RCS: You may redistribute only under the terms of the Artistic Licence,
6 ?RCS: as specified in the README file that comes with the distribution.
7 ?RCS: You may reuse parts of this distribution only within the terms of
8 ?RCS: that same Artistic Licence; a copy of which may be found at the root
9 ?RCS: of the source tree for dist 3.0.
10 ?RCS:
11 ?RCS: $Log: mkdep.U,v $
12 ?RCS: Revision 3.0.1.4  1997/02/28  16:13:07  ram
13 ?RCS: patch61: replaced .o with $_o all over the place
14 ?RCS:
15 ?RCS: Revision 3.0.1.3  1994/10/29  16:25:02  ram
16 ?RCS: patch36: added ?F: line for metalint file checking
17 ?RCS:
18 ?RCS: Revision 3.0.1.2  1994/01/24  14:15:12  ram
19 ?RCS: patch16: cppflags is now an optional dependency
20 ?RCS:
21 ?RCS: Revision 3.0.1.1  1993/12/15  08:22:39  ram
22 ?RCS: patch15: force zero exit status in all mkdep scripts
23 ?RCS:
24 ?RCS: Revision 3.0  1993/08/18  12:09:16  ram
25 ?RCS: Baseline for dist 3.0 netwide release.
26 ?RCS:
27 ?X:
28 ?X: This unit generates the script 'mkdep' in the top-level directory.
29 ?X:     It is up to the makefile to use it for automatic dependencies
30 ?X: generation (usage: 'mkdep [cppflags] -- *.c').
31 ?X:
32 ?MAKE:mkdep: spitshell startsh cpp +cppflags grep contains rm sed sort uniq \
33         Getfile Oldconfig eunicefix cat +cc cppminus test _o
34 ?MAKE:  -pick add $@ %<
35 ?S:mkdep:
36 ?S:     This variable holds the name of a command to generate makefile
37 ?S:     dependencies on the standard output. It is the pathname of the
38 ?S:     generated mkdep script.
39 ?S:.
40 ?F:mkdep
41 ?T:IFS arg flags takeflags srcfile toplev filebase inc dir files file dep c
42 : find out how to generate dependencies
43 echo " "
44 echo "Checking how to generate makefile dependencies on your machine..." >&4
45 ?X: We are in the UU directory
46 toplev=`cd ..;pwd`
47 $cat >dep.c <<'EOCP'
48 #include "dep.h"
49 EOCP
50 ?X: Empty dep.h causes RIOS to barf
51 $cat >dep.h <<'EOCP'
52
53 EOCP
54 takeflags='flags=""
55 case "$@" in
56 *--*)
57         for arg
58         do
59                 shift
60                 case "$arg" in
61                 --) break;;
62                 *) flags="$flags $arg";;
63                 esac
64         done;;
65 esac'
66 case "$mkdep" in
67 '')
68         ;;
69 *)
70         if test -x "$mkdep" &&
71                 $mkdep dep.c >dep.out 2>/dev/null &&
72                 $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1
73         then
74                 echo "$mkdep works."
75         else
76                 mkdep=
77         fi
78 esac
79
80 case "$mkdep" in
81 '')
82 ?X: have to figure something out: Try cpp
83 ?X: have to pass source names one by one to cpp...
84         $spitshell > ../mkdep <<EOM
85 $startsh
86 $takeflags
87 for srcfile
88 do
89         $cpp -M -I. $cppflags \$flags \$srcfile 2>/dev/null
90 done
91 exit 0
92 EOM
93         mkdep=$toplev/mkdep
94         chmod +x $mkdep
95         $eunicefix $mkdep
96         if $mkdep dep.c >dep.out 2>/dev/null &&
97                 $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1
98         then
99                 echo "Looks like we can use $cpp -M."
100         else
101                 mkdep=
102         fi
103         ;;
104 esac
105
106 case "$mkdep" in
107 '')
108 ?X: have to figure something out: on NeXT, use cc -MM
109 ?X: have to pass source names one by one to cc...
110         $spitshell > ../mkdep <<EOM
111 $startsh
112 $takeflags
113 for srcfile
114 do
115         $cc -MM -I. $cppflags \$flags \$srcfile 2>/dev/null
116 done
117 exit 0
118 EOM
119         mkdep=$toplev/mkdep
120         chmod +x $mkdep
121         $eunicefix $mkdep
122         if $mkdep dep.c >dep.out 2>/dev/null &&
123                 $contains "dep$_o: dep.h" dep.out >/dev/null 2>&1
124         then
125                 echo "Looks like we can use $cc -MM."
126         else
127                 mkdep=
128         fi
129         ;;
130 esac
131
132 case "$mkdep" in
133 '')
134 ?X: still no luck -- try something fancier.
135         $spitshell >../mkdep <<EOS
136 $startsh
137 $takeflags
138 for srcfile
139 do
140         case "\$srcfile" in
141         *.c) c='.c';;
142         *.y) c='.y';;
143         *.l) c='.l';;
144         esac
145         filebase=\`basename \$srcfile \$c\`
146         <\$srcfile $cpp $cppminus $cppflags -I. \$flags 2>/dev/null | \\
147         $sed -e '/^# *[0-9]/!d' \\
148                 -e 's/^.*"\(.*\)".*\$/'\$filebase'$_o: \1/' \\
149                 -e 's|: \./|: |' \\
150                 -e 's|: *$|: '\$srcfile'|' | \\
151         $grep -v '^#' | $sort | $uniq
152 done
153 exit 0
154 EOS
155         mkdep=$toplev/mkdep
156         chmod +x $mkdep
157         $eunicefix $mkdep
158         if $mkdep dep.c >dep.out 2>/dev/null &&
159                 $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1
160         then
161                 echo "A shell script using $cpp does the trick."
162         else
163                 echo "$cpp doesn't seem to be any use at all."
164                 $spitshell >../mkdep <<EOS
165 $startsh
166 $takeflags
167 files="\$@"
168 set X \$flags
169 shift
170 inc='.'
171 while test \$# -gt 0
172 do
173         case "\$1" in
174         -I) 
175                 shift
176                 inc="\$inc:\$1"
177                 ;;
178         -I*)
179                 dir=\`echo \$1 | sed -e 's/^-I//'\`
180                 inc="\$inc:\$dir"
181                 ;;
182         esac
183         shift
184 done
185 set X \$files
186 shift
187 trap "$rm -f /tmp/mkdep\$\$; exit 1" 1 2 3 15
188 for srcfile
189 do
190         case "\$srcfile" in
191         *.c) c='.c';;
192         *.y) c='.y';;
193         *.l) c='.l';;
194         esac
195         filebase=\`basename \$srcfile \$c\`
196         echo \$filebase$_o: \$srcfile
197         $grep '^#[  ]*include' \$srcfile /dev/null | \
198         $sed -n -e 's/#[   ]*include[  ]*//' \\
199                 -e '/<\(.*\)>/ d' \\
200                 -e 's/:[^"]*"\([^"]*\)".*/: \1/' \\
201                 -e "s/\\.c:/$_o:/p" > /tmp/mkdep\$\$
202 ?X: Deal with directories specified via -I requests to locate files
203         IFS=': '
204         while read file dep; do
205                 for dir in \$inc; do
206                         if $test -f "\$dir/\$dep"; then
207                                 dep="\$dir/\$dep"
208                                 break
209                         fi
210                 done
211                 echo "\$file: \$dep" | $sed -e 's,: \./,: ,'
212         done </tmp/mkdep\$\$
213         IFS=' '
214         $rm -f /tmp/mkdep\$\$
215 done
216 exit 0
217 EOS
218                 mkdep=$toplev/mkdep
219                 chmod +x $mkdep
220                 $eunicefix $mkdep
221                 if $mkdep dep.c >dep.out 2>/dev/null &&
222                         $contains "dep$_o:.*dep\.h" dep.out >/dev/null 2>&1
223                 then
224                         cat << EOM
225
226 I can use a script with grep instead, but it will make some incorrect
227 dependencies, since it doesn't understand about conditional compilation.
228 Moreover, some dependencies may be missing, because scanning won't be
229 a recursive process.
230 If you have a program which generates makefile dependencies, you may want
231 to use it.  If not, you can use the script and edit the Makefile by hand
232 if you need to.
233 EOM
234                 else
235                         mkdep=
236                         cat << EOM
237
238 I can't seem to generate makefile dependencies at all!  Perhaps you have a
239 program that does?  If you don't, you might look at the mkdep script to
240 see if you can create one which works.
241 EOM
242                 fi
243         fi
244 esac
245 dflt="$mkdep"
246 fn=f~/
247 rp="Name of program to make makefile dependencies?"
248 . ./getfile
249 mkdep="$ans"
250 $rm -f dep.c dep.h dep$_o dep.out
251