xref: /openbsd/gnu/usr.bin/perl/makedepend_file.SH (revision 256a93a4)
1#! /bin/sh
2case $PERL_CONFIG_SH in
3'')
4	if test -f config.sh; then TOP=.;
5	elif test -f ../config.sh; then TOP=..;
6	elif test -f ../../config.sh; then TOP=../..;
7	elif test -f ../../../config.sh; then TOP=../../..;
8	elif test -f ../../../../config.sh; then TOP=../../../..;
9	else
10		echo "Can't find config.sh."; exit 1
11	fi
12	. $TOP/config.sh
13	;;
14esac
15: This forces SH files to create target in same directory as SH file.
16: This is so that make depend always knows where to find SH derivatives.
17case "$0" in
18*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
19esac
20
21echo "Extracting makedepend_file (with variable substitutions)"
22rm -f makedepend_file
23$spitshell >makedepend_file <<!GROK!THIS!
24$startsh
25# makedepend_file.SH
26#
27MAKE=$make
28trnl='$trnl'
29!GROK!THIS!
30$spitshell >>makedepend_file <<'!NO!SUBS!'
31
32file=$1
33shift
34outfile=$1
35shift
36
37case $PERL_CONFIG_SH in
38'')
39	if test -f config.sh; then TOP=.;
40	elif test -f ../config.sh; then TOP=..;
41	elif test -f ../../config.sh; then TOP=../..;
42	elif test -f ../../../config.sh; then TOP=../../..;
43	elif test -f ../../../../config.sh; then TOP=../../../..;
44	else
45		echo "Can't find config.sh."; exit 1
46	fi
47	. $TOP/config.sh
48	;;
49esac
50
51# Avoid localized gcc messages
52case "$ccname" in
53    gcc) LC_ALL=C ; export LC_ALL ;;
54esac
55
56# We need .. when we are in the x2p directory if we are using the
57# cppstdin wrapper script.
58# Put .. and . first so that we pick up the present cppstdin, not
59# an older one lying about in /usr/local/bin.
60PATH=".$path_sep..$path_sep$PATH"
61export PATH
62
63case "$osname" in
64amigaos) cat=/bin/cat ;; # must be absolute
65esac
66
67    case "$osname" in
68    os2)      uwinfix="-e s,\\\\\\\\,/,g" ;;
69    cygwin)   uwinfix="-e s,\\\\\\\\,/,g" ;;
70    posix-bc) uwinfix="-e s/\\*POSIX(\\(.*\\))/\\1/" ;;
71    vos)      uwinfix="-e s/\#/\\\#/" ;;
72    *)        uwinfix="" ;;
73    esac
74    case "$file" in
75    *.c) filebase=`basename $file .c` ;;
76    *.y) filebase=`basename $file .y` ;;
77    esac
78    case "$file" in
79    */*) finc="-I`echo $file | sed 's#/[^/]*$##'`" ;;
80    *)   finc= ;;
81    esac
82    $echo "Finding dependencies for $filebase$_o"
83    # Below, we strip out all but preprocessor directives.
84    # We have to take care of situations like
85    #       #if defined(FOO) BAR   /* comment line 1
86    #                                 more comment lines */
87    # If we just delete text starting from the '/*' to the end of line, we will
88    # screw up cases like
89    #      #if defined(FOO)    /* comment */ \
90    #          && defined(BAR) /* comment */ \
91    #          && defined(BAZ) /* comment */ \
92    #               etc.
93    # Also, in lines like
94    #      #defined FOO(a,b)    a/**/b
95    # the comment may be important and so needs to be retained.
96    # This code processes the single-line comments first; it assumes there is
97    # at most one straightforward comment per continued preprocessor line,
98    # replacing each non-empty comment (and its surrounding white space) by a
99    # single space.  (sed only has a greedy '*' quantifier, so this doesn't
100    # work right if there are multiple comments per line, and strings can look
101    # like comments to it; both are unlikely in a preprocessor statement.) Any
102    # continuation line is joined, and the process repeated on the enlarged
103    # line as long as there are continuations.  At the end, if there are any
104    # comments remaining, they are either completely empty or are like the
105    # first situation.  The latter are just deleted by first deleting to the
106    # end of line (including preceding white space) things that start with '/*'
107    # and the next char isn't a '*'; then things that start with '/**', but the
108    # next char isn't a '/'.  (Subsequent lines of the comment are irrelevant
109    # and get dropped.)  At the end, we unjoin very long lines to avoid
110    # preprocessor limitations
111    ( $echo "#line 2 \"$file\"";                               \
112      $sed -n <$file                                           \
113	-e "/^${filebase}_init(/q"                             \
114        -e ': tstcont'                                         \
115	-e '/^[ 	]*#/s|[ 	]*/\*..*\*/[ 	]*| |' \
116        -e '/\\$/{'                                            \
117            -e 'N'                                             \
118            -e 'b tstcont'                                     \
119        -e '}'                                                 \
120	-e 's/\\\n//g'                                         \
121	-e '/^#line/d'                                         \
122	-e '/^[ 	]*#/{'                                 \
123	    -e 's|[ 	]*/\*[^*].*$||'                        \
124	    -e 's|[ 	]*/\*\*[^/].*$||'                      \
125            -e 's/.\{255\}/&\\\n/g'                           \
126	    -e p                                               \
127	-e '}' | $grep -v ":" ) >UU/$file.c
128
129    # We're not sure why this was there; the #endif is extraneous on modern z/OS
130    #if [ "$osname" = os390 -a "$file" = perly.c ]; then
131    #   $echo '#endif' >>UU/$file.c
132    #fi
133
134    if [ "$osname" = os390 ]; then
135        $cppstdin -DPERL_CORE $finc -I. $cppflags $cppminus <UU/$file.c |
136        $sed \
137    	    -e '/^#.*<stdin>/d' \
138	    -e '/^#.*"-"/d' \
139	    -e '/^#.*git_version\.h/d' \
140	    -e 's#\.[0-9][0-9]*\.c#'"$file.c#" \
141	    -e 's/^[	 ]*#[	 ]*line/#/' \
142	    -e '/^# *[0-9][0-9]* *[".\/]/!d' \
143	    -e 's/^.*"\(.*\)".*$/'$filebase'\$(OBJ_EXT): \1/' \
144	    -e 's/^# *[0-9][0-9]* \(.*\)$/'$filebase'\$(OBJ_EXT): \1/' \
145	    -e 's|: \./|: |' \
146	    -e 's|\.c\.c|.c|' $uwinfix | \
147        $uniq | $sort | $uniq >>$outfile
148    else
149        $cppstdin -DPERL_CORE $finc -I. $cppflags $cppminus <UU/$file.c >$$.cout 2>$$.cerr
150        $sed \
151	    -e '1d' \
152	    -e '/^#.*<stdin>/d' \
153            -e '/^#.*<builtin>/d' \
154            -e '/^#.*<built-in>/d' \
155            -e '/^#.*<command line>/d' \
156            -e '/^#.*<command-line>/d' \
157	    -e '/^#.*"-"/d' \
158	    -e '/^#.*"\/.*\/"/d' \
159	    -e '/: file path prefix .* never used$/d' \
160	    -e '/^#.*git_version\.h/d' \
161	    -e 's#\.[0-9][0-9]*\.c#'"$file.c#" \
162	    -e 's/^[	 ]*#[	 ]*line/#/' \
163	    -e '/^# *[0-9][0-9]* *[".\/]/!d' \
164	    -e 's/^.*"\(.*\)".*$/'$filebase'\$(OBJ_EXT): \1/' \
165	    -e 's/^# *[0-9][0-9]* \(.*\)$/'$filebase'\$(OBJ_EXT): \1/' \
166	    -e 's|: \./|: |' \
167           -e 's|\.c\.c|.c|' $uwinfix $$.cout $$.cerr| \
168        $uniq | $sort | $uniq >>$outfile
169        rm $$.cout
170        rm $$.cerr
171    fi
172    $echo "$filebase\$(OBJ_EXT): $@" >>$outfile
173
174!NO!SUBS!
175$eunicefix makedepend_file
176chmod +x makedepend_file
177