1rules
2
3/*
4 * Glenn Fowler
5 * AT&T Research
6 *
7 * default make base rules
8 *
9 * conventions:
10 *
11 *	internal make rule names match the RE \.[.A-Z][.A-Z0-9]*
12 *	internal make variable names match the RE \.[.A-Z][.A-Z0-9]*\.
13 *	internal make operator names match the RE :[A-Z]*:
14 *	use $(tmp) (10 chars max) to generate shell tmp file names
15 *	every (non-builtin shell) command should use a make variable
16 *	the flags for command $(XYZ) are $(XYZFLAGS)
17 */
18
19.ID. = "@(#)$Id: Makerules (AT&T Research) 2012-06-08 $"
20
21.RULESVERSION. := $(MAKEVERSION:@/.* //:/-//G)
22
23/*
24 * handy attributes
25 */
26
27.FUNCTION : .USE .ATTRIBUTE .MAKE .FUNCTIONAL .VIRTUAL .FORCE .REPEAT
28
29.ANCESTOR.LIST = $(-ancestor-source) .SOURCE.a lib .SOURCE.h include
30tmp = ${COTEMP}
31
32/*
33 * rule option definitions
34 */
35
36set option=';all-static;bp;-;Force the prerequisite libraries of static \b+l\b\aname\a library references to be static.'
37set option=';ancestor;n;-;Set the ancestor search directory depth to \adepth\a. \bMAKEPATH\b and variant recursive invocations may increase the depth.;depth:=3'
38set option=';ancestor-source;s;-;A list of \b.SOURCE\b\a.suffix\a \adirectory\a pairs added to the ancestor directory search.;.SOURCE.suffix directory...:=$(.ANCESTOR.LIST)'
39set option=';archive-clean;s;-;A catenation of edit operators that selects archive member files to be removed after being added to the archive.;edit-ops'
40set option=';archive-output;s;-;The output file name for archiving actions (\bpax\b, \bsave\b, \btgz\b, etc.) The default is based on the current directory and the VERSION variable.;file'
41set option=';cctype;s;-;Set the \bprobe\b(1) C compiler type identifier. The default value is based on the \bCC\b variable. To disable the C probe use \b--cctype=-\b or set \bCC=""\b.;[type]'
42set option=';clean-ignore;s;-;Ignore \bclean\b action generated target files matching \apattern\a.;pattern'
43set option=';clobber;sv;-;Replace existing \binstall\b action targets matching \apattern\a instead of renaming to \atarget\a\b.old\b.;pattern:!*'
44set option=';compare;b;-;Ignore \binstall\b action targets whose contents have not changed. On by default.'
45set option=';debug-symbols;bp;-;Compile and link with debugging symbol options enabled.'
46set option=';force-shared;b;-;Do not ignore \b-l\b\aname\a shared library reference modification times.'
47set option=';instrument;s;-;Enable compile-time, link-time and/or run-time code instrumentation. Instrumentation interfaces that replace the compiler command, and the \bapp\b, \binsight\b, \bpurecov\b, \bpurify\b, \bquantify\b and \bsentinel\b special-need interfaces, are supported.;command'
48set option=';ld-script;s;-;A space-separated list of suffixes of script files to be passed to the linker.;suffix'
49set option=';lib-type;bp;-;Bind library references to \b--debug-symbols\b or \b--profile\b specific variants.'
50set option=';link;s;-;Hard link \binstall\b action targets matching \apattern\a instead of copying.;pattern'
51set option=';local-static;bp;-;Compile and link against static library targets. The default links against shared library targets, but care must be taken to point runtime shared library binding to the current directory when executing command targets in the current directory.'
52set option=';native-pp;np;-;Force the use of the native C preprocessor and print a \alevel\a diagnostic message noting the override.;level'
53set option=';official-output;s;-;The \bdiff\b(1) log file name for the \bofficial\b action. If \afile\a is a relative path name then it is written in the next view level.;file:=OFFICIAL'
54set option=';prefix-include;b;-;Override the C preprocessor prefix include option. \b--noprefix-include\b may be needed for some compilers that misbehave when \b$$(CC.INCLUDE.LOCAL)\b is set and \b#include "..."\b assumes the subdirectory of the including file. The default value is based on the \bprobe\b(1) information.'
55set option=';preserve;sv;-;Move existing \binstall\b action targets matching \apattern\a to the \bETXTBSY\b subdirectory of the install target.;pattern:!*'
56set option=';profile;b;-;Compile and link with \bprof\b(1) instrumentation options enabled.'
57set option=';recurse;sa;-;Set the recursive \b:MAKE:\b \aaction\a:;[action:=1]{[+combine?Combine all recursive makefiles into one rooted at the current directory. \b::\b, \b:PACKAGE:\b, \b.SOURCE\b*, and \bLDLIBRARIES\b are intercepted to adjust relative directory and library references. Complex makefile hierarchies may not be amenable to combination.][+implicit?All makefiles in all subdirectories are treated as if they contained \b:MAKE:\b.][+list?List the recursion directories, one per line, on the standard output and exit. A \b-\b prerequisite separates groups that may be made concurrently and a \b+\b prerequisite separates leaf directories from intermediate directories.][+only?Disable component closure and operate on explicit prerequisites only.][+prereqs?List the recursion directory dependencies as a makefile on the standard output and exit.][+\anumber\a?Set the directory recursion concurrency level to \anumber\a.]}'
58set option=';recurse-enter;s;-;\atext\a prependeded to the \adirectory\a\b:\b message printed on the standard error upon entering a recursive \b:MAKE:\b directory.;text'
59set option=';recurse-leave;s;-;\atext\a prependeded to the \adirectory\a\b:\b message printed on the standard error upon leaving a recursive \b:MAKE:\b directory. If \b--recurse-leave\b is not specified then no message is printed upon leaving \b:MAKE:\b directories.;text'
60set option=';select;s;-;A catenation of edit operators that selects terminal source files.;edit-ops'
61set option=';separate-include;b;-;Allow \b$$(CC.INCLUDE.LOCAL)\b to be used with compilers that support it. On by default. If \b--noseparate-include\b is set then \b$$(CC.INCLUDE.LOCAL)\b will not be used, even if the current compiler supports it.'
62set option=';shared;bp;-;Set \b:LIBRARY:\b to generate shared libraries (dlls).'
63set option=';static-link;bp;-;Compile and link with a preference for static libraries.'
64set option=';strip-symbols;b;-;Strip link-time static symbols from executables.'
65set option=';threads;b;-;Compile and link with thread options enabled. Not implemented yet.'
66set option=';variants;sv;-;Select only \bcc-\b\avariant\a directories matching \apattern\a.;pattern:!*'
67set option=';view-verify;n;-;Verify that all view root directories exist. If there are any missing directories then a \alevel\a diagnostic is printed.;level'
68set option=';virtual;b;-;Allow \b:MAKE:\b to \bmkdir\b(1) recursive directories that do not exist in the top view. On by default. If \b--novirtual\b is set then \b:MAKE:\b warns about but ignores virtual recursive directories.'
69
70/*
71 * rule option defaults
72 */
73
74set all-static:=1
75set archive-output:=$$(PWD:N=*[0-9].[0-9]*|*-$(VERSION:@N!=-):?$$(PWD:B:S:/---*\\([^-]*\\)/-\\1/)?$$(VERSION:@N!=-:Y%$$(PWD:B:S)-$$(VERSION)%$$(PWD:B)%)?)
76set compare:=1
77set lib-type:=1
78set official-output:=OFFICIAL
79set preserve:=$$(CC.SUFFIX.SHARED:+$$(CC.PREFIX.SHARED)*$$(CC.SUFFIX.SHARED).*)|$$(CC.SUFFIX.DYNAMIC:+$$(CC.PREFIX.DYNAMIC)*$$(CC.SUFFIX.DYNAMIC))
80set recurse:=1
81set separate-include:=1
82set virtual:=1
83
84/*
85 * name=value => --option compatibility
86 */
87
88.OPTION.COMPATIBILITY : .MAKE .VIRTUAL .FORCE
89	local N O
90	if .MAKEVERSION. < 20121221
91		O =
92		N =
93		if ! "$(-?clobber)" && "$("clobber":T=QV)"
94			O += clobber=$(clobber)
95			if clobber == "1"
96				N += --clobber
97			elif clobber == "0"
98				N += --noclobber
99			else
100				N += --clobber=$(clobber)
101			end
102		end
103		if ! "$(-?compare)" && "$("compare":T=QV)"
104			O += compare=$(compare)
105			if compare
106				N += --compare
107			else
108				N += --nocompare
109			end
110		end
111		if ! "$(-?debug-symbols)" && "$("debug":T=QV)"
112			O += debug=$(debug)
113			if debug
114				N += --debug-symbols
115			else
116				N += --nodebug-symbols
117			end
118		end
119		if ! "$(-?instrument)" && "$("instrument":T=QV)"
120			O += instrument=$(instrument)
121			if instrument != ""
122				N += --instrument=$(instrument)
123			else
124				N += --noinstrument
125			end
126		end
127		if ! "$(-?link)" && "$("link":T=QV)"
128			O += link=$(link)
129			if link == "1"
130				N += --link
131			elif link == "0"
132				N += --nolink
133			else
134				N += --link=$(link)
135			end
136		end
137		if ! "$(-?prefix-include)" && "$("prefixinclude":T=QV)"
138			O += prefixinclude=$(prefixinclude)
139			if prefixinclude
140				N += --prefix-include
141			else
142				N += --noprefix-include
143			end
144		end
145		if ! "$(-?static-link)" && "$("static":T=QV)"
146			O += static=$(static)
147			if static
148				N += --static-link
149			else
150				N += --nostatic-link
151			end
152		end
153		if N
154			set $(N)
155			if .MAKEVERSION. >= 20050701
156				error 1 $(O): obsolete: use $(N)
157			end
158		end
159	end
160
161/*
162 * made when the base rules are loaded
163 *
164 * makerules options are set up here
165 */
166
167.MAKERULES.LOAD : .MAKE .VIRTUAL .FORCE .IMMEDIATE
168	local O N
169
170	/*
171	 * rule vs. engine incompatibility is ethereal
172	 * changes to edit ops and probe info are the main factors
173	 * but changing the date should not be taken lightly
174	 */
175
176	.MAKEVERSION. := $(MAKEVERSION:@/.* //:/-//G)
177	if .MAKEVERSION. < 20040909
178		error 3 version $(.MAKEVERSION.:/^\(....\)\(..\)\(..\)$/\1-\2-\3/) incompatible with base rules version $(.RULESVERSION.:/^\(....\)\(..\)\(..\)$/\1-\2-\3/)
179	end
180
181	/*
182	 * exported options
183	 */
184
185	if MAKE_OPTIONS && ! "$(-mam:N=static*)"
186		for O $(MAKE_OPTIONS)
187			if O == "-*"
188				set $(O)
189			else if O == "*([^=])[[:upper:].]*([^=])=*"
190				eval
191				$(O:V)
192				end
193			else
194				set --$(O:V)
195			end
196		end
197	end
198	if "$(-view-verify)" && ! "$(*.VIEW:O=2)"
199		error $(-view-verify) viewpath not set
200	end
201	if "$(-mam:N=(regress|static)*)"
202		.MAMROOT. := $(PWD:C@.*/src/@/src/@:C@/[^/]*@/..@G:C@/@@)
203		.MAKE : .MAM.LOAD
204	end
205	PAXFLAGS &= $$(MAKEPATH:C@:@ @G:N!=...*:C@.*@-s\@&/*\@\@@) $$(PWD:C@.*@-s\@&/*\@\@@)
206	.MAKE : .PROBE.LOAD
207
208/*
209 * binding directory lists
210 */
211
212PKGDIRS = $(LIBDIR) $(*.VIEW:X=$(VROOT)/$(LIBDIR:B:S)) $(MAKERULESPATH:/:/ /G::D)
213LCLDIRS = /usr/local/arch/$(_hosttype_):/usr/local
214OPTDIRS = $(INSTALLROOT)/opt:/usr/add-on:/usr/addon:/usr/contrib:$(LCLDIRS):/opt
215STDDIRS = /:/usr
216USRDIRS = $(LCLDIRS):$(OPTDIRS):$(STDDIRS)
217
218/*
219 * common directories
220 */
221
222INSTALLROOT = $(HOME)
223
224BINDIR = $(INSTALLROOT)/bin
225DLLDIR = $(CC.DLL.DIR)
226ETCDIR = $(INSTALLROOT)/etc
227FUNDIR = $(INSTALLROOT)/fun
228INCLUDEDIR = $(INSTALLROOT)/include
229LIBDIR = $(INSTALLROOT)/lib
230LOCALEDIR = $(INSTALLROOT)/lib/locale
231MANDIR = $(INSTALLROOT)/man/man
232SHAREDIR = $(INSTALLROOT)/share
233TMPDIR = /usr/tmp
234
235/*
236 * common files
237 */
238
239CATALOG = $(.CATALOG.NAME.)
240HTMLINITFILES = 2HTML:$(HOME)/.2html
241LICENSE =
242LICENSEFILE = LICENSE
243LICENSEFILEDEFAULT =
244LICENSEFILES = $(.PACKAGE.license) $(LICENSE:/,.*//:N!=*=*:/.*/$(.PACKAGE.)-& &) $(LICENSEFILE) $(LICENSEFILEDEFAULT) $(.PACKAGE.:X=$$(.PACKAGE.):C,/,-,) $(.PACKAGE.:X=$$(PWD:C,^$(INSTALLROOT)/[^/]*/[^/]*/,,:C,/.*,,:/^lib//:/lib$//):C,/,-,) $(.PACKAGE.)
245LICENSEINFO = $(.FIND. lib/package .lic $(LICENSEFILES))
246LICENSECLASS = $(LICENSEINFO:P=W=$(LICENSE),query=${type}.${class})
247
248/*
249 * language processor suffix equivalences
250 */
251
252.SUFFIX.c = .c
253.SUFFIX.HEADER.c = .h
254.SUFFIX.C = .C .cc .cpp .cxx .c++
255.SUFFIX.f = .f .F
256.SUFFIX.r = .r .R
257
258.COMMAND.CC = g++ CC c++ cxx
259
260/*
261 * $(sh echo hello) may be handier than :COMMAND:
262 * $(.sh. ...) will not be frozen in .mo
263 */
264
265.sh. : .SPECIAL .VIRTUAL .FUNCTIONAL .FORCE .REPEAT .ALWAYS .LOCAL
266	set -
267	$(%)
268
269/*
270 * $(.FIND. sibling suffix file ...)
271 *
272 * find file ... in sibling dir on PATH with suffix
273 * - sibling ignores sibling
274 * - suffix ignores suffix
275 */
276
277.FIND. : .FUNCTION
278	local ( SIBLING SUFFIX FILES ... ) $(%:/:/ /G)
279	local D F P X
280	P = $(SIBLING:N=lib/package:+$(PACKAGEROOT)/bin) $(PATH) $(PKGDIRS)
281	P := $(P:/:/ /G:D:T=F)
282	for F $(FILES)
283		if X = "$(F:T=FR)"
284			return $(X)
285		end
286		if "$(X:S)" != "*.*" && SUFFIX != "-"
287			if X = "$(F:D:B:S=$(SUFFIX):T=FR)"
288				return $(X)
289			end
290		end
291		if F == "*/*" || SIBLING == "-"
292			D =
293		else
294			D = =$(SIBLING)
295		end
296		if X = "$(P:X=$(F:D$(D):B:S):T=FR)"
297			return $(X:O=1)
298		end
299		if "$(F:S)" != "*.*" && SUFFIX != "-"
300			if X = "$(P:X=$(F:D$(D):B:S=$(SUFFIX)):T=FR)"
301				return $(X:O=1)
302			end
303		end
304	end
305
306/*
307 * $(INSTRUMENT_$(-instrument:O=1:B)) is eval'd in .MAKEINIT
308 */
309
310INSTRUMENT_app = : $(.INSTRUMENT.app)
311INSTRUMENT_insight = command=CC root=INSIGHT bin=bin.$(_hosttype_)
312INSTRUMENT_purecov = command=CCLD root=PURE_HOME CCFLAGS=$(CC.DEBUG)
313INSTRUMENT_purify = command=CCLD root=PURE_HOME
314INSTRUMENT_quantify = command=CCLD root=PURE_HOME CCFLAGS=$(CC.DEBUG)
315INSTRUMENT_sentinel = command=CCLD root=SE_HOME CCFLAGS=$(CC.DEBUG)
316
317.INSTRUMENT.app : .FUNCTION
318	if ! ( APP = "$(PATH:/:/ /G:X=../lib/app/cpp:P=X:O=1)" )
319		error 3 app not found
320	end
321	CPP = $(APP)
322	CPPFLAGS = $(CCFLAGS:N=-[DIU]*)
323	LDLIBRARIES += -lapp
324	.SOURCE.a : $(APP:D:D)
325
326.INSTRUMENT.notfound : .FUNCTION
327	error 3 $(-instrument) not found
328
329/*
330 * standard versions to avoid ETXTBSY during installation
331 */
332
333for .X. cat cmp cp ln mv rm
334	eval
335	STD$(.X.:F=%(upper)s) := $(STDDIRS:/:/ /G:X=bin/$(.X.):P=X:O=1)
336	end
337end
338.X. := $(STDLN)
339STDLN := $$(_feature_:N=ln:?$(.X.)?$$(STDCP)?)
340
341/*
342 * action related symbols
343 */
344
345
346AR = $(CC.AR) $(CC.AR.ARFLAGS)
347ARFLAGS = $(ARHYPHEN)r
348ARHYPHEN =	/* XXX: change to ``-'' when sun4 finally expires */
349AS = as
350if "$(PATH:/:/ /G:X=awk:P=X)"
351AWK = awk
352elif "$(PATH:/:/ /G:X=nawk:P=X)"
353AWK = nawk
354elif "$(PATH:/:/ /G:X=gawk:P=X)"
355AWK = gawk
356else
357AWK = awk
358end
359BISON = bison
360BISONFLAGS = -d
361cc = cc
362CC = cc
363CCFLAGS = $(CC.OPTIMIZE)
364CCLD = $(CC)
365CCLDFLAGS =
366CCSPECIALIZE =
367CHGRP = chgrp
368CHMOD = chmod
369CHOWN = chown
370CMP = cmp
371CMPFLAGS = -s
372CP = cp
373CPIO = cpio
374CPP = $(MAKEPP)
375CPPFLAGS = $(CCFLAGS:N=-[DIU]*)
376CPR = cp
377CPRFLAGS = -pr
378
379if "$(PATH:/:/ /G:X=ctags:P=X)"
380	CTAGS = ctags
381end
382
383DIFF = diff
384DIFFFLAGS = -u
385EGREP = egrep
386F77 = f77
387FLEX = flex
388FLEXFLAGS = -l
389GREP = grep
390HOSTCC = $(CC)
391IFFE = iffe
392IFFESRCDIR = features
393IFFEGENDIR = FEATURE
394IFFEFLAGS = -v
395IFFECC = $(CC)
396IFFECCFLAGS = $(CCFLAGS)
397IFFELDFLAGS = $(LDFLAGS)
398IFFEREFS =
399IGNORE = ignore
400LD = $(CC.LD)
401LDFLAGS =
402LDSHARED = $(CC.SHARED.LD|CC.LD)
403LDRUNPATH = $(CC.RUNPATH)
404if "$(sh if $(FLEX) $(FLEXFLAGS) --version >/dev/null 2>&1; then echo 0; else echo 1; fi)" == "0"
405LEX = $(FLEX)
406LEXFLAGS = $(FLEXFLAGS)
407else
408LEX = lex
409LEXFLAGS =
410end
411
412.T. = $(USRDIRS:/:/ /G:X=lib/lint) $(USRDIRS:/:/ /G:X=lib/cmplrs/cc) $(USRDIRS:/:/ /G:X=ccs/lib)
413if .T. = "$(.T.:X=lint1:P=X:O=1)"
414LINTLIB := $(.T.:D)
415else
416LINTLIB = /usr/lib
417end
418LINTLIBRARIES = libc$(CC.SUFFIX.ARCHIVE)
419LINT1 = $(LINTLIB)/lint1
420LINT2 = $(LINTLIB)/lint2
421if ! "$(_release_:N=V)"
422LINTFLAGS = -bh
423end
424
425LN = $(_feature_:N=ln:?ln?$(CP)?)
426LPR = lpr
427
428if "$(PATH:/:/ /G:X=lprof:P=X)"
429LPROF = lprof
430end
431
432LS = ls
433M4 = m4
434
435if "$(PATH:/:/ /G:X=mcs:P=X)"
436MCS = mcs
437MCSFLAGS = -d
438end
439
440MKDIR = mkdir
441MM2HTML = mm2html
442MM2HTMLINFO = $(LICENSEINFO)
443MM2HTMLINIT = $(HTMLINITFILES:/:/ /G:T=F:O=1)
444MM2HTMLFLAGS = $(MM2HTMLINFO:@Q:/^/-l /) $(MM2HTMLINIT:@Q:/^/-h /) $(LICENSE:@/^/-o /:@Q)
445MV = mv
446MVFLAGS = -f
447if "$(PATH:/:/ /G:X=nawk:P=X)"
448NAWK = nawk
449elif "$(PATH:/:/ /G:X=gawk:P=X)"
450NAWK = gawk
451else
452NAWK = awk
453end
454NM = $(CC.NM)
455NMEDIT = $(CC.NMEDIT) -e '/^$(CC.PREFIX.SYMBOL)_STUB_/d' -e '/$(CC.PREFIX.SYMBOL)_already_defined$/d'
456NMFLAGS = $(CC.NMFLAGS)
457PACKAGE =
458PACKAGE_IGNORE =
459PACKAGE_LOCAL = $(.PACKAGE.:O=1)_
460PACKAGE_PATH = $(PACKAGE)
461PAX = pax
462PERL = perl
463PPCC = $(MAKERULESPATH:/:/ /G:X=ppcc:P=X:O=1)
464PPCCFLAGS =
465PR = pr
466PROTO = proto
467PROTOEDIT =
468PROTOFLAGS = -s $(LICENSEINFO:$(PROTOEDIT):/^/-l /) $(LICENSE:@/^/-o /:@Q)
469RANLIB = $(IGNORE) ranlib
470REGRESS = regress
471REGRESSFLAGS =
472RM = rm
473RMFLAGS = -f
474RMRECURSEFLAGS = -r
475SED = sed
476SHAR = shar
477SHELLMAGIC = $(CC.SHELLMAGIC)
478SILENT = silent
479SORT = sort
480STRIP = $(CC.STRIP)
481STRIPFLAGS = $(CC.STRIP.FLAGS)
482TAR = tar
483TARFLAGS = v
484VARIANT =
485VARIANTID =
486
487if "$(PATH:/:/ /G:X=vgrind:P=X)"
488VGRIND = vgrind
489end
490
491if ! "$(PATH:/:/ /G:X=yacc:P=X)" && "$(PATH:/:/ /G:X=bison:P=X)"
492YACC = $(BISON)
493YACCFLAGS = -y $(BISONFLAGS)
494else
495YACC = yacc
496YACCFLAGS = -d
497end
498
499/*
500 * special symbols
501 */
502
503.BUILT. = $(...:T=XU:A!=.TERMINAL:T=F:P=L:N!=/*$(.INSTALL.LIST.:@/ /|/G:/^./|&/)$(VROOT:?|$(VROOT)/*??)$(-global:@/:/|/G:/^./|&/)|$(CATALOG).msg:T=G)
504.CLOBBER. = $(".":L=*.([it]i|l[hn])) core
505.FILES. = $(LICENSEFILE)
506.MANIFEST.FILES. = $(*.COMMON.SAVE:T=F) $(.SELECT.:A!=.ARCHIVE|.COMMAND|.OBJECT|.TARGET)
507.MANIFEST. = $(.MANIFEST.FILES.:P=F:T=FR:P=C:H=U)
508.SOURCES. = $(.SELECT.:A=.REGULAR:A!=.ARCHIVE|.COMMAND|.OBJECT)
509
510/*
511 * stop expansion of certain state variables
512 */
513
514(AR) (ARFLAGS) (AS) (ASFLAGS) (CPP) (CC) (CCFLAGS) (CCLD) \
515	(CCLDFLAGS) (COATTRIBUTES) (COBOL) (COBOLDIALECT) (COBOLFLAGS) \
516	(F77) (F77FLAGS) (IFFE) (IFFEFLAGS) (LD) (LDFLAGS) (LDLIBRARIES) \
517	(LDSHARED) (LEX) (LEXFLAGS) (M4) (M4FLAGS) (PERLMAGIC) \
518	(PROTO) (PROTOFLAGS) (SHELLMAGIC) \
519	(YACC) (YACCFLAGS) : .PARAMETER
520
521/*
522 * mark actions that operate on built objects
523 */
524
525.ONOBJECT : .ATTRIBUTE
526
527/*
528 * file attributes
529 */
530
531.OBJECT : .ATTRIBUTE
532
533include "Scanrules.mk"
534
535/*
536 * pattern association attributes
537 */
538
539.INSTALL. :
540.INSTALL.%.COMMAND : $$(BINDIR)
541.INSTALL.%.ARCHIVE : $$(LIBDIR)
542
543/*
544 * naming conventions
545 */
546
547.CATALOG.NAME. : .FUNCTION
548	local N
549	if ID == "+([A-Za-z0-9_])"
550		N := $(ID)
551		if PWD == "*/lib/*"
552			N := lib$(N)
553		end
554	elif "$(PWD:B)" == "cc-*"
555		N := $(PWD:D::B)
556	elif "$(PWD:D::B)" == "?*lib"
557		N := $(PWD:D::B:/lib$//)$(PWD:B)
558	else
559		N := $(PWD:B)
560	end
561	return $(N)
562
563.DLL.NAME. : .FUNCTION .PROBE.INIT
564	local L
565	if "$(CC.DLL)"
566		if "$(.SHARED.DEF.:A=.TARGET)"
567			L := $($(.SHARED.DEF.) - $(%))
568		else
569			L := $(CC.PREFIX.SHARED)$(%:O=1)$(CC.SUFFIX.SHARED)
570			if "$(%:O=2)" == "[0-9]*"
571				L := $(L).$(%:O=2)
572			end
573		end
574	end
575	return $(L)
576
577.LIB.NAME. : .FUNCTION .PROBE.INIT
578	local T
579	if ! .NO.LIB.TYPE && "$(-lib-type)"
580		if ! ( T = "$(.PACKAGE.$(%:O=1).type)" )
581			T := $(CC.LIB.TYPE)
582		elif T == "-"
583			T =
584		end
585	end
586	return $(CC.PREFIX.ARCHIVE)$(%:O=1)$(T)$(CC.SUFFIX.ARCHIVE)
587
588/*
589 * bind overrides
590 */
591
592+ldl : .VIRTUAL
593
594for .S. dl m /* dynamic unless explicitly overridden */
595	-l$(.S.) : .DONTCARE
596	.PACKAGE.$(.S.).library := -l
597end
598
599.NO.LIB.TYPE = 0
600
601.LIB.TYPE. : .FUNCTION
602	local P T
603	if "$(%)" == "*/*"
604		if CC.PREFIX.DYNAMIC || CC.SUFFIX.DYNAMIC
605			T := $(%:D)/$(CC.PREFIX.DYNAMIC)$(%:B)$(CC.SUFFIX.DYNAMIC)
606		else
607			T := $(%:D)/$(CC.PREFIX.SHARED)$(%:B)$(CC.SUFFIX.SHARED)
608		end
609		if T = "$(*.SOURCE.%.ARCHIVE:X=$(T):T=F:O=1)"
610			return $(T)
611		end
612	end
613	if ! .NO.LIB.TYPE
614		if "$(-lib-type)" && "$(.PACKAGE.$(%).type)" != "-"
615			for P $(.PACKAGE.$(%).type) $(CC.LIB.TYPE)
616				/* libX-P.a or libX_P.a or libP/libX.a */
617				T := $(CC.PREFIX.ARCHIVE)$(%)$(P)$(CC.SUFFIX.ARCHIVE)
618				if ! "$(T:A=.TARGET)" && ! "$(T:T=F)"
619					T := $(CC.PREFIX.ARCHIVE)$(%)(P:/-/_/)$(CC.SUFFIX.ARCHIVE)
620					if ! "$(T:A=.TARGET)" && ! "$(T:T=F)"
621						T := lib$(P:/-//)/$(CC.PREFIX.ARCHIVE)$(%)$(CC.SUFFIX.ARCHIVE)
622					end
623				end
624				if "$(T:A=.TARGET)" || "$(T:T=F)"
625					return $(T)
626				end
627			end
628		end
629	end
630
631.BIND.+l% : .FUNCTION
632	local A B L
633	B := $(%:/+l//)
634	A := $(CC.PREFIX.ARCHIVE)$(B)$(CC.SUFFIX.ARCHIVE)
635	if "$(-mam:N=static*,port*)"
636		if L = "$(A:A=.TARGET)"
637			return $(L)
638		end
639		L := -l$(B)
640		if "$(%:A=.DONTCARE)"
641			$(L) : .DONTCARE
642		end
643		return + $(L:T=F)
644	end
645	if ( L = "$(.LIB.TYPE. $(B))" )
646		return $(L)
647	end
648	if ( L = "$(A:A=.TARGET)" )
649		return $(L)
650	end
651	if ! "$(.LIBRARY.LIST.)" || "$(.PACKAGE.LIBRARY. $(B))" != "-l"
652		if "$(.REQUIRE.-l% -l$(B):/[-+]l//:N=$(B))"
653			if ( L = "$(A:T=F)" )
654				return $(L)
655			end
656		end
657	end
658	A := $(%:/+l/-l/)
659	if ! ( L = "$(A:T=F)" )
660		if "$(A:A=.DONTCARE)"
661			$(%) : .DONTCARE
662		end
663	end
664	return $(L)
665
666.BIND.-l% : .FUNCTION
667	local A B D T V X
668	if "$(%)" != "[-+]l*"
669		return $(%)
670	end
671	B := $(%:/[-+]l//)
672	if "$(-mam:N=static*,port*)" && ! .BIND.REAL.
673		if "$(%)" != "-l+([a-zA-Z0-9_])"
674			$(%) : .DONTCARE
675			return + $(%)
676		end
677		.BIND.REAL. = 1
678		A := $(.BIND.-l% $(%):T=F)
679		.BIND.REAL. =
680		V := ${mam_lib$(B)}
681		if "$(%:A=.DONTCARE)" && "$(A:N=/*)"
682			print -um bind -l$(B) dontcare
683			return + $(V)
684		elif T = "$(%:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1$(CC.SUFFIX.ARCHIVE)/:A=.TARGET)"
685			return $(T)
686		else
687			$(V) : .DONTCARE
688			return $(V:T=F)
689		end
690	end
691	if ( T = "$(.LIB.TYPE. $(B))" )
692		return $(T)
693	end
694	if ( "$(-static-link)" || "$(.PACKAGE.LIBRARY. $(B))" == "+l" ) && "$(<<)" != ".BIND.+l%"
695		V := $(CC.PREFIX.ARCHIVE)$(B)$(CC.SUFFIX.ARCHIVE)
696		if ( T = "$(V:A=.TARGET)" )
697			return $(T)
698		end
699		if ( T = "$(V:T=F)" )
700			if "$(T:D)" != "$(CC.STDLIB:/ /|/G)" && "$(T:D)" != "/usr/($(.PACKAGE.:/ /|/G))"
701				$(T) : -IGNORE
702				return $(T)
703			end
704		end
705	end
706	if "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:N=$(CC.DYNAMIC))" || ! "$(CCLDFLAGS:N=$(CC.STATIC))" )
707		if ( CC.SUFFIX.DYNAMIC || ! "$(-local-static)" ) && CC.SUFFIX.SHARED && ! "$(.PLUGIN.$(B))"
708			if CC.SUFFIX.DYNAMIC
709				T := $(*$(B):N=*$(CC.SUFFIX.DYNAMIC))
710				if "$(CC.PREFIX.DYNAMIC)" != "$(CC.PREFIX.SHARED)"
711					if CC.PREFIX.DYNAMIC
712						T := $(T:D:B=$(T:B:/$(CC.PREFIX.DYNAMIC)/$(CC.PREFIX.SHARED)/):S=$(CC.SUFFIX.SHARED))
713					else
714						T := $(T:D:B=$(T:B:/^/$(CC.PREFIX.SHARED)/):S=$(CC.SUFFIX.SHARED))
715					end
716				else
717					T := $(T:D:B:S=$(CC.SUFFIX.SHARED))
718				end
719			else
720				T := $(*$(B):N=*$(CC.SUFFIX.SHARED)*(.+([0-9])))
721			end
722			if "$(T:A=.TARGET)"
723				if ( X = "$(*.INSTALL:N=*/$(T))" )
724					make $(X)
725					return - $(X)
726				end
727				return $(T)
728			end
729			if ( T = "$(*$(B):N=-l$(B):/-l//)" )
730				T := $(T)$($(B).VERSION:/[^0-9]//G)
731				if ( T = "$(T:B:S=$(CC.SUFFIX.SHARED):A=.TARGET)" )
732					if ( X = "$(*.INSTALL:N=*/$(T))" )
733						make $(X)
734						return - $(X)
735					end
736					return $(T)
737				end
738			end
739		end
740		if ( T = "$(%:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1$(CC.SUFFIX.ARCHIVE)/:A=.TARGET)" )
741			if "$(PACKAGE_OPTIONS:N=optimize-space)" && "$(CC.SUFFIX.SHARED)"
742				if ( V = "$(*$(B):N=*$(CC.SUFFIX.SHARED)*:A=.TARGET)" )
743					A := $(V:/\(.*$(CC.SUFFIX.SHARED)\).*/\1/)
744					if "$(A)" != "$(V)"
745						$(A) : $(V)
746							$(LN) -f $(*) $(<)
747						V := $(A)
748					end
749					.MAKE : $(V)
750					$(%) : .NULL
751					return $(%)
752				end
753			end
754			return $(T)
755		else
756			local H I J L P Q S Z
757			L := $(%)
758			V :=
759			if P = "$(PACKAGE_$(B)_VERSION)"
760				P := ?([-.])$(P)
761			end
762			if T = "$(PACKAGE_$(B)_LIB)"
763				if ! "$(.PACKAGE.stdlib:N=$(T))"
764					.SOURCE.a : $(T)
765				end
766			end
767			for J $(CC.PREFIX.SHARED) ''
768				for I $(P) ''
769					if "$(CC.SUFFIX.DYNAMIC)"
770						if T = "$(*.SOURCE.%.ARCHIVE:L>$(CC.PREFIX.ARCHIVE)$(B)$(I)$(CC.SUFFIX.ARCHIVE)|$(J)$(B)$(I)$(CC.SUFFIX.SHARED))"
771							if "$(CC.SUFFIX.SHARED)"
772								if T != "*$(CC.SUFFIX.SHARED)" && T == "*$(CC.SUFFIX.ARCHIVE)"
773									if S = "$(T:D:B=$(J)$(T:B:/$(CC.PREFIX.ARCHIVE)//):S=$(CC.SUFFIX.SHARED):T=F)"
774										T := $(S)
775									end
776								end
777							end
778							T := $(T:T=F)
779							Q = .ARCHIVE
780							if ! "$(-force-shared)" && ! "$(-static-link)" && ! "$(CC.SUFFIX.DYNAMIC)" && "$(CC.SUFFIX.SHARED)" && T == "*$(CC.SUFFIX.SHARED)"
781								Q += .IGNORE
782							end
783							$(%) $(T) : $(Q)
784							return $(T)
785						end
786					elif "$(J)" || ! "$(CC.PREFIX.SHARED)"
787						if ! S
788							if "$(CC.SUFFIX.STATIC)"
789								S = |$(CC.SUFFIX.STATIC)
790							end
791							if "$(CC.SUFFIX.SHARED)"
792								S := $(S:V)|$(CC.SUFFIX.SHARED)
793								if "$(CC.SUFFIX.SHARED)" != "$(CC.SUFFIX.OBJECT)"
794									H = -
795									if "$(CC.DIALECT:N=VERSION)"
796										Z = 1
797									end
798								end
799							end
800						end
801						while 1
802							T := $(*.SOURCE.%.ARCHIVE:L!>$(L:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1/)$(I)@($(V)$(CC.SUFFIX.ARCHIVE)$(S)))
803							if ! T && Z
804								T := $(*.SOURCE.%.ARCHIVE:L!>$(L:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1/)$(I)@($(V)$(CC.SUFFIX.ARCHIVE)$(S)$(V)*))
805							end
806							if T
807								if ! "$(CC.SUFFIX.SHARED)" || T != "*$(CC.SUFFIX.SHARED)"
808									if T == "*$(CC.SUFFIX.ARCHIVE)"
809										if "$(CC.STDLIB:N=$(T:D))"
810											return - $(T:T=F)
811										end
812										return $(H) $(T:B:S)
813									end
814									if "$(CC.SUFFIX.STATIC)" && T == "*$(CC.SUFFIX.STATIC)"
815										H = -
816									end
817								end
818								T := $(T:B:S)
819								Q = .ARCHIVE
820								if ! "$(-force-shared)" && ! "$(-static-link)" && ! "$(CC.SUFFIX.DYNAMIC)" && "$(CC.SUFFIX.SHARED)" && T == "*$(CC.SUFFIX.SHARED)"
821									Q += .IGNORE
822								end
823								$(%) $(T) : $(Q)
824								return $(H) $(T:T=F)
825							end
826							if ! "$(L:N=*+(.+([0-9])))"
827								break
828							end
829							T := $(L:/\.[0-9]*$//)
830							V := $(L:/$(T)//)$(V)
831							L := $(T)
832						end
833					end
834				end
835			end
836		end
837	else
838		T := $(CC.PREFIX.ARCHIVE)$(B)$(CC.SUFFIX.ARCHIVE)
839		if "$(%:A=.DONTCARE)"
840			$(T) : .DONTCARE
841		end
842		return $(T)
843	end
844	if ! "$(.BOUND.$(B))"
845		.BOUND.$(B) := 1
846		if T = "$(CC.REQUIRE.$(B))"
847			$(%) : .DONTCARE
848			return $(T)
849		elif T = "$(B:B:S=.req:T=F)"
850			$(%) : .DONTCARE
851			return $(T:T=I)
852		else
853			T := lib/$(B)
854			$(T) : .ARCHIVE
855			if ! "$(T:T=F)"
856				T := $(MAKELIB:D)/$(T)
857			end
858			if "$(T:T=F)"
859				T := $(T:T=I)
860				if ! "$(T:N=[-+]l$(B))"
861					$(%) : .DONTCARE
862				end
863				return $(T)
864			end
865		end
866	end
867
868.BIND.-u% : .FUNCTION
869	$(%) : .NULL
870
871.BIND.$"{"mam_lib%"}" : .FUNCTION
872	if "$(-mam:N=static*,port*)"
873		local L T
874		L := $(%:/\${mam_lib\(.*\)}/\1/)
875		T := $(CC.PREFIX.ARCHIVE)$(L)$(CC.SUFFIX.ARCHIVE)
876		if ( T = "$(T:T=F)" )
877			print -um bind -l$(L)
878			return - $(T)
879		else
880			-l$(L) : .DONTCARE
881			return + $(%)
882		end
883	end
884
885/*
886 * .REQUIRE.-l% helper that includes pkg-*.mk of lib and prereqs
887 * before any -l bindings -- needed because the package lib is
888 * probably linked last but the pkg-*.mk rules may give binding
889 * hints for prereq libs
890 */
891
892"{" "}" : .VIRTUAL .IGNORE .DONTCARE
893
894.REQUIRED. : .FUNCTION
895	local A L R
896	for L $(%)
897		if A = "$(L:A<.REQUIRE.)"
898			R += $($(A) $(L))
899		end
900	end
901	return $(R)
902
903.REQUIRE.RULES. : .FUNCTION
904	local B R T D DL DR
905	B := $(%:/[-+]l//)
906	if "$(-mam:N=static*)" && "$(%)" != "[-+]l+([a-zA-Z0-9_])"
907		return
908	end
909	for D 1 2
910		if ( T = "$(CC.REQUIRE.$(B))" )
911			if "$(-mam:N=static*)"
912				return
913			end
914			return $(T)
915		end
916		if ( T = "$(PACKAGE_$(B)_LIB)" )
917			if T == "$(%:T=F:P=D)"
918				T := $(T)/lib/$(B)
919				if ( T = "$(T:T=F)" )
920					return $(T:T=I)
921				end
922				return $(%)
923			end
924		end
925		if "$(.PACKAGE.$(B).rules)"
926			break
927		end
928		R := pkg-$(B).mk
929		if R = "$(R:T=F)"
930			include + $(R)
931			.PACKAGE.$(B).rules := $(R)
932		else
933			.PACKAGE.$(B).rules := -
934			break
935		end
936	end
937	if ! ( T = "$(%:/[-+]l\(.*\)/\1.req/:T=F)" )
938		R := lib/$(B)
939		$(R) : .ARCHIVE
940		if ! ( T = "$(R:T=F)" )
941			R := $(MAKELIB:D)/$(R)
942			if ! ( T = "$(R:T=F)" )
943				return $(%)
944			end
945		end
946		.REQUIRED.$(B) := 1
947		if "$(-mam:N=static*,port*)"
948			return ${mam_lib$(B)}
949		end
950		/* req must be seen at or before the lib */
951		DL := $(%:T=WF:P=D)
952		DR := $(T:P=D)
953		if DL != "$(DR)"
954			for D $(*.SOURCE.%.ARCHIVE:N!=.)
955				if D == "$(DR)"
956					break
957				end
958				if D == "$(DL)"
959					return $(%)
960				end
961			end
962		end
963	elif "$(-mam:N=static*,port*)"
964		return ${mam_lib$(B)}
965	end
966	.REQUIRED.$(B) := 1
967	T := $(T:T=I)
968	if "$(T:N=+l$(B))"
969		.PACKAGE.$(B).library := +l
970	end
971	return $(T)
972
973.REQUIRE.-l% : .FUNCTION
974	local B H L R S
975	R := $(.REQUIRE.RULES. $(%))
976	for L $(R)
977		B := $(L:/-l//)
978		if ! "$(.PACKAGE.$(B).rules)"
979			H := pkg-$(B).mk
980			if H = "$(H:T=F)"
981				include + $(H)
982				.PACKAGE.$(B).rules := $(H)
983			else
984				.PACKAGE.$(B).rules := -
985			end
986		end
987	end
988	B := $(%:/[-+]l//)
989	if "$(.PACKAGE.LIBRARY. $(B))" == "+l"
990		if "$(-all-static)"
991			H =
992			for L $(R)
993				S := $(L:/-l/+l/)
994				if "$(S:A=.VIRTUAL)" || "$(.PACKAGE.LIBRARY. $(L:/[-+]l//))" == "-l"
995					H += $(L)
996				else
997					H += $(S)
998				end
999			end
1000			return { $(H) }
1001		end
1002		return { $(R:/-l$(B)/+l$(B)/) }
1003	end
1004	return { $(R) }
1005
1006.REQUIRE.+l% : .FUNCTION
1007	local A B L S
1008	B := $(%:/+l//)
1009	L := $(.REQUIRE.-l% -l$(B))
1010	if "$(-all-static)"
1011		for B $(L)
1012			S := $(B:/-l/+l/)
1013			if "$(S:A=.VIRTUAL)" || "$(.PACKAGE.LIBRARY. $(B:/[-+]l//))" == "-l"
1014				A += $(B)
1015			else
1016				A += $(S)
1017			end
1018		end
1019		return $(A)
1020	end
1021	return $(L:/-l$(B)/+l$(B)/)
1022
1023.SOURCE.%.ARCHIVE : .FORCE $$(*.SOURCE.a) $$(*.SOURCE)
1024
1025/*
1026 * some actions cannot operate concurrently
1027 */
1028
1029.LEX.SEMAPHORE .YACC.SEMAPHORE : .SEMAPHORE
1030
1031/*
1032 * target property metarules
1033 */
1034
1035.LD.KEEP. = $(CC.SUFFIX.LD) $(-ld-script)
1036.ARCHIVE.OMIT. = $(CC.LD.STATIC)|$(CC.LD.DYNAMIC)$(.LD.KEEP.:/^/|*/:/ //G)
1037
1038.ARCHIVE.o : .USE .ARCHIVE (AR) (ARFLAGS) .ARPREVIOUS .ARUPDATE .ARCLEAN
1039	$(^:?$$(CP) $$(^) $$(<)$$("\n")??)$(.ARPREVIOUS.$(<:B:S):@?$(IGNORE) $$(AR) $$(ARHYPHEN)d $$(<) $$(.ARPREVIOUS.$$(<:B:S))$$("\n")??)$(>:N!=$(.ARCHIVE.OMIT.):K=$(AR) $(ARFLAGS) $(<))
1040
1041.ARPREVIOUS : .MAKE .VIRTUAL .FORCE .REPEAT .IGNORE
1042	eval
1043	$(<).$(<<:B:S) = $(*$(<<:T=SR):N!=$(**:@/ /|/G))
1044	end
1045
1046.ARUPDATE : .AFTER .IGNORE .VIRTUAL .FORCE .REPEAT
1047	$(<<:T=A)
1048
1049.ARCOPY : .AFTER .IGNORE .VIRTUAL .FORCE .REPEAT
1050	$(**:O=1:P=I=$(<<):?: $(<<) linked to $(**:O=1)?$(<<:T=AF)?)
1051
1052.ARCLEAN.LIST. : .FUNCTION
1053	local I V
1054	if ! .AR.RETAIN
1055		for I $(***:T=F:T=G:P=L:A!=.ARCHIVE|.TERMINAL:N!=$(.ARCHIVE.OMIT.):$(-archive-clean))
1056			if ! "$(~$(I):A=.FORCE:A!=.IGNORE)"
1057				V += $(I)
1058			end
1059		end
1060	end
1061	return $(V)
1062
1063.ARCLEAN : .AFTER .IGNORE .VIRTUAL .FORCE .REPEAT
1064	$(.ARCLEAN.LIST.:K=$(RM) $(RMFLAGS))
1065
1066.COMMAND.o : .USE .COMMAND (CCLD) (CCLDFLAGS) $$(LDLIBRARIES)
1067	$(CCLD) $(CCLDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
1068
1069.OBJECT.o : .USE (LD) (LDFLAGS)
1070	$(LD) -r $(LDFLAGS) -o $(<) $(*)
1071
1072/*
1073 * match-all metarules
1074 */
1075
1076for .S. $(.SUFFIX.c) $(.SUFFIX.C)
1077	% : %$(.S.) (CC) (CCFLAGS) (CCLDFLAGS) $$(LDLIBRARIES)
1078		$(CC) $(CCFLAGS) $(CCLDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
1079end
1080
1081for .S. $(.SUFFIX.f) $(.SUFFIX.r)
1082	% : %$(.S.) (F77) (F77FLAGS) (LDFLAGS) $$(LDLIBRARIES)
1083		$(F77) $(F77FLAGS) $(LDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
1084end
1085
1086% : %.fql (F77) (CCFLAGS) (F77FLAGS) (LDFLAGS) $$(LDLIBRARIES)
1087	$(F77) $(CCFLAGS) $(F77FLAGS) $(LDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
1088
1089% : %.s (ASFLAGS) (LDFLAGS) $$(LDLIBRARIES)
1090	$(CC) $(ASFLAGS) $(LDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
1091
1092% : %.sh (SHELLMAGIC)
1093	case $(-mam:N=(regress|static)*:/:.*//)$(-regress):$OPTIND:$RANDOM in
1094	?*:*:*|*::*|*:*:$RANDOM)
1095		;;
1096	*)	if	ENV= LC_ALL=C x= $SHELL -nc '[[ a || b ]] && : ${list[level]} $$(( 1 + $x )) !(pattern)' 2>/dev/null
1097		then	if	$(GREP) '### .*archaic.* ###' >/dev/null
1098			then	: $(<) contains archaic constructs :
1099			else	ENV= LC_ALL=C $SHELL -n $(>)
1100			fi
1101		fi
1102		;;
1103	esac
1104	case '$(SHELLMAGIC)' in
1105	"")	case $(&:T=E:@O!) in
1106		0)	$(CP) $(>) $(<)
1107			;;
1108		*)	{
1109			i=`(read x; echo $x) < $(>)`
1110			case $i in
1111			'#!'*|*'||'*|':'*|'":"'*|"':'"*)	echo "$i" ;;
1112			esac
1113			cat - $(>) <<'!'
1114	$(&:T=E)
1115	!
1116			} > $(<)
1117			;;
1118		esac
1119		;;
1120	*)	cat - $(>) > $(<) <<'!'
1121	$(SHELLMAGIC)
1122	$(&:T=E)
1123	!
1124		;;
1125	esac
1126	$(SILENT) test -w $(<) -a -x $(<) || $(CHMOD) u+w,+x $(<)
1127
1128PERLMAGIC = $("#")!/usr/bin/perl
1129
1130% : %.pl (PERLMAGIC)
1131	case '$(PERLMAGIC)' in
1132	"")	case $(&:T=E:@O!) in
1133		0)	$(CP) $(>) $(<)
1134			;;
1135		*)	{
1136			i=`(read x; echo $x) < $(>)`
1137			case $i in
1138			'#!'*|*'||'*|':'*|'":"'*|"':'"*)	echo "$i" ;;
1139			esac
1140			cat - $(>) <<'!'
1141	$(&:T=E)
1142	!
1143			} > $(<)
1144			;;
1145		esac
1146		;;
1147	*)	cat - $(>) > $(<) <<'!'
1148	$(PERLMAGIC)
1149	$(&:T=E)
1150	!
1151		;;
1152	esac
1153	$(SILENT) test -w $(<) -a -x $(<) || $(CHMOD) u+w,+x $(<)
1154
1155if "$("/bin/cat.exe":T=F)"
1156%.exe : % .NULL
1157end
1158
1159/*
1160 * double suffix metarules
1161 */
1162
1163for .S. $(.SUFFIX.c) $(.SUFFIX.C)
1164	%.o : %$(.S.) (CC) (CCFLAGS)
1165		$(CC) $(CCFLAGS) -c $(>)
1166end
1167
1168for .S. $(.SUFFIX.f) $(.SUFFIX.r)
1169	%.o : %$(.S.) (F77) (F77FLAGS)
1170		$(F77) $(F77FLAGS) -c $(>)
1171end
1172
1173%.o : %.s (AS) (ASFLAGS)
1174	$(AS) $(ASFLAGS) -o $(<) $(>)
1175
1176%.o : %.S (CC) (CCFLAGS)
1177	$(CC) $(CCFLAGS) -c $(>)
1178
1179%.c %.h : %.y .YACC.SEMAPHORE (YACC) (YACCFLAGS)
1180	if	silent $(YACC) --version >/dev/null 2>&1
1181	then	$(YACC) $(YACCFLAGS) -o$(<:N=*.c) $(YACCFIX.$(%):?-p$(YACCFIX.$(%))??) $(>)
1182	else	$(YACC) $(YACCFLAGS) $(>)$(YACCFIX.$(%):?$("\n")$(STDED) $(STDEDFLAGS) y.tab.c <<!$("\n")g/yytoken/s//yy_token/g$("\n")g/[yY][yY]/s//<<<<&>>>>/g$("\n")g/<<<<yy>>>>/s//$(YACCFIX.$(%))/g$("\n")g/<<<<YY>>>>/s//$(YACCFIX.$(%):F=%(invert)s)/g$("\n")w$("\n")q$("\n")!??)$(YACCHDR.$(%):?$("\n")$(STDED) $(STDEDFLAGS) y.tab.c <<!$("\n")1i$("\n")#include "$(YACCHDR.$(%))"$("\n").$("\n")g/extern.*malloc/d$("\n")w$("\n")q$("\n")!??)
1183		$(MV) y.tab.c $(%).c
1184		if	$(SILENT) test -s y.tab.h
1185		then	$(STDED) $(STDEDFLAGS) y.tab.h <<'!'
1186	1i
1187	$("#")ifndef _$(%:F=%(upper)s)_H
1188	$("#")define _$(%:F=%(upper)s)_H
1189	.
1190	$a
1191	$("#")endif $("/")* _$(%:F=%(upper)s)_H *$("/")
1192	.
1193	w
1194	q
1195	!
1196			$(YACCFIX.$(%):?$(STDED) $(STDEDFLAGS) y.tab.h <<!$("\n")g/yytoken/s//yy_token/g$("\n")g/yy/s//$(YACCFIX.$(%))/g$("\n")g/YY/s//$(YACCFIX.$(%):F=%(invert)s)/g$("\n")w$("\n")q$("\n")!$("\n")$(PROTO) -frs y.tab.h$("\n")??)if	$(SILENT) $(CMP) $(CMPFLAGS) y.tab.h $(%).h
1197			then	$(RM) $(RMFLAGS) y.tab.h
1198			else	$(MV) y.tab.h $(%).h
1199			fi
1200		fi
1201		if	$(SILENT) test -f y.output
1202		then	$(MV) y.output $(%).grammar
1203		fi
1204	fi
1205
1206%.c : %.l .LEX.SEMAPHORE (LEX) (LEXFLAGS) (CC)
1207	if	silent $(LEX) --version >/dev/null 2>&1
1208	then	$(LEX) $(LEXFLAGS) -o$(<) $(LEXFIX.$(%):?-P$(LEXFIX.$(%))??) $(>)
1209	else	$(LEX) $(LEXFLAGS) $(>)$(LEXFIX.$(%):@?$("\n")$(STDED) $(STDEDFLAGS) lex.yy.c <<!$("\n")g/yy/s//$(LEXFIX.$(%))/g$("\n")g/YY/s//$(LEXFIX.$(%):F=%(invert)s)/g$("\n")w$("\n")q$("\n")!??)
1210		$(MV) lex.yy.c $(<)
1211	fi$(LEXHDR.$(%):?$("\n")$(STDED) $(STDEDFLAGS) $(<) <<!$("\n")1i$("\n")#include "$(LEXHDR.$(%))"$("\n").$("\n")w$("\n")q$("\n")!??)
1212
1213%.mo : %.mk
1214	$(MAKE) $(-+) --base --compile --file=$(>) $(CCFLAGS:N=-[I][!-]*) $(&:T=E)
1215
1216/*
1217 * library req support
1218 */
1219
1220-L% : "" .MAKE .DONTCARE .VIRTUAL .FORCE .REPEAT .IGNORE
1221	/* we should be able to do just .SOURCE.a here */
1222	.SOURCE.%.ARCHIVE .SOURCE.a : $(<:/-L//)
1223	if CC.SUFFIX.DYNAMIC
1224		.SOURCE.%$(CC.SUFFIX.SHARED) : $(<:/-L//)
1225	end
1226
1227/*
1228 * C alternate flags support
1229 */
1230
1231cc-% : "" .ALWAYS .LOCAL .FORCE .RECURSE.SEMAPHORE
1232	set -
1233	if	test -d $(<:V:Q)
1234	then	$(-silent:Y%%echo $(-errorid:C%$%/%)$(<:V:Q): >&2%)
1235		cd $(<:V:Q)
1236		$(MAKE) --file=$(MAKEFILE) --keepgoing $(-) --errorid=$(<:V:Q) .ATTRIBUTE.$(IFFEGENDIR)/%:.ACCEPT MAKEPATH=..:$(MAKEPATH) $(=:V:N!=MAKEPATH=*) $(.RECURSE.ARGS.:N!=.CC-*:/^\.INSTALL$/.CC-INSTALL/) $(%:Y;$$(INSTRUMENT_$$(%:/,.*//):@?--instrument=$$(%:/,.*//)?$$(%:V:/,/ /G:/~/,/G:N!=[!-+]*=*:@/^./CCFLAGS=-&/:@Q) $$(%:V:/,/ /G:/~/,/G:N=[!-+]*=*)?);;) $(.VARIANT.$(<))
1237	fi
1238
1239/*
1240 * feature test support -- the magic is in $(IFFE)
1241 */
1242
1243$(IFFEGENDIR)/% : $(IFFESRCDIR)/%.c .SCAN.c (IFFE) (IFFEFLAGS)
1244	$(IFFE) $(IFFEFLAGS) run $(>)
1245
1246$(IFFEGENDIR)/% : $(IFFESRCDIR)/%.sh .SCAN.c (IFFE) (IFFEFLAGS)
1247	$(IFFE) $(IFFEFLAGS) run $(>) $(?$(>):T=F)
1248
1249$(IFFEGENDIR)/% : $(IFFESRCDIR)/% .SCAN.c (IFFE) (IFFEFLAGS)
1250	$(IFFE) $(IFFEFLAGS) run $(>)
1251
1252$(IFFEGENDIR)/% : %.iffe .SCAN.c (IFFE) (IFFEFLAGS)
1253	$(IFFE) $(IFFEFLAGS) run $(>)
1254
1255$(IFFEGENDIR)/% : "" .SCAN.c (IFFE) (IFFEFLAGS)
1256	$(IFFE) $(IFFEFLAGS) def $(%)
1257
1258%.h : %.iffe .SCAN.c (IFFE) (IFFEFLAGS)
1259	$(IFFE) -o $(<) $(IFFEFLAGS) run $(>)
1260
1261.IFFE.REF. : .FUNCTION
1262	local T
1263	set mam=hold
1264	T := $(...:N=*.req:A=.TARGET)
1265	.MAKE : $(T)
1266	T := $(T:T=F:T=I:/[[:space:]][[:space:]]*/ /G:N!=-l($(T:B:C, ,|,G)))
1267	T += $(LDLIBRARIES) $(IFFEREFS:N=-l*)
1268	.R. : .CLEAR .MAKE $(T)
1269		: $(*)
1270	.MAKE : .R.
1271	set mam=nohold
1272	T := $(*.SOURCE.%.STD.INCLUDE:N=*/($(.PACKAGE.build:A!=.TARGET:/ /|/G)):T=FD:U!)
1273	T := $(T:/^/-I/) $(T:D:U:/^/-I/) $(*.R.:N!=$(<:T=M:@/ /|/G):U)
1274	if T
1275		if "$(-mam:N=static*,port*)"
1276			return ref $(*.SOURCE.%.ARCHIVE:I=$$(T:N=${mam_lib+([a-zA-Z0-9_])}:P=D):$(.CC.NOSTDLIB.):/.*/${mam_cc_L+-L&}/) $(T) $(IFFEREFS:N!=-l*) :
1277		else
1278			return ref $(*.SOURCE.%.ARCHIVE:I=$$(T:N=-l*:P=D):$(.CC.NOSTDLIB.):P=A:/^/-L/) $(IFFEREFS:N!=-l*) $(T) :
1279		end
1280	end
1281
1282/*
1283 * C information abstractor support rules
1284 */
1285
1286.SOURCE.db : $$(CIAFLAGS:N=-d*:/-d//)
1287
1288CIA = $(CC.ALTPP.ENV) $(CC.DIALECT:N=C++:?CIA?cia?)
1289CIALD = $(CIA)
1290CIADBFLAGS =
1291CIAFLAGS =
1292CIAFILES = $(CC.DIALECT:N=C++:?Ref.db Sym.db?reference.db symbol.db?)
1293DOT = dot
1294DOTFLAGS = -Tps
1295DAGGER = $(CC.DIALECT:N=C++:?Dagger?dagger?)
1296DAGGERFLAGS =
1297
1298(CIA) (CIADBFLAGS) (CIAFLAGS) : .PARAMETER
1299
1300%.A : %.c (CIA) (CIAFLAGS)
1301	$(CIA) $(CIAFLAGS) $(CPPFLAGS) -c $(>)
1302
1303%.A : %.C (CIA) (CIAFLAGS)
1304	$(CIA) $(CIAFLAGS) $(CPPFLAGS) -c $(>)
1305
1306.CIADB.AGAIN =
1307
1308.CIADB : .MAKE .VIRTUAL .FORCE .ONOBJECT .REPEAT .PROBE.INIT
1309	local A S T U X
1310	for S $(.SUFFIX.c) $(.SUFFIX.C)
1311		T += $(.SOURCES.:G=%$(S):B:S=$(CC.SUFFIX.OBJECT))
1312	end
1313	if T
1314		.SOURCE.c : $(IFFESRCDIR)
1315		.CIA.REBIND : .MAKE .VIRTUAL .FORCE .AFTER .FOREGROUND
1316			.REBIND : $(CIAFILES)
1317		for U $(T)
1318			X =
1319			for S $(.SUFFIX.c) $(.SUFFIX.C)
1320				X += $(*$(U):G=%$(S))
1321			end
1322			if ( X = "$(X:A!=.LCL.INCLUDE|.STD.INCLUDE)" )
1323				$(U:B:S=.A) : .IMPLICIT $(X) $(~$(U):A=.STATEVAR)
1324				A += $(U:B:S=.A)
1325			end
1326		end
1327		$(CIAFILES:O=1) : (CIADBFLAGS) (CIAFLAGS) $(A) .CIA.REBIND
1328			$(CIALD) $(CIAFLAGS) $(*)
1329		.MAKE : $(CIAFILES:O=1)
1330	elif .CIADB.AGAIN
1331		error 3 ciadb: no source to generate database
1332	else
1333		.CIADB.AGAIN = 1
1334		.ARGS : .INSERT $(<)
1335		.MAKE : .ALL
1336	end
1337
1338.CIADOT : .CIADB
1339	$(DAGGER) $(DAGGERFLAGS) | $(DOT) $(DOTFLAGS)
1340
1341/*
1342 * .USE action scripts
1343 */
1344
1345.DO.COPY : .USE
1346	$(CMP) $(CMPFLAGS) $(*:O=1) $(<) || { $(RM) $(RMFLAGS) $(<); $(SILENT) test -d $(<:D) || $(MKDIR) $(<:D); $(CP) $(*:O=1) $(<); }
1347
1348.DO.INSTALL.OPT. = $(~:N=user=*:@C,.*,\&\& { $(CHOWN) & $(<) || true ;},:@C, user=, ,G) \
1349		   $(~:N=group=*:@C,.*,\&\& { $(CHGRP) & $(<) || true ;},:@C, group=, ,G) \
1350		   $(~:N=mode=*:@C,.*,\&\& $(CHMOD) & $(<),:@C, mode=\([-+]\), ugo\1,G:@C, mode=, ,G)
1351
1352.DO.INSTALL.OLD.BUSY = { test -f $(%) && ignore $(RM) $(RMFLAGS) $(%).old* && $(MV) $(MVFLAGS) $(%) `echo $(%).old* | $(SED) -e 's/.* //' -e 's/old\(z*\)$/old\1z/' -e 's/\*$//'`; }
1353
1354.DO.INSTALL.OLD. : .FUNCTION
1355	if "$(-preserve)" == "\*" || "$(-preserve:N=*/*:?$$(%:N=$$(-preserve))?$$(%:B:S:N=$$(-preserve))?)"
1356		return $(SILENT) test -d $(%:D:B=ETXTBSY) || $(MKDIR) $(%:D:B=ETXTBSY); $(MV) $(MVFLAGS) $(%) $(%:D:B=ETXTBSY)/$(%:B)#$(%:P=I)
1357	elif "$(-clobber)" == "\*" || "$(-clobber:N=*/*:?$$(%:N=$$(-clobber))?$$(%:B:S:N=$$(-clobber))?)"
1358		return { $(RM) $(RMFLAGS) $(%) || $(.DO.INSTALL.OLD.BUSY); }
1359	else
1360		return { $(MV) $(MVFLAGS) $(%) $(%).old || $(.DO.INSTALL.OLD.BUSY); }
1361	end
1362
1363.DO.INSTALL : .USE $$(<:N=*$$(CC.SUFFIX.ARCHIVE):?.ARCOPY??)
1364	if	$(SILENT) test '' != "$(*:O=1)"
1365	then	if	$(SILENT) test '' != "$(*:O=1:P=I=$(<))"
1366		then	: $(<) linked to $(*:O=1)
1367		elif	$(SILENT) test -d "$(*:O=1)"
1368		then	$(-link:+$$(<:B:$$(<:A=.COMMAND:Y@@S@):N=$$(-link):+$$$(LN) $$$(_feature_:N=ln|ln-s:O=2:Y%-s $$$(*:O=1:D=$$$(<:D:P=R=$$$(*:O=1:D)):B:S)%$$$(*:O=1)%) $$$(<) || ))$(CPR) $(CPRFLAGS) $(*:O=1) $(<:D)
1369		else	$(-compare:+$$(SILENT) $$(CMP) $$(CMPFLAGS) $$(*:O=1) $$(<) ||)
1370			{
1371			if	$(SILENT) test -f "$(<)"
1372			then	$(.DO.INSTALL.OLD. $(<))
1373			fi
1374			$(-link:+$$(<:B:$$(<:A=.COMMAND:Y@@S@):N=$$(-link):+$$$(LN) $$$(_feature_:N=ln|ln-s:O=2:Y%-s $$$(*:O=1:D=$$$(<:D:P=R=$$$(*:O=1:D)):B:S)%$$$(*:O=1)%) $$$(<) || ))$(IGNORE) $(CP) $(*:O=1) $(<) $(.DO.INSTALL.OPT.)
1375			}
1376		fi
1377	fi
1378
1379.DO.INSTALL.DIR : .USE .DO.TOP.LEVEL
1380	if	$(SILENT) test ! -d $(<)
1381	then	$(MKDIR) -p $(<)$(.DO.INSTALL.OPT.)
1382	fi
1383
1384.DO.TOP.LEVEL : .MAKE .VIRTUAL .FORCE .REPEAT .IGNORE
1385	if ! "$(<<:A=.GLOBAL)" && ! "$(<<:P=L)"
1386		force $(<<)
1387	end
1388
1389.DO.LINK.OLD. : .FUNCTION
1390	if "$(-clobber)" == "\*" || "$(-clobber:N=*/*:?$$(%:N=$$(-clobber))?$$(%:B:S:N=$$(-clobber))?)"
1391		return $(RM) $(RMFLAGS) $(%)
1392	else
1393		return $(CP) $(%) $(%).old$("\n")$(RM) $(RMFLAGS) $(%)
1394	end
1395
1396.DO.LINK : .USE /* .ACCEPT .ACCEPT until dual-time implementation */
1397	if	$(SILENT) test -f "$(<)"
1398	then	$(.DO.LINK.OLD. $(<))
1399	fi
1400	$(LN) $(*:O=1) $(<)
1401
1402.DO.NOTHING : .USE .NULL
1403
1404.NOOPTIMIZE.c .CC.NOOPTIMIZE /* drop .CC.* in 2004 */ : .MAKE .LOCAL
1405	CCFLAGS := $(.MAM.CC.FLAGS|CCFLAGS:VP:N!=-O*|$(CC.OPTIMIZE)|$\(CC.OPTIMIZE\))
1406	if "$(-mam)"
1407		CCFLAGS := ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} $(<:A=.NOPROTECT.c:+${mam_cc_NOPROTECT}) $$(.MAM.STATE.VARS. $(<))
1408	elif "$(-debug-symbols)"
1409		CCFLAGS := $(CC.DEBUG) $(CCFLAGS:VP:N!=-g|$(CC.DEBUG)|$\(CC.DEBUG\))
1410	end
1411
1412.NOPROTECT.c : .MAKE .LOCAL
1413	if "$(-mam)"
1414		CCFLAGS := ${mam_cc_FLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT}
1415	else
1416		CCFLAGS += $(CC.NOPROTECT)
1417	end
1418
1419.READONLY. : .FUNCTION
1420	local ( .ROSRC. .ROOBJ. ... RO ) $(%)
1421	if RO == "-S.idat"
1422		.ROSED. = s/^\([ 	]*[.a-zA-Z0-9_$:]*[ 	]*\.*\)idat/\1code/
1423		return $(@.DO.READONLY.c.sed)
1424	elif RO == "-S.data"
1425		.ROSED. = s/^\([ 	]*\.*\)data/\\1text/
1426		return $(@.DO.READONLY.c.sed)
1427	elif RO == "-S.rdata"
1428		.ROSED. = s/^\([ 	]*\.*\)data/\1rdata/
1429		return $(@.DO.READONLY.c.sed)
1430	end
1431	return $$(CC) $$(CCFLAGS:N!=$(CC.DEBUG)) $(RO) -c $(.ROSRC.)
1432
1433.READONLY.c : .USE .IMPLICIT
1434	$(.READONLY. $(>) $(<) $(CC.READONLY))
1435
1436.DO.READONLY.c.sed : .USE
1437	$(CC) $(CCFLAGS:N!=$(CC.DEBUG)) -S $(.ROSRC.)
1438	$(.ROSRC.:B:N=$(<:B):?$(":") convert $(<:B:S=.c) data to readonly text in $(<:B:S)$("\n")??)set -
1439	$(SED)	-e '$(.ROSED.)' \
1440		-e 's/^\([ 	]*[.a-zA-Z0-9_$:]*[ 	]*\.*\)zero[ 	][ 	]*/\1set	.,.+/' \
1441		-e 's/^\([ 	]*[.a-zA-Z0-9_$:]*[ 	]*\.*\)space[ 	][ 	]*1/\1byte 0/' \
1442		-e 's/^\([ 	]*[.a-zA-Z0-9_$:]*[ 	]*\.*\)space[ 	][ 	]*2/\1byte 0,0/' \
1443		-e 's/^\([ 	]*[.a-zA-Z0-9_$:]*[ 	]*\.*\)space[ 	][ 	]*3/\1byte 0,0,0/' \
1444		-e 's/^\([ 	]*[.a-zA-Z0-9_$:]*[ 	]*\.*\)space[ 	][ 	]*4/\1byte 0,0,0,0/' \
1445		$(.ROSRC.:B:S=.s) > 1.$(tmp).s
1446	$(AS) $(ASFLAGS) -o $(.ROOBJ.) 1.$(tmp).s
1447	$(RM) $(RMFLAGS) $(.ROSRC.:B:S=.s) 1.$(tmp).s
1448
1449.READONLY.l : .USE .IMPLICIT
1450	$(".YYSUF.=.l":R)$(@.DO.READONLY.ly)
1451
1452.READONLY.y : .USE .IMPLICIT
1453	$(".YYSUF.=.y":R)$(@.DO.READONLY.ly)
1454
1455.DO.READONLY.ly : .USE
1456	: convert $(<:B:S=.c) tables to readonly text in $(<:B:S)
1457	set -
1458	$(CP) $(<:B:S=.c) 1.$(tmp).c
1459	$(STDED) $(STDEDFLAGS) 1.$(tmp).c > 2.$(tmp).c <<!
1460	$(@.YYSCRIPT$(.YYSUF.))
1461	w
1462	q
1463	!
1464	$(".ROSRC.=2.$(tmp).c":R)$(".ROOBJ.=2.$(tmp)$(CC.SUFFIX.OBJECT)":R)$(@.DO.READONLY.c.$(CC.READONLY))
1465	$(CC) $(CCFLAGS) -c 1.$(tmp).c
1466	$(LD) -r $(LDFLAGS) $(&:T=D:N=-[!DIOUl]*) -o $(<:B:S) 1.$(tmp)$(CC.SUFFIX.OBJECT) 2.$(tmp)$(CC.SUFFIX.OBJECT)
1467	$(CHMOD) -x $(<:B:S)
1468	$(RM) $(RMFLAGS) [12].$(tmp).[cos]
1469
1470.YYSCRIPT.l : .USE
1471	/struct yysvf[ 	]*{/;.,/}/p
1472	/define[ 	][ 	]*YYTYPE/p
1473	/struct yywork[ 	]*{/s/^.*}/&;\\
1474	struct yywork /
1475	-p
1476	$(@.YYFIX:@/YY/yycrank/G)
1477	$(@.YYFIX:@/YY/yyvstop/G)
1478	$(@.YYFIX:@/YY/yysvec/G)
1479	$(@.YYFIX:@/YY/yymatch/G)
1480	$(@.YYFIX:@/YY/yyextra/G)
1481
1482.YYSCRIPT.y : .USE .IMPLICIT
1483	g/typedef.*yyt[a-z]*;/p
1484	$(@.YYFIX:@/YY/yyexca/G)
1485	$(@.YYFIX:@/YY/yyact/G)
1486	$(@.YYFIX:@/YY/yypact/G)
1487	$(@.YYFIX:@/YY/yypgo/G)
1488	$(@.YYFIX:@/YY/yyr1/G)
1489	$(@.YYFIX:@/YY/yyr2/G)
1490	$(@.YYFIX:@/YY/yychk/G)
1491	$(@.YYFIX:@/YY/yydef/G)
1492	$(@.YYFIX.release)
1493
1494.YYFIX :
1495	/^\(.*\)YY[ 	]*\[]/s//extern \1 YY[];\\
1496	\1 YY []/
1497	.ka
1498	/}/kb
1499	'a,'bp
1500	'a,'bd
1501
1502if "$(_release_:N=V)"
1503.YYFIX.release :
1504	/^#[ 	]*ifndef[ 	][ 	]*YYDEBUG/;/^#[ 	]*endif/p
1505	/^#[ 	]*if[ 	][ 	]*YYDEBUG/p
1506	$(@.YYFIX:@/YY/yytoks/G)
1507	$(@.YYFIX:@/YY/yyreds/G)
1508	/^#[ 	]*endif/p
1509end
1510
1511RECURSEROOT = .
1512
1513.RECURSE : .MAKE .VIRTUAL .FORCE .NULL
1514
1515.NORECURSE : .MAKE .VIRTUAL .FORCE .NULL
1516
1517.RECURSE.SEMAPHORE : .VIRTUAL .FORCE .IGNORE .NULL
1518
1519.RECURSE.ARGS. : .FUNCTION
1520	local A L V
1521	L = .TARGET
1522	for A $(.ORIGINAL.ARGS.)
1523		if ! "$(A:A=.TARGET)" && ( T = "$(A:/.*/.&/U:A=$(L))" )
1524			A := $(T)
1525		else
1526			L = .ONOBJECT
1527		end
1528		if "$(A:A!=.ACTIVE:N!=.RECURSE)" || "$(A:A=.ONOBJECT)"
1529			V += $(A)
1530		end
1531	end
1532	if V && "$(~.ARGS:A=.ONOBJECT)"
1533		V := .RECURSE $(V)
1534	end
1535	return $(V)
1536
1537.RECURSE.OPTIONS. : .FUNCTION
1538	local L O R
1539	O = ..
1540	R = --include=..
1541	for L $(.RWD.:C,/, ,G)
1542		O := $(O)/..
1543		R += --include=$(O)
1544	end
1545	R := RECURSEROOT=$(O)	/* += for --include -- not sure about that */
1546	return $(R)
1547
1548.RECURSE.INIT. : .FUNCTION
1549	local D N P
1550	if ! "$(-recurse)"
1551		return
1552	end
1553	if ( D = "$(%)" )
1554		.X. : .CLEAR
1555		for N $(D)
1556			if N == "-"
1557				.X. : $(N)
1558			elif "$(N:T=F=D)"
1559				.X. : $(N)
1560			else
1561				P := $(".":L=$(N):T=F=D)
1562				if P
1563					.X. : $(P)
1564				else
1565					.X. : $(N)
1566				end
1567			end
1568		end
1569		D := $(~.X.)
1570	else
1571		D = .
1572	end
1573	if "$(-recurse)" == "*prereqs*"
1574		print $(D:W=P=$(.RECURSE.ARGS.:A!=.ONOBJECT:N!=.RECURSE))
1575		exit 0
1576	end
1577	if D == "."
1578		D := $(D:W=R=$(.RECURSE.ARGS.:A!=.ONOBJECT:N!=.RECURSE))
1579	end
1580	if "$(-recurse)" == "*only*"
1581		D := $(D:N=?(*/)($(.RECURSE.ARGS.:/ /|/G)))
1582	end
1583	if "$(-recurse)" == "*list*"
1584		print $(D:/ /$("\n")/G)
1585		exit 0
1586	end
1587	$(D) : .OBJECT
1588	P := recurse .RECURSE $(D:B:S:N!=$(...:A=.ONOBJECT:N=.*:/.\(.*\)/\1/L:N!=*.*:/ /|/G)) $(<<) $(...:A>*.RECURSE.INIT.*)
1589	P := $(P:U:/ /|/G)
1590	.ORIGINAL.ARGS. := $(.ORIGINAL.ARGS.:N!=$(P))
1591	.ARGS : .CLEAR $(~.ARGS:N!=$(P))
1592	P := $(D:N!=-|.|.CC-*|cc-*)
1593	if P == "* + *"
1594		$(P:@/ + .*//:T!=FR) : .TERMINAL .RECURSE.DIR
1595		$(P:@/.* + //:T!=FR) : .TERMINAL .NORECURSE.DIR
1596	else
1597		$(P:T!=FR) : .TERMINAL .RECURSE.DIR
1598	end
1599	$(P:T=FR) : .TERMINAL .RECURSE.FILE
1600	.SELECT.EDIT. := $(.SELECT.EDIT.):N!=($(P:T=F:P=L=*:/ /|/G))?(/*)
1601	return $(D:N!=+)
1602
1603.RECURSE.FLUSH : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER
1604	unbind $(<<)
1605
1606.RECURSE.DIR : .USE .ALWAYS .LOCAL .FORCE .RECURSE.FLUSH .RECURSE.SEMAPHORE
1607	set -
1608	if	$(*.VIEW:O=2:N=...:+2d) test -d $(<) $(-virtual:+|| $(MKDIR) $(<))
1609	then	$(-silent:~echo $$(-recurse-enter) $$(.RWD.:+$$$(<:N!=/*:+$$$$(.RWD.)/))$$(<)$$(":") >&2)
1610		cd $(<)
1611		$(MAKE) $(-) --errorid=$(<:Q) $(=:V:N!=MAKEPATH=*|VPATH=*) .RWD.=$(.RWD.:C%$%/%)$(<) $(.RECURSE.OPTIONS.) $(.ORIGINAL.ARGS.)
1612		$(-recurse-leave:+$$(-silent:~echo $$$(-recurse-leave) $$$(.RWD.:+$$$$(<:N!=/*:+$$$$$(.RWD.)/))$$$(<)$$$(":") >&2))
1613	else	echo $(<): warning: cannot recurse on virtual directory >&2
1614	fi
1615
1616.NORECURSE.DIR : .USE .ALWAYS .LOCAL .FORCE .RECURSE.SEMAPHORE
1617	set -
1618	if	$(*.VIEW:O=2:N=...:+2d) test -d $(<) $(-virtual:+|| $(MKDIR) $(<))
1619	then	$(-silent:~echo $(-recurse-enter) $(.RWD.:+$(<:N!=/*:+$(.RWD.)/))$(<)$$(":") >&2)
1620		cd $(<)
1621		$(MAKE) $(-) --norecurse --errorid=$(<:Q) $(=:V:N!=MAKEPATH=*|VPATH=*) .RWD.=$(.RWD.:C%$%/%)$(<) $(.RECURSE.ARGS.:N!=.RECURSE)
1622		$(-recurse-leave:+$(-silent:~echo $(-recurse-leave) $(.RWD.:+$(<:N!=/*:+$$(.RWD.)/))$(<)$$$(":") >&2))
1623	else	echo $(<): warning: cannot recurse on virtual directory >&2
1624	fi
1625
1626.RECURSE.FILE : .USE .ALWAYS .LOCAL .FORCE .RECURSE.FLUSH .RECURSE.SEMAPHORE
1627	set -
1628	$(-silent:~echo $(.RWD.:+$(<:N!=/*:+$(.RWD.)/))$(<)$$(":") >&2)
1629	$(MAKE) $(-) --errorid=$(<:B:Q) --file=$(<) $(=) .RWD.=$(.RWD.) $(.ORIGINAL.ARGS.)
1630
1631/*
1632 * source dependency operator
1633 */
1634
1635"::" : .MAKE .OPERATOR .PROBE.INIT
1636	if ! "$(<)"
1637		if ! "$(>)"
1638			.FILES. += .
1639		else
1640			$(>:N=[!-.]*|.[!A-Z]*) : .SPECIAL
1641			.FILES. += $(>:N=.|[!-.]*|.[!A-Z]*)
1642		end
1643	elif "$(<:O=2)"
1644		error 2 $(<:O=2): only one target expected
1645	else
1646		local T0 T1 T2 T3 T4 TA TL TP TS OBJ STATIC
1647		if "$(>:V:G=%$(CC.SUFFIX.OBJECT))"
1648			OBJ = 1
1649		end
1650		if ! "$(<:N=*$(CC.SUFFIX.OBJECT))"
1651			$(<) : .COMMAND
1652		end
1653		T0 := $(.LD.KEEP.:/^/%/)
1654		STATIC = 0
1655		for T1 $(>:V:T=X)
1656			if "$(T1:V:A=.ARCHIVE)" || T1 == "[-+]l*"
1657				$(T1:V) : .ARCHIVE .MULTIPLE
1658				if T1 == "$(CC.LD.STATIC)"
1659					STATIC = 1
1660					if CC.SUFFIX.DYNAMIC == ".dll"
1661						continue
1662					end
1663				elif T1 == "$(CC.LD.DYNAMIC)"
1664					STATIC = 0
1665					if CC.SUFFIX.DYNAMIC == ".dll"
1666						continue
1667					end
1668				elif T1 == "+l*" && "$(<:A=.COMMAND)"
1669					.PACKAGE.$(T1:/+l//).library.$(<:B) := +l
1670				end
1671				TP += $(T1:V)
1672			elif T2 = "$(T1:G=$(T0))"
1673				TP += $(T2)
1674			elif T1 == ".[a-zA-Z]*|[!-+]*=*|$\(*\)" || "$(T1:A=.ATTRIBUTE|.STATE)" || "$(T1:A=.MAKE:A=.LOCAL)"
1675				TP += $(T1:V)
1676				if "$(T1:A!=.USE)"
1677					TA += $(T1:V)
1678				end
1679			elif T1 == "[-+]?*"
1680				.OPTIONS.$(<) += $(T1)
1681			elif T1 == "-"
1682				T4 = 1
1683			elif OBJ && ( T2 = "$(T1:G=%$(CC.SUFFIX.OBJECT))" )
1684				if CC.SUFFIX.OBJECT == "$(T1:S)"
1685					T2 := $(T1)
1686				else
1687					if "$(-target-context)"
1688						T2 := $(T2:D=$(T1:D):B:S)
1689					elif "$(-target-prefix)"
1690						T2 := $(T2:D=$(T1:D):B:S:C%/%$(-target-prefix)%G)
1691					end
1692					$(T2) : .SPECIAL .IMPLICIT $(T1)
1693					$(T1) : .SPECIAL .TERMINAL
1694				end
1695				if T2 != "$(<)?($(CC.SUFFIX.COMMAND))"
1696					if STATIC
1697						$(T2) : .SPECIAL CC.DLL= CC.DLLBIG=
1698						if CC.SUFFIX.DYNAMIC == ".dll"
1699							TS += $(T2)
1700							continue
1701						end
1702					end
1703					TP += $(T2)
1704				end
1705				T3 += $(T2)
1706			elif "$(T1:N=*.*:G=%)" && T1 != "$(<)?($(CC.SUFFIX.COMMAND))"
1707				if "$(T1:G=$(<))" || "$(T1:G=$(<)$(CC.SUFFIX.COMMAND))"
1708					TP += .IMPLICIT
1709				end
1710				TP += $(T1)
1711			elif T4
1712				TP += $(T1)
1713			end
1714		end
1715		T0 := $(<)
1716		TL =
1717		if "$(<:A=.ARCHIVE)" || "$(TP:V:A=.ATTRIBUTE:A=.ARCHIVE)"
1718			TP += -COMMAND
1719			if ! "$(@:V)" && ! "$(~:A=.USE)"
1720				TP += .ARCHIVE$(CC.SUFFIX.OBJECT)
1721			end
1722			TL = 1
1723		else
1724			TA += $(.LIBRARY.ONLY.)
1725			if "$(T3:N=$(<)?($(CC.SUFFIX.COMMAND)))"
1726				TL = 1
1727			elif OBJ || "$(>:V:A=.ARCHIVE)"
1728				if "$(T0:N=*$(CC.SUFFIX.OBJECT))"
1729					TP += .OBJECT$(CC.SUFFIX.OBJECT)
1730				else
1731					if ! "$(<:S)" && CC.SUFFIX.COMMAND
1732						$(T0) : .VIRTUAL $(T0)$(CC.SUFFIX.COMMAND)
1733						T0 := $(T0)$(CC.SUFFIX.COMMAND)
1734					end
1735					TP += .COMMAND$(CC.SUFFIX.OBJECT)
1736					TL = 1
1737				end
1738			else
1739				TP += .OBJECT
1740			end
1741		end
1742		if TL
1743			TL := CC.SHARED.LIBS.$(T0)
1744			$(TL) := $$(*$(T0):VBFUI:A=.ARCHIVE:N=-l*:U)
1745			($(TL)) : .PARAMETER
1746			TP += ($(TL))
1747		end
1748		if T1 = "$(T3:A=.IMPLICIT)"
1749			$(T1) : .SPECIAL $(TA:V:Q)
1750			if "$(.OPTIONS.$(<))"
1751				(.OPTIONS.$(<)) : .PARAMETER
1752				$(T1) : .SPECIAL (.OPTIONS.$(<))
1753			end
1754		end
1755		if TS
1756			.LIBRARY.STATIC.$(<:B:/^$(CC.PREFIX.ARCHIVE)//) : $(CC.LD.STATIC) $(TS) $(CC.LD.DYNAMIC)
1757		end
1758		$(T0) : $(TP:V:Q)
1759		if "$(@:V:?1??)"
1760			eval
1761				$$(T0) :
1762					$(@:V)
1763			end
1764		end
1765		if "$(<:N=*_*)" && ! "$(@$(<):V)" && ( T1 = "$(*$(<):@N=$(<:/.*_//).*)" )
1766			T1 := $(T1:S)
1767			T2 := %$(T1)>%
1768			if "$(@$(T2):V)"
1769				eval
1770				$$(<) :
1771					$(@$(T2):V:/$$(>)/$$(*:N=*$(T1):O=1)/G)
1772				end
1773			end
1774		end
1775		: $(.INSTALL.COMMON. - $(<) $(T0) $(>)) :
1776	end
1777
1778/*
1779 * if no rhs then make all by default
1780 * otherwise add rhs to all
1781 */
1782
1783":ALL:" : .MAKE .OPERATOR
1784	if "$(>:V)"
1785		.ALL : $(>:V)
1786		if ! "$(~.MAIN)"
1787			.MAIN : .ALL
1788		end
1789	else
1790		.MAIN : .CLEAR .ALL
1791		if "$(<:V)"
1792			$(<) : .ALL
1793		end
1794	end
1795
1796/*
1797 * DEPRECATED
1798 * lhs builds rhs as a side effect
1799 */
1800
1801":BUILD:" : .MAKE .OPERATOR
1802	$(<) : $(>)
1803	eval
1804	$$(>) : .JOINT .FORCE
1805		$(@:V)
1806	end
1807
1808/*
1809 * DEPRECATED -- use $(sh ...) instead
1810 * lhs is a variable whose value is the result
1811 * of shell command substitution on the action
1812 * wrt prerequisites on the rhs
1813 */
1814
1815":COMMAND:" : .MAKE .OPERATOR
1816	.RETAIN : $(<)
1817	eval
1818	$$(<) : .SPECIAL .VIRTUAL .FUNCTIONAL $$(-mam:N=static*:?.ALWAYS .LOCAL??) $$(>)
1819		$(@:V)
1820	end
1821
1822/*
1823 * lhs is a copy of rhs
1824 */
1825
1826":COPY:" : .MAKE .OPERATOR
1827	$(<:V) : .SPECIAL .DO.COPY $(>:V)
1828
1829/*
1830 * make dll via cc- if not already made at this level
1831 */
1832
1833.RECURSE.DLL : .MAKE .USE
1834	local DIR
1835	if .DLL.TOP. && ! "$(-mam:N=static*,port*)" && ! "$(.SHARED.ON.)" && ( CC.SUFFIX.DYNAMIC || CC.SUFFIX.SHARED )
1836		DIR := $(<:/^.DLL.//)
1837		if ! "$(DIR:T=F)"
1838			{ test -d $(DIR) || $(MKDIR) $(DIR) }
1839		end
1840		.ORIGINAL.ARGS. := .DLL.$(.ORIGINAL.ARGS.:N=install|.INSTALL:@?INSTALL?ALL?)
1841		make $(DIR)
1842	end
1843
1844":DLL:" : .MAKE .OPERATOR
1845	local DIR OPT
1846	if "$(PWD:B)" == "cc-*"
1847		.DLL.LIST. += $$(.LIBRARY.LIST.)
1848	else
1849		.DLL.TOP. = 1
1850		if ! ( OPT = "$(>:N=-*)" )
1851			OPT := $(CC.OPTIMIZE)
1852		end
1853		if "$(>:N=big|BIG)"
1854			OPT += $(CC.DLLBIG)
1855		else
1856			OPT += $(CC.DLL)
1857		end
1858		DIR := cc$(OPT:/,/~/G:/ /,/G)
1859		.VARIANT.$(DIR) := VARIANT=DLL
1860		.ALL : .DLL.$(DIR)
1861		.DLL.$(DIR) : .RECURSE.DLL
1862	end
1863
1864.DLL.ALL : $$(.DLL.LIST.)
1865
1866.DLL.INSTALL. : .FUNCTION
1867	local L R
1868	for L $(.DLL.LIST.)
1869		R += $(*.INSTALL:N=*/$(.DLL.NAME. $(L))*)
1870	end
1871	return $(R)
1872
1873.DLL.INSTALL : $$(.DLL.INSTALL.)
1874
1875.DLL.CHECK : .USE .MAKE .VIRTUAL .FORCE
1876	local B L
1877	B := $(<:/.DLL.CHECK.//)
1878	if !.DLL.TOP. && ! .DLL.LIST. && ! "$(-mam:N=static*,port*)" && ! "$(.SHARED.ON.)" && ! "$(PWD:B:N=cc-*)" && ( L = "$(.DLL.NAME. $(B))" )
1879		$(L) : .ARCHIVE
1880		if L = "$(L:T=F)"
1881			error 1 $(B): generating static library but dynamic $(L) already exists
1882		end
1883	end
1884
1885/*
1886 * lhs is a function
1887 */
1888
1889":FUNCTION:" : .MAKE .OPERATOR
1890	eval
1891	$$(<:V) : .SPECIAL .FUNCTION $$(>:V)
1892		$(@:V)
1893	end
1894
1895/*
1896 * add an initialization make action
1897 * rhs is optional name
1898 */
1899
1900":INIT:" : .MAKE .OPERATOR
1901	local T
1902	if ( T = $(>:O=1) )
1903		T := $(.GENSYM.)
1904	end
1905	if T != ".*"
1906		T := .$(T)
1907	end
1908	if T != "*.(INIT|init)"
1909		T := $(T).init
1910	end
1911	.MAKEINIT : $(T)
1912	eval
1913	$$(T) : .MAKE .VIRTUAL .FORCE
1914		$(@:V)
1915	end
1916
1917/*
1918 * install lhs from rhs
1919 */
1920
1921":INSTALL:" : .MAKE .OPERATOR
1922	local D O R S T X
1923	if ! "$(<:V)" && ! "$(>:V)" && ! "$(@:V)"
1924		.NO.INSTALL. = 1
1925	else
1926		if O = "$(>:N=*=*)"
1927			$(O) : .SPECIAL .VIRTUAL .DONTCARE
1928		end
1929		if T = "$(>:N=-*:N!=-)"
1930			error 1 use {user,group,mode}=... instead of -{u,g,m}...
1931			T := $(T:/-u/user=/:/-g/group=/:/-m/mode=/)
1932			$(T) : .SPECIAL .VIRTUAL .DONTCARE
1933			O += $(T)
1934		end
1935		S := $(>:T=XS)
1936		R := $(>:N!=-*|*=*:T!=XS)
1937		if ! "$(<:V)"
1938			if ! "$(R:V)"
1939				eval
1940				.DO.INSTALL : .USE
1941					$(@:V)
1942				end
1943			else
1944				.INSTALL : $(R)
1945				if "$(@:V)"
1946					eval
1947					$$(R) :
1948						$(@:V)
1949					end
1950				end
1951			end
1952		elif "$(.INSTALL.$(R:B:S))" != "."
1953			if $(R:O) == 1
1954				eval
1955				.INSTALL.$(R:B:S) = $(<:V:D)
1956				end
1957			end
1958			if "$(<:V:D)"
1959				$(<:V:D) : .SPECIAL .DO.INSTALL.DIR
1960				D := .DO.INSTALL.DIR.$(<:V:D:C,/,_,G)
1961				$(D) : .VIRTUAL .IGNORE $(<:V:D)
1962				.INSTALL : $(<:V:D)
1963			end
1964			.INSTALL : $(<:V)
1965			if "$(@:V)"
1966				eval
1967				$$(<:V) : .SPECIAL .SCAN.IGNORE $$(D:V) $(S) $(R)
1968					$(@:V)
1969				end
1970			elif "$(R)"
1971				if "$(R:A=.DONTCARE)"
1972					X = :T=F
1973				else
1974					X =
1975				end
1976				$(<:V) : .SPECIAL .SCAN.IGNORE $(D) $$("$(R)":N!=$$(<)|$$(<:P=U)$(X):@?$(O) $(S) $(R) .DO.INSTALL??)
1977			else
1978				$(<:V) : .SPECIAL .SCAN.IGNORE $(D) $$(<:B:S:N!=$$(<):@?$(O) $(S) $(R) $$(<:B:S) .DO.INSTALL??)
1979			end
1980		end
1981	end
1982
1983/*
1984 * install rhs into lhs dir
1985 */
1986
1987":INSTALLDIR:" : .MAKE .OPERATOR
1988	local D O R T
1989	if O = "$(>:N=*=*)"
1990		$(O) : .SPECIAL .VIRTUAL .DONTCARE
1991	end
1992	if T = "$(>:N=-*:N!=-)"
1993		error 1 use {user,group,mode}=... instead of -{u,g,m}...
1994		T := $(T:/-u/user=/:/-g/group=/:/-m/mode=/)
1995		$(T) : .SPECIAL .VIRTUAL .DONTCARE
1996		O += $(T)
1997	end
1998	O += $(>:T=XS)
1999	R := $(>:N!=-*|*=*:T!=XS)
2000	if ! "$(<:V)" || "$(<:V)" == "."
2001		for T $(R)
2002			eval
2003			.INSTALL.$(T:B:S) = .
2004			end
2005		end
2006	elif ! "$(R)"
2007		$(<:V) : .SPECIAL .DO.INSTALL.DIR $(>)
2008		.INSTALL : $(<:V)
2009	else
2010		for T $(R)
2011			eval
2012			.INSTALL.$(T:B:S) =
2013			end
2014			for D $(<:V)
2015				eval
2016				$(T:D=$(D:V):B:S) :INSTALL: $(O) $(T)
2017					$(@:V)
2018				end
2019			end
2020		end
2021	end
2022
2023/*
2024 * install in lhs dir using rhs pattern to select
2025 */
2026
2027":INSTALLMAP:" : .MAKE .OPERATOR
2028	if "$(<)"
2029		local D T
2030		T := $(.GENSYM.)
2031		.INSTALL : $(<) $(T)
2032		$(<) : .SPECIAL .DO.INSTALL.DIR
2033		D := .DO.INSTALL.DIR.$(<:C,/,_,G)
2034		$(D) : .VIRTUAL .IGNORE $(<)
2035		.INSTALL.MAPS. += $(>)
2036		eval
2037		$$(T) : .MAKE .FORCE .IGNORE
2038			local T
2039			for T $$(...:$(>):A!=.ATTRIBUTE|.FUNCTIONAL|.MAKE|.VIRTUAL:T=F:N!=$(<)/*)
2040				$$(T:D=$(<):B:S) : $$(T) .SPECIAL .SCAN.IGNORE $(D) .DO.INSTALL
2041				.INSTALL : $$(T:D=$(<):B:S)
2042			end
2043		end
2044	end
2045
2046/*
2047 * install $(PROTO) output of rhs in lhs dir
2048 */
2049
2050":INSTALLPROTO:" : .MAKE .OPERATOR
2051	local A P T
2052	T := $(<:O=1)
2053	if "$(T)" == "*.h"
2054		A = :INSTALL:
2055	else
2056		A = :INSTALLDIR:
2057	end
2058	if P = "$(<:O=2)"
2059		P := -f -e $(P)
2060	end
2061	eval
2062	$(T) $(A) $(>) (PROTO) (PROTOFLAGS)
2063		$$(PROTO) -p $$(PROTOFLAGS) $(P) $$(*) $$(PROTOINSTALL) > 1.$(tmp).x
2064		if	$$(CMP) $$(CMPFLAGS) $$(<) 1.$(tmp).x
2065		then	$$(RM) $$(RMFLAGS) 1.$(tmp).x
2066		else	$$(MV) 1.$(tmp).x $$(<)
2067		fi
2068	end
2069
2070/*
2071 * action jointly builds all targets on lhs wrt prerequisites on rhs
2072 */
2073
2074":JOINT:" : .MAKE .OPERATOR
2075	eval
2076	$$(<:V) : .JOINT $$(>:V)
2077		$(@:V)
2078	end
2079
2080/*
2081 * <name> [<major.minor>] [option ...] :LIBRARY: <source> -[lL]*
2082 */
2083
2084":LIBRARY:" : .MAKE .OPERATOR .PROBE.INIT
2085	local A B H I L M N P Q R S T V X
2086	P := $(.PACKAGE.plugin)
2087	B := $(<:O=1)
2088	M := $(B)
2089	I = 1
2090	for T $(<:O>1)
2091		if T == "+([-+.0-9])"
2092			V := $(T)
2093		elif T == "DLL*"
2094			if "$(PWD:B)" == "cc-*"
2095				.DLL.LIST. += $(B)
2096			else
2097				.DLL.TOP. = 1
2098			end
2099			.ALL : .$(B)
2100		else
2101			if T == "--*"
2102				T := $(T:/--//)
2103			end
2104			if T == "no*"
2105				T := $(T:/no//}
2106				X = 0
2107			else
2108				X = 1
2109			end
2110			if T == "id=*"
2111				M := $(T:/id=//)
2112			elif T == "install"
2113				I := $(X)
2114			elif T == "list=*"
2115				H := $(T:/list=//)
2116			elif T == "plugin=*"
2117				P := $(T:/plugin=//)
2118			elif T == "private"
2119				let I = ! X
2120			elif T == "shared=*"
2121				N := $(T:/shared=//)
2122			elif T == "static"
2123				A := $(X)
2124			end
2125		end
2126	end
2127	if ! V
2128		if P
2129			V = 0.0
2130		else
2131			V = 1.0
2132		end
2133	elif V == "-"
2134		V =
2135	elif ! VERSION
2136		VERSION := $(V)
2137	end
2138	if "$(B:A=.TARGET)"
2139		T := .ALL
2140	else
2141		T := $(B)
2142		.ALL : $(B)
2143	end
2144	.LIBRARY.LIST. += $(B)
2145	if ! .MAIN.TARGET.
2146		.MAIN.TARGET. := $(B:B:S)
2147	end
2148	L := $(.LIB.NAME. $(P)$(B) $(V))
2149	$(L) : .ARCHIVE$(CC.SUFFIX.OBJECT)
2150	.PLUGIN.$(B) := $(P)
2151	.RETAIN : .PLUGIN.$(B)
2152	if ! I || P
2153		if ! I || ! A
2154			:INSTALLDIR: $(L)
2155		end
2156		if P
2157			X := $(.DLL.NAME. $(B) $(V):B:C%\..*%%)
2158			if I && CC.SHARED.REGISTRY
2159				.CC.SHARED.REGISTRY.$(X) := $(LIBDIR)/$(P)/registry.ld
2160				$(.DLL.NAME. $(B) $(V)) : .CC.DLL.DIR.INIT
2161				.CC.DLL.DIR.INIT : .VIRTUAL .IGNORE $(LIBDIR)/$(P)
2162				$(LIBDIR)/$(P) : .DO.INSTALL.DIR
2163			end
2164			.CC.DLL.DIR.$(X) := $(LIBDIR)/$(P)
2165			.INSTALL.$(X) := .
2166		end
2167	end
2168	if CC.SHARED.NAME && N != "-"
2169		if N == "-+([0-9])"
2170			.PACKAGE.soname := $(N)
2171			N =
2172		end
2173		if ! N
2174			N := $(.DLL.NAME. $(B) $(V))
2175		elif N == "+([-+.0-9])"
2176			N := $(.DLL.NAME. $(B) $(N))
2177		end
2178		X := $(.DLL.NAME. $(B) $(V):B:C%\..*%%)
2179		.CC.SHARED.NAME.$(X) := $(CC.SHARED.NAME)$(N)
2180	end
2181	if "$(>:G=%$(CC.SUFFIX.OBJECT):O=1)"
2182		if ! I
2183			X := $(.NO.INSTALL.)
2184			.NO.INSTALL. := 1
2185		end
2186		eval
2187		$(L) :: $(>:V:N!=[-+][lL]*)
2188			$(@:V)
2189		end
2190		if ! I
2191			.NO.INSTALL. := $(X)
2192		end
2193	end
2194	.INSTALL : .DLL.CHECK.$(B)
2195	.DLL.CHECK.$(B) : .DLL.CHECK
2196	$(B).VERSION := $(V)
2197	D := $(>:V:N=-L*)
2198	if ! P || A
2199		Q := $(P)$(B)
2200		S := $(Q) $(>:V:N=[-+]l*::N!=[-+]l$(Q)) $(.PACKAGE.LIBRARIES. $(.PACKAGE.build:A!=.TARGET):N!=[-+]l$(Q)) $(LDLIBRARIES:N=[-+]l*:N!=[-+]l$(Q))
2201		eval
2202		if I && ! "$(.NO.INSTALL.)"
2203			$$(LIBDIR)/lib/$(Q) :INSTALL: $(Q).req
2204		end
2205		.REQUIRE.$(Q) = $(S:U)
2206		(.REQUIRE.$(Q)) : .PARAMETER
2207		if "$(-mam:N=static*,port*)"
2208			$(Q).req : (CC) (CCFLAGS) (LDFLAGS) (.REQUIRE.$(Q))
2209				set -
2210				echo 'int main(){return 0;}' > 1.$(tmp).c
2211				$$(CC) $$(CCFLAGS) -c 1.$(tmp).c &&
2212				x=`$$(CC) $$(CCFLAGS) $$(LDFLAGS) -o 1.$(tmp).x 1.$(tmp)$(CC.SUFFIX.OBJECT) -l'*' 2>&1 | $(SED) -e 's/[][()+@?]/#/g' || :` &&
2213				{
2214				case "$(D)" in
2215				*?)	echo " $(D)" ;;
2216				esac
2217				for i in $$(.MAM.REQ. $$(.REQUIRE.$(Q)))
2218				do	case $i in
2219					"$(Q)"$(...:A=.ARCHIVE:A=.TARGET:N=$(CC.PREFIX.ARCHIVE)*$(CC.SUFFIX.ARCHIVE):/^$(CC.PREFIX.ARCHIVE)\(.*\)$(CC.SUFFIX.ARCHIVE)/|\1/:@/ //G))
2220						;;
2221					*)	if	test -f  $$(LIBDIR)/lib/$i
2222						then	y=`cat $$(LIBDIR)/lib/$i`
2223							case $y in
2224							*-?*)	echo "" $y ;;
2225							esac
2226							continue
2227						elif	test ! -f $$(LIBDIR)/$(CC.PREFIX.ARCHIVE)$i$(CC.SUFFIX.ARCHIVE)
2228						then	case `{ $$(CC) $$(CCFLAGS) $$(*.SOURCE.%.ARCHIVE:$$(.CC.NOSTDLIB.):N=*/$(CC.PREFIX.ARCHIVE)*:P=L:/^/-L/) $$(LDFLAGS) -o 1.$(tmp).x 1.$(tmp)$(CC.SUFFIX.OBJECT) $(D) -l$i 2>&1 || echo '' $x ;} | $(SED) -e 's/[][()+@?]/#/g' || :` in
2229							*$x*)	case `{ $$(CC) $$(CCFLAGS) $$(LDFLAGS) -o 1.$(tmp).x 1.$(tmp)$(CC.SUFFIX.OBJECT) $(D) -l$i 2>&1 || echo '' $x ;} | $(SED) -e 's/[][()+@?]/#/g' || :` in
2230								*$x*) continue ;;
2231								esac
2232								;;
2233							esac
2234						fi
2235						;;
2236					esac
2237					echo " -l$i"
2238				done
2239				} > $$(<)
2240				$$(RM) $$(RMFLAGS) 1.$(tmp).*
2241		else
2242			$(Q).req : (CC) (.REQUIRE.$(Q)) .PREQUIRE
2243				echo "" $$(.REQ. $$(.REQUIRE.$(Q))) > $$(<)
2244		end
2245		$(L) : .INSERT $(Q).req.REQUIRE
2246		$(Q).req.REQUIRE : .VIRTUAL .IGNORE .NULL $(Q).req
2247		end
2248	end
2249	eval
2250	_BLD_$(M:B:S:/[^a-zA-Z0-9_]/_/G) == 1
2251	end
2252	.LIBRARY.ONLY. += _BLD_$(B:B:S:/[^a-zA-Z0-9_]/_/G)=
2253	if P || ! A
2254		$(T) : $(L) $(.SHARED. $(L) $(B) $(V|"-") $(>:V:N=[!-+]*=*) $(>:V:N=[-+]l*))
2255	else
2256		$(T) : $(L)
2257	end
2258	if H
2259		L := $(M:B)
2260		eval
2261			$(L)src = $$(*$$(*$$(*$(L))):N=*.c:T=F)
2262			$(L)list.h : ($(L)src) $$$(-mam:+$$$($(L)src))
2263				{
2264				cat <<!
2265				$$("/")*
2266				$$(" ")* -l$(L) function list -- define your own CMDLIST()
2267				$$(" ")*/
2268				!
2269				$$(SED) \
2270					-e '/^$(H)[a-z_][a-z_0-9]*(/!d' \
2271					-e 's/^$(H)//' \
2272					-e 's/(.*//' \
2273					-e 's/.*/CMDLIST(&)/' \
2274					$$($$(~):T=F) |
2275				$$(SORT) -u
2276				} > 1.$$(tmp).h
2277				if	$$(CMP) $$(CMPFLAGS) 1.$$(tmp).h $$(<)
2278				then	$$(RM) $$(RMFLAGS) 1.$$(tmp).h
2279				else	$$(MV) 1.$$(tmp).h $$(<)
2280				fi
2281		end
2282	end
2283
2284/*
2285 * <pseudo-library> :REQUIRE: -[lL]*
2286 */
2287
2288":REQUIRE:" : .MAKE .OPERATOR
2289	if ! "$(.NO.INSTALL.)"
2290		$$(LIBDIR)/lib/$(<) :INSTALL: $(<).req
2291	end
2292	.REQUIRE.$(<) := $(>)
2293	(.REQUIRE.$(<)) : .PARAMETER
2294	eval
2295	$$(<:B:S=.req) : (.REQUIRE.$$(<))
2296		echo "" $$(.REQ. $$(.REQUIRE.$(<))) > $$(<)
2297	end
2298
2299.REQ. : .FUNCTION
2300	local B I Q R L
2301	for I $(%)
2302		if I == "[-+]l*"
2303			B := $(I:/^[-+]l//)
2304		else
2305			B := $(I)
2306			I := -l$(I)
2307		end
2308		if ! "$(.PACKAGE.$(B).private)"
2309			if "$(.REQUIRE.$(B))"
2310				R += $(I)
2311			else
2312				Q := $(.REQUIRE.-l% $(I))
2313				if Q != "{ - }"
2314					for L $(Q)
2315						if "$(L:N=-l*)"
2316							if "$(.REQUIRED.$(L:/-l//))"
2317								R += $(I)
2318								break
2319							end
2320						end
2321						if "$(L:T=F)"
2322							R += $(I)
2323							break
2324						end
2325					end
2326				end
2327			end
2328		end
2329	end
2330	return $(R)
2331
2332.MAM.REQ. : .FUNCTION
2333	local B I R
2334	for I $(%)
2335		if I == "[-+]l*"
2336			B := $(I:/^[-+]l//)
2337		else
2338			B := $(I)
2339		end
2340		if ! "$(.PACKAGE.$(B).private)"
2341			R += $(B)
2342		end
2343	end
2344	return $(R)
2345
2346.PREQUIRE : .MAKE .IGNORE
2347	local B P R
2348	B := $(<<:B)
2349	P := $((.PREQUIRE.$(B)))
2350	R := $(.REQ. $(.REQUIRE.$(B)))
2351	if "$(R)" != "$(P)"
2352		(.PREQUIRE.$(B)) := $(R)
2353		force $(<<)
2354	end
2355
2356.SHARED.DEF. = .SHARED.DEF$(CC.SUFFIX.SHARED)
2357.SHARED.USE. = .SHARED$(CC.SUFFIX.SHARED)
2358.SHARED.FLAGS. = : $(CCFLAGS) :
2359
2360.SHARED.ON. : .FUNCTION
2361	if ! "$(-static-link)" && ! "$(CC.LIB.DLL:N=broken)" && "$(CC.DLL)" && ! "$(-mam:N=static*,port*)" && ( "$(-shared)" || "$(.SHARED.FLAGS.:@N=* ($(CC.DLL)|$(CC.DLLBIG)) *)" || "$(.SHARED.FLAGS.:V:@N=* ($\(CC.DLL\)|$\(CC.DLLBIG\)) *)" )
2362		return 1
2363	end
2364
2365.SHARED.LIST.EXCLUDE. : .FUNCTION
2366	local A L T X
2367	T = <<<
2368	while "$($(T):A=.MAKE)"
2369		T := $(T)<
2370	end
2371	A := $(*$($(T)<):O=1)
2372	if CC.SUFFIX.ARCHIVE && "$(A:N=*@($(CC.SUFFIX.ARCHIVE)))"
2373		L := $(A:B)
2374		if CC.PREFIX.ARCHIVE
2375			L := $(L:/^$(CC.PREFIX.ARCHIVE)//)
2376		end
2377	else
2378		T := $($(T):O=1)
2379		if CC.SUFFIX.DYNAMIC && "$(T:N=*@($(CC.SUFFIX.DYNAMIC)))"
2380			L := $(T:B)
2381			if CC.PREFIX.DYNAMIC
2382				L := $(L:/$(CC.PREFIX.DYNAMIC)//)
2383			end
2384		elif CC.SUFFIX.SHARED && "$(T:N=*@($(CC.SUFFIX.SHARED)))"
2385			L := $(T:B)
2386			if CC.PREFIX.SHARED
2387				L := $(L:/$(CC.PREFIX.SHARED)//)
2388			end
2389		end
2390	end
2391	if L
2392		L := $(L:/[0-9._]*$//)
2393		X := N!=-l$(L)
2394		if CC.SUFFIX.DYNAMIC
2395			X := $(X)|?(*/)$(CC.PREFIX.DYNAMIC)$(L)*([0-9._])$(CC.SUFFIX.DYNAMIC)
2396		end
2397		if CC.SUFFIX.SHARED
2398			X := $(X)|?(*/)$(CC.PREFIX.SHARED)$(L)*([0-9._])$(CC.SUFFIX.SHARED)
2399		end
2400	end
2401	return $(X)
2402
2403.SHARED.LIST.LIBS. : .FUNCTION
2404	return $(~~:VBFUI)
2405
2406.SHARED.LIST. : .FUNCTION
2407	local A D L M R S T U N=0 X
2408	X := $(.SHARED.LIST.EXCLUDE.)
2409	M := [-+]l*|*$(CC.SUFFIX.ARCHIVE)|*$(CC.SUFFIX.SHARED)
2410	S := $(%:O=1)
2411	A := $(%:O>1:$(X):/^$(CC.PREFIX.ARCHIVE)\(.*\)\$(CC.SUFFIX.ARCHIVE)/+l\1/)
2412	for L $(A)
2413		if L == "{"
2414			let N = N + 1
2415		elif L == "}"
2416			let N = N - 1
2417		elif N <= 1
2418			T += $(L)
2419		end
2420	end
2421	N = 0
2422	for L $(A:H=O)
2423		if L == "}"
2424			let N = N + 1
2425		elif L == "{"
2426			let N = N - 1
2427		else
2428			if L == "+l*"
2429				if ! "$(T:N=$(L))" && ! "$(R:N=$(L))"
2430					D := $(L:/+/-/)
2431					if "$(R:N=$(D))" || ! "$(-all-static)" && "$(CC.STDLIB:N=$(D:T=F:P=D))" && "$(.PACKAGE.$(L:/+l//).library)" != "+l"
2432						L := $(D)
2433					end
2434				end
2435			end
2436			if L != "$(M)" || ! "$(R:N=$(L))" || N <= 1 && "$(T:N=$(L))"
2437				R += $(L)
2438			end
2439		end
2440	end
2441	return $(S:T=F) $(R:H=O:T=F)
2442
2443.SHARED. : .FUNCTION
2444	local A B D L S T
2445	if "$(.SHARED.ON.)"
2446		if "$(.SHARED.DEF.:A=.TARGET)"
2447			return $($(.SHARED.DEF.) $(%))
2448		end
2449		A := $(%:O=1)
2450		B := $(CC.PREFIX.SHARED)$(%:O=2)$(CC.SUFFIX.SHARED)
2451		L := $(%:O>3:N=[-+]l*)
2452		$(L) : .DONTCARE
2453		if "$(%:O=3)" != "[0-9]*"
2454			S := $(B)
2455		else
2456			S := $(B).$(%:O=3)
2457		end
2458		$(S) : .SHARED.o $(%:N=[!-+]*=*) $(A) $$(.SHARED.BIND. $(%:O=2) $(L))
2459		if ! "$(.INSTALL.$(S))" && ! "$(.NO.INSTALL.)"
2460			if ! ( D = "$(.CC.DLL.DIR.$(S:C%\..*%%))" )
2461				D = $(DLLDIR)
2462			end
2463			$(D:V) :INSTALLDIR: $(S)
2464				$(LD_PRELOAD:N=$(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%):?LD_PRELOAD=""; _RLD_LIST=DEFAULT;?)if	$(SILENT) test -f $(<:C%\$(CC.SUFFIX.SHARED)\.%.oo.%)
2465				then	$(STDRM) $(RMFLAGS) $(<:C%\$(CC.SUFFIX.SHARED)\.%.oo.%)
2466				fi
2467				if	$(SILENT) test -f $(<)
2468				then	$(STDMV) $(<) $(<:C%\$(CC.SUFFIX.SHARED)\.%.oo.%)
2469				fi
2470				$(STDCP) $(<:B:S) $(<)
2471				if	$(SILENT) test "$(<)" != "$(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)"
2472				then	if	$(SILENT) test -f $(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)
2473					then	$(STDRM) $(RMFLAGS) $(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)
2474					fi
2475					$(STDLN) $(<) $(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)
2476				fi
2477				chmod -w $(<)
2478		end
2479	end
2480	return $(S)
2481
2482.SHARED.BIND. : .FUNCTION
2483	local ( B X ... ) $(%)
2484	local A F L P S N
2485	N := $(.SHARED.LIST.EXCLUDE.)
2486	X += $("$(B).req":T=F:P=X:T=I:N!=$("\n")|[-+]l$(B)|$(X:/ /|/G):$(N))
2487	if "$(X)"
2488		let .NO.LIB.TYPE = .NO.LIB.TYPE + 1
2489		for F $(X)
2490			if "$(CC.SHARED)"
2491				if F == "+l*|-ldl|-liconv" /* XXX: probe!!! */
2492					S += $(F)
2493					if F == "+l*"
2494						if ! ( P = "$(<:T=M:A=.COMMAND:O=1)" )
2495							P := $(<:T=M:B:S:N=$(CC.PREFIX.ARCHIVE)*$(CC.SUFFIX.ARCHIVE)|$(CC.PREFIX.SHARED)*$(CC.SUFFIX.SHARED)*:O=1)
2496						end
2497						if P
2498							.PACKAGE.$(F:/+l//).library.$(P) := +l
2499						end
2500					end
2501				else
2502					L := $(F:T=F)
2503					if L == "-l*|*$(CC.SUFFIX.DYNAMIC|CC.SUFFIX.SHARED|"..")|*/libm.a" /* XXX: probe!!! */
2504						S += $(L)
2505						if CC.SUFFIX.STATIC
2506							if A = "$(L:P=B:/\(.*\)\$(CC.SUFFIX.SHARED)\([0-9.]*\)$/\1$(CC.SUFFIX.STATIC)\2/)"
2507								S += $(A)
2508							end
2509						end
2510					elif L && "$(L:A=.TARGET)"
2511						S += $(.REQUIRE.-l% $(F))
2512					else
2513						P := lib/$(L:B:/$(CC.PREFIX.SHARED)//)
2514						$(P) : .ARCHIVE
2515						if "$(P:T=F)"
2516							S += $(L)
2517						end
2518					end
2519				end
2520			else
2521				L := $(F:T=F)
2522				if L == "*$(CC.SUFFIX.ARCHIVE)"
2523					S += $(L)
2524				end
2525			end
2526		end
2527		let .NO.LIB.TYPE = .NO.LIB.TYPE - 1
2528		if S
2529			return $(.SHARED.LIST. $(S))
2530		end
2531	end
2532
2533.SHARED.o : .USE (LDSHARED) (LDFLAGS) $$(LDLIBRARIES)
2534	$(LDSHARED) $(LDFLAGS) $(CC.SHARED) -o $(<) $(.CC.LIB.DLL.$(CC.LIB.DLL) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.:$(CC.SHARED:@??:T=F:N=*$(CC.SUFFIX.ARCHIVE)?)))) $(CC.DLL.LIBRARIES)
2535
2536.SHARED.DEF.dll.a .SHARED.DEF.lib .SHARED.DEF.x : .FUNCTION
2537	local A B D G I L S W X Y Z
2538	Y := $(%:O=2)
2539	B := $(Y)$(%:O=3:/[^0-9]//G)$(dll.custom:?_$(dll.custom)??)
2540	D := $(CC.PREFIX.DYNAMIC)$(B:B)$(CC.SUFFIX.DYNAMIC)
2541	if "$(%:O=1)" != "-"
2542		L := $(CC.PREFIX.SHARED)$(Y:B)$(CC.SUFFIX.SHARED)
2543		S := $(CC.PREFIX.SHARED)$(B:B)$(CC.SUFFIX.SHARED)
2544		Z := $(%:O>3:N=+l*)
2545		X :=
2546		if ! "$(.PLUGIN.$(Y))"
2547			X += $(Y)
2548		end
2549		X += $(Z:/^+l//)
2550		Z += $(%:O>3:/^[-+]l//:N!=*=*|$(X:/ /|/):/^/-l/)
2551		$(Z) : .DONTCARE
2552		A := $(%:O=1)
2553		if CC.DLL.DIR == "$\(BINDIR)"
2554			W := $(Y:B:S=.so)
2555			D := $(W)/$(D)
2556			S := $(W)/$(S)
2557			if CC.SUFFIX.DEBUG
2558				G := $(D:D:B:S=$(CC.SUFFIX.DEBUG))
2559			end
2560			if "$(*.LIBRARY.STATIC.$(Y))"
2561				Z += .LIBRARY.STATIC.$(Y)
2562				.LIBRARY.STATIC.$(Y) : .VIRTUAL
2563			end
2564			if CC.HOSTTYPE == "win32.*" && ! "$(.NO.INSTALL.)" && "$(.INSTALL.$(S))" != "." && "$(ARFLAGS)" != "*I*" && ! "$(*$(A):G=%.def)"
2565				ARFLAGS := $(ARFLAGS)I
2566			end
2567		end
2568		$(D) $(S) $(G:+- $(G)) : .JOINT $(<:/DEF.//) $(*$(A):N=*@($(.LD.KEEP.:/ /|/G:/|$//))) $(A) $(Z)
2569		.ALL : $(D) $(S)
2570		if ! "$(.NO.INSTALL.)"
2571			X := $(D:B:C%\..*%%)
2572			if ! "$(.INSTALL.$(D))"
2573				if ! ( I = "$(.CC.DLL.DIR.$(X))" )
2574					I = $(DLLDIR)
2575				end
2576				$(I:V) :INSTALLDIR: $(D)
2577			end
2578			if ! "$(.INSTALL.$(S))" && ! "$(.INSTALL.$(X))"
2579				$(LIBDIR)/$(L) :INSTALL: $(S)
2580				if G
2581					$(LIBDIR)/$(G:B:S) :INSTALL: $(G)
2582				end
2583			end
2584		end
2585	end
2586	return $(D)
2587
2588.SHARED.REF.dll.a .SHARED.REF.lib : .FUNCTION
2589	local K L
2590	K := *@($(.LD.KEEP.:/ /|/G:/|$//))
2591	L := $(%:N=*$(CC.SUFFIX.ARCHIVE):O=1)
2592	return $(CC.LIB.ALL) $(L) $(CC.LIB.UNDEF) $(%:N=$(K):T=F) $(*.LIBRARY.STATIC.$(L:B:/^$(CC.PREFIX.ARCHIVE)//):T=*) $(.SHARED.LIST. $(%:N!=*$(L)|$(K)))
2593
2594.SHARED.dll.a .SHARED.lib : .USE (LDSHARED) (LDFLAGS) $$(LDLIBRARIES)
2595	$(SILENT) test -d $(<:O=1:D) || $(MKDIR) $(<:O=1:D)
2596	$(LDSHARED) $(LDFLAGS) $(CCFLAGS:N=-[gG]*) $(CC.SHARED) -o $(<:O=1) $(.SHARED.REF.lib $(.SHARED.LIST.LIBS.)) $(CC.DLL.LIBRARIES)
2597
2598.SHARED.REF.x : .FUNCTION
2599	local L
2600	L := $(%:N=*$(CC.SUFFIX.ARCHIVE):O=1)
2601	return $(.CC.LIB.DLL.symbol $(L)) $(.SHARED.LIST. $(*.LIBRARY.STATIC.$(L:B:/^$(CC.PREFIX.ARCHIVE)//):T=*) $(%:N!=$(L)|*$(CC.SUFFIX.OBJECT)))
2602
2603.SHARED.x : .USE (LDSHARED) (LDFLAGS) $$(LDLIBRARIES)
2604	$(LDSHARED) $(LDFLAGS) $(CCFLAGS:N=-[gG]*) $(CC.SHARED) -o $(<:O=1:B:S) $(.SHARED.REF.x $(.SHARED.LIST.LIBS.)) $(CC.DLL.LIBRARIES)
2605
2606/*
2607 * link lhs to rhs
2608 */
2609
2610":LINK:" : .MAKE .OPERATOR
2611	local D L T U
2612	for L $(<)
2613		if "$(L:N=*/*)"
2614			.ALL : $(L:D) $(L)
2615			$(L:D) : .SPECIAL .DO.INSTALL.DIR
2616			D := .DO.INSTALL.DIR.$(L:D)
2617			$(D) : .VIRTUAL .IGNORE $(L:D)
2618			$(L) : .DO.LINK $(D) $(>)
2619		else
2620			if U = "$(L:N!=/*:T!=FD:O=1)"
2621				.ALL : $(U)
2622				$(U) : .SPECIAL .DO.LINK $(>)
2623			end
2624			if ( T = "$(.INSTALL.$(>:B:S):V)" ) != "." && "$(>:A=.ARCHIVE|.COMMAND)"
2625				if ! T
2626					if "$(>:A=.ARCHIVE)"
2627						T = $(LIBDIR)
2628					else
2629						T = $(BINDIR)
2630					end
2631				end
2632				.INSTALL : $(U:D=$(T:V):B:S) $(L:N=/*)
2633				$(U:D=$(T:V):B:S) $(L:N=/*) : .SPECIAL .SCAN.IGNORE .DO.LINK $(>:D=$(T:V):B:S)
2634			end
2635		end
2636	end
2637
2638/*
2639 * if rhs is dir then make recursively, else just make
2640 * rhs name=value are .SCRIPT for sub-makes
2641 */
2642
2643":MAKE:" : .MAKE .OPERATOR
2644	if "$(-recurse)" != "*combine*"
2645		local ATT EXP LHS RHS SCR
2646		if ! ( LHS = "$(<)" )
2647			LHS = .RECURSE
2648			.ALL .MAIN : $(LHS)
2649		end
2650		ATT := $(>:A=.ATTRIBUTE)
2651		for SCR $(>:N=*=*)
2652			eval
2653			$(SCR)
2654			end
2655			script $(SCR:/=.*//)
2656		end
2657		RHS = $(>:N!=*=*:A!=.ATTRIBUTE)
2658		eval
2659			$$(<) :
2660				$(@:V)
2661		end
2662		$(LHS) : $(ATT) $$(.RECURSE.INIT. $(RHS))
2663	elif ! .NONRECURSIVE.PREFIX
2664		local A B I P INS APP NB NP OB OP
2665		A = ::
2666		A := $(@$(A):V)
2667		eval
2668		":NONRECURSIVE_COMMAND:" : .MAKE .OPERATOR
2669			$(A:V)
2670		end
2671		"::" : .MAKE .OPERATOR
2672			if .NONRECURSIVE.PREFIX
2673				local I P
2674				.PACKAGE.build.$(<:O=1) := $(.PACKAGE.build)
2675				for I $(>)
2676					if I != "[-+]*|$(.NONRECURSIVE.PREFIX)/*"
2677						P += $(I:C,^,$(.NONRECURSIVE.PREFIX)/,)
2678					else
2679						P += $(I)
2680					end
2681				end
2682				eval
2683				$$(<) :NONRECURSIVE_COMMAND: $$(P)
2684					$(@:V)
2685				end
2686			else
2687				eval
2688				$$(<) :NONRECURSIVE_COMMAND: $$(>)
2689					$(@:V)
2690				end
2691			end
2692		.ASSERT..SOURCE% : ":NONRECURSIVE_SOURCE:"
2693		":NONRECURSIVE_SOURCE:" : .MAKE .OPERATOR
2694			if .NONRECURSIVE.PREFIX
2695				local I P
2696				for I $(>)
2697					if I != "[-+]*|$(.NONRECURSIVE.PREFIX)/*"
2698						P += $(I:C,^,$(.NONRECURSIVE.PREFIX)/,)
2699					else
2700						P += $(I)
2701					end
2702				end
2703				eval
2704				$$(<) : $$(P)
2705					$(@:V)
2706				end
2707			else
2708				eval
2709				$$(<) : $$(>)
2710					$(@:V)
2711				end
2712			end
2713		A =
2714		for I $(".":W=R=$(.RECURSE.ARGS.:A!=.ONOBJECT:N!=.RECURSE):N!=-)
2715			A := $(I) $(A)
2716		end
2717		for I $(A)
2718			.NONRECURSIVE.PREFIX := $(I)
2719			OP := $(.PACKAGE.)
2720			.PACKAGE. = -
2721			OB := $(.PACKAGE.build)
2722			.PACKAGE.build = -
2723			include "$(I:X=$(MAKEFILES:/:/ /G):T=F:O=1)"
2724			APP =
2725			INS =
2726			for P $(.PACKAGE.build)
2727				if P == "-"
2728					INS := $(APP)
2729					APP =
2730				else if ! "$(OB:N=$(P))"
2731					APP += $(P)
2732				end
2733			end
2734			.PACKAGE.build := $(INS) $(OB) $(APP)
2735			APP =
2736			INS =
2737			for P $(.PACKAGE.)
2738				if P == "-"
2739					INS := $(APP)
2740					APP =
2741				else if ! "$(OP:N=$(P))"
2742					APP += $(P)
2743				end
2744			end
2745			.PACKAGE. := $(INS) $(OP) $(APP)
2746		end
2747		.NONRECURSIVE.PREFIX =
2748		.ASSERT. : .DELETE .SOURCE%
2749		eval
2750		.NONRECURSIVE.PACKAGE.LIBRARIES. : .FUNCTION
2751			$(@.PACKAGE.LIBRARIES.:V)
2752		end
2753		.PACKAGE.LIBRARIES. : .FUNCTION
2754			if ! "$(%)"
2755				return $(.NONRECURSIVE.PACKAGE.LIBRARIES. $(.PACKAGE.build.$(<<:O=1)))
2756			end
2757		LDLIBRARIES += $$(.PACKAGE.LIBRARIES.)
2758	end
2759
2760/*
2761 * rhs compilation with no optimization
2762 * lhs is CC.HOSTTYPE match pattern list to match
2763 * activated for all architectures if lhs omitted
2764 */
2765
2766":NOOPTIMIZE:" : .MAKE .OPERATOR .PROBE.INIT
2767	local T P
2768	.P. : .CLEAR $(<)
2769	P := $(*.P.:/ /|/G)
2770	if ! "$(P)" || "$(-mam:N=static*)" || CC.HOSTTYPE == "$(P)"
2771		for T $(>)
2772			if "$(@.NOOPTIMIZE$(T:S):V)"
2773				$(T:B:S=$(CC.SUFFIX.OBJECT)) : .SPECIAL .NOOPTIMIZE$(T:S)
2774			else
2775				error 1 :NOOPTIMIZE: ignored for suffix $(T:S)
2776			end
2777		end
2778	end
2779
2780":NOPROTECT:" : .MAKE .OPERATOR .PROBE.INIT
2781	local T P
2782	.P. : .CLEAR $(<)
2783	P := $(*.P.:/ /|/G)
2784	if ! "$(P)" || "$(-mam:N=static*)" || CC.HOSTTYPE == "$(P)"
2785		for T $(>)
2786			if "$(@.NOPROTECT$(T:S):V)"
2787				$(T:B:S=$(CC.SUFFIX.OBJECT)) : .SPECIAL .NOPROTECT$(T:S)
2788			else
2789				error 1 :NOPROTECT: ignored for suffix $(T:S)
2790			end
2791		end
2792	end
2793
2794/*
2795 * force default and the usual suspects to do nothing
2796 */
2797
2798":NOTHING:" : .MAKE .OPERATOR
2799	.ALL .INSTALL .MAIN all cc- install : .CLEAR .DO.NOTHING
2800	exit 0
2801
2802/*
2803 * var :OPTIONAL: src ...
2804 *
2805 *	lhs var set to rhs src and rhs asserted on ::
2806 */
2807
2808":OPTIONAL:" : .MAKE .OPERATOR
2809	$(<) := $(>)
2810	:: $(>)
2811
2812/*
2813 * rhs are package names used in compilation
2814 * a package consists of a library and include directory
2815 * the most recent :PACKAGE: assertion takes highest precedence
2816 * .PACKAGE. is the ordered package list used to alter
2817 * .SOURCE.h, INCLUDEDIR, LDLIBRARIES and ancestor
2818 * .PACKAGE.build is the package list to build against
2819 * $(PACKAGE_<package>_BIN) explicit bin dir for <package>
2820 * $(PACKAGE_<package>_INCLUDE) explicit include for <package>
2821 * $(PACKAGE_<package>_LIB) explicit lib dir for <package>
2822 * $(PACKAGE_<package>) root dir for include|lib for <package>
2823 * $(PACKAGE_PATH) default root dirs for all packages
2824 * _PACKAGE_<package>==1 state var defined for <package>
2825 * the following options either control all packages (: starts token)
2826 * or individual packages (: appended to package name)
2827 *
2828 *	:version=xxx:	attempt version xxx first
2829 *	:noinstall:	do not redefine INCLUDEDIR
2830 *	:nolibrary:	do not link with library
2831 *	:static:	attempt static library first
2832 *	:dynamic:	attempt dynamic library first
2833 *	:insert:	insert into package list
2834 *	:noregistry:	do not link dll against address registry
2835 *	:soname:	link dll with $(CC.SHARED.NAME), =-1 for :B: edit
2836 */
2837
2838.PACKAGE. =
2839.PACKAGE.build =
2840.PACKAGE.install =
2841.PACKAGE.libraries =
2842.PACKAGE.license =
2843.PACKAGE.plugin =
2844.PACKAGE.registry = 1
2845.PACKAGE.soname =
2846.PACKAGE.stdlib = $(*.SOURCE.a) $(CC.STDLIB) /usr/lib /lib
2847.PACKAGE.strip =
2848
2849.PACKAGE.LIBRARY. : .FUNCTION
2850	local P R
2851	if ! ( P = "$(<:T=M:A=.COMMAND:O=1)" )
2852		P := $(<:T=M:B:S:N=$(CC.PREFIX.ARCHIVE)*$(CC.SUFFIX.ARCHIVE)|$(CC.PREFIX.SHARED)*$(CC.SUFFIX.SHARED)*:O=1)
2853	end
2854	if P
2855		if R = "$(.PACKAGE.$(%).library.$(P))"
2856			return $(R)
2857		end
2858		if R = "$(.PACKAGE.$(%).library.weak.$(P))"
2859			return $(R)
2860		end
2861	end
2862	return $(.PACKAGE.$(%).library)
2863
2864.PACKAGE.LIBRARIES. : .FUNCTION
2865	local L P R
2866	for L $(%)
2867		if P = "$(.PACKAGE.LIBRARY. $(L))"
2868			if ! "$(**:B:S:N=[-+]l$(L)|$(.LIB.NAME. $(L)))"
2869				$(P)$(L) : .DONTCARE
2870				R += $(P)$(L)
2871			end
2872		end
2873	end
2874	.UNBIND : $(R)
2875	R += $(.PACKAGE.libraries)
2876	$(R) : .ARCHIVE .MULTIPLE
2877	return $(R)
2878
2879/*
2880 * initialize the package args
2881 * on return the following are set if found for package $(P)
2882 *	PACKAGE_$(P)_BIN	package bin dir
2883 *	PACKAGE_$(P)_INCLUDE	package include dir
2884 *	PACKAGE_$(P)_LIB	package lib dir
2885 *	.PACKAGE.$(P).found	1 if at least one package lib or header found
2886 * the canonicalized last package name is returned
2887 */
2888
2889.PACKAGE.CONFIG. = lib/pkgconfig
2890.PACKAGE.GLOBAL. =
2891.PACKAGE.LOCAL. =
2892.PACKAGE.PROBE. =
2893
2894.PACKAGE.INIT. : .FUNCTION .PROBE.INIT
2895	local T1 T2 T3 T4 T5 T6 T7
2896	local B D E G H I K L N P Q T V W X Y Z EP IP LP LPL LPV PFX SFX FOUND
2897	if ! .PACKAGE.GLOBAL.
2898		.PACKAGE.GLOBAL. := $(PATH:/:/ /G:D:N!=$(USRDIRS:/:/|/G)|/usr/*([!/])) $(INSTALLROOT:T=F:P=L=*) $(CC.STDLIB:D:N!=$(USRDIRS:/:/|/G)|/usr/*([!/])) $(PATH:/:/ /G:D) $(OPTDIRS:/:/ /G)
2899		.PACKAGE.GLOBAL. := $(.PACKAGE.GLOBAL.:N!=$(PACKAGE_IGNORE):T=F:U)
2900		.PACKAGE.CONFIG. := $(.PACKAGE.GLOBAL.:X=$(.PACKAGE.CONFIG.):T=F:U)
2901		: $(.PACKAGE.PROBE.:V:R)
2902	end
2903	for P $(%)
2904		if "$(_PACKAGE_$(P))" == "0"
2905			continue
2906		end
2907		if "$(PACKAGE_$(P)_found)" != ""
2908			.PACKAGE.$(P).found := $(PACKAGE_$(P)_found)
2909		end
2910		if "$(.PACKAGE.$(P).found)" != ""
2911			continue
2912		end
2913		FOUND = 0
2914		H := $(PACKAGE_$(P))
2915		if ! H
2916			H := $($(P:F=%(upper)s)_HOME)
2917			if H && H == "*/*"
2918				PACKAGE_$(P) := $(H)
2919			end
2920		end
2921		E := $(PACKAGE_$(P)_BIN)
2922		EP := $(.PACKAGE.$(P).bin)
2923		if EP == "/*"
2924			if ! E
2925				E := $(EP)
2926			end
2927			EP =
2928		end
2929		if ! EP
2930			EP = bin
2931		end
2932		I := $(PACKAGE_$(P)_INCLUDE)
2933		IP := $(.PACKAGE.$(P).include)
2934		if IP == "/*"
2935			if ! I
2936				I := $(IP)
2937			end
2938			IP =
2939		end
2940		if ! IP
2941			IP = include
2942		end
2943		L := $(PACKAGE_$(P)_LIB)
2944		LP := $(.PACKAGE.$(P).lib)
2945		if LP == "/*"
2946			if ! L
2947				L := $(LP)
2948			end
2949			LP =
2950		end
2951		if ! LP
2952			LP := $(CC.STDLIB.BASE)
2953		end
2954		if ( I && L || "$(.PACKAGE.$(P).rules)" != "-" && ( "$(I:T=F)" || "$(L:T=F)" ) )
2955			FOUND = 1
2956		else
2957			if ! "$(CC.REQUIRE.$(P))"
2958				if T1 = "$(.PACKAGE.CONFIG.:L!~?(lib)($(P)|$(P)-*).pc:O=1)"
2959					T1 := $(T1:T=I:/${\([^}]*\)}/$$(\1)/G)
2960					local $(T1:N=+([[:alnum:]_[:space:]])=*:/=.*//)
2961					$(T1:N=+([[:alnum:]_[:space:]])[:]*:/:.*//) : .CLEAR
2962					: $(T1:V:R)
2963					if !I
2964						I := $(~Cflags:N=-I*:/-I//)
2965						PACKAGE_$(P)_INCLUDE := $(I)
2966					end
2967					if !L
2968						L := $(~Libs:N=-L*:/-L//)
2969						PACKAGE_$(P)_LIB := $(L)
2970					end
2971					CC.REQUIRE.$(P) := $(~Libs:N=[-+]l*)
2972					PACKAGE_$(P) := /
2973					FOUND = 1
2974				end
2975			end
2976			T2 := $(PACKAGE_$(P))
2977			if T2
2978				if !I
2979					T1 = $(T2)/$(IP)
2980					if "$(T1:P=X)"
2981						I := $(T1)
2982					end
2983				end
2984				if !L
2985					for T3 $(LP)
2986						T1 = $(T2)/$(T3)
2987						if "$(T1:P=X)"
2988							L := $(T1)
2989							break
2990						end
2991					end
2992				end
2993			elif !I && !L
2994				T1 = $(INSTALLROOT)/$(IP)/$(P)
2995				if "$(T1:P=X)"
2996					for K SHARED ARCHIVE
2997						for T3 $(LP)
2998							T1 = $(INSTALLROOT)/$(T3)/$(CC.PREFIX.$(K))$(P)$(CC.SUFFIX.$(K))
2999							if "$(T1:P=X)"
3000								T2 := $(INSTALLROOT)
3001								PACKAGE_$(P) := $(T2)
3002								break 2
3003							end
3004						end
3005					end
3006				end
3007			end
3008			if !L || !I && !T2
3009				T4 := $(PACKAGE_PATH:/:/ /G) $(.PACKAGE.DIRS.) $(.PACKAGE.GLOBAL.) $(.PACKAGE.GLOBAL.:/:/ /G:C%$%/$(P)%)
3010				if P == "*[!0-9]+([0-9])"
3011					T4 += $(.PACKAGE.GLOBAL.:/:/ /G:C%$%/$(P:C,[0-9]*$,,)%)
3012				end
3013				V =
3014				if T5 = "$(PACKAGE_$(P)_VERSION)"
3015					N := $(P)-$(T5) $(P)$(T5) $(P)R$(T5) $(P)r$(T5)
3016					B =
3017					for T5 $(T5:/\./ /G)
3018						if V
3019							V := $(V)*(?(.)$(T5)
3020							B := $(B))
3021						else
3022							V := $(T5)
3023						end
3024					end
3025					V := $(V)$(B)
3026				elif P == "*[0-9][rR]+([0-9])"
3027					N := $(P)
3028					P := $(N:/[rR][0-9]*$//)
3029				else
3030					N :=
3031				end
3032				if B = "$(P:N=[!0-9]*+([0-9.]):/[0-9]*$//)"
3033					B := @($(P)|$(B))
3034				else
3035					B := $(P)
3036				end
3037				N += $(P)
3038				if P == "*[!0-9]+([0-9])"
3039					N += $(P:C,[0-9]*$,,)
3040				end
3041				LPL := $(CC.STDLIB:B) $(T1) $(LP)
3042				LPL := $(LPL:U)
3043				T4 := $(T4:N!=//*:T=F:H=P:U)
3044				T7 := $(T4:X=$(IP)/$(P):N!=//*:T=F:D:D)
3045				T1 =
3046				for K SHARED ARCHIVE
3047					SFX := $(CC.SUFFIX.$(K))
3048					PFX := $(CC.PREFIX.$(K))
3049					for D $(N) /
3050						T5 := $(T7) $(T4:N=*/$(D):D) $(T4)
3051						T5 := $(T5:U)
3052						if ! V
3053							if ! .PACKAGE.LOCAL.
3054								.PACKAGE.LOCAL. := $(PKGDIRS:T=F:P=A:U)
3055							end
3056							for X $(.PACKAGE.LOCAL.)
3057								Y := $(X)/$(PFX)$(P)$(SFX)
3058								if ( T1 = "$(Y:P=X:O=1:D)" )
3059									break 3
3060								end
3061								Y := $(X)/$(PFX)$(P)$(CC.LIB.TYPE)$(SFX)
3062								if ( T1 = "$(Y:P=X:O=1:D)" )
3063									break 3
3064								end
3065							end
3066						end
3067						for LPV $(LPL)
3068							X := $(T5:C%$%/$(D)/$(LPV)/$(PFX)$(P)$(SFX)%:C%^//%/%)
3069							if ( T1 = "$(X:N!=//*:P=X:O=1:D)" )
3070								break 3
3071							end
3072							if T6 = "$(X:D:N!=//*:P=X:O=1)"
3073								if Z = "$(T6:L>=?(lib)$(B)*$(SFX)*([0-9.]))"
3074									if V
3075										if W = "$(Z:N=*$(V)*:O=1)"
3076											T1 := $(T6)
3077											break 3
3078										end
3079									end
3080									T1 := $(T6)
3081									break 3
3082								end
3083							end
3084						end
3085					end
3086				end
3087				if "$(T1)"
3088					FOUND = 1
3089					L := $(T1)
3090					if T2
3091						T1 := $(T2)
3092					else
3093						T1 := $(T1:D)
3094					end
3095				elif T2
3096					T1 := $(T2)
3097				elif ! ( T1 = "$(T4:C%$%/$(IP)/$(P)%:N!=//*:P=X:O=1:D:D)" )
3098					T1 := $(T4:N=*/$(P):C%$%/$(IP)%:N!=//*:P=X:O=1:D)
3099				end
3100				if T1 == "/"
3101					T1 = /usr
3102				end
3103				eval
3104				PACKAGE_$(P) = $(T1:P=C)
3105				end
3106			else
3107				T1 := $(T2)
3108			end
3109			if T1
3110				.PACKAGE.DIRS. += $(T1)
3111				if !I && IP != "-"
3112					I := $(T1)/$(IP)
3113					H := $(I)/$(P)/.
3114					if "$(H:P=X)"
3115						I := $(I)/$(P)
3116					end
3117					eval
3118					PACKAGE_$(P)_INCLUDE = $(I:P=C)
3119					end
3120				end
3121				if ! "$(PACKAGE_$(P)_LIB)" || !L && LP != "-"
3122					if !L
3123						L := $(T1)/$(LP:O=N)
3124					end
3125					eval
3126					PACKAGE_$(P)_LIB = $(L:P=C)
3127					end
3128					if ! "$(.PACKAGE.stdlib:N=$(L))"
3129						.SOURCE.a : $(L)
3130					end
3131				end
3132				if ! "$(PACKAGE_$(P)_INCLUDE)" && "$(PACKAGE_$(P)_LIB)"
3133					I := $(PACKAGE_$(P)_LIB:D)/$(IP)
3134					H := $(I)/.
3135					if "$(H:P=X)"
3136						eval
3137						PACKAGE_$(P)_INCLUDE = $(I:P=C)
3138						end
3139					end
3140				end
3141				eval
3142				_PACKAGE_$(P) $(.INITIALIZED.:?=?==?) 1
3143				end
3144				if ! FOUND
3145					for D $(I)/*.h*([!.]) $(I)/*/*.h*([!.])
3146						if "$(D:P=G:O=1:P=X)"
3147							FOUND = 1
3148							break
3149						end
3150					end
3151					if ! FOUND && "$(PACKAGE_$(P)_VERSION)"
3152						PACKAGE_$(P)_VERSION :=
3153						PACKAGE_$(P) :=
3154						PACKAGE_$(P)_BIN :=
3155						PACKAGE_$(P)_INCLUDE :=
3156						PACKAGE_$(P)_LIB :=
3157						return $(.PACKAGE.INIT. $(P))
3158					end
3159				end
3160			end
3161		end
3162		if FOUND && ! "$(PACKAGE_$(P)_BIN)"
3163			if EP == "-"
3164				PACKAGE_$(P)_BIN :=
3165			else
3166				PACKAGE_$(P)_BIN := $(PACKAGE_$(P)_LIB:D:B=$(EP))
3167			end
3168		end
3169		error -1 PACKAGE_$(P)=$(PACKAGE_$(P)) PACKAGE_$(P)_BIN=$(PACKAGE_$(P)_BIN) PACKAGE_$(P)_INCLUDE=$(PACKAGE_$(P)_INCLUDE) PACKAGE_$(P)_LIB=$(PACKAGE_$(P)_LIB)
3170		.PACKAGE.$(P).found := $(FOUND)
3171	end
3172	return $(P)
3173
3174/*
3175 * evaluate a logical expression of package ids
3176 * used by :VARIANT:
3177 */
3178
3179PACKAGES : .SPECIAL .FUNCTION
3180	local P M X
3181	if ! "$(%)"
3182		return 1
3183	end
3184	M := $(.PACKAGE.:/ /|/G)
3185	for P $(%:/[^a-zA-Z0-9_.]/ /G)
3186		if "$(P)" != "$(M)"
3187			: $(.PACKAGE.INIT. $(P))
3188		end
3189	end
3190	X := $(%)
3191	for P $(.PACKAGE.)
3192		X := $(X:/\<$(P)\>/1/G)
3193	end
3194	return $(X:/\([A-Za-z_.][A-Za-z0-9_.]*\)/"$$(.PACKAGE.\1.found)"=="1"/G:@/"  *"/" \&\& "/G:E)
3195
3196":PACKAGE:" : .MAKE .OPERATOR
3197	local A H I T N O P Q V version insert=0 install=1 this_install library=-l options=1 private
3198	if "$(<)"
3199		/* a separate include handles package definitions */
3200		eval
3201		$$(<:V) :package: $$(>:V)
3202			$(@:V)
3203		end
3204		return
3205	end
3206	if ! "$(-?ancestor)"
3207		/* please convert me to long op names */
3208		let I = $(".":P=L=*:C,[^/],,G:O!:H=N:O=1) - 2
3209		if I > 3
3210			I = 3
3211		elif I < 0
3212			I = 0
3213		end
3214		if I && "$(*.VIEW:O=2:P=I=..)"
3215			let I = I + 1
3216		end
3217		set ancestor:=$(I)
3218	end
3219	for T $(>)
3220		if T == "{" || T == "}"
3221			.PACKAGE.build += $(T)
3222		elif T == "+"
3223			break
3224		elif T == "-"
3225			install = 0
3226		elif T == "--"
3227			options = 0
3228		elif T == ":*" || T == "--*" && options || T != "--*" && T == "*=*" && T != "*:*"
3229			for O $(T:/:/ /G)
3230				N := $(O:/^--//)
3231				if N == "no*"
3232					V := 0
3233					N := $(N:/no//)
3234				else
3235					V := 1
3236				end
3237				if N == "*=*"
3238					V := $(N:/[^=]*=//)
3239					N := $(N:/=.*//)
3240				end
3241				S =
3242				Q := $(N)
3243				if N == "optimize"
3244					if "$(PACKAGE_OPTIONS:N=optimize-space)"
3245						N = dynamic
3246						.PACKAGE.strip = $(CC.LD.STRIP)
3247					elif "$(PACKAGE_OPTIONS:N=optimize-time)"
3248						N = static
3249					else
3250						N =
3251					end
3252				elif N == "private"
3253					private = 1
3254					N = static
3255				elif N == "space"
3256					if ! "$(PACKAGE_OPTIONS:N=optimize-time)"
3257						N = dynamic
3258						.PACKAGE.strip = $(CC.LD.STRIP)
3259					else
3260						N =
3261					end
3262				elif N == "time"
3263					if ! "$(PACKAGE_OPTIONS:N=optimize-space)"
3264						N = static
3265					else
3266						N =
3267					end
3268				end
3269				if N == "dynamic"
3270					library := -l
3271					if N == "$(Q)"
3272						.NO.LIB.TYPE = 1
3273					end
3274				elif N == "license"
3275					if V && ! .PACKAGE.license
3276						if V == "1"
3277							.PACKAGE.license := $(P)
3278						else
3279							.PACKAGE.license := $(V)
3280						end
3281					end
3282				elif N == "type"
3283					if V
3284						.NO.LIB.TYPE = 0
3285					else
3286						.NO.LIB.TYPE = 1
3287					end
3288				elif N == "static"
3289					if V
3290						library := +l
3291					else
3292						library := -l
3293					end
3294				elif N == "insert|install|version"
3295					$(N) := $(V)
3296				elif N == "registry|soname"
3297					.PACKAGE.$(N) := $(V)
3298				elif N == "ignore"
3299					if PACKAGE_IGNORE
3300						PACKAGE_IGNORE := $(PACKAGE_IGNORE)|$(V)
3301					else
3302						PACKAGE_IGNORE := $(V)
3303					end
3304				elif N == "latest"
3305					_API_DEFAULT == 99999999
3306				elif N == "api"
3307					if V == 0
3308						eval
3309						_$(P:F=%(upper)s)_API_H == 1
3310						end
3311					else
3312						if V == "latest"
3313							V = 99999999
3314						end
3315						if V >= 19700101
3316							eval
3317							_API_DEFAULT == $(V)
3318							end
3319						end
3320					fi
3321				elif O == "--*" || N == "debug|profile|threads"
3322					set $(O)
3323				end
3324			end
3325		elif T == "[-+]*"
3326			.PACKAGE.libraries += $(T)
3327		elif T == "CC.*=*|noCC.*"
3328			if T == "no*"
3329				T := $(T:V:/no//) =
3330			end
3331			if .PACKAGE.GLOBAL.
3332				eval
3333				$(T:V)
3334				end
3335			else
3336				.PACKAGE.PROBE. += $("\n")$(T:V)
3337			end
3338		elif T != "*:(command|force|order|prereq)"
3339			if T == "*:*"
3340				P := $(T:/:.*//)
3341				T := $(T:/[^:]*//)
3342			else
3343				P := $(T)
3344				T :=
3345			end
3346			if P == "/*"
3347				V := $(P)
3348				P := $(P:B)
3349				if ! PACKAGE_$(P)
3350					PACKAGE_$(P) := $(V)
3351				end
3352			end
3353			if "$(_PACKAGE_$(P))" == "0"
3354				continue
3355			end
3356			I = pkg-$(P).mk
3357			V := $(version)
3358			this_install := $(install)
3359			while 1
3360				if H = "$(I:T=F)"
3361					.PACKAGE.$(P).rules := $(H)
3362					break
3363				elif "$(PACKAGE_$(P))$(PACKAGE_$(P)_INCLUDE)$(PACKAGE_$(P)_LIB)"
3364					break
3365				elif P == "*[0-9][rR]+([0-9.])"
3366					N := $(P:/[rR][0-9.]*$//)
3367					V := $(P:/$(N).\([0-9.]*\)$/\1/)
3368					P := $(N)
3369				elif P == "*?(-)+([0-9.])"
3370					N := $(P:/-*[0-9.]*$//)
3371					V := $(P:/$(N)-*\([0-9.]*\)$/\1/)
3372					P := $(N)
3373				else
3374					break
3375				end
3376			end
3377			if ! "$(.PACKAGE.$(P).rules)"
3378				.PACKAGE.$(P).rules := -
3379			end
3380			.PACKAGE.$(P).library := $(library)
3381			.PACKAGE.$(P).private := $(private)
3382			if "$(V)"
3383				PACKAGE_$(P)_VERSION := $(V)
3384			end
3385			I := $(insert)
3386			A := 0
3387			for N $(T:/:/ /G)
3388				if N == "no*"
3389					V := 0
3390					N := $(N:/no//)
3391				else
3392					V := 1
3393				end
3394				if N == "*=*"
3395					V := $(N:/[^=]*=//)
3396					N := $(N:/=.*//)
3397				end
3398				Q := $(N)
3399				if N == "optimize"
3400					if "$(PACKAGE_OPTIONS:N=optimize-space)"
3401						N = dynamic
3402					elif "$(PACKAGE_OPTIONS:N=optimize-time)"
3403						N = static
3404					else
3405						N =
3406					end
3407				elif N == "space"
3408					if ! "$(PACKAGE_OPTIONS:N=optimize-time)"
3409						N = dynamic
3410					else
3411						N =
3412					end
3413				elif N == "time"
3414					if ! "$(PACKAGE_OPTIONS:N=optimize-space)"
3415						N = static
3416					else
3417						N =
3418					end
3419				end
3420				if N == "dontcare"
3421					if V
3422						.PACKAGE.$(P).dontcare := 1
3423					end
3424				elif N == "dynamic"
3425					.PACKAGE.$(P).library := -l
3426					if N == "$(Q)"
3427						.PACKAGE.$(P).type := -
3428					end
3429				elif N == "static"
3430					.PACKAGE.$(P).library := +l
3431				elif N == "library"
3432					if V
3433						.PACKAGE.$(P).library := -l
3434					else
3435						.PACKAGE.$(P).library :=
3436					end
3437				elif N == "private"
3438					if V
3439						.PACKAGE.$(P).library := +l
3440						.PACKAGE.$(P).private := 1
3441					else
3442						.PACKAGE.$(P).private :=
3443					end
3444				elif N == "include|lib"
3445					if V != 1
3446						if V == 0
3447							V = -
3448						end
3449						.PACKAGE.$(P).$(N) := $(V)
3450					end
3451				elif N == "license"
3452					if V && ! .PACKAGE.license
3453						if V == "1"
3454							.PACKAGE.license := $(P)
3455						else
3456							.PACKAGE.license := $(V)
3457						end
3458					end
3459				elif N == "root"
3460					if V == 0
3461						.PACKAGE.$(P).include := -
3462						.PACKAGE.$(P).lib := -
3463						.PACKAGE.$(P).library :=
3464					elif V
3465						.PACKAGE.$(P) := $(V)
3466					end
3467				elif N == "type"
3468					if V
3469						.PACKAGE.$(P).type := $(V)
3470					else
3471						.PACKAGE.$(P).type := -
3472					end
3473				elif N == "version"
3474					PACKAGE_$(P)_VERSION := $(V)
3475				elif N == "install"
3476					this_$(N) := $(V)
3477				elif N == "insert"
3478					I := 1
3479				elif N == "attributes"
3480					A := $(V)
3481				elif N == "plugin"
3482					A = 1
3483					.PACKAGE.$(N) := $(P)
3484				elif N == "api|[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
3485					if V == 0
3486						eval
3487						_$(P:F=%(upper)s)_API_H == 1
3488						end
3489					else
3490						if N != "api"
3491							V := $(N)
3492						end
3493						if V == "latest"
3494							V = 99999999
3495						end
3496						eval
3497						_API_$(P) == $(N)
3498						end
3499					end
3500				else
3501					.PACKAGE.$(P).option.$(N) := $(V)
3502				end
3503			end
3504			if ! A
3505				eval
3506				_PACKAGE_$(P) $(.INITIALIZED.:?=?==?) 1
3507				end
3508				if this_install && ! .PACKAGE.install
3509					if "$(INCLUDEDIR:V)" == "\$\(INSTALLROOT\)/include"
3510						.PACKAGE.install = 1
3511						.PACKAGE.$(P).dontcare := 1
3512						INCLUDEDIR := $(INCLUDEDIR:V)/$(P)
3513					end
3514				end
3515				if ! "$(.PACKAGE.:N=$(P))"
3516					if I
3517						.PACKAGE. := $(P) $(.PACKAGE.)
3518						.PACKAGE.build := $(P) $(.PACKAGE.build)
3519					else
3520						.PACKAGE. += $(P)
3521						.PACKAGE.build += $(P)
3522					end
3523				end
3524				if "$(H)"
3525					include + "$(H)"
3526				end
3527			end
3528		end
3529	end
3530
3531/*
3532 * :PACKAGE_INIT: foo.c bar.c ...
3533 *
3534 *	for source that compiles either standalone or with richer libraries
3535 *	rhs installed in $(BINDIR) using .ACCEPT semantics
3536 *	rhs appear in $(BINDIR) for .LIST.PACKAGE.BINARY
3537 *	lhs for pre-installed $(BINDIR) files listed by .LIST.PACKAGE.BINARY
3538 */
3539
3540":PACKAGE_INIT:" : .MAKE .OPERATOR
3541	local I B
3542	.LIST.PACKAGE.BINARY : .LIST.PACKAGE.INIT
3543	eval
3544	.LIST.PACKAGE.INIT : .MAKE
3545		local I
3546		for I $$(*)
3547			print ;;;$$(I:T=F:P=A);$$(BINDIR)/$$(I:B)
3548		end
3549		for I $(<)
3550			if I != "/*"
3551				I := $$(I:D=$$(BINDIR):B:S)
3552			end
3553			if I = "$$(I:T=F:P=A)"
3554				print ;;;$$(I);$$(I)
3555			end
3556		end
3557	end
3558	for I $(>)
3559		B := $(I:B)
3560		if ! "$(.NO.INSTALL.)"
3561			$(BINDIR) :INSTALLDIR: $(B)
3562			$(BINDIR)/$(B) : .ACCEPT
3563		end
3564		$(B) :: $(I)
3565		.LIST.PACKAGE.INIT : $(B)
3566	end
3567
3568/*
3569 * rhs compilation to place tables and/or data in
3570 * readonly text object section -- should go away
3571 * when C const is used/implemented to do same
3572 * lhs is CC.HOSTTYPE match pattern to match
3573 * activated for all architectures if lhs omitted
3574 */
3575
3576":READONLY:" : .MAKE .OPERATOR .PROBE.INIT
3577	local T
3578	if ! "$(<)" || "$(-mam:N=static*)" || CC.HOSTTYPE == "$(<)"
3579		for T $(>)
3580			if "$(@.READONLY$(T:S):V)"
3581				$(T:B:S=$(CC.SUFFIX.OBJECT)) : .SPECIAL .READONLY$(T:S)
3582			else
3583				error 1 :READONLY: ignored for suffix $(T:S)
3584			end
3585		end
3586	end
3587
3588/*
3589 * rhs are generated but still saved by save common actions
3590 */
3591
3592":SAVE:" : .MAKE .OPERATOR
3593	.COMMON.SAVE : $(>)
3594
3595/*
3596 * rhs are metarule patterns that do not generate %
3597 */
3598
3599":TERMINAL:" : .MAKE .OPERATOR
3600	.METARULE.X. : $(>)
3601
3602/*
3603 * cc-* variants
3604 *
3605 *	id :VARIANT: [ package-expr ]
3606 *		n1 = v1
3607 *		n2 = v2
3608 *		...
3609 *
3610 *	:VARIANT: [ arch:suffix:option ]
3611 */
3612
3613":VARIANT:" : .MAKE .OPERATOR
3614	if "$(<)"
3615		.VARIANTS. += cc-$(<)
3616		.CLOBBER. += cc-$(<)
3617		eval
3618		cc-$$(<) : .ALWAYS .LOCAL .FORCE .SPECIAL .RECURSE.SEMAPHORE
3619			set -
3620			if	test "0" != "$$(PACKAGES $(>))"
3621			then	if	test ! -d $$(<)
3622				then	$(MKDIR) $$(<)
3623				fi
3624				$$(-silent:Y%%echo $$(.RWD.:C%$%/%)$$(<): >&2%)
3625				cd $$(<)
3626				$$(MAKE) --file=$$(MAKEFILE) --keepgoing $$(-) --errorid=$$(<) _BLD_$$(<:/cc-//:/[^a-zA-Z0-9_]/_/G)==1 VARIANT=$$(<:/cc-//) VARIANTID=$$(<:/cc-//:N=[a-zA-Z]*:?-??)$$(<:/cc-//) .ATTRIBUTE.$(IFFEGENDIR)/%:.ACCEPT MAKEPATH=..:$$(MAKEPATH) $$(=:V:N!=MAKEPATH=*) $$(.RECURSE.ARGS.:N!=.CC-*) $(@:V:@Q)
3627			fi
3628		end
3629	else
3630		local V
3631		for V $(>|CC.DLL.VARIANTS)
3632			local ( A S O ... ) $(V:/:/ /G)
3633			eval
3634			-$(S) :VARIANT:
3635				CC = cc $(O)
3636			end
3637		end
3638	end
3639
3640/*
3641 * external distribution workarounds
3642 *
3643 *	target :WORKAROUND:		target is empty
3644 *	target :WORKAROUND: -		target is .TERMINAL
3645 *	target :WORKAROUND: prereq	target copied from prereq
3646 *	target :WORKAROUND: prereq	target from action applied to prereq
3647 *		action
3648 */
3649
3650.WORKAROUND.COVERED. :FUNCTION:
3651	local T
3652	if T = "$(^^)"
3653		return $(T)
3654	end
3655	if T = "$(<<:P=L=*:O=2)"
3656		return $(T)
3657	end
3658
3659":WORKAROUND:" : .MAKE .OPERATOR
3660	if "$(>)" == "-"
3661		$(<) : .TERMINAL
3662	else
3663		eval
3664		$$(>) : .SCAN.NULL
3665		$$(<) : -TERMINAL $$(>)
3666			$(@:V:@?$$(>:V:@Y%%test "" != "$$$$(.WORKAROUND.COVERED.)" && { $$$$(SILENT) test -d $$$$(<:D) || $$$$(MKDIR) $$$$(<:D); $$$$(CP) $$$$(.WORKAROUND.COVERED.) $$$$(<) ;}$$("\n")%)$$(@:V)?$$(>:@Y%$$$$(SILENT) test -d $$$$(<:D) || $$$$(MKDIR) $$$$(<:D); $$$$(CP) $$$$(*)%: >%) $$$(<)?)
3667		end
3668	end
3669
3670/*
3671 * :YYPREFIX: [prefix] [header.h] a.y a.y.c a.y.h b.l b.l.c
3672 */
3673
3674":YYPREFIX:" : .MAKE .OPERATOR
3675	local H P F PL PY PH B I O
3676	for F $(>)
3677		if "$(F)" != "*.*"
3678			P := $(F)
3679		elif "$(F)" == "*.l.c"
3680			PL := $(F)
3681		elif "$(F)" == "*.y.c"
3682			PY := $(F)
3683		elif "$(F)" == "*.y.h"
3684			PH := $(F)
3685		elif "$(F)" == "*.h"
3686			H := $(F)
3687		elif "$(F)" == "*.l"
3688			LEXFIX.$(F:B) := $(P)
3689			LEXHDR.$(F:B) := $(H)
3690		elif "$(F)" == "*.y"
3691			YACCFIX.$(F:B) := $(P)
3692			YACCHDR.$(F:B) := $(H)
3693		end
3694	end
3695	if PL
3696		:: $(PL)
3697		.PASS.AFTER.$(PL) : .VIRTUAL .FORCE .AFTER
3698			{
3699			echo "/* : : fallback $(<<) generated by $(LEX) -- do not edit : : */"
3700			cat $(<<)
3701			} > $(<<:B:S=.l.c)
3702		.FAIL.AFTER.$(PL) : .VIRTUAL .FORCE .AFTER .FAILURE $(PL)
3703			: $(<<) : falling back to previously generated $(*) :
3704			$(CP) $(*) $(<<)
3705		$(PL:B:B)$(PL:S) : .PASS.AFTER.$(PL) .FAIL.AFTER.$(PL)
3706	end
3707	if PY
3708		:: $(PY)
3709		O := $(PY:S)
3710		I := $(PY:B::S)
3711		B := $(PY:B:B)
3712		if PH
3713			.PASS.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER
3714				{
3715				echo "/* : : fallback $(<<:N=*.c:B:S=.c) generated by $(YACC) -- do not edit : : */"
3716				cat $(<<:N=*.c)
3717				} > $(<<:N=*.c:B:S=.y.c)
3718				{
3719				echo "/* : : fallback $(<<:N=*.h:B:S=.h) generated by $(YACC) -- do not edit : : */"
3720				cat $(<<:N=*.h)
3721				} > $(<<:N=*.h:B:S=.y.h)
3722			.FAIL.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER .FAILURE $(PY) $(PH)
3723				: $(<<) : falling back to previously generated { $(*) } :
3724				$(CP) $(*:O=1) $(<<:O=1)
3725				$(CP) $(*:O=2) $(<<:O=2)
3726		else
3727			.PASS.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER
3728				{
3729				echo "/* : : fallback $(<<) generated by $(YACC) -- do not edit : : */"
3730				cat $(<<)
3731				} > $(<<:B:S=.y.c)
3732			.FAIL.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER .FAILURE $(PY)
3733				: $(<<) : falling back to previously generated $(*) :
3734				$(CP) $(*) $(<<)
3735		end
3736		$(PY:B:B)$(PY:S) : .PASS.AFTER.$(PY) .FAIL.AFTER.$(PY)
3737	end
3738
3739/*
3740 * rhs are compiled using $(cc) rather than $(CC)
3741 * use like ::
3742 * NOTE: case ignorant filesystems make this a little tricky
3743 */
3744
3745":cc:" : .MAKE .OPERATOR .PROBE.INIT
3746	if "$(CC)" != "$(cc)"
3747		local O S T
3748		for S $(.SUFFIX.$(CC.DIALECT:N=C++:?c?C?))
3749			T := $(>:G=%$(S))
3750			if T == "*$(S)" || S == ".c" && T != "*.C" || S == ".C" && T != "*.c"
3751				O += $(T:B:S=$(CC.SUFFIX.OBJECT))
3752			end
3753		end
3754		O := $(O:U)
3755		.CLOBBER. += null.mo null.ms
3756		:: $(>)
3757		$(<) :: $(O)
3758		$(O) : .CLEAR .JOINT .DO.cc
3759	end
3760
3761.DO.cc : .USE .ALWAYS .LOCAL .FORCE
3762	$(-exec:?silent ??)$(MAKE) --file=/dev/null --file=$(MAKEFILE) $(-) --errorid=$(cc:N!=*=*:B) '.null : $(<)' .null $(=) CC=$(cc:@Q) CCFLAGS=$(CCFLAGS:VP:@Q)
3763
3764/*
3765 * make scripts
3766 */
3767
3768.CLEARARGS : .MAKE .VIRTUAL .FORCE
3769	.ARGS : .CLEAR
3770
3771.SELECT. : .FUNCTION
3772	local T X
3773	.UNION. : .CLEAR
3774	if T = "$(*.ARGS)"
3775		.ARGS : .CLEAR
3776		.MAIN.TARGET. := $(T:O=1:B:S)
3777		for X $(T)
3778			T := $(.FILES.$(X:B:S):N!=[-+]l*:T=F:T!=G)
3779			$(T:N!=[-+]l*) : .SPECIAL -ARCHIVE -COMMAND -OBJECT
3780			.UNION. : .SPECIAL $(T) $(?$(X:B:S):N!=[-+]l*:T=F:P=S:T!=G)
3781		end
3782	else
3783		.UNION. : .SPECIAL $(.FILES.:V:T=F) $(.FILES.:T=F:T!=G)
3784		$(*.UNION.:N!=[-+]l*) : .SPECIAL -ARCHIVE -COMMAND -OBJECT
3785		.UNION. : .SPECIAL $(...:T!=XS:N!=[-+]l*:T=F:A=.REGULAR:P=S:T!=G)
3786		.UNION. : .SPECIAL $(...:T=XSFA:N!=[-+]l*:T=F:A=.REGULAR:P=S:T!=G)
3787	end
3788	return $(*.UNION.:$(-select):$(.SELECT.EDIT.))
3789
3790.GENSYM.COUNT. = 0
3791
3792.RETAIN : .GENSYM.COUNT.
3793
3794.GENSYM. : .FUNCTION
3795	local N
3796	if ! ( N = "$(%)" )
3797		N = .GENSYM
3798	end
3799	let $(N).COUNT. = $(N).COUNT. + 1
3800	return $(N).$($(N).COUNT.).
3801
3802.INSTALL.COMMON. : .FUNCTION
3803	local ( D T A P ... ) $(%)
3804	local B T1 T2
3805	if ! "$(A)" || "$(A)" == "-"
3806		A := $(T)
3807	end
3808	B := $(T:B:S)
3809	if B == "-"
3810		B := $(.GENSYM. X)
3811	end
3812	eval
3813		.FILES.$(B) = $(P:V:N=[!-.]*|.[!A-Z]*)
3814		.RHS.$(B) = $(P:V)
3815	end
3816	.FILES. += $$(.FILES.$(B))
3817	if ! .MAIN.TARGET.
3818		.MAIN.TARGET. := $(B)
3819	end
3820	if ! "$(.NO.INSTALL.)"
3821		if "$(.INSTALL.$(B):V)" != "."
3822			.ALL : $(T)
3823		end
3824		if ! ( T1 = "$(.INSTALL.$(B):V)" )
3825			if D != "-"
3826				T1 := $(D:)
3827			else
3828				for T2 $(.INSTALL.MAPS.)
3829					if "$(T:$(T2))"
3830						T1 = .
3831						break
3832					end
3833				end
3834			end
3835			if ! T1
3836				if ( T1 = "$(T:A<=.INSTALL.)" )
3837					T1 := $(*$(T1):V)
3838				end
3839			end
3840		end
3841		if A != "-*" && T1 && T1 != "." && T1 != "$(A:V:D)"
3842			$(T1:V) :INSTALLDIR: $(A)
3843		end
3844		for T2 $(P:V:N=*.[[:digit:]]*([[:alpha:]]))
3845			if A == "-*" || ! "$(*$(A):V:N=$(T2:V))"
3846				$$(MANDIR)$(T2:V:/.*\.//) :INSTALLDIR: $(T2:V)
3847			end
3848		end
3849		for T2 $(P:V:N=*.man?(=*))
3850			if T2 == "*.man=*"
3851				T1 := $(T2:V:/.*man=//)
3852				T2 := $(T2:V:/=.*//)
3853			else
3854				T1 = 1
3855			end
3856			$$(MANDIR)$(T1)/$(T2:V:D:B:S=.$(T1)) :INSTALL: $(T2:V)
3857		end
3858	end
3859
3860.INSTALL.LIST. : .FUNCTION
3861	set noalias /* don't tell dmr */
3862	: $(!.INSTALL)
3863	.MAKE : $(~.INSTALL:A=.MAKE)
3864	return $(*.INSTALL:N=$(INSTALLROOT)/*) $(*.INSTALL:N=$(INSTALLROOT)/*$(CC.SUFFIX.SHARED).+([0-9.]):/\.[0-9.]*$//)
3865
3866.PROBE.LOAD : .MAKE .VIRTUAL .FORCE
3867	.PROBE.SPECIAL. = CC.HOSTTYPE CC.LD.DYNAMIC CC.LD.STATIC CC.STDLIB.BASE
3868	$(.PROBE.SPECIAL.) : .FUNCTION
3869		$(.PROBE.SPECIAL.) : -FUNCTIONAL
3870		make .PROBE.INIT
3871		return "$($(<))"
3872
3873.PROBE.INIT : .MAKE .VIRTUAL .FORCE .OPTION.COMPATIBILITY
3874	local I J K
3875	if "$(.COMMAND.CC:N=$(CC))"
3876		if ! "$(PATH:/:/ /G:X=$(CC):P=X)"
3877			for I $(.COMMAND.CC:N!=$(CC))
3878				if "$(PATH:/:/ /G:X=$(I):P=X)"
3879					CC := $(I)
3880					break
3881				end
3882			end
3883		end
3884	end
3885	$(.PROBE.SPECIAL.) : -FUNCTIONAL
3886	if "$(-base)" || ! "$(CC)" || "$(-cctype)" == "[-0]"
3887		set cctype:=0
3888		.CC.PROBE. =
3889	else
3890		if ! "$(-cctype)"
3891			set cctype:="$(CC:N!=*=*)"
3892			if ! "$(-cctype)"
3893				set cctype:=cc
3894			end
3895		end
3896		I := $(-cctype:O=1:P=C) $(-cctype:O>1)
3897		set cctype:="$(I)"
3898		if ! ( .CC.PROBE. = "$(CC.PROBE)" )
3899			.CC.PROBE. := $(-cctype|"cc":@P=P=C)
3900		end
3901		.CC.PROBE. : .VIRTUAL $(.CC.PROBE.)
3902		$(.CC.PROBE.) : .SPECIAL .ACCEPT .DONTCARE
3903		(AR) (AS) (CPP) (CC) (LD) : .CC.PROBE.
3904		if .CC.PROBE.
3905			include "$(.CC.PROBE.)"
3906			if ! "$(CC.HOSTTYPE)"
3907				CC.HOSTTYPE := $(_hosttype_)
3908			end
3909		else
3910			if "$(-cctype)"
3911				error 1 $(-cctype): C probe failed -- default assumed
3912			end
3913			if ! CC.STDINCLUDE
3914				CC.STDINCLUDE = /usr/include
3915			end
3916			if ! CC.MAKE.OPTIONS
3917				CC.MAKE.OPTIONS = nativepp=-1
3918			end
3919		end
3920	end
3921	if CC.MAKE.OPTIONS
3922		set $(CC.MAKE.OPTIONS)
3923	end
3924	$(CC.LD.DYNAMIC) $(CC.LD.STATIC) : .MULTIPLE .ARCHIVE .IGNORE .DO.NOTHING
3925	if ! CC.SUFFIX.ARCHIVE
3926		CC.SUFFIX.ARCHIVE = .a
3927	end
3928	.ATTRIBUTE.%$(CC.SUFFIX.ARCHIVE) : .ARCHIVE
3929	if CC.SUFFIX.STATIC
3930		.ATTRIBUTE.%$(CC.SUFFIX.STATIC) : .ARCHIVE
3931	end
3932	if CC.SUFFIX.DYNAMIC && CC.SUFFIX.SHARED
3933		.ATTRIBUTE.%$(CC.SUFFIX.SHARED) : .ARCHIVE .SCAN.IGNORE
3934		.SOURCE.%$(CC.SUFFIX.SHARED) : .FORCE $$(*.SOURCE.%.ARCHIVE)
3935	end
3936	if ! CC.SUFFIX.OBJECT
3937		CC.SUFFIX.OBJECT = .o
3938	end
3939	if ! CC.STDLIB.BASE
3940		CC.STDLIB.BASE := $(CC.STDLIB:N=?(/usr)/lib?(64):B) lib
3941		CC.STDLIB.BASE := $(CC.STDLIB.BASE:U)
3942	end
3943	if CCSPECIALIZE
3944		CC.OPTIMIZE := $(CCSPECIALIZE)
3945	end
3946	.ATTRIBUTE.%$(CC.SUFFIX.OBJECT) : .OBJECT
3947	if CC.SHARED.REGISTRY
3948		CC.SHARED += $$(.CC.SHARED.REGISTRY.)
3949	end
3950	if CC.SHARED.NAME
3951		CC.SHARED += $$(.CC.SHARED.NAME.)
3952	end
3953	if "$(-mam:N=static*,port*)"
3954		.NO.LIB.TYPE = 1
3955	end
3956	if ! .NO.LIB.TYPE && "$(-lib-type)"
3957		I :=
3958		J :=
3959		if "$(-instrument)"
3960			I := $(-instrument:B:/\(...\).*/-\1/)
3961		end
3962		if "$(-threads)"
3963			J := t$(J)
3964		end
3965		if "$(-debug-symbols)" || "$(CCFLAGS:N=$(CC.DEBUG))" && ! "$(CCFLAGS:N=-O*|$(CC.OPTIMIZE))"
3966			J := $(J)g
3967		end
3968		if ! "$(J)"
3969			if K = "$(CCFLAGS:N=-p|-pg)"
3970				J := $(K:O=1:/-//)
3971			elif K = "$(LDFLAGS:N=-O[1-9])"
3972				J := $(K:O=1:/-//)
3973			end
3974		end
3975		if J
3976			J := -$(J)
3977		end
3978
3979		/*
3980		 * insert default flags
3981		 */
3982
3983		for K $(...:T=XQSV:N=\(*FLAGS\):/[()]//G)
3984			if "$($(K)_DEFAULT:V)"
3985				$(K) := $$($(K)_DEFAULT) $($(K):V)
3986			end
3987		end
3988		CC.LIB.TYPE := $(I)$(J)
3989	end
3990	.REQUIRE.$(CC.PREFIX.ARCHIVE)%$(CC.SUFFIX.ARCHIVE) : .FUNCTION
3991		if "$(%:N=-l*)"
3992			return $(.REQUIRE.-l% $(%))
3993		elif "$(%:N=+l*)"
3994			return $(.REQUIRE.+l% $(%))
3995		elif ! "$(%:A=.TARGET)" && CC.PREFIX.ARCHIVE && "$(%:B:S:N=$(CC.PREFIX.ARCHIVE)*.$(CC.SUFFIX.ARCHIVE))"
3996			return $(.REQUIRE.-l% -l$(%:B:S:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.SUFFIX.ARCHIVE)$//:/$(CC.LIB.TYPE)$//))
3997		end
3998
3999	/*
4000	 * this is a workaround hack to help packages with broken compilers
4001	 * don't rely on this hook
4002	 *
4003	 * sco.i386 may need
4004	 *	export _MAKE_PROBE_WORKAROUND_='CC.LIB.DLL=broken --static=1'
4005	 */
4006
4007	if "$(_MAKE_PROBE_WORKAROUND_)"
4008		local I
4009		for I $(_MAKE_PROBE_WORKAROUND_)
4010			eval
4011			$(I)
4012			end
4013		end
4014	end
4015	include - + pkg-default.mk
4016
4017.FLAGSINIT : .VIRTUAL
4018
4019.MAKEINIT : .MAKE .VIRTUAL .FORCE .OPTION.COMPATIBILITY
4020	local A T1 T2 T3 T4 T5 T6 TI
4021
4022	/*
4023	 * .SOURCE.mk gets bound long before the first user makefile is read
4024	 * this assertion ensures that any user specified dirs appear
4025	 * before the internal defaults set in the initdynamic[] script
4026	 */
4027
4028	.SOURCE.mk : .CLEAR . $(*.SOURCE.mk:N!=$(*.SOURCE.mk.INTERNAL:/ /|/G)) $(*.SOURCE.mk.INTERNAL)
4029	.MAKE : .PROBE.INIT
4030	if "$(-instrument)"
4031		if ! ( instrument.root = "$(-instrument:O=1:D:N!=.:T=F)" )
4032			T1 = $(PATH):$(OPTDIRS)
4033			instrument.root := $(T1:/:/ /G:N!=.:X=$(-instrument:O=1:B)/.:P=X:D)
4034			if ! instrument.root
4035				instrument.root = $(.INSTRUMENT.notfound)
4036			end
4037		end
4038		T2 := $(-instrument:O=1:B)
4039		T1 := $(INSTRUMENT_$(T2))
4040		if ! T1 || ! "$(T1:N!=*=*)"
4041			T5 =
4042			T6 =
4043			for T3 $(T1:N=*=*:/command=/TI=/:/root=/T5=/:/bin=/T6=/)
4044				eval
4045				$(T3)
4046				end
4047			end
4048			if ! TI
4049				TI = CC
4050				CCFLAGS := $(CCFLAGS:N!=-g|-O*|-p*|$(CC.DEBUG)|$(CC.OPTIMIZE)) $(CC.DEBUG)
4051			end
4052			T1 := $(TI) = $($(TI):N=*=*)
4053			if ! T5
4054				T2 := $(T2:F=%(upper)s)
4055				T5 = $(T2)HOME
4056				for T3  $(T2) $(T2)HOME $(T2)_HOME $(T2)ROOT $(T2)_ROOT
4057					if "$($(T3):T=F)"
4058						T5 := $(T3)
4059						break
4060					end
4061				end
4062			end
4063			if "$($(T5))"
4064				T5 := $($(T5))
4065			else
4066				T1 += $(T5)=$(instrument.root)
4067				T5 := $(instrument.root)
4068			end
4069			if ! "$(PATH:/:/ /G:X=$(-instrument):P=X)"
4070				if T6
4071					T5 := $(T5)/$(T6)
4072				end
4073				T1 += PATH=$(PATH):$(T5)
4074			end
4075			T1 += $(-instrument) $($(TI):N!=*=*)
4076		end
4077		if T1
4078			CC.READONLY =
4079			set expandview
4080			eval
4081			$(T1:V)
4082			end
4083		end
4084	end
4085	if "$(-mam:N=(regress|static)*)"
4086		set nativepp:=-1
4087	end
4088	if "$(-debug-symbols)" && ! "$(CCFLAGS:N=$(CC.DEBUG))"
4089		CCFLAGS := $(CCFLAGS:V:N!=-O*|$(CC.OPTIMIZE)|$\(CC.OPTIMIZE\)) $(CC.DEBUG)
4090	end
4091	if "$(-profile)" && ! "$(CCFLAGS:N=$(CC.PROFILE))"
4092		CCFLAGS += $(CC.PROFILE)
4093	end
4094	if ! CC.LIB.THREADS
4095		CC.LIB.THREADS = -lpthreads
4096	end
4097	$(CC.LIB.THREADS) : .DONTCARE
4098	if A = "$(-ancestor)"
4099		if "$(-mam:N=(regress|static)*)"
4100			T1 = ..
4101			let T2 = 1
4102			while T2 < A
4103				let T2 = T2 + 1
4104				T1 := ../$(T1)
4105			end
4106			.MAM.INSTALLROOT := $(T1)
4107			print -um setv INSTALLROOT $(T1)
4108			T4 =
4109			for T3 $(.ANCESTOR.LIST)
4110				if T4
4111					$(T4) : $(T1)/$(T3)
4112					T4 =
4113				else
4114					T4 := $(T3)
4115				end
4116			end
4117		end
4118		T1 = ..
4119		let T2 = 0
4120		while T2 < A
4121			let T2 = T2 + 1
4122			T4 =
4123			for T3 $(.ANCESTOR.LIST)
4124				if T4
4125					$(T4) : $(T1)/$(T3)
4126					T4 =
4127				else
4128					T4 := $(T3)
4129				end
4130			end
4131			T1 := ../$(T1)
4132		end
4133	elif "$(-mam:N=(regress|static)*)"
4134		.MAM.INSTALLROOT := $(INSTALLROOT:N=..*(/*):?$(INSTALLROOT)?$HOME?)
4135		print -um setv INSTALLROOT $(.MAM.INSTALLROOT)
4136	end
4137	for T3 $(.ANCESTOR.LIST)
4138		if T4
4139			$(T4) : $($(T3:F=%(upper)s)DIR)
4140			T4 =
4141		else
4142			T4 := $(T3)
4143		end
4144	end
4145	.SOURCE.h : $(INSTALLROOT)/include
4146	if "$(-mam:N=dynamic*)"
4147		.MAM.INSTALLROOT := $(INSTALLROOT:N=$(HOME):?$HOME?$(INSTALLROOT)?)
4148		print -um setv INSTALLROOT $(.MAM.INSTALLROOT)
4149	end
4150	.MAMEDIT. =
4151	if "$(INSTALLROOT:N=..*(/*))"
4152		.MAMROOT. := $(INSTALLROOT)
4153	else
4154		.MAMROOT. := $(PWD:C@.*/src/@/src/@:C@/[^/]*@/..@G:C@/@@)
4155	end
4156	.SOURCE.h : $(*.SOURCE.c:N!=.) $(*.SOURCE:N!=.)
4157	.SOURCE .SOURCE.a .SOURCE.c .SOURCE.h : .INSERT .
4158	if CC.PREROOT && "$(CC.PREROOT:P!=I=/)"
4159		T1 := $(CC.PREROOT) /
4160		CC.STDINCLUDE := $(T1:X=$$(CC.STDINCLUDE:C@^/@@))
4161		CC.STDLIB := $(T1:X=$$(CC.STDLIB:C@^/@@))
4162	end
4163	if T1 = "$(.PACKAGE.build:A!=.TARGET)"
4164		local B D H I L N P Q S T V W X Z K=0 K.0=0 KP IP LP
4165		LDLIBRARIES += $$(.PACKAGE.LIBRARIES. $(T1))
4166		T2 =
4167		for P $(T1)
4168			if P == "{"
4169				if ! "$(-mam:N=static*)"
4170					if K
4171						KP := $(K.$(K))
4172					else
4173						KP = 0
4174					end
4175					let K = K + 1
4176					local K.$(K)=$(KP)
4177					local L.$(K)
4178				end
4179				continue
4180			elif P == "}"
4181				if ! "$(-mam:N=static*)" && K
4182					if ! $(K.$(K))
4183						error 3 at least one of the packages { $(L.$(K)) } must exist
4184					end
4185					let K = K - 1
4186				end
4187				continue
4188			elif $(K.$(K)) > 0
4189				continue
4190			end
4191			if K
4192				L.$(K) += $(P)
4193			end
4194			P := $(.PACKAGE.INIT. $(P))
4195			I := $(PACKAGE_$(P)_INCLUDE)
4196			L := $(PACKAGE_$(P)_LIB)
4197			if "$(.PACKAGE.$(P).found)" == "1"
4198				if K
4199					K.$(K) := 1
4200				end
4201			elif ! K && ! "$(.PACKAGE.$(P).dontcare)"
4202				if ! "$(PKGDIRS:X=package/$(P).lic package/$(P).pkg:T=F)" && ! "$(.PACKAGE.$(P).library)"
4203					error 3 $(P): package not found
4204				end
4205				.PACKAGE.$(P).dontcare := 1
4206			end
4207			T2 += $(P)
4208			T4 =
4209			if "$(-mam:N=static*)"
4210				if "$(INCLUDEDIR:D:N=$(INSTALLROOT))" || "$(INCLUDEDIR:D:D:N=$(INSTALLROOT))"
4211					T4 += P
4212				end
4213				if I && ( "$(I:D)" == "$(L:D)" || "$(I:D:D)" == "$(L:D)" )
4214					if "$(I:D)" == "$(L:D)"
4215						H := $(I:D)
4216					else
4217						H := $(I:D:D)
4218					end
4219					T := $(I:C,^$(H)/,,)
4220					print -um setv PACKAGE_$(P) $(T4:N=P:?${INSTALLROOT}?$(H)?)
4221					print -um setv PACKAGE_$(P)_INCLUDE ${PACKAGE_$(P)}/$(T)
4222					print -um setv PACKAGE_$(P)_LIB ${PACKAGE_$(P)}/$(L:B:S)
4223					T4 += I L
4224				end
4225			end
4226			if I
4227				if ! "$(CC.STDINCLUDE:N=$(I))"
4228					.SOURCE.h : $(I)
4229					if "$(I:B)" == "$(P)" && ! "$(CC.STDINCLUDE:N=$(I:D))"
4230						.SOURCE.h : $(I:D)
4231					end
4232				elif "$(-mam:N=static*)"
4233					.SOURCE.h : $(I)
4234					CC.STDINCLUDE := $(CC.STDINCLUDE:N!=$(I))
4235					if "$(I:B)" == "$(P)"
4236						.SOURCE.h : $(I:D)
4237						CC.STDINCLUDE := $(CC.STDINCLUDE:N!=$(I:D))
4238					end
4239				end
4240				if "$(-mam:N=(regress|static)*)"
4241					.MAMPACKAGE. += PACKAGE_$(P)_INCLUDE
4242					if ! "$(T4:N=I)"
4243						print -um setv PACKAGE_$(P)_INCLUDE $(T4:N=P:?${INSTALLROOT}/$(INSTALLROOT:P=R=$(I))?$(I)?)
4244					end
4245				end
4246			end
4247			if L && L != "/lib|/usr/lib"
4248				if ! "$(CC.STDLIB:N=$(L))"
4249					.SOURCE.a : $(L)
4250				elif "$(-mam:N=static*)"
4251					.SOURCE.a : $(L)
4252					CC.STDLIB := $(CC.STDLIB:N!=$(L))
4253				end
4254				if "$(-mam:N=(regress|static)*)"
4255					.MAMPACKAGE. += PACKAGE_$(P)_LIB
4256					if ! "$(T4:N=L)"
4257						print -um setv PACKAGE_$(P)_LIB $(T4:N=P:?${INSTALLROOT}/$(INSTALLROOT:P=R=$(L))?$(L)?)
4258					end
4259				end
4260			end
4261		end
4262		T3 := $(*.SOURCE.h)
4263		.SOURCE.h : $(CC.STDINCLUDE) $(LCLDIRS:/:/ /G:C,$,/include,)
4264		T4 := $(*.SOURCE.a)
4265		.SOURCE.a : $(CC.STDLIB)
4266		if T2
4267			T2 += .
4268			T1 := $(*.SOURCE.h:C,.*,$$(T2:C%.*%&/\&%),)
4269			.SOURCE.h : .CLEAR . $(T1:P=C)
4270			T1 := $(*.SOURCE.a:C,.*,$$(T2:C%.*%&/\&%),)
4271			.SOURCE.a : .CLEAR . $(T1:P=C)
4272		end
4273	else
4274		T3 := $(*.SOURCE.h)
4275		.SOURCE.h : $(CC.STDINCLUDE)
4276		T4 := $(*.SOURCE.a)
4277		.SOURCE.a : $(CC.STDLIB)
4278	end
4279	if "$(-mam:N=(regress|static)*)"
4280		.CC.NOSTDINCLUDE. := $(CC.STDINCLUDE:V:N!=*[()]*|$(T3:@C@ @|@G):C@ @|@G:C@^@N!=@)
4281		.CC.NOSTDLIB. := $(CC.STDLIB:V:N!=*[()]*|$(T4:@C@ @|@G):C@ @|@G:C@^@N!=@)
4282	else
4283		.CC.NOSTDINCLUDE. := $(CC.STDINCLUDE:N!=$(T3:@C@ @|@G):C@ @|@G:C@^@N!=@)
4284		.CC.NOSTDLIB. := $(CC.STDLIB:N!=$(T4:@C@ @|@G):C@ @|@G:C@^@N!=@)
4285	end
4286	T3 = $(PACKAGE_PATH:/:/ /G) $(.PACKAGE.DIRS.) $(.PACKAGE.GLOBAL.)
4287	.SOURCE.a : $(T3:X=lib:N!=$(.PACKAGE.stdlib:/ /|/G):T=F)
4288	T3 =
4289	if ! "$(CC.DIALECT:N=ANSI)"
4290		stdarg.h : .SPECIAL .NULL .TERMINAL .DONTCARE .IGNORE /* courtesy to proto(1) */
4291	end
4292	if "$(CC.REPOSITORY)"
4293		.PTR.PREREQS = $(!) $(!.PTR.CHECK)
4294		if ! "$(*.SOURCE.ptr)"
4295			.SOURCE.ptr : $(CC.REPOSITORY)
4296		end
4297		T3 += $$(.PTR.OPTIONS.)
4298	end
4299	if ! "$(CC.INCLUDE.LOCAL)" && "$(CC.DIALECT:N=-I-)" /* pre 2005-05-25 courtesy */
4300		CC.INCLUDE.LOCAL = -I-
4301	end
4302	if "$(-separate-include)"
4303		CC.SEPARATEINCLUDE := $(CC.INCLUDE.LOCAL)
4304	end
4305	if ! "$(-nativepp)"
4306		if ! "$(-separate-include)" && "$(-?separate-include)"
4307			set nativepp:=-1
4308			if ! "$(-?prefix-include)"
4309				set prefix-include:=0
4310			end
4311		elif "$(CC.SEPARATEINCLUDE)" && !CC.ALTPP.FLAGS && !CC.ALTPP.ENV
4312			set nativepp:=1
4313		end
4314	end
4315	if ! "$(-nativepp)"
4316		if CC.CC && ! ( T4 = "$(CC.PROBEPP)" )
4317			T4 := $(-cctype:@P=P=C,pp)
4318		end
4319		if ! "$(CC.DIALECT:N=LIBPP)" || CPP != "$\(MAKEPP\)"
4320			if ! "$(-?prefix-include)" && CPP != "$\(MAKEPP\)"
4321				set prefix-include:=1
4322			end
4323			(CC) : (CPP)
4324			if CC.ALTPP.FLAGS || CC.ALTPP.ENV
4325				T5 := $(CC.ALTPP.FLAGS)
4326				T3 += $(T5:V)
4327				if CC.ALTPP.ENV
4328					.BIND : (CC)
4329					CC := $$(CC.ALTPP.ENV) $(CC:V)
4330				end
4331			else
4332				.BIND : (CC)
4333				if "$(CCLD:V)" == "$$(CC)"
4334					CCLD := $(CC:V)
4335				end
4336				CC := $(CC:N=*=*) $$(PPCC) $$(PPCCFLAGS) $$(CC.DIALECT:/^/-o /) $$(CPP) $(TI:@N=CC:?$(-instrument)?$(-cctype)?)
4337			end
4338			if T4
4339				T5 := -I-D$(T4)
4340				T3 += $(T5:V)
4341			end
4342		end
4343	elif ! "$(-?prefix-include)" && ! "$(CC.SEPARATEINCLUDE)"
4344		set prefix-include:=1
4345	end
4346	if ! "$(-?prefix-include)" && "$(CCFLAGS:N=$(CC.INCLUDE.LOCAL)|-I-)"
4347		set prefix-include:=1
4348	end
4349	if "$(-prefix-include)" || ! "$(-separate-include)" || "$(-nativepp)" && ! "$(CC.SEPARATEINCLUDE)"
4350		T3 += $$(*:A=.SCAN.c:@?$$$(*.SOURCE.%.LCL.INCLUDE:I=$$$$(!$$$$(*):A=.LCL.INCLUDE|.STD.INCLUDE:P=D:U):$(.CC.NOSTDINCLUDE.):/^/-I/)??) $$(&:T=D)
4351		if "$(-nativepp)" == "[1-9]*"
4352			error 1 local include files may be ignored by the native C preprocessor
4353		end
4354	else
4355		if ! "$(-?prefix-include)"
4356			set prefix-include:=0
4357		end
4358		T3 += $$(*:A=.SCAN.c:@?$$$(*.SOURCE.%.LCL.INCLUDE:I=$$$$(!$$$$(*):A=.LCL.INCLUDE:P=D):$(.CC.NOSTDINCLUDE.):/^/-I/) $$(.PREFIX.SOURCE. $$(*):/^/-I/) $(CC.INCLUDE.LOCAL:--I-) $$$(!$$$(*):A=.STD.INCLUDE:A=.LCL.INCLUDE:@+-I.) $$$(*.SOURCE.%.STD.INCLUDE:I=$$$$(!$$$$(*):A=.STD.INCLUDE:P=D):$(.CC.NOSTDINCLUDE.):/^/-I/)??) $$(&:T=D)
4359	end
4360	if "$(CC.DIALECT:N=TOUCHO)"
4361		.TOUCHO : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER .FOREGROUND
4362			.REBIND : $(*$(<<):N=*$(CC.SUFFIX.OBJECT))
4363		.APPEND.%.COMMAND : .TOUCHO
4364	end
4365	if "$(CCFLAGS:N=-g|$(CC.DEBUG))"
4366		_BLD_DEBUG == 1
4367	end
4368	if "$(-instrument)"
4369		_BLD_INSTRUMENT == 1
4370	end
4371	if "$(-static-link)"
4372		_BLD_STATIC_LINK == 1
4373	end
4374	if "$(-shared)" && ! "$(CCFLAGS:VP:N=$\(CC.DLL\))"
4375		T4 = $(CC.DLL)
4376	else
4377		T4 =
4378	end
4379	if T3
4380		T4 += $$(-target-context:?$$$(!$$$(*):A=.PFX.INCLUDE:@Y%$$$(<:P=U:D:T=*:P=L=*:/^/-I/) %%)??)$$(-target-prefix:?$$$(<:O=1:N=$$$(*:O=1:B:S=$$$(CC.SUFFIX.OBJECT)):Y%%-o $$$$(<) %)??)$(T3:V)
4381	end
4382	if T3 || T4
4383		CCFLAGS &= $(T4:V)
4384	end
4385	T3 =
4386	T4 =
4387	if "$(CC.REPOSITORY)"
4388		T3 += $(T5:V) $$(CCFLAGS:N=-[D]*) $$(.PTR.PREREQS:A=.SCAN.c:@?$$$(*.SOURCE.%.LCL.INCLUDE:I=$$$$(.PTR.PREREQS:A=.LCL.INCLUDE:P=D):/^/-I/) $(CC.SEPARATEINCLUDE) $$$(*.SOURCE.%.LCL.INCLUDE:I=$$$$(.PTR.PREREQS:A=.LCL.INCLUDE|.STD.INCLUDE:P=D):$(.CC.NOSTDINCLUDE.):/^/-I/)??) $$(&.PTR.CHECK:T=D)
4389		.APPEND.%.COMMAND : .PTR.CHECK .PTR.UPDATE
4390		T3 := $$(@:V:N=*$\(CC*(LD)\)*:@?$(T3:V)??)
4391	end
4392	if "$(CC.ARFLAGS)"
4393		.ARCHIVE.o : .CLEAR .USE .ARPREVIOUS (CC) (AR)
4394			$(.ARPREVIOUS.$(<:B:S):@?$(IGNORE) $$(AR) $$(ARHYPHEN)d $$(<) $$(.ARPREVIOUS.$$(<:B:S))$$("\n")??)$(CC) $(CC.ARFLAGS) $(CCLDFLAGS) -o $(<) $(*)
4395		.SHARED.o : .CLEAR .USE (LDSHARED)
4396			$(LDSHARED) $(CC.SHARED) $(CCLDFLAGS) -o $(<) $(*$(**):N!=*$(CC.SUFFIX.ARCHIVE))
4397		.ATTRIBUTE.%.a : -ARCHIVE
4398	end
4399	IFFEFLAGS += -c '$$(IFFECC) $$(IFFECCFLAGS) $$(IFFELDFLAGS)' $$(-mam:N=(regress|static)*:??-S '$$(CC.STATIC)')
4400	if "$(-cross)" || "$(CC.EXECTYPE)" && "$(CC.HOSTTYPE)" != "$(CC.EXECTYPE)"
4401		set cross
4402		IFFEFLAGS += -x $(CC.HOSTTYPE)
4403	end
4404	.BIND : (IFFEFLAGS)
4405	IFFEFLAGS += $$(.IFFE.REF.)
4406	if ! IFFE_huh
4407		/* can't figure out why this .PARAMETER must be repeated */
4408		(IFFEFLAGS) : .PARAMETER
4409	end
4410	if "$(-mam:N=(regress|static)*)"
4411		LDFLAGS &= $(T3:V)
4412	else
4413		if "$(CC.LD.ORIGIN:V)"
4414			T4 += $$(CC.LD.ORIGIN)
4415		end
4416		if "$(CC.LD.RUNPATH:V)"
4417			T4 += $$(.CC.LD.RUNPATH.)
4418		end
4419		LDFLAGS &= $$(*.SOURCE.%.ARCHIVE:I=$$$(*:N=-l*:P=D):$(.CC.NOSTDLIB.):P=A:/^/-L/) $(T3:V)
4420	end
4421	CCLDFLAGS &= $$(CCFLAGS:N!=-[DIU]*:@C@$$(CC.ALTPP.FLAGS)@@) $$(LDFLAGS) $(T4:V)
4422	if "$(CC.LD.STRIP:V)"
4423		if "$(-strip-symbols)" || "$(PACKAGE_OPTIONS:N=optimize-space)"
4424			.PACKAGE.strip = $(CC.LD.STRIP)
4425		end
4426		CCLDFLAGS += $$(.PACKAGE.strip)
4427	end
4428	M4FLAGS &= $$(*.SOURCE.%.M4.INCLUDE:I=$$$(!$$$(*):P=D):/^/-I/) $$(&:T=D)
4429	make .FLAGSINIT
4430
4431	/*
4432	 * state var defaults
4433	 */
4434
4435	if ERROR_CATALOG == ""
4436		ERROR_CATALOG == "$(CATALOG)"
4437	end
4438	if USAGE_LICENSE == ""
4439		USAGE_LICENSE == "$(LICENSEINFO:P=W=$(LICENSE),type=usage)$(CATALOG:N!=$(ID):Y%[--catalog?$(CATALOG)]%%)"
4440	end
4441
4442	/*
4443	 * map unknown command line targets to common actions
4444	 */
4445
4446	for T3 .ARGS .MAIN
4447		T2 := $(~$(T3):V)
4448		eval
4449		.ORIGINAL$(T3). = $(T2:V)
4450		end
4451		$(T3) : .CLEAR .VIRTUAL
4452		T4 = 0
4453		for T1 $(T2)
4454			if ! T4 && "$(T1:A!=.IMMEDIATE|.TARGET)"
4455				T2 := $(".$(T1:F=%(upper)s)":A=.IMMEDIATE|.TARGET:A!=.ATTRIBUTE)
4456				if T2
4457					T1 := $(T2)
4458				else
4459					T4 = 1
4460				end
4461			end
4462			$(T3) : $(T1:V)
4463		end
4464	end
4465
4466	/*
4467	 * pure recursion makefiles (only :MAKE:) make .RECURSE first by default
4468	 * .NORECURSE inhibits the default .RECURSE first
4469	 */
4470
4471	if "$(~.MAIN:V)" == ".RECURSE" && "$(~.ALL:V)" == ".RECURSE" && ! "$(~.ARGS:V:N=.RECURSE|.NORECURSE)" && ! "$(~.ARGS:V:O=1:A=.IMMEDIATE)"
4472		.ARGS : .INSERT .RECURSE
4473	end
4474
4475	/*
4476	 * check make recursion limits
4477	 */
4478
4479	T1 := $(-recurse:/:/ /G:N=[0-9]*:O=N)
4480	if T1 > 0
4481		T2 =
4482		while T1 > 0
4483			let T1 = T1 - 1
4484			T2 += .SEMAPHORE
4485		end
4486		.RECURSE.SEMAPHORE : $(T2)
4487	end
4488	.INITIALIZED. = 1
4489
4490.PTR.LOCAL =
4491
4492.PTR.OPTIONS. : .CLEAR .FUNCTION .PTR.INIT
4493	if ! "$(.PTR.LOCAL)"
4494		.PTR.LOCAL := $(*.SOURCE.ptr:N!=.:O=1)
4495	elif "$(.PTR.LOCAL)" != "$(*.SOURCE.ptr:N!=.:O=1)"
4496		.UNBIND : $(.PTR.LOCAL)
4497		.BIND : $(.PTR.LOCAL)
4498	end
4499	.UNION : .CLEAR $(*.SOURCE.ptr:N!=.:O=1) $(*.SOURCE.ptr:N!=.:O>1:T=F)
4500	return $(*.UNION:@N!=$(CC.REPOSITORY):$(CC.DIALECT:N=PTRIMPLICIT:?D??):/^/-ptr/)
4501
4502.PTR.DONTCARE : .MAKE .VIRTUAL .IGNORE .FORCE
4503	.DONTCARE.% : .FUNCTION
4504		if "$(<:T=M:N=.PTR.CHECK)"
4505			return ok
4506		end
4507
4508.PTR.CHECK : .VIRTUAL .PTR.INIT .PTR.DONTCARE $$(.PTR.LIST.)
4509
4510.PTR.INIT : .MAKE .VIRTUAL .FORCE .IGNORE
4511	if "$(CC.DIALECT:N=PTRMKDIR)"
4512		local X
4513		.PTR.DIR. := $(~.SOURCE.ptr:N!=.:O=1)
4514		$(.PTR.DIR.) : .MAKE .IGNORE
4515			if "$(^)"
4516				$(^) : -MAKE
4517				if "$(CC.DIALECT:N=PTRCOPY)"
4518					X := $("defmap":D=$(^):B:S:T=F)
4519				end
4520				.MAKE :
4521					$(MKDIR) $(<) 2>/dev/null $(X:?&& $(CP) -p $(X) $(<))
4522			end
4523		.MAKE : $(.PTR.DIR.)
4524		$(.PTR.DIR.) : -MAKE
4525	end
4526
4527.PTR.UPDATE : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER .FOREGROUND
4528	.PTR.CHECK : .CLEAR .VIRTUAL .IGNORE $$(.PTR.LIST.)
4529	.UNBIND : $(*.PTR.CHECK)
4530	.MAKE : .PTR.CHECK
4531
4532.PTR.LIST. : .FUNCTION
4533	local D
4534	.UNION : .CLEAR
4535	.UNBIND : $(*.SOURCE.ptr)
4536	for D $(*.SOURCE.ptr:N!=.)
4537		.UNION : $(D:T=F:L<=*@(.[cChH]*|$(CC.SUFFIX.SOURCE)|$(CC.SUFFIX.OBJECT)|$(CC.SUFFIX.ARCHIVE)):D=$(D):B:S)
4538	end
4539	$(*.UNION) : .TERMINAL
4540	for D $(*.UNION:N=*.c)
4541		$(D:D:B:S=$(CC.SUFFIX.OBJECT)) : $(D)
4542			$(<<<:N=.PTR.UPDATE:??$$(<:T=F:D:P=L:Y%$$(RM) $$(RMFLAGS) $$(<)%%)?)
4543	end
4544	return $(*.UNION)
4545
4546.NOSTATEFILE : .MAKE .VIRTUAL .FORCE
4547	set nowritestate
4548
4549.SETARGS : .MAKE .VIRTUAL .FORCE
4550	if ! "$(*.ARGS)"
4551		.ARGS : $(*.MAIN)
4552	end
4553
4554.MAMACTION. : .FUNCTION
4555	local V
4556	if ! .MAMEDIT.
4557		local E P
4558		.MAMEDIT. = :
4559		E = N!=-[DI]-*:
4560		for P $(.MAMPACKAGE.)
4561			E := $(E)@C%$($(P):C@\.@\\.@G)%$("$"){$(P)}%G:
4562		end
4563		if VOFFSET != "."
4564			V = INSTALLROOT
4565			for P $(".":P=L=*:C%/$(VOFFSET)$%%)
4566				E := $(E)@C%$(P)%$("$"){$(V)}%G:
4567				V = PACKAGEROOT
4568			end
4569		end
4570		if .MAMROOT.
4571			P := $(.MAMROOT.:C@\.@\\.@G)
4572			E := $(E)@C%$(P)/\.\./\.\.%$("$"){PACKAGEROOT}%G:
4573			E := $(E)@C%$(P)%$("$"){INSTALLROOT}%G:
4574			if VOFFSET == "."
4575				E := $(E)@C%$(PWD:X=$(.MAMROOT.)/../..)%$("$"){PACKAGEROOT}%G:
4576				E := $(E)@C%$(PWD:X=$(.MAMROOT.))%$("$"){INSTALLROOT}%G:
4577			end
4578		end
4579		.MAMEDIT. := $(E)
4580	end
4581	V := $(%:$(.MAMEDIT.:V))
4582	if V != "setv +([! ]) ${\1}"
4583		return $(V:V)
4584	elif V == "setv INSTALLROOT ${INSTALLROOT}"
4585		return setv INSTALLROOT $(.MAM.INSTALLROOT)
4586	elif V == "setv PACKAGEROOT ${PACKAGEROOT}"
4587		if .MAM.INSTALLROOT == "$HOME"
4588			.MAM.PACKAGEROOT = $HOME
4589		end
4590		return setv PACKAGEROOT $(.MAM.PACKAGEROOT)
4591	end
4592
4593.MAMNAME. : .FUNCTION
4594	if "$(%)" == ".[A-Z]*" && "$(%)" != ".INIT|.DONE"
4595		return $(%:/.//:F=%(lower)s)
4596	end
4597	if "$(%)" == "/*|$(.MAMROOT.)/*)"
4598		return $(.MAMACTION. $(%))
4599	end
4600	if "$(%)" == "-l+([a-zA-Z0-9_])" && "$(-mam:N=*,port*)"
4601		return $(%:/-l\(.*\)/${mam_lib\1}/)
4602	end
4603
4604.MAM.STATE.VARS. : .FUNCTION
4605	local V R
4606	for V $(?$(%):T=S:A!=.PARAMETER:T=U)
4607		if ! "$($(V))"
4608			R += $(V:/.*/${&+-D&=${&}})
4609		end
4610	end
4611	return $(R)
4612
4613/*
4614 * common actions
4615 *
4616 *	if the first command line target is not a known atom then
4617 *	the function .UNKNOWN translates the atom name to upper
4618 *	case preceded by a dot in an attempt to yield one of the
4619 *	common actions described below
4620 *
4621 *	.COMMON.SAVE	prerequisite of all common save actions
4622 *
4623 *	$(.BUILT.)	list of built targets
4624 *	$(.CLOBBER.)	list of additional files to clobber
4625 *	$(.FILES.)	all :: source files
4626 *	$(.FILES.targ)	source files for :: target targ
4627 *	$(.MAIN.TARGET.)first :: target name
4628 *	$(.MANIFEST.)	all source and miscellaneous files
4629 *	$(.ORIGINAL.ARGS.) original command line args
4630 *	$(.ORIGINAL.MAIN.) original .MAIN prereqs
4631 *	$(.RWD.)	current directory via .RECURSE
4632 *	$(.SELECT.)	list of all or selected source files
4633 *	$(.SOURCES.)	non-generated source files in $(.SELECT.)
4634 */
4635
4636test : .SPECIAL .DONTCARE .ONOBJECT $$("check":A=.TARGET:A!=.ARCHIVE|.COMMAND|.OBJECT)
4637
4638.ALL : .VIRTUAL
4639
4640.RETAIN : .BASE.
4641
4642.BASE.DATE.FORMAT. = %Y%m%d
4643
4644.BASE.VERIFY : .MAKE .VIRTUAL .FORCE .REPEAT
4645	if ! "$(.BASE.)"
4646		error 3 $(-archive-output): no base archive for delta
4647	end
4648
4649.BASE.UPDATE : .MAKE .VIRTUAL .FORCE
4650	local B N
4651	N := $("":T=R:F=%($(.BASE.DATE.FORMAT.))T)
4652	if ( B = "$(N:T=F)" )
4653		error $(-force:?1?3?) $(B): base archive already generated
4654	end
4655	.BASE. := $(N)
4656
4657.BASE : .BASE.UPDATE .COMMON.SAVE
4658	$(PAX) -d -w -f $(.BASE.) -z - $(PAXFLAGS) $(.MANIFEST.)
4659
4660.DELTA : .BASE.VERIFY .COMMON.SAVE
4661	$(PAX) -d -w -f $("":T=R:F=%($(.BASE.DATE.FORMAT.))T).$(.BASE.) -z $(.BASE.) $(PAXFLAGS) $(.MANIFEST.)
4662
4663/*
4664 * believe generated files and clean up archive intermediates
4665 */
4666
4667.BELIEVE : .MAKE .VIRTUAL .ONOBJECT
4668	local A O
4669	set ignorelock keepgoing touch
4670	make .INSTALL
4671	set notouch
4672	for A $(...:A=.TARGET:A=.ARCHIVE.o)
4673		O += $(*$(A):N=*$(CC.SUFFIX.OBJECT):T=F)
4674	end
4675	if "$(O)"
4676		make { $(RM) $(RMFLAGS) $(O) }
4677	end
4678
4679.CC- .VARIANTS : .ONOBJECT $$(*.SOURCE:L<=cc-*:$$(-variants:+N=$$(-variants))) $$(.VARIANTS.:$$(-variants:+N=$$(-variants)))
4680
4681.CC-INSTALL : .ONOBJECT .ALL $$(CC.LIB.TYPE:+$$$(*.INSTALL:N=*$$$(CC.LIB.TYPE)$$$(CC.SUFFIX.ARCHIVE)))
4682
4683.CC.LD.RUNPATH. : .FUNCTION
4684	if "$(LDRUNPATH)" && CC.LD.RUNPATH && "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:V:N=$(CC.DYNAMIC)|$\(CC.DYNAMIC\))" || ! "$(CCLDFLAGS:V:N=$(CC.STATIC)|$\(CC.STATIC\))" )
4685		local T
4686		T := $(LDRUNPATH:N!=.) $(*.SOURCE.%.ARCHIVE:I=$$(**:N=-l*:P=D):N!=.:$(.CC.NOSTDLIB.):P=A:N!=$(LIBDIR))
4687		if T = "$(T:@/ /:/G)"
4688			return $(CC.LD.RUNPATH)$(T)
4689		end
4690	end
4691
4692.CC.LIB.DLL. : .FUNCTION
4693	return $(%)
4694
4695.CC.LIB.DLL.export : .FUNCTION
4696	local F J
4697	J := $(--jobs) /* XXX: multiple :LIBRARY: may get botched with jobs>0 */
4698	set nojobs
4699	F := _$(%:O=1:B:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.LIB.TYPE)$//:/[^a-zA-Z0-9_]/_/G)_
4700	F := $(F:/___*/_/G)
4701	$(F).exp : .FORCE $(%:O=1)
4702		: generate $(*) export symbols in $(<)
4703		set -
4704		$(NM) $(NMFLAGS) $(*) |
4705		$(SED) $(NMEDIT) > $(<)
4706	.MAKE : $(F).exp
4707	set $(J)
4708	return $(F).exp $(%)
4709
4710.CC.LIB.DLL.object : .FUNCTION
4711	local F J
4712	J := $(--jobs) /* XXX: multiple :LIBRARY: may get botched with jobs>0 */
4713	set nojobs
4714	F := _$(%:O=1:B:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.LIB.TYPE)$//:/[^a-zA-Z0-9_]/_/G)_
4715	F := $(F:/___*/_/G)
4716	$(F) : .FORCE $(%:O=1)
4717		: extract $(*) objects in $(<)
4718		set -
4719		$(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(<)
4720		$(MKDIR) $(<)
4721		cd $(<)
4722		$(AR) $(ARHYPHEN)x $(*:P=A)
4723	.MAKE : $(F)
4724	.DONE : .DONE.$(F)
4725	.DONE.$(F) : .FORCE
4726		$(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(<:/.DONE.//)
4727	set $(J)
4728	return $(F)/* $(%:O>1)
4729
4730.CC.LIB.DLL.option : .FUNCTION
4731	return $(CC.LIB.ALL) $(%:O=1) $(CC.LIB.UNDEF) $(%:O>1)
4732
4733.CC.LIB.DLL.symbol : .FUNCTION
4734	local F J
4735	J := $(--jobs) /* XXX: multiple :LIBRARY: may get botched with jobs>0 */
4736	set nojobs
4737	F := _$(%:O=1:B:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.LIB.TYPE)$//:/[^a-zA-Z0-9_]/_/G)_
4738	F := $(F:/___*/_/G)
4739	$(F).c : .FORCE $(%:O=1)
4740		: generate $(*) export symbols in $(<)
4741		set -
4742		$(NM) $(NMFLAGS) $(*) |
4743		$(SED) $(NMEDIT) -e '/^[ 	]*$/d' $(CC.PREFIX.SYMBOL:?-e 's/^$(CC.PREFIX.SYMBOL)//'??) |
4744		$(SORT) -u > $(<:B:S=.i)
4745		{
4746			echo '/* $(*) export symbols */'
4747			echo
4748			echo 'typedef int (*Export_t)();'
4749			echo
4750			echo '#if defined(__cplusplus)'
4751			echo 'extern "C" {'
4752			echo '#endif'
4753			echo
4754			while	read sym
4755			do	echo "extern int $sym();"
4756			done < $(<:B:S=.i)
4757			echo
4758			echo 'extern int $(<:B)();'
4759			echo 'extern Export_t $(<:B)export[];'
4760			echo
4761			echo '#if defined(__cplusplus)'
4762			echo '}'
4763			echo '#endif'
4764			echo
4765			echo 'Export_t $(<:B)export[] ='
4766			echo '{'
4767			while	read sym
4768			do	echo "	$sym,"
4769			done < $(<:B:S=.i)
4770			echo '};'
4771			echo
4772			echo 'int $(<:B)() { return 0; }'
4773			$(RM) $(RMFLAGS) $(<:B:S=.i)
4774		} > $(<)
4775	.MAKE : $(F)$(CC.SUFFIX.OBJECT)
4776	set $(J)
4777	return $(F)$(CC.SUFFIX.OBJECT) $(%)
4778
4779.CC.LIB.DLL.undef : .FUNCTION
4780	return `$(NM) $(NMFLAGS) $(%:O=1) | $(SED) $(NMEDIT) -e "s/^/-u /"` $(%)
4781
4782.CC.SHARED.NAME. : .FUNCTION
4783	local R E
4784	if ( R = "$(<<:B:C%\..*%%)" ) && ( E = "$(.PACKAGE.soname)" ) && "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:V:N=$(CC.DYNAMIC)|$\(CC.DYNAMIC\))" || ! "$(CCLDFLAGS:V:N=$(CC.STATIC)|$\(CC.STATIC\))" )
4785		if R = "$(.CC.SHARED.NAME.$(R))"
4786			while E < 0
4787				let E = E + 1
4788				R := $(R:B)
4789			end
4790			return $(R)
4791		end
4792	end
4793
4794.CC.SHARED.REGISTRY. : .FUNCTION
4795	local R
4796	if ( R = "$(<<:B:C%\..*%%)" ) && .PACKAGE.registry && "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:V:N=$(CC.DYNAMIC)|$\(CC.DYNAMIC\))" || ! "$(CCLDFLAGS:V:N=$(CC.STATIC)|$\(CC.STATIC\))" )
4797		if R = "$(.CC.SHARED.REGISTRY.$(R))"
4798			local CC.SHARED.REGISTRY.PATH
4799			CC.SHARED.REGISTRY.PATH := $(R)
4800		end
4801		return $(CC.SHARED.REGISTRY)
4802	end
4803
4804.COMMON.SAVE : .NULL .VIRTUAL .IGNORE .FOREGROUND
4805
4806.CLEAN : .CLEARARGS .ONOBJECT
4807	$(IGNORE) $(RM) $(RMFLAGS) $(.BUILT.:A=.REGULAR:A!=.ARCHIVE|.COMMAND:N!=*.(m[klos]|db$(CC.SUFFIX.SHARED:?|$(CC.SUFFIX.SHARED:/\.//).*??))$(-clean-ignore:+|($(-clean-ignore))))
4808
4809.CLOBBER : .CLEARARGS .ONOBJECT .NOSTATEFILE
4810	$(IGNORE) $(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(.CLOBBER.:T=F:P=L) $(.BUILT.:A=.REGULAR)
4811
4812.CLOBBER.INSTALL : .ONOBJECT
4813	$(IGNORE) $(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(.INSTALL.LIST.:T=F:P=L:A=.REGULAR)
4814
4815if CPIO
4816.CPIO : .COMMON.SAVE
4817	echo $(.MANIFEST.) | tr ' ' '\012' | $(CPIO) -o $(CPIOFLAGS) > $(-archive-output)$(-?archive-output:~.cpio)
4818end
4819
4820if CTAGS
4821.CTAGS :
4822	$(CTAGS) $(CTAGSFLAGS) $(.SOURCES.:N=*.[cfhly])
4823end
4824
4825if VGRIND
4826.GRIND : $(CTAGS:@?.GRINDEX?.COMMON.SAVE?)
4827	$(VGRIND) $(VGRINDFLAGS) $(.SOURCES.:N=*.[chly]|*.mk|$(MAKEFILE)) $(LPR:@?| $$(LPR) $$(LPRFLAGS)??)
4828
4829if CTAGS
4830.GRINDEX : .COMMON.SAVE
4831	$(CTAGS) $(CTAGSFLAGS) -v $(.SOURCES.:N=*.[chly]) | $(SORT) -f >index
4832	$(VGRIND) $(VGRINDFLAGS) -x index $(LPR:@?| $$(LPR) $$(LPRFLAGS)??)
4833end
4834end
4835
4836.INSTALL : .ALL .ONOBJECT
4837
4838.LINT : .MAKE .VIRTUAL .FORCE .SETARGS
4839	local T1 T2 LINT1ARGS
4840	set nojobs nowritestate override
4841	if "$(_release_:N=research|V)"
4842		if "$(_release_:N=V)"
4843			LINT1FLAGS += -H$$(<<:B:S=.lh)
4844		else
4845			LINT1FLAGS += -S$$(<<:B:S=.lh)
4846		end
4847		LINT1ARGS = $(*$(<):G=%$(<:S):O=2:??$(>)?O)
4848	end
4849	.LINTLIBRARIES. = $(*:A=.ARCHIVE) $(LINTLIBRARIES)
4850	.SOURCE.ln : $(LINTLIB)
4851	.INSERT.%.ARCHIVE .INSERT.%.COMMAND : .DO.NOTHING $$(<:A=.TARGET:?.LINT0??)
4852	.LINT0 : .VIRTUAL .FORCE
4853		$(SILENT) $(RM) $(RMFLAGS) $(<<:B:S=.l[hn])
4854	for T1 % %.o
4855		for T2 $(.METARULE.I.$(T1))
4856			$(T1) : $(T2) .NULL
4857		end
4858	end
4859	eval
4860	%.o : %.c .FORCE
4861		set -
4862		$(_release_:N=V:??echo $$$(>):$$$("\n")?){ $$(CPP) $$(CPPFLAGS) -C -Dlint $$(>) | $$(LINT1) $$(LINT1FLAGS) $$(LINTFLAGS) $(LINT1ARGS:V) >> $$(<<:B:S=.ln) ;} 2>&1
4863	end
4864	.ARCHIVE.o : .CLEAR .USE
4865		$(SILENT) $(RM) $(RMFLAGS) $(<:B:S=.lh)
4866	if "$(_release_:N=V)"
4867	.COMMAND.o :
4868		set -
4869		cat $(<:B:S=.ln) $(.LINTLIBRARIES.:B:S=.ln:/$(CC.PREFIX.ARCHIVE)\(.*\)/& llib-l\1/:T=F) > $(TMPDIR)/l$$.ln
4870		$(LINT2) -T$(TMPDIR)/l$$.ln $(<:B:S=.lh:T=F:/^/-H/) $(LINTFLAGS)
4871		$(RM) $(RMFLAGS) $(TMPDIR)/l$$.ln $(<:B:S=.l[hn])
4872	elif "$(_release_:N=research)"
4873	.COMMAND.o :
4874		set -
4875		echo $(<)::
4876		cat $(<:B:S=.ln) $(.LINTLIBRARIES.:B:S=.ln:/$(CC.PREFIX.ARCHIVE)\(.*\)/& llib-l\1/:T=F) > $(TMPDIR)/l$$.ln
4877		$(LINT2) $(TMPDIR)/l$$.ln -S$(<:B:S=.lh) $(LINTFLAGS)
4878		$(RM) $(RMFLAGS) $(TMPDIR)/l$$.ln $(<:B:S=.l[hn])
4879	else
4880	.COMMAND.o :
4881		set -
4882		echo $(<)::
4883		cat $(<:B:S=.ln) $(.LINTLIBRARIES.:B:S=.ln:/$(CC.PREFIX.ARCHIVE)\(.*\)/& llib-l\1/:T=F) > $(TMPDIR)/l$$.ln
4884		$(LINT2) $(TMPDIR)/l$$.ln $(LINTFLAGS)
4885		$(RM) $(RMFLAGS) $(TMPDIR)/l$$.ln $(<:B:S=.l[hn])
4886	end
4887
4888.LIST.GENERATED : .ONOBJECT .MAKE
4889	print $(.INSTALL.LIST.:T=F:P=L:A=.REGULAR:/$/$("\n")/G) $(.CLOBBER.:T=F:P=L:/$/$("\n")/G) $(.BUILT.:A=.REGULAR:/ /$("\n")/G)
4890
4891.LIST.INSTALL : .ONOBJECT .MAKE
4892	print $(.INSTALL.LIST.:$(INSTALLROOT:N=.:?T=F?N=$(INSTALLROOT)/*:C%$(INSTALLROOT)/%%):C% %$("\n")%G)
4893
4894.LIST.INSTALLED : .ONOBJECT .MAKE
4895	print $(.INSTALL.LIST.:$(INSTALLROOT:N=.:?T=F?N=$(INSTALLROOT)/*:T=F:C%$(INSTALLROOT)/%%):C% %$("\n")%G)
4896
4897.LIST.MANIFEST : .ONOBJECT .COMMON.SAVE .MAKE
4898	if .RWD.
4899		print $(.MANIFEST.:C,^\([^/]\),$(.RWD.)/\1,:/ /$("\n")/G)
4900	else
4901		print $(.MANIFEST.:/ /$("\n")/G)
4902	end
4903
4904.LIST.PACKAGE.DIRS. = $(VROOT:T=F:P=L=*) $(INSTALLROOT) $(PACKAGEROOT)
4905
4906.LIST.PACKAGE.BINARY.EDIT. = $(.LIST.PACKAGE.DIRS.:T=F:P=A:C%\(.*\)/arch/$(CC.HOSTTYPE)$%\1%:C%\(.*\)/arch$%\1%:H=RU:C,.*,C%^&/%%,:C, ,:,G)
4907.LIST.PACKAGE.SOURCE.EDIT. = $(.LIST.PACKAGE.DIRS.:T=F:P=A:H=RU:C,.*,C%^&/%%,:C, ,:,G)
4908
4909.LIST.PACKAGE.LICENSE : .ONOBJECT .MAKE
4910	local I J E
4911	if "$(package.license.class)"
4912		if "$(LICENSECLASS)" != "$(package.license.class)"
4913			if "$(LICENSECLASS)" != "."
4914				error 1 $(LICENSECLASS): not a $(package.license.class) license -- ignored
4915			end
4916			exit 0
4917		end
4918	end
4919	E := $(.LIST.PACKAGE.SOURCE.EDIT.)
4920	if I = "$(LICENSEINFO:P!=S)"
4921		print ;;;$(I);$(I:$(E))
4922		for J $(I:T=I:N=*.def:D=$(I:D):B:S:T=F)
4923			print ;;;$(J);$(J:$(E))
4924		end
4925		I := $(I:D)/LICENSES/$(I:B)
4926		if I = "$(I:T=F)"
4927			print ;;;$(I);$(I:$(E))
4928		end
4929	end
4930
4931.LIST.PACKAGE.LOCAL : .ONOBJECT .COMMON.SAVE .MAKE
4932	local I E
4933	E := $(.LIST.PACKAGE.SOURCE.EDIT.)
4934	for I $(.MANIFEST.:T=F:P=A)
4935		print ;;;$(I);$(I:$(E))
4936	end
4937
4938.LIST.PACKAGE.BINARY : .ONOBJECT .MAKE .LIST.PACKAGE.LICENSE
4939	local I E
4940	.UNION : .CLEAR $(.INSTALL.LIST.:N=$(INSTALLROOT)/*:T=F)
4941	E := $(.LIST.PACKAGE.BINARY.EDIT.)
4942	if package.strip
4943		for I $(*.UNION:T=F:P=A:$(PACKAGE_OPTIONS:N=optimize-space:Y%:N=$(INSTALLROOT)/(bin|fun|lib)/*:N!=*$(CC.SUFFIX.ARCHIVE)|$(INSTALLROOT)/lib/lib?(/*)%%))
4944			if "$(I:T=Y)" == "*/?(x-)(dll|exe)"
4945				print ;;filter $(STRIP) $(STRIPFLAGS) $(I);$(I);$(I:$(E))
4946			else
4947				print ;;;$(I);$(I:$(E))
4948			end
4949		end
4950	else
4951		for I $(*.UNION:T=F:P=A)
4952			print ;;;$(I);$(I:$(E))
4953		end
4954	end
4955
4956.LIST.PACKAGE.RUNTIME : .ONOBJECT .MAKE .LIST.PACKAGE.LICENSE
4957	local E I X
4958	X := /lib/lib*(/*) $(CC.SUFFIX.ARCHIVE) $(CC.SUFFIX.DYNAMIC) $(CC.SUFFIX.SHARED:?$(CC.SUFFIX.SHARED)+([-.0-9])??) $(CC.SUFFIX.STATIC)
4959	.UNION : .CLEAR $(.INSTALL.LIST.:N=$(INSTALLROOT)/(bin|lib)/*:N!=*@($(X:N=?*:/ /|/G)):T=F)
4960	E := $(.LIST.PACKAGE.BINARY.EDIT.)
4961	if package.strip
4962		for I $(*.UNION:T=F:P=A)
4963			if "$(I:T=Y)" == "*/?(x-)(dll|exe)"
4964				print ;;filter $(STRIP) $(STRIPFLAGS) $(I);$(I);$(I:$(E))
4965			else
4966				print ;;;$(I);$(I:$(E))
4967			end
4968		end
4969	else
4970		for I $(*.UNION:T=F:P=A)
4971			print ;;;$(I);$(I:$(E))
4972		end
4973	end
4974
4975.PROTO.LICENSE. : .FUNCTION
4976	local F G
4977	if .PACKAGE.license || LICENSE == "*=*"
4978		G = 1
4979	elif LICENSE
4980		G = 0
4981	elif F = "$(LICENSEFILE:T=F)"
4982		G := $(sh egrep -c "^(contributor|license)=\($" $(F) || true)
4983	else
4984		G = 0
4985	end
4986	return $(G)
4987
4988.LIST.PACKAGE.SOURCE : .ONOBJECT .COMMON.SAVE .MAKE .LIST.PACKAGE.LICENSE
4989	local E F G
4990	PROTOEDIT = P=A
4991	E := $(.LIST.PACKAGE.SOURCE.EDIT.)
4992	G := $(.PROTO.LICENSE.)
4993	for F $(.MANIFEST.:T=F:P=A)
4994		if G && F == "*.{1,3}(?)"
4995			print ;;$(PROTO) $(PROTOFLAGS) -o source=$(F:T=ZR=%Y) -c '' -dp $(F);$(F);$(F:$(E))
4996		else
4997			print ;;;$(F);$(F:$(E))
4998		end
4999	end
5000
5001.LIST.SOURCE.TGZ : .ONOBJECT .COMMON.SAVE .MAKE
5002	local E N F P # vs # I N T J
5003	PROTOEDIT = P=A
5004	E := $(.LIST.PACKAGE.SOURCE.EDIT.)
5005	N := $(.PROTO.LICENSE.)
5006	for F $(.MANIFEST.)
5007		P := $(F:T=F)
5008		if N && F == "*.{1,3}(?)"
5009			print ;;$(PROTO) $(PROTOFLAGS) -o source=$(F:T=ZR=%Y) -c '' -dp $(P);$(P);$(F:$(E))
5010		else
5011			print ;;;$(P);$(F:$(E))
5012		end
5013	end
5014
5015.LIST.SYMBOLS : .ALWAYS
5016	lib="$(...:A=.ARCHIVE:A=.TARGET:T=F:N!=*[-/]*)"
5017	for lib in $lib
5018	do	$(NM) $(NMFLAGS) $lib | $(SED) $(NMEDIT) $(CC.PREFIX.SYMBOL:?-e 's/^$(CC.PREFIX.SYMBOL)//'??) | $(SORT) -u
5019	done
5020
5021if LPROF
5022.LPROF : .MAKE .VIRTUAL .FORCE .ONOBJECT .SETARGS
5023	local T1 T2
5024	set force noscan nowritestate override
5025	.INSERT.%.COMMAND : .LPROF0 .LPROF1 $$(<:B:S=.cnt)
5026	.LPROF0 : .MAKE .VIRTUAL .FORCE
5027		.LPROFFILES. =
5028	.LPROF1 : .AFTER .IGNORE $$(<<:B:S=.cnt)
5029		$(LPROF) $(LPROFFLAGS) -r "$(.LPROFFILES.:/^ //)" -o $(<<) -c $(*)
5030	for T1 % %.o
5031		for T2 $(.METARULE.I.$(T1))
5032			$(T1) : $(T2) .NULL
5033		end
5034	end
5035	%.o : %.c .MAKE
5036		.LPROFFILES. += $(>)
5037	.ARCHIVE.o .COMMAND.o : .NULL
5038end
5039
5040.OFFICIAL : .ONOBJECT
5041	$(*.VIEW:O=2:@?$$(.MANIFEST.:P=L:N!=[-/]*:T=FR:T!=FL:C@.*@{ $$(DIFF) $$(DIFFFLAGS) $$(*.VIEW:O=2)/& & || true; } >> $(-official-output:D=$$(*.VIEW:O=2):B:S); $$(MV) $$(MVFLAGS) & $$(*.VIEW:O=2)/&;@)?: no lower view?)
5042
5043.PAX : .COMMON.SAVE $$(*.RECURSE:@?.PAX.RECURSE?.PAX.LOCAL)
5044
5045.PAX.LOCAL : .COMMON.SAVE
5046	$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.pax) $(PAXFLAGS) $(.MANIFEST.)
5047
5048.PAX.RECURSE : .COMMON.SAVE
5049	$(MAKE) --noexec --file=$(MAKEFILE) $(-) recurse list.manifest |
5050	$(SORT) -u |
5051	$(PAX) -w -f $(-archive-output)$(-?archive-output:~.pax) $(PAXFLAGS)
5052
5053.PRINT : .COMMON.SAVE
5054	$(PR) $(PRFLAGS) $(.SOURCES.:N!=*.[0-9]*([!./])) $(LPR:@?| $(LPR) $(LPRFLAGS)??)
5055
5056.SAVE : .COMMON.SAVE
5057	$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.$("":T=R:F=%($(.BASE.DATE.FORMAT.))T)) $(PAXFLAGS) $(.MANIFEST.)
5058
5059.SHAR : .COMMON.SAVE
5060	$(SHAR) $(SHARFLAGS) $(.MANIFEST.) > $(-archive-output)$(-?archive-output:~.shar)
5061
5062.TAR : .COMMON.SAVE
5063	$(TAR) cf$(TARFLAGS) $(-archive-output)$(-?archive-output:~.tar) $(.MANIFEST.)
5064
5065.TARBALL : .COMMON.SAVE
5066	$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.tgz) -x tar:gzip $(PAXFLAGS) -s ',^[^/],$(PWD:B:/-.*//)$(VERSION:@N!=-:?-$(VERSION)??)/,' $(.MANIFEST.)
5067
5068.TGZ : .COMMON.SAVE $$(*.RECURSE:@?.TGZ.RECURSE?.TGZ.LOCAL)
5069
5070.TGZ.LOCAL : .COMMON.SAVE
5071	{ $(SILENT) print -r '$(.MANIFEST.:@/ /$("\n")/G)'; } |
5072	$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.tgz) -x tar:gzip $(PAXFLAGS)
5073
5074.TGZ.RECURSE : .COMMON.SAVE
5075	$(MAKE) --noexec --file=$(MAKEFILE) $(-) recurse list.manifest |
5076	$(SORT) -u |
5077	$(PAX) -w -f $(-archive-output)$(-?archive-output:~.tgz) -x tar:gzip $(PAXFLAGS)
5078
5079/*
5080 * make abstract machine support
5081 */
5082
5083.MAM.LOAD : .MAKE .VIRTUAL .FORCE
5084	if "$(-mam:N=static*)"
5085		set noreadstate reread strictview
5086		set readonly
5087		INSTALLROOT = $(.MAMROOT.)
5088		PACKAGEROOT = $(.MAMROOT.)/../..
5089		set noreadonly
5090		if "$(-mam:N=*,port*)"
5091			if ! "$(-?prefix-include)"
5092				set noprefix-include
5093			end
5094			if ! "$(-?separate-include)"
5095				set noseparate-include
5096			end
5097		end
5098	end
5099	.MAKEINIT : .MAM.INIT
5100
5101.MAM.INIT : .MAKE .VIRTUAL .FORCE .AFTER
5102	local T
5103	if ! "$(-mam)"
5104		return
5105	end
5106	LICENSEFILES := $(LICENSEINFO)
5107	if "$(-mam:N=*,port*)"
5108		for T $("<VARIABLES>":L=CC.+([[:upper:].]))
5109			$(T) :=
5110		end
5111		CC.DEBUG = ${mam_cc_DEBUG}
5112		CC.DIALECT =
5113		CC.DLL = ${mam_cc_DLL}
5114		CC.DLLBIG = ${mam_cc_DLLBIG}
5115		CC.DYNAMIC =
5116		CC.EXPORT.DYNAMIC = ${mam_cc_EXPORT_DYNAMIC}
5117		CC.HOSTTYPE = ${mam_cc_HOSTTYPE}
5118		CC.OPTIMIZE = ${mam_cc_OPTIMIZE}
5119		CC.PIC = ${mam_cc_PIC}
5120		CC.PICBIG = ${mam_cc_PICBIG}
5121		CC.PREFIX.ARCHIVE = lib
5122		CC.PREFIX.DYNAMIC = ${mam_cc_PREFIX_DYNAMIC}
5123		CC.PREFIX.SHARED = ${mam_cc_PREFIX_SHARED}
5124		CC.SHARED =
5125		CC.SHELLMAGIC = ${mam_cc_SHELLMAGIC}
5126		CC.STATIC =
5127		CC.SUFFIX.ARCHIVE = .a
5128		CC.SUFFIX.DYNAMIC = ${mam_cc_SUFFIX_DYNAMIC}
5129		CC.SUFFIX.SHARED = ${mam_cc_SUFFIX_SHARED}
5130		_hosttype_ = ${mam_cc_HOSTTYPE}
5131	end
5132	.MAM.PACKAGEROOT := $(".":P=R=$(PACKAGEROOT))
5133	print -um setv PACKAGEROOT $(PACKAGEROOT)
5134	PACKAGEROOT = ${PACKAGEROOT}
5135	print -um setv AR ${mam_cc_AR} ${mam_cc_AR_ARFLAGS}
5136	AR = ${AR}
5137	print -um setv ARFLAGS $(ARHYPHEN)rc
5138	ARFLAGS = $(ARHYPHEN)rc
5139	print -um setv AS as
5140	AS = ${AS}
5141	print -um setv ASFLAGS
5142	ASFLAGS = ${ASFLAGS}
5143	print -um setv CC $(-mam:N=static*,port*:?$(-cctype:O=1:B:S)?$(CC)?)
5144	CC = ${CC}
5145	.MAM.CC.FLAGS := $(CCFLAGS:VP:N!=-O*|$(CC.OPTIMIZE)|$\(CC.OPTIMIZE\)|-g|$(CC.DEBUG)|$\(CC.DEBUG\))
5146	print -um setv mam_cc_FLAGS $(.MAM.CC.FLAGS)
5147	T := $(CCFLAGS:VP)
5148	if "$(T:N=-O*|$(CC.OPTIMIZE))"
5149		print -um setv CCFLAGS ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${mam_cc_OPTIMIZE}?}
5150	elif "$(T:N=-g|$(CC.DEBUG))"
5151		print -um setv CCFLAGS ${mam_cc_DEBUG}
5152	else
5153		print -um setv CCFLAGS ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG??}
5154	end
5155	CCFLAGS = ${mam_cc_FLAGS} ${CCFLAGS}
5156	print -um setv CCLDFLAGS $(CCLDFLAGS:VP:N!=$\(*\)) ${-strip-symbols?1?${mam_cc_LD_STRIP}??}
5157	CCLDFLAGS = ${CCLDFLAGS}
5158	CC.NATIVE = ${CC}
5159	CMP = cmp 2>/dev/null
5160	print -um setv COTEMP $$
5161	print -um setv CPIO cpio
5162	CPIO = ${CPIO}
5163	print -um setv CPIOFLAGS
5164	CPIOFLAGS = ${CPIOFLAGS}
5165	print -um setv CPP "${CC} -E"
5166	CPP = ${CPP}
5167	print -um setv F77 f77
5168	F77 = ${F77}
5169	print -um setv HOSTCC ${CC}
5170	print -um setv IGNORE
5171	INSTALLROOT = ${INSTALLROOT}
5172	print -um setv LD ld
5173	LD = ${LD}
5174	print -um setv LDFLAGS $(LDFLAGS:VP:@Y&"$(LDFLAGS:VP)"&&)
5175	LDFLAGS = ${LDFLAGS}
5176	if "$(-mam:N=*,port*)"
5177		LDFLAGS &= $$(*.SOURCE.%.ARCHIVE:I=$$$(*:N=${mam_lib+([a-zA-Z0-9_])}:P=D):$(.CC.NOSTDLIB.):/.*/${mam_cc_L+-L&}/)
5178	end
5179	print -um setv LEX lex
5180	LEX = ${LEX}
5181	print -um setv LEXFLAGS
5182	LEXFLAGS = ${LEXFLAGS}
5183	print -um setv LPR lpr
5184	LPR = ${LPR}
5185	print -um setv LPRFLAGS
5186	LPRFLAGS = ${LPRFLAGS}
5187	M4 = ${M4}
5188	print -um setv M4FLAGS $(M4FLAGS:VP:@?"$(M4FLAGS:VP)"??)
5189	M4FLAGS = ${M4FLAGS}
5190	print -um setv NMAKE nmake
5191	MAKE := $(-never:?${NMAKE}?$$$(<:A=.ALWAYS:@Y%$(MAKE)%${NMAKE}%)?)
5192	print -um setv NMAKEFLAGS
5193	NMAKEFLAGS = ${NMAKEFLAGS}
5194	print -um setv PR pr
5195	PR = ${PR}
5196	print -um setv PRFLAGS
5197	PRFLAGS = ${PRFLAGS}
5198	print -um setv SHELL /bin/sh
5199	SHELL = ${SHELL}
5200	print -um setv SILENT
5201	STDCMP = ${STDCMP} 2>/dev/null
5202	STDCP = ${STDCP}
5203	STDED = ${STDED}
5204	STDEDFLAGS = ${STDEDFLAGS}
5205	STDLN = ${STDLN}
5206	STDMV = ${STDMV}
5207	STDRM = ${STDRM}
5208	print -um setv TAR tar
5209	TAR = ${TAR}
5210	print -um setv YACC yacc
5211	YACC = ${YACC}
5212	print -um setv YACCFLAGS -d
5213	YACCFLAGS = ${YACCFLAGS}
5214	.ARUPDATE .ARCOPY :
5215		$(<<:N=*$(CC.SUFFIX.ARCHIVE):?(ranlib $$(<<)) >/dev/null 2>&1 || true??)
5216	.ARCLEAN : .NULL
5217	.DO.INSTALL :
5218		test '' = '$(*)' || $(STDCMP) $(CMPFLAGS) $(*) $(<) || { $(STDMV) $(<) $(<).old 2>/dev/null || true; $(STDCP) $(*) $(<) $(.DO.INSTALL.OPT.) ;}
5219	for T .READONLY.*
5220		$(T) : .CLEAR .NULL .VIRTUAL
5221	end
5222
5223	/*
5224	 * force some make...prev
5225	 * bindfile() should probably do this
5226	 * but right now its too noisy
5227	 */
5228
5229	make (USAGE_LICENSE) $(LICENSEFILES)
5230
5231/*
5232 * miscellaneous support
5233 */
5234
5235include - "msgcat.mk"
5236
5237/*
5238 * local installation info
5239 */
5240
5241include "Makeinstall.mk"
5242
5243/*
5244 * architecture specific additions
5245 */
5246
5247include - "rules-$(_hosttype_).mk"
5248
5249if _hosttype_ != "$(_hosttype_:B)"
5250include - "rules-$(_hosttype_:B).mk"
5251	if "$(_hosttype_:B)" != "$(_hosttype_:B:/\([0-9][0-9]*\)[^0-9][^0-9]*[0-9]*$/\1/)"
5252	include - "rules-$(_hosttype_:B:/\([0-9][0-9]*\)[^0-9][^0-9]*[0-9]*$/\1/).mk"
5253	end
5254end
5255
5256/*
5257 * local additions
5258 */
5259
5260include - "Localrules.mk"
5261