1:
2# @(#)probe.win32 (AT&T Research) 2010-01-01
3#
4# win32 specific make C probe initialization
5# wrapped cc's are easy on uwin
6#
7# 2> easy.err to avoid mysterious hang with bcc
8
9# begin preamble shared with the pp probe.ini
10
11IFS=$'\n'
12
13chmod 777 . # cl.exe setuid workaround
14
15typeset -A header version
16
17# we are probing on behalf of libpp and nmake
18# so the native preprocessor must be forced in
19# order to bootstrap libpp and nmake
20
21nativepp=-1
22export nativepp
23
24probe_header="
25stddef.h
26"
27for inc in syslimits.h winerror.h ostream bits/ctype_base.h stream.h
28do	echo 	"#include <$inc>" > easy.c
29	if	$cc -E easy.c > /dev/null 2> easy.err
30	then	probe_header="$probe_header
31$inc
32"
33	fi
34done
35
36{
37for i in $probe_header
38do	echo "#include <$i>"
39done
40echo '#ifdef __cplusplus'
41echo "int _Pr0b3_cplus=__cplusplus;"
42echo '#endif'
43echo '#ifdef _UWIN'
44echo "int _Pr0b3_uwin=_UWIN;"
45echo '#endif'
46echo '#ifdef __BORLANDC__'
47echo "int _Pr0b3_version_BORLAND=__BORLANDC__;"
48echo '#endif'
49echo '#ifdef __DMC__'
50echo "int _Pr0b3_version_DM=__DMC__;"
51echo '#endif'
52echo '#ifdef _MSC_VER'
53echo "int _Pr0b3_version_MS=_MSC_VER;"
54echo '#endif'
55echo '#ifdef __ICL'
56echo "int _Pr0b3_version_ICL=__ICL;"
57echo '#endif'
58echo '#ifdef __LCC__'
59echo "int _Pr0b3_version_LCC=0+__LCC__;"
60echo '#endif'
61echo '#ifdef __MINGW32__'
62echo "int _Pr0b3_version_MINGW=__MINGW32__;"
63echo '#endif'
64echo '#ifdef __INTERIX'
65echo "int _Pr0b3_version_INTERIX=__INTERIX;"
66echo '#endif'
67echo '#ifdef __WATCOMC__'
68echo "int _Pr0b3_version_WATCOM=__WATCOMC__;"
69echo '#endif'
70} > easy.c
71
72include=
73uwin=
74cplus=
75
76$cc -E easy.c 2>&1 |
77egrep -i '^(#(line)? 1 .*\.[hH]| *int +_Pr0b3_[a-zA-Z_]* *= *[0-9])' |
78sed	-e 's,_Pr0b3_,,' \
79	-e 's/.*"\(.*\)".*/\1/' \
80	-e 's,^  *,,' \
81	-e 's,  *$,,' \
82	-e 's, *= *,=,' \
83	-e 's,^\(.\):[\\/]*,/\1/,' \
84	-e 's,[\\/][\\/]*,/,g' \
85	-e 's,^\(/.*\)/\(.*\)$,header[\2]="\1",' \
86	-e 's, *int *\(.*\);.*,\1,' \
87	-e 's,^version_\(.*\)=,version[\1]=,' \
88	> easy.sh
89. ./easy.sh
90
91include=
92for i in $probe_header
93do	d=${header[$i]}
94	if	[[ $d ]]
95	then	include="$include
96$d"
97	elif	[[ $i == */* ]]
98	then	d=${header[${i##*/}]}
99		if	[[ $d == */${i%/*} ]]
100		then	include="$include
101${d%/${i%/*}}"
102		fi
103	fi
104done
105
106i=$($cc -V 2> easy.err)
107if	test "" != "$i" -a -d "$i/include"
108then	include="$i/include
109$include"
110fi
111
112stdinclude=
113for inc in $include
114do	if	[[ ${inc%/*} -ef /msdev/platformsdk ]]
115	then	inc=/msdev/platformsdk/${inc##*/}
116	elif	[[ ${inc%/*} -ef /platformsdk ]]
117	then	inc=/platformsdk/${inc##*/}
118	fi
119	for dup in $stdinclude
120	do	[[ $inc -ef $dup ]] && continue 2
121	done
122	stdinclude="$stdinclude
123$inc"
124done
125
126# end preamble shared with the pp probe.ini
127
128if	[[ ${version[@]} == [0-9]* && $stdinclude ]]
129then	: the payoff
130	set -- $cc
131	cmd=$1
132	shift
133	set -- $(whence $cmd) "$@"
134	typ=$(package)
135	dialect="ANSI CLOSURE DYNAMIC EXPORT=DLL LIBPP -I-"
136	case ${cc##*/} in
137	*CC*)	dialect="$dialect C++"
138		cplus=1
139		;;
140	esac
141	ld=${cc%cc}ld
142	if	[[ ! -x $ld ]]
143	then	ld=${cc%/*}/ld
144		if	[[ ! -x $ld ]]
145		then	case $cc in
146			*/ncc)	ld=/usr/bin/nld ;;
147			*)	ld=/usr/bin/ld ;;
148			esac
149		fi
150	fi
151	{
152		if	$cc -v >/dev/null 2>&1
153		then	v=$($cc -v 2>/dev/null)
154			if	[[ $v ]]
155			then	print "# ;VERSION;-v;$v;PATH;$cc"
156			fi
157		else	v=
158		fi
159		cat <<!
160CC.CC = $*
161CC.NATIVE = $*
162CC.EXECTYPE = $typ
163CC.HOSTTYPE = $typ
164CC.ALTPP.FLAGS = -Yp,\$(CPP:D)
165CC.ALTPP.ENV =
166CC.AR = ar
167CC.ARFLAGS =
168CC.DEBUG = -g
169CC.DIALECT = $dialect
170CC.DLL = -D_BLD_DLL
171CC.DLLBIG = -D_BLD_DLL
172CC.DLL.DEF = -D_BLD_DLL
173CC.DLL.DIR = \$(BINDIR)
174CC.DLL.LIBRARIES =
175CC.DLL.VARIANTS =
176CC.DYNAMIC =
177CC.EXPORT.DYNAMIC =
178CC.LD = $ld
179CC.LD.DYNAMIC = -Bdynamic
180CC.LD.LAZY =
181CC.LD.NOLAZY =
182CC.LD.ORIGIN =
183CC.LD.RECORD =
184CC.LD.NORECORD =
185CC.LD.RUNPATH =
186CC.LD.STATIC = -Bstatic
187CC.LD.STRIP =
188CC.LIB.DLL = option
189CC.LIB.ALL = -Bwhole-archive
190CC.LIB.UNDEF = -Bno-whole-archive
191CC.MAKE.OPTIONS = nativepp=0
192CC.NM = nm
193CC.NMEDIT =
194CC.NMFLAGS =
195CC.OPTIMIZE = -O
196CC.PIC =
197CC.PICBIG =
198CC.READONLY =
199CC.REPOSITORY =
200CC.SHARED = -G
201CC.SHARED.LD = $ld
202CC.SHARED.REGISTRY =
203CC.SHARED.REGISTRY.PATH =
204CC.SHELLMAGIC =
205CC.SIZE = size
206CC.STATIC = -Bstatic
207!
208		inc=
209		lib=
210		if	[[ ${version[LCC]} ]]
211		then	lib=/lcc
212		fi
213		if	[[ $stdinclude == *' '* ]]
214		then	stdinclude=${stdinclude//' '/''}
215		fi
216		stdinc=
217		stdlib=
218		for inc in $stdinclude
219		do	stdinc="$stdinc $inc"
220			d=${inc%/*}/lib
221			if	[[ -d $d ]]
222			then	stdlib="$stdlib $d"
223			fi
224		done
225		case $uwin in
226		[0-9]*)	cat <<!
227CC.STDINCLUDE = /usr/include $stdinc
228CC.STDLIB = /usr/lib$lib $stdlib
229!
230			;;
231		*)	cat <<!
232CC.STDINCLUDE = $stdinc
233CC.STDLIB = $stdlib
234!
235			;;
236		esac
237		cat <<!
238CC.STRICT =
239CC.STRIP = strip
240CC.STRIP.FLAGS =
241CC.PREFIX.ARCHIVE = lib
242CC.PREFIX.DYNAMIC =
243CC.PREFIX.SHARED =
244CC.PREFIX.SYMBOL = _
245CC.SUFFIX.ARCHIVE = .a
246CC.SUFFIX.COMMAND =
247CC.SUFFIX.DEBUG = .pdb
248CC.SUFFIX.DYNAMIC = .dll
249CC.SUFFIX.LD = .def .exp .ign .res
250CC.SUFFIX.OBJECT = .o
251CC.SUFFIX.SHARED = .lib
252CC.SUFFIX.SOURCE = .c
253CC.SUFFIX.STATIC =
254!
255		if	[[ $v ]]
256		then	case $v in
257			*\"*)	v=$(print -r -- | sed -e 's,",\\",g' -e 's,^ ,,' -e 's,.*,"&",') ;;
258			*\'*)	v=\"$v\" ;;
259			esac
260			cat <<!
261CC.VERSION = -v
262CC.VERSION.STRING = $v
263!
264		else	cat <<!
265CC.VERSION =
266CC.VERSION.STRING =
267!
268		fi
269		if	[[ ${version[MINGW]} || ${version[MS]} ]]
270		then	cat <<!
271CC.WARN = -Wall
272!
273		else	cat <<!
274CC.WARN =
275!
276		fi
277		cat <<!
278CC.PREROOT =
279CC.UNIVERSE = att
280!
281	} >&3
282	exit 0
283fi
284