summaryrefslogtreecommitdiff
path: root/mcon/U/cppstdin.U
blob: 85d556d39f9bef749977811b17fd53feec819805 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
?RCS: $Id$
?RCS:
?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
?RCS: 
?RCS: You may redistribute only under the terms of the Artistic Licence,
?RCS: as specified in the README file that comes with the distribution.
?RCS: You may reuse parts of this distribution only within the terms of
?RCS: that same Artistic Licence; a copy of which may be found at the root
?RCS: of the source tree for dist 4.0.
?RCS:
?RCS: $Log: cppstdin.U,v $
?RCS: Revision 3.0.1.4  1994/10/29  16:08:34  ram
?RCS: patch36: added ?F: line for metalint file checking
?RCS:
?RCS: Revision 3.0.1.3  1994/01/24  14:05:38  ram
?RCS: patch16: comment for CPPLAST was missing
?RCS:
?RCS: Revision 3.0.1.2  1993/12/15  08:18:58  ram
?RCS: patch15: new variables cpprun and cpplast, guaranteed wrapper-free
?RCS: patch15: cppstdin now tries to use cc, even at the cost of a wrapper
?RCS:
?RCS: Revision 3.0.1.1  1993/08/25  14:00:53  ram
?RCS: patch6: remove wrapper when not actually used
?RCS:
?RCS: Revision 3.0  1993/08/18  12:05:38  ram
?RCS: Baseline for dist 3.0 netwide release.
?RCS:
?MAKE:cppstdin cppminus cpprun cpplast: contains test Myread Oldconfig Loc \
	cpp +cc rm hint osname gccversion startsh eunicefix
?MAKE:	-pick add $@ %<
?S:cppstdin:
?S:	This variable contains the command which will invoke the C
?S:	preprocessor on standard input and put the output to stdout.
?S:	It is primarily used by other Configure units that ask about
?S:	preprocessor symbols.
?S:.
?S:cppminus:
?S:	This variable contains the second part of the string which will invoke
?S:	the C preprocessor on the standard input and produce to standard
?S:	output.  This variable will have the value "-" if cppstdin needs
?S:	a minus to specify standard input, otherwise the value is "".
?S:.
?S:cpprun:
?S:	This variable contains the command which will invoke a C preprocessor
?S:	on standard input and put the output to stdout. It is guaranteed not
?S:	to be a wrapper and may be a null string if no preprocessor can be
?S:	made directly available. This preprocessor might be different from the
?S:	one used by the C compiler. Don't forget to append cpplast after the
?S:	preprocessor options.
?S:.
?S:cpplast:
?S:	This variable has the same functionality as cppminus, only it applies to
?S:	cpprun and not cppstdin.
?S:.
?C:CPPSTDIN:
?C:	This symbol contains the first part of the string which will invoke
?C:	the C preprocessor on the standard input and produce to standard
?C:	output.	 Typical value of "cc -E" or "/lib/cpp", but it can also
?C:	call a wrapper. See CPPRUN.
?C:.
?C:CPPMINUS:
?C:	This symbol contains the second part of the string which will invoke
?C:	the C preprocessor on the standard input and produce to standard
?C:	output.  This symbol will have the value "-" if CPPSTDIN needs a minus
?C:	to specify standard input, otherwise the value is "".
?C:.
?C:CPPRUN:
?C:	This symbol contains the string which will invoke a C preprocessor on
?C:	the standard input and produce to standard output. It needs to end
?C:	with CPPLAST, after all other preprocessor flags have been specified.
?C:	The main difference with CPPSTDIN is that this program will never be a
?C:	pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
?C:	available directly to the user. Note that it may well be different from
?C:	the preprocessor used to compile the C program.
?C:.
?C:CPPLAST:
?C:	This symbol is intended to be used along with CPPRUN in the same manner
?C:	symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
?C:.
?H:#define CPPSTDIN "$cppstdin"
?H:#define CPPMINUS "$cppminus"
?H:#define CPPRUN "$cpprun"
?H:#define CPPLAST "$cpplast"
?H:.
?F:cppstdin !testcpp.out !testcpp.c
?T:wrapper x_cpp x_minus ok
: see how we invoke the C preprocessor
echo " "
echo "Now, how can we feed standard input to your C preprocessor..." >&4
cat <<'EOT' >testcpp.c
#define ABC abc
#define XYZ xyz
ABC.XYZ
EOT
cd ..
if $test ! -f cppstdin; then
	echo "$startsh" >cppstdin
if $test "X$osname" = "Xaix" -a "X$gccversion" = X; then
?X: AIX cc -E doesn't show the absolute headerfile
?X: locations but we'll cheat by using the -M flag.
	echo 'cat >.$$.c; rm -f .$$.u; '"$cc"' ${1+"$@"} -M -c .$$.c 2>/dev/null; \
	test -s .$$.u && \
	awk '"'"'$2 ~ /\.h$/ { print "# 0 \""$2"\"" }'"'"' .$$.u; \
	rm -f .$$.o .$$.u; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >> cppstdin
else
	echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >>cppstdin
fi; else
	echo "Keeping your $hint cppstdin wrapper."
fi
chmod 755 cppstdin
$eunicefix cppstdin
wrapper=`pwd`/cppstdin
ok='false'
cd UU

?X:
?X: We'll run the cpp tests again if we don't have any valid C preprocessor
?X: yet or don't know how to proceed without a wrapper (in which case cpprun
?X: is empty and that's really annoying...)
?X:
if $test "X$cppstdin" != "X" && \
	$cppstdin $cppminus <testcpp.c >testcpp.out 2>&1 && \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
then
	echo "You used to use $cppstdin $cppminus so we'll use that again."
	case "$cpprun" in
	'') echo "But let's see if we can live without a wrapper..." ;;
	*)
		if $cpprun $cpplast <testcpp.c >testcpp.out 2>&1 && \
			$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
		then
			echo "(And we'll use $cpprun $cpplast to preprocess directly.)"
			ok='true'
		else
			echo "(However, $cpprun $cpplast does not work, let's see...)"
		fi
		;;
	esac
else
	case "$cppstdin" in
	'') ;;
	*)
		echo "Good old $cppstdin $cppminus does not seem to be of any help..."
		;;
	esac
fi

if $ok; then
	: nothing
elif echo 'Maybe "'"$cc"' -E" will work...'; \
	$cc -E <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	echo "Yup, it does."
	x_cpp="$cc -E"
	x_minus='';
elif echo 'Nope...maybe "'"$cc"' -E -" will work...'; \
	$cc -E - <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	echo "Yup, it does."
	x_cpp="$cc -E"
	x_minus='-';
elif echo 'Nope...maybe "'"$cc"' -P" will work...'; \
	$cc -P <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	echo "Yipee, that works!"
	x_cpp="$cc -P"
	x_minus='';
elif echo 'Nope...maybe "'"$cc"' -P -" will work...'; \
	$cc -P - <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	echo "At long last!"
	x_cpp="$cc -P"
	x_minus='-';
elif echo 'No such luck, maybe "'$cpp'" will work...'; \
	$cpp <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	echo "It works!"
	x_cpp="$cpp"
	x_minus='';
elif echo 'Nixed again...maybe "'$cpp' -" will work...'; \
	$cpp - <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	echo "Hooray, it works!  I was beginning to wonder."
	x_cpp="$cpp"
	x_minus='-';
elif echo 'Uh-uh.  Time to get fancy.  Trying a wrapper...'; \
	$wrapper <testcpp.c >testcpp.out 2>&1; \
	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
	x_cpp="$wrapper"
	x_minus=''
	echo "Eureka!"
else
	dflt=''
	rp="No dice.  I can't find a C preprocessor.  Name one:"
	. ./myread
	x_cpp="$ans"
	x_minus=''
	$x_cpp <testcpp.c >testcpp.out 2>&1
	if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
		echo "OK, that will do." >&4
	else
echo "Sorry, I can't get that to work.  Go find one and rerun Configure." >&4
		exit 1
	fi
fi

case "$ok" in
false)
	cppstdin="$x_cpp"
	cppminus="$x_minus"
	cpprun="$x_cpp"
	cpplast="$x_minus"
?X:
?X: If /lib/cpp is used, try using a wrapper to increase our chances to have
?X: the C compiler and our $cppstdin agree on the same symbols... However,
?X: since cpprun is guaranteed not to be a wrapper, we must clear it if the
?X: only preprocessor we found was a wrapper, with all our luck...
?X:
	set X $x_cpp
	shift
	case "$1" in
	"$cpp")
		echo "Perhaps can we force $cc -E using a wrapper..."
		if $wrapper <testcpp.c >testcpp.out 2>&1; \
			$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
		then
			echo "Yup, we can."
			cppstdin="$wrapper"
			cppminus='';
		else
			echo "Nope, we'll have to live without it..."
		fi
		;;
	esac
	case "$cpprun" in
	"$wrapper")
		cpprun=''
		cpplast=''
		;;
	esac
	;;
esac

case "$cppstdin" in
"$wrapper"|'cppstdin') ;;
*) $rm -f $wrapper;;
esac
$rm -f testcpp.c testcpp.out