rules
/*
* Glenn Fowler
* AT&T Research
*
* default make base rules
*
* conventions:
*
* internal make rule names match the RE \.[.A-Z][.A-Z0-9]*
* internal make variable names match the RE \.[.A-Z][.A-Z0-9]*\.
* internal make operator names match the RE :[A-Z]*:
* use $(tmp) (10 chars max) to generate shell tmp file names
* every (non-builtin shell) command should use a make variable
* the flags for command $(XYZ) are $(XYZFLAGS)
*/
.ID. = "@(#)$Id: Makerules (AT&T Research) 2012-06-08 $"
.RULESVERSION. := $(MAKEVERSION:@/.* //:/-//G)
/*
* handy attributes
*/
.FUNCTION : .USE .ATTRIBUTE .MAKE .FUNCTIONAL .VIRTUAL .FORCE .REPEAT
.ANCESTOR.LIST = $(-ancestor-source) .SOURCE.a lib .SOURCE.h include
tmp = ${COTEMP}
/*
* rule option definitions
*/
set option=';all-static;bp;-;Force the prerequisite libraries of static \b+l\b\aname\a library references to be static.'
set option=';ancestor;n;-;Set the ancestor search directory depth to \adepth\a. \bMAKEPATH\b and variant recursive invocations may increase the depth.;depth:=3'
set 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)'
set 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'
set 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'
set 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]'
set option=';clean-ignore;s;-;Ignore \bclean\b action generated target files matching \apattern\a.;pattern'
set option=';clobber;sv;-;Replace existing \binstall\b action targets matching \apattern\a instead of renaming to \atarget\a\b.old\b.;pattern:!*'
set option=';compare;b;-;Ignore \binstall\b action targets whose contents have not changed. On by default.'
set option=';debug-symbols;bp;-;Compile and link with debugging symbol options enabled.'
set option=';force-shared;b;-;Do not ignore \b-l\b\aname\a shared library reference modification times.'
set 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'
set option=';ld-script;s;-;A space-separated list of suffixes of script files to be passed to the linker.;suffix'
set option=';lib-type;bp;-;Bind library references to \b--debug-symbols\b or \b--profile\b specific variants.'
set option=';link;s;-;Hard link \binstall\b action targets matching \apattern\a instead of copying.;pattern'
set 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.'
set option=';native-pp;np;-;Force the use of the native C preprocessor and print a \alevel\a diagnostic message noting the override.;level'
set 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'
set 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.'
set option=';preserve;sv;-;Move existing \binstall\b action targets matching \apattern\a to the \bETXTBSY\b subdirectory of the install target.;pattern:!*'
set option=';profile;b;-;Compile and link with \bprof\b(1) instrumentation options enabled.'
set 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.]}'
set 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'
set 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'
set option=';select;s;-;A catenation of edit operators that selects terminal source files.;edit-ops'
set 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.'
set option=';shared;bp;-;Set \b:LIBRARY:\b to generate shared libraries (dlls).'
set option=';static-link;bp;-;Compile and link with a preference for static libraries.'
set option=';strip-symbols;b;-;Strip link-time static symbols from executables.'
set option=';threads;b;-;Compile and link with thread options enabled. Not implemented yet.'
set option=';variants;sv;-;Select only \bcc-\b\avariant\a directories matching \apattern\a.;pattern:!*'
set 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'
set 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.'
/*
* rule option defaults
*/
set all-static:=1
set archive-output:=$$(PWD:N=*[0-9].[0-9]*|*-$(VERSION:@N!=-):?$$(PWD:B:S:/---*\\([^-]*\\)/-\\1/)?$$(VERSION:@N!=-:Y%$$(PWD:B:S)-$$(VERSION)%$$(PWD:B)%)?)
set compare:=1
set lib-type:=1
set official-output:=OFFICIAL
set preserve:=$$(CC.SUFFIX.SHARED:+$$(CC.PREFIX.SHARED)*$$(CC.SUFFIX.SHARED).*)|$$(CC.SUFFIX.DYNAMIC:+$$(CC.PREFIX.DYNAMIC)*$$(CC.SUFFIX.DYNAMIC))
set recurse:=1
set separate-include:=1
set virtual:=1
/*
* name=value => --option compatibility
*/
.OPTION.COMPATIBILITY : .MAKE .VIRTUAL .FORCE
local N O
if .MAKEVERSION. < 20121221
O =
N =
if ! "$(-?clobber)" && "$("clobber":T=QV)"
O += clobber=$(clobber)
if clobber == "1"
N += --clobber
elif clobber == "0"
N += --noclobber
else
N += --clobber=$(clobber)
end
end
if ! "$(-?compare)" && "$("compare":T=QV)"
O += compare=$(compare)
if compare
N += --compare
else
N += --nocompare
end
end
if ! "$(-?debug-symbols)" && "$("debug":T=QV)"
O += debug=$(debug)
if debug
N += --debug-symbols
else
N += --nodebug-symbols
end
end
if ! "$(-?instrument)" && "$("instrument":T=QV)"
O += instrument=$(instrument)
if instrument != ""
N += --instrument=$(instrument)
else
N += --noinstrument
end
end
if ! "$(-?link)" && "$("link":T=QV)"
O += link=$(link)
if link == "1"
N += --link
elif link == "0"
N += --nolink
else
N += --link=$(link)
end
end
if ! "$(-?prefix-include)" && "$("prefixinclude":T=QV)"
O += prefixinclude=$(prefixinclude)
if prefixinclude
N += --prefix-include
else
N += --noprefix-include
end
end
if ! "$(-?static-link)" && "$("static":T=QV)"
O += static=$(static)
if static
N += --static-link
else
N += --nostatic-link
end
end
if N
set $(N)
if .MAKEVERSION. >= 20050701
error 1 $(O): obsolete: use $(N)
end
end
end
/*
* made when the base rules are loaded
*
* makerules options are set up here
*/
.MAKERULES.LOAD : .MAKE .VIRTUAL .FORCE .IMMEDIATE
local O N
/*
* rule vs. engine incompatibility is ethereal
* changes to edit ops and probe info are the main factors
* but changing the date should not be taken lightly
*/
.MAKEVERSION. := $(MAKEVERSION:@/.* //:/-//G)
if .MAKEVERSION. < 20040909
error 3 version $(.MAKEVERSION.:/^\(....\)\(..\)\(..\)$/\1-\2-\3/) incompatible with base rules version $(.RULESVERSION.:/^\(....\)\(..\)\(..\)$/\1-\2-\3/)
end
/*
* exported options
*/
if MAKE_OPTIONS && ! "$(-mam:N=static*)"
for O $(MAKE_OPTIONS)
if O == "-*"
set $(O)
else if O == "*([^=])[[:upper:].]*([^=])=*"
eval
$(O:V)
end
else
set --$(O:V)
end
end
end
if "$(-view-verify)" && ! "$(*.VIEW:O=2)"
error $(-view-verify) viewpath not set
end
if "$(-mam:N=(regress|static)*)"
.MAMROOT. := $(PWD:C@.*/src/@/src/@:C@/[^/]*@/..@G:C@/@@)
.MAKE : .MAM.LOAD
end
PAXFLAGS &= $$(MAKEPATH:C@:@ @G:N!=...*:C@.*@-s\@&/*\@\@@) $$(PWD:C@.*@-s\@&/*\@\@@)
.MAKE : .PROBE.LOAD
/*
* binding directory lists
*/
PKGDIRS = $(LIBDIR) $(*.VIEW:X=$(VROOT)/$(LIBDIR:B:S)) $(MAKERULESPATH:/:/ /G::D)
LCLDIRS = /usr/local/arch/$(_hosttype_):/usr/local
OPTDIRS = $(INSTALLROOT)/opt:/usr/add-on:/usr/addon:/usr/contrib:$(LCLDIRS):/opt
STDDIRS = /:/usr
USRDIRS = $(LCLDIRS):$(OPTDIRS):$(STDDIRS)
/*
* common directories
*/
INSTALLROOT = $(HOME)
BINDIR = $(INSTALLROOT)/bin
DLLDIR = $(CC.DLL.DIR)
ETCDIR = $(INSTALLROOT)/etc
FUNDIR = $(INSTALLROOT)/fun
INCLUDEDIR = $(INSTALLROOT)/include
LIBDIR = $(INSTALLROOT)/lib
LOCALEDIR = $(INSTALLROOT)/lib/locale
MANDIR = $(INSTALLROOT)/man/man
SHAREDIR = $(INSTALLROOT)/share
TMPDIR = /usr/tmp
/*
* common files
*/
CATALOG = $(.CATALOG.NAME.)
HTMLINITFILES = 2HTML:$(HOME)/.2html
LICENSE =
LICENSEFILE = LICENSE
LICENSEFILEDEFAULT =
LICENSEFILES = $(.PACKAGE.license) $(LICENSE:/,.*//:N!=*=*:/.*/$(.PACKAGE.)-& &) $(LICENSEFILE) $(LICENSEFILEDEFAULT) $(.PACKAGE.:X=$$(.PACKAGE.):C,/,-,) $(.PACKAGE.:X=$$(PWD:C,^$(INSTALLROOT)/[^/]*/[^/]*/,,:C,/.*,,:/^lib//:/lib$//):C,/,-,) $(.PACKAGE.)
LICENSEINFO = $(.FIND. lib/package .lic $(LICENSEFILES))
LICENSECLASS = $(LICENSEINFO:P=W=$(LICENSE),query=${type}.${class})
/*
* language processor suffix equivalences
*/
.SUFFIX.c = .c
.SUFFIX.HEADER.c = .h
.SUFFIX.C = .C .cc .cpp .cxx .c++
.SUFFIX.f = .f .F
.SUFFIX.r = .r .R
.COMMAND.CC = g++ CC c++ cxx
/*
* $(sh echo hello) may be handier than :COMMAND:
* $(.sh. ...) will not be frozen in .mo
*/
.sh. : .SPECIAL .VIRTUAL .FUNCTIONAL .FORCE .REPEAT .ALWAYS .LOCAL
set -
$(%)
/*
* $(.FIND. sibling suffix file ...)
*
* find file ... in sibling dir on PATH with suffix
* - sibling ignores sibling
* - suffix ignores suffix
*/
.FIND. : .FUNCTION
local ( SIBLING SUFFIX FILES ... ) $(%:/:/ /G)
local D F P X
P = $(SIBLING:N=lib/package:+$(PACKAGEROOT)/bin) $(PATH) $(PKGDIRS)
P := $(P:/:/ /G:D:T=F)
for F $(FILES)
if X = "$(F:T=FR)"
return $(X)
end
if "$(X:S)" != "*.*" && SUFFIX != "-"
if X = "$(F:D:B:S=$(SUFFIX):T=FR)"
return $(X)
end
end
if F == "*/*" || SIBLING == "-"
D =
else
D = =$(SIBLING)
end
if X = "$(P:X=$(F:D$(D):B:S):T=FR)"
return $(X:O=1)
end
if "$(F:S)" != "*.*" && SUFFIX != "-"
if X = "$(P:X=$(F:D$(D):B:S=$(SUFFIX)):T=FR)"
return $(X:O=1)
end
end
end
/*
* $(INSTRUMENT_$(-instrument:O=1:B)) is eval'd in .MAKEINIT
*/
INSTRUMENT_app = : $(.INSTRUMENT.app)
INSTRUMENT_insight = command=CC root=INSIGHT bin=bin.$(_hosttype_)
INSTRUMENT_purecov = command=CCLD root=PURE_HOME CCFLAGS=$(CC.DEBUG)
INSTRUMENT_purify = command=CCLD root=PURE_HOME
INSTRUMENT_quantify = command=CCLD root=PURE_HOME CCFLAGS=$(CC.DEBUG)
INSTRUMENT_sentinel = command=CCLD root=SE_HOME CCFLAGS=$(CC.DEBUG)
.INSTRUMENT.app : .FUNCTION
if ! ( APP = "$(PATH:/:/ /G:X=../lib/app/cpp:P=X:O=1)" )
error 3 app not found
end
CPP = $(APP)
CPPFLAGS = $(CCFLAGS:N=-[DIU]*)
LDLIBRARIES += -lapp
.SOURCE.a : $(APP:D:D)
.INSTRUMENT.notfound : .FUNCTION
error 3 $(-instrument) not found
/*
* standard versions to avoid ETXTBSY during installation
*/
for .X. cat cmp cp ln mv rm
eval
STD$(.X.:F=%(upper)s) := $(STDDIRS:/:/ /G:X=bin/$(.X.):P=X:O=1)
end
end
.X. := $(STDLN)
STDLN := $$(_feature_:N=ln:?$(.X.)?$$(STDCP)?)
/*
* action related symbols
*/
AR = $(CC.AR) $(CC.AR.ARFLAGS)
ARFLAGS = $(ARHYPHEN)r
ARHYPHEN = /* XXX: change to ``-'' when sun4 finally expires */
AS = as
if "$(PATH:/:/ /G:X=awk:P=X)"
AWK = awk
elif "$(PATH:/:/ /G:X=nawk:P=X)"
AWK = nawk
elif "$(PATH:/:/ /G:X=gawk:P=X)"
AWK = gawk
else
AWK = awk
end
BISON = bison
BISONFLAGS = -d
cc = cc
CC = cc
CCFLAGS = $(CC.OPTIMIZE)
CCLD = $(CC)
CCLDFLAGS =
CCSPECIALIZE =
CHGRP = chgrp
CHMOD = chmod
CHOWN = chown
CMP = cmp
CMPFLAGS = -s
CP = cp
CPIO = cpio
CPP = $(MAKEPP)
CPPFLAGS = $(CCFLAGS:N=-[DIU]*)
CPR = cp
CPRFLAGS = -pr
if "$(PATH:/:/ /G:X=ctags:P=X)"
CTAGS = ctags
end
DIFF = diff
DIFFFLAGS = -u
EGREP = egrep
F77 = f77
FLEX = flex
FLEXFLAGS = -l
GREP = grep
HOSTCC = $(CC)
IFFE = iffe
IFFESRCDIR = features
IFFEGENDIR = FEATURE
IFFEFLAGS = -v
IFFECC = $(CC)
IFFECCFLAGS = $(CCFLAGS)
IFFELDFLAGS = $(LDFLAGS)
IFFEREFS =
IGNORE = ignore
LD = $(CC.LD)
LDFLAGS =
LDSHARED = $(CC.SHARED.LD|CC.LD)
LDRUNPATH = $(CC.RUNPATH)
if "$(sh if $(FLEX) $(FLEXFLAGS) --version >/dev/null 2>&1; then echo 0; else echo 1; fi)" == "0"
LEX = $(FLEX)
LEXFLAGS = $(FLEXFLAGS)
else
LEX = lex
LEXFLAGS =
end
.T. = $(USRDIRS:/:/ /G:X=lib/lint) $(USRDIRS:/:/ /G:X=lib/cmplrs/cc) $(USRDIRS:/:/ /G:X=ccs/lib)
if .T. = "$(.T.:X=lint1:P=X:O=1)"
LINTLIB := $(.T.:D)
else
LINTLIB = /usr/lib
end
LINTLIBRARIES = libc$(CC.SUFFIX.ARCHIVE)
LINT1 = $(LINTLIB)/lint1
LINT2 = $(LINTLIB)/lint2
if ! "$(_release_:N=V)"
LINTFLAGS = -bh
end
LN = $(_feature_:N=ln:?ln?$(CP)?)
LPR = lpr
if "$(PATH:/:/ /G:X=lprof:P=X)"
LPROF = lprof
end
LS = ls
M4 = m4
if "$(PATH:/:/ /G:X=mcs:P=X)"
MCS = mcs
MCSFLAGS = -d
end
MKDIR = mkdir
MM2HTML = mm2html
MM2HTMLINFO = $(LICENSEINFO)
MM2HTMLINIT = $(HTMLINITFILES:/:/ /G:T=F:O=1)
MM2HTMLFLAGS = $(MM2HTMLINFO:@Q:/^/-l /) $(MM2HTMLINIT:@Q:/^/-h /) $(LICENSE:@/^/-o /:@Q)
MV = mv
MVFLAGS = -f
if "$(PATH:/:/ /G:X=nawk:P=X)"
NAWK = nawk
elif "$(PATH:/:/ /G:X=gawk:P=X)"
NAWK = gawk
else
NAWK = awk
end
NM = $(CC.NM)
NMEDIT = $(CC.NMEDIT) -e '/^$(CC.PREFIX.SYMBOL)_STUB_/d' -e '/$(CC.PREFIX.SYMBOL)_already_defined$/d'
NMFLAGS = $(CC.NMFLAGS)
PACKAGE =
PACKAGE_IGNORE =
PACKAGE_LOCAL = $(.PACKAGE.:O=1)_
PACKAGE_PATH = $(PACKAGE)
PAX = pax
PERL = perl
PPCC = $(MAKERULESPATH:/:/ /G:X=ppcc:P=X:O=1)
PPCCFLAGS =
PR = pr
PROTO = proto
PROTOEDIT =
PROTOFLAGS = -s $(LICENSEINFO:$(PROTOEDIT):/^/-l /) $(LICENSE:@/^/-o /:@Q)
RANLIB = $(IGNORE) ranlib
REGRESS = regress
REGRESSFLAGS =
RM = rm
RMFLAGS = -f
RMRECURSEFLAGS = -r
SED = sed
SHAR = shar
SHELLMAGIC = $(CC.SHELLMAGIC)
SILENT = silent
SORT = sort
STRIP = $(CC.STRIP)
STRIPFLAGS = $(CC.STRIP.FLAGS)
TAR = tar
TARFLAGS = v
VARIANT =
VARIANTID =
if "$(PATH:/:/ /G:X=vgrind:P=X)"
VGRIND = vgrind
end
if ! "$(PATH:/:/ /G:X=yacc:P=X)" && "$(PATH:/:/ /G:X=bison:P=X)"
YACC = $(BISON)
YACCFLAGS = -y $(BISONFLAGS)
else
YACC = yacc
YACCFLAGS = -d
end
/*
* special symbols
*/
.BUILT. = $(...:T=XU:A!=.TERMINAL:T=F:P=L:N!=/*$(.INSTALL.LIST.:@/ /|/G:/^./|&/)$(VROOT:?|$(VROOT)/*??)$(-global:@/:/|/G:/^./|&/)|$(CATALOG).msg:T=G)
.CLOBBER. = $(".":L=*.([it]i|l[hn])) core
.FILES. = $(LICENSEFILE)
.MANIFEST.FILES. = $(*.COMMON.SAVE:T=F) $(.SELECT.:A!=.ARCHIVE|.COMMAND|.OBJECT|.TARGET)
.MANIFEST. = $(.MANIFEST.FILES.:P=F:T=FR:P=C:H=U)
.SOURCES. = $(.SELECT.:A=.REGULAR:A!=.ARCHIVE|.COMMAND|.OBJECT)
/*
* stop expansion of certain state variables
*/
(AR) (ARFLAGS) (AS) (ASFLAGS) (CPP) (CC) (CCFLAGS) (CCLD) \
(CCLDFLAGS) (COATTRIBUTES) (COBOL) (COBOLDIALECT) (COBOLFLAGS) \
(F77) (F77FLAGS) (IFFE) (IFFEFLAGS) (LD) (LDFLAGS) (LDLIBRARIES) \
(LDSHARED) (LEX) (LEXFLAGS) (M4) (M4FLAGS) (PERLMAGIC) \
(PROTO) (PROTOFLAGS) (SHELLMAGIC) \
(YACC) (YACCFLAGS) : .PARAMETER
/*
* mark actions that operate on built objects
*/
.ONOBJECT : .ATTRIBUTE
/*
* file attributes
*/
.OBJECT : .ATTRIBUTE
include "Scanrules.mk"
/*
* pattern association attributes
*/
.INSTALL. :
.INSTALL.%.COMMAND : $$(BINDIR)
.INSTALL.%.ARCHIVE : $$(LIBDIR)
/*
* naming conventions
*/
.CATALOG.NAME. : .FUNCTION
local N
if ID == "+([A-Za-z0-9_])"
N := $(ID)
if PWD == "*/lib/*"
N := lib$(N)
end
elif "$(PWD:B)" == "cc-*"
N := $(PWD:D::B)
elif "$(PWD:D::B)" == "?*lib"
N := $(PWD:D::B:/lib$//)$(PWD:B)
else
N := $(PWD:B)
end
return $(N)
.DLL.NAME. : .FUNCTION .PROBE.INIT
local L
if "$(CC.DLL)"
if "$(.SHARED.DEF.:A=.TARGET)"
L := $($(.SHARED.DEF.) - $(%))
else
L := $(CC.PREFIX.SHARED)$(%:O=1)$(CC.SUFFIX.SHARED)
if "$(%:O=2)" == "[0-9]*"
L := $(L).$(%:O=2)
end
end
end
return $(L)
.LIB.NAME. : .FUNCTION .PROBE.INIT
local T
if ! .NO.LIB.TYPE && "$(-lib-type)"
if ! ( T = "$(.PACKAGE.$(%:O=1).type)" )
T := $(CC.LIB.TYPE)
elif T == "-"
T =
end
end
return $(CC.PREFIX.ARCHIVE)$(%:O=1)$(T)$(CC.SUFFIX.ARCHIVE)
/*
* bind overrides
*/
+ldl : .VIRTUAL
for .S. dl m /* dynamic unless explicitly overridden */
-l$(.S.) : .DONTCARE
.PACKAGE.$(.S.).library := -l
end
.NO.LIB.TYPE = 0
.LIB.TYPE. : .FUNCTION
local P T
if "$(%)" == "*/*"
if CC.PREFIX.DYNAMIC || CC.SUFFIX.DYNAMIC
T := $(%:D)/$(CC.PREFIX.DYNAMIC)$(%:B)$(CC.SUFFIX.DYNAMIC)
else
T := $(%:D)/$(CC.PREFIX.SHARED)$(%:B)$(CC.SUFFIX.SHARED)
end
if T = "$(*.SOURCE.%.ARCHIVE:X=$(T):T=F:O=1)"
return $(T)
end
end
if ! .NO.LIB.TYPE
if "$(-lib-type)" && "$(.PACKAGE.$(%).type)" != "-"
for P $(.PACKAGE.$(%).type) $(CC.LIB.TYPE)
/* libX-P.a or libX_P.a or libP/libX.a */
T := $(CC.PREFIX.ARCHIVE)$(%)$(P)$(CC.SUFFIX.ARCHIVE)
if ! "$(T:A=.TARGET)" && ! "$(T:T=F)"
T := $(CC.PREFIX.ARCHIVE)$(%)(P:/-/_/)$(CC.SUFFIX.ARCHIVE)
if ! "$(T:A=.TARGET)" && ! "$(T:T=F)"
T := lib$(P:/-//)/$(CC.PREFIX.ARCHIVE)$(%)$(CC.SUFFIX.ARCHIVE)
end
end
if "$(T:A=.TARGET)" || "$(T:T=F)"
return $(T)
end
end
end
end
.BIND.+l% : .FUNCTION
local A B L
B := $(%:/+l//)
A := $(CC.PREFIX.ARCHIVE)$(B)$(CC.SUFFIX.ARCHIVE)
if "$(-mam:N=static*,port*)"
if L = "$(A:A=.TARGET)"
return $(L)
end
L := -l$(B)
if "$(%:A=.DONTCARE)"
$(L) : .DONTCARE
end
return + $(L:T=F)
end
if ( L = "$(.LIB.TYPE. $(B))" )
return $(L)
end
if ( L = "$(A:A=.TARGET)" )
return $(L)
end
if ! "$(.LIBRARY.LIST.)" || "$(.PACKAGE.LIBRARY. $(B))" != "-l"
if "$(.REQUIRE.-l% -l$(B):/[-+]l//:N=$(B))"
if ( L = "$(A:T=F)" )
return $(L)
end
end
end
A := $(%:/+l/-l/)
if ! ( L = "$(A:T=F)" )
if "$(A:A=.DONTCARE)"
$(%) : .DONTCARE
end
end
return $(L)
.BIND.-l% : .FUNCTION
local A B D T V X
if "$(%)" != "[-+]l*"
return $(%)
end
B := $(%:/[-+]l//)
if "$(-mam:N=static*,port*)" && ! .BIND.REAL.
if "$(%)" != "-l+([a-zA-Z0-9_])"
$(%) : .DONTCARE
return + $(%)
end
.BIND.REAL. = 1
A := $(.BIND.-l% $(%):T=F)
.BIND.REAL. =
V := ${mam_lib$(B)}
if "$(%:A=.DONTCARE)" && "$(A:N=/*)"
print -um bind -l$(B) dontcare
return + $(V)
elif T = "$(%:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1$(CC.SUFFIX.ARCHIVE)/:A=.TARGET)"
return $(T)
else
$(V) : .DONTCARE
return $(V:T=F)
end
end
if ( T = "$(.LIB.TYPE. $(B))" )
return $(T)
end
if ( "$(-static-link)" || "$(.PACKAGE.LIBRARY. $(B))" == "+l" ) && "$(<<)" != ".BIND.+l%"
V := $(CC.PREFIX.ARCHIVE)$(B)$(CC.SUFFIX.ARCHIVE)
if ( T = "$(V:A=.TARGET)" )
return $(T)
end
if ( T = "$(V:T=F)" )
if "$(T:D)" != "$(CC.STDLIB:/ /|/G)" && "$(T:D)" != "/usr/($(.PACKAGE.:/ /|/G))"
$(T) : -IGNORE
return $(T)
end
end
end
if "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:N=$(CC.DYNAMIC))" || ! "$(CCLDFLAGS:N=$(CC.STATIC))" )
if ( CC.SUFFIX.DYNAMIC || ! "$(-local-static)" ) && CC.SUFFIX.SHARED && ! "$(.PLUGIN.$(B))"
if CC.SUFFIX.DYNAMIC
T := $(*$(B):N=*$(CC.SUFFIX.DYNAMIC))
if "$(CC.PREFIX.DYNAMIC)" != "$(CC.PREFIX.SHARED)"
if CC.PREFIX.DYNAMIC
T := $(T:D:B=$(T:B:/$(CC.PREFIX.DYNAMIC)/$(CC.PREFIX.SHARED)/):S=$(CC.SUFFIX.SHARED))
else
T := $(T:D:B=$(T:B:/^/$(CC.PREFIX.SHARED)/):S=$(CC.SUFFIX.SHARED))
end
else
T := $(T:D:B:S=$(CC.SUFFIX.SHARED))
end
else
T := $(*$(B):N=*$(CC.SUFFIX.SHARED)*(.+([0-9])))
end
if "$(T:A=.TARGET)"
if ( X = "$(*.INSTALL:N=*/$(T))" )
make $(X)
return - $(X)
end
return $(T)
end
if ( T = "$(*$(B):N=-l$(B):/-l//)" )
T := $(T)$($(B).VERSION:/[^0-9]//G)
if ( T = "$(T:B:S=$(CC.SUFFIX.SHARED):A=.TARGET)" )
if ( X = "$(*.INSTALL:N=*/$(T))" )
make $(X)
return - $(X)
end
return $(T)
end
end
end
if ( T = "$(%:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1$(CC.SUFFIX.ARCHIVE)/:A=.TARGET)" )
if "$(PACKAGE_OPTIONS:N=optimize-space)" && "$(CC.SUFFIX.SHARED)"
if ( V = "$(*$(B):N=*$(CC.SUFFIX.SHARED)*:A=.TARGET)" )
A := $(V:/\(.*$(CC.SUFFIX.SHARED)\).*/\1/)
if "$(A)" != "$(V)"
$(A) : $(V)
$(LN) -f $(*) $(<)
V := $(A)
end
.MAKE : $(V)
$(%) : .NULL
return $(%)
end
end
return $(T)
else
local H I J L P Q S Z
L := $(%)
V :=
if P = "$(PACKAGE_$(B)_VERSION)"
P := ?([-.])$(P)
end
if T = "$(PACKAGE_$(B)_LIB)"
if ! "$(.PACKAGE.stdlib:N=$(T))"
.SOURCE.a : $(T)
end
end
for J $(CC.PREFIX.SHARED) ''
for I $(P) ''
if "$(CC.SUFFIX.DYNAMIC)"
if T = "$(*.SOURCE.%.ARCHIVE:L>$(CC.PREFIX.ARCHIVE)$(B)$(I)$(CC.SUFFIX.ARCHIVE)|$(J)$(B)$(I)$(CC.SUFFIX.SHARED))"
if "$(CC.SUFFIX.SHARED)"
if T != "*$(CC.SUFFIX.SHARED)" && T == "*$(CC.SUFFIX.ARCHIVE)"
if S = "$(T:D:B=$(J)$(T:B:/$(CC.PREFIX.ARCHIVE)//):S=$(CC.SUFFIX.SHARED):T=F)"
T := $(S)
end
end
end
T := $(T:T=F)
Q = .ARCHIVE
if ! "$(-force-shared)" && ! "$(-static-link)" && ! "$(CC.SUFFIX.DYNAMIC)" && "$(CC.SUFFIX.SHARED)" && T == "*$(CC.SUFFIX.SHARED)"
Q += .IGNORE
end
$(%) $(T) : $(Q)
return $(T)
end
elif "$(J)" || ! "$(CC.PREFIX.SHARED)"
if ! S
if "$(CC.SUFFIX.STATIC)"
S = |$(CC.SUFFIX.STATIC)
end
if "$(CC.SUFFIX.SHARED)"
S := $(S:V)|$(CC.SUFFIX.SHARED)
if "$(CC.SUFFIX.SHARED)" != "$(CC.SUFFIX.OBJECT)"
H = -
if "$(CC.DIALECT:N=VERSION)"
Z = 1
end
end
end
end
while 1
T := $(*.SOURCE.%.ARCHIVE:L!>$(L:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1/)$(I)@($(V)$(CC.SUFFIX.ARCHIVE)$(S)))
if ! T && Z
T := $(*.SOURCE.%.ARCHIVE:L!>$(L:/-l\(.*\)/$(CC.PREFIX.ARCHIVE)\1/)$(I)@($(V)$(CC.SUFFIX.ARCHIVE)$(S)$(V)*))
end
if T
if ! "$(CC.SUFFIX.SHARED)" || T != "*$(CC.SUFFIX.SHARED)"
if T == "*$(CC.SUFFIX.ARCHIVE)"
if "$(CC.STDLIB:N=$(T:D))"
return - $(T:T=F)
end
return $(H) $(T:B:S)
end
if "$(CC.SUFFIX.STATIC)" && T == "*$(CC.SUFFIX.STATIC)"
H = -
end
end
T := $(T:B:S)
Q = .ARCHIVE
if ! "$(-force-shared)" && ! "$(-static-link)" && ! "$(CC.SUFFIX.DYNAMIC)" && "$(CC.SUFFIX.SHARED)" && T == "*$(CC.SUFFIX.SHARED)"
Q += .IGNORE
end
$(%) $(T) : $(Q)
return $(H) $(T:T=F)
end
if ! "$(L:N=*+(.+([0-9])))"
break
end
T := $(L:/\.[0-9]*$//)
V := $(L:/$(T)//)$(V)
L := $(T)
end
end
end
end
end
else
T := $(CC.PREFIX.ARCHIVE)$(B)$(CC.SUFFIX.ARCHIVE)
if "$(%:A=.DONTCARE)"
$(T) : .DONTCARE
end
return $(T)
end
if ! "$(.BOUND.$(B))"
.BOUND.$(B) := 1
if T = "$(CC.REQUIRE.$(B))"
$(%) : .DONTCARE
return $(T)
elif T = "$(B:B:S=.req:T=F)"
$(%) : .DONTCARE
return $(T:T=I)
else
T := lib/$(B)
$(T) : .ARCHIVE
if ! "$(T:T=F)"
T := $(MAKELIB:D)/$(T)
end
if "$(T:T=F)"
T := $(T:T=I)
if ! "$(T:N=[-+]l$(B))"
$(%) : .DONTCARE
end
return $(T)
end
end
end
.BIND.-u% : .FUNCTION
$(%) : .NULL
.BIND.$"{"mam_lib%"}" : .FUNCTION
if "$(-mam:N=static*,port*)"
local L T
L := $(%:/\${mam_lib\(.*\)}/\1/)
T := $(CC.PREFIX.ARCHIVE)$(L)$(CC.SUFFIX.ARCHIVE)
if ( T = "$(T:T=F)" )
print -um bind -l$(L)
return - $(T)
else
-l$(L) : .DONTCARE
return + $(%)
end
end
/*
* .REQUIRE.-l% helper that includes pkg-*.mk of lib and prereqs
* before any -l bindings -- needed because the package lib is
* probably linked last but the pkg-*.mk rules may give binding
* hints for prereq libs
*/
"{" "}" : .VIRTUAL .IGNORE .DONTCARE
.REQUIRED. : .FUNCTION
local A L R
for L $(%)
if A = "$(L:A<.REQUIRE.)"
R += $($(A) $(L))
end
end
return $(R)
.REQUIRE.RULES. : .FUNCTION
local B R T D DL DR
B := $(%:/[-+]l//)
if "$(-mam:N=static*)" && "$(%)" != "[-+]l+([a-zA-Z0-9_])"
return
end
for D 1 2
if ( T = "$(CC.REQUIRE.$(B))" )
if "$(-mam:N=static*)"
return
end
return $(T)
end
if ( T = "$(PACKAGE_$(B)_LIB)" )
if T == "$(%:T=F:P=D)"
T := $(T)/lib/$(B)
if ( T = "$(T:T=F)" )
return $(T:T=I)
end
return $(%)
end
end
if "$(.PACKAGE.$(B).rules)"
break
end
R := pkg-$(B).mk
if R = "$(R:T=F)"
include + $(R)
.PACKAGE.$(B).rules := $(R)
else
.PACKAGE.$(B).rules := -
break
end
end
if ! ( T = "$(%:/[-+]l\(.*\)/\1.req/:T=F)" )
R := lib/$(B)
$(R) : .ARCHIVE
if ! ( T = "$(R:T=F)" )
R := $(MAKELIB:D)/$(R)
if ! ( T = "$(R:T=F)" )
return $(%)
end
end
.REQUIRED.$(B) := 1
if "$(-mam:N=static*,port*)"
return ${mam_lib$(B)}
end
/* req must be seen at or before the lib */
DL := $(%:T=WF:P=D)
DR := $(T:P=D)
if DL != "$(DR)"
for D $(*.SOURCE.%.ARCHIVE:N!=.)
if D == "$(DR)"
break
end
if D == "$(DL)"
return $(%)
end
end
end
elif "$(-mam:N=static*,port*)"
return ${mam_lib$(B)}
end
.REQUIRED.$(B) := 1
T := $(T:T=I)
if "$(T:N=+l$(B))"
.PACKAGE.$(B).library := +l
end
return $(T)
.REQUIRE.-l% : .FUNCTION
local B H L R S
R := $(.REQUIRE.RULES. $(%))
for L $(R)
B := $(L:/-l//)
if ! "$(.PACKAGE.$(B).rules)"
H := pkg-$(B).mk
if H = "$(H:T=F)"
include + $(H)
.PACKAGE.$(B).rules := $(H)
else
.PACKAGE.$(B).rules := -
end
end
end
B := $(%:/[-+]l//)
if "$(.PACKAGE.LIBRARY. $(B))" == "+l"
if "$(-all-static)"
H =
for L $(R)
S := $(L:/-l/+l/)
if "$(S:A=.VIRTUAL)" || "$(.PACKAGE.LIBRARY. $(L:/[-+]l//))" == "-l"
H += $(L)
else
H += $(S)
end
end
return { $(H) }
end
return { $(R:/-l$(B)/+l$(B)/) }
end
return { $(R) }
.REQUIRE.+l% : .FUNCTION
local A B L S
B := $(%:/+l//)
L := $(.REQUIRE.-l% -l$(B))
if "$(-all-static)"
for B $(L)
S := $(B:/-l/+l/)
if "$(S:A=.VIRTUAL)" || "$(.PACKAGE.LIBRARY. $(B:/[-+]l//))" == "-l"
A += $(B)
else
A += $(S)
end
end
return $(A)
end
return $(L:/-l$(B)/+l$(B)/)
.SOURCE.%.ARCHIVE : .FORCE $$(*.SOURCE.a) $$(*.SOURCE)
/*
* some actions cannot operate concurrently
*/
.LEX.SEMAPHORE .YACC.SEMAPHORE : .SEMAPHORE
/*
* target property metarules
*/
.LD.KEEP. = $(CC.SUFFIX.LD) $(-ld-script)
.ARCHIVE.OMIT. = $(CC.LD.STATIC)|$(CC.LD.DYNAMIC)$(.LD.KEEP.:/^/|*/:/ //G)
.ARCHIVE.o : .USE .ARCHIVE (AR) (ARFLAGS) .ARPREVIOUS .ARUPDATE .ARCLEAN
$(^:?$$(CP) $$(^) $$(<)$$("\n")??)$(.ARPREVIOUS.$(<:B:S):@?$(IGNORE) $$(AR) $$(ARHYPHEN)d $$(<) $$(.ARPREVIOUS.$$(<:B:S))$$("\n")??)$(>:N!=$(.ARCHIVE.OMIT.):K=$(AR) $(ARFLAGS) $(<))
.ARPREVIOUS : .MAKE .VIRTUAL .FORCE .REPEAT .IGNORE
eval
$(<).$(<<:B:S) = $(*$(<<:T=SR):N!=$(**:@/ /|/G))
end
.ARUPDATE : .AFTER .IGNORE .VIRTUAL .FORCE .REPEAT
$(<<:T=A)
.ARCOPY : .AFTER .IGNORE .VIRTUAL .FORCE .REPEAT
$(**:O=1:P=I=$(<<):?: $(<<) linked to $(**:O=1)?$(<<:T=AF)?)
.ARCLEAN.LIST. : .FUNCTION
local I V
if ! .AR.RETAIN
for I $(***:T=F:T=G:P=L:A!=.ARCHIVE|.TERMINAL:N!=$(.ARCHIVE.OMIT.):$(-archive-clean))
if ! "$(~$(I):A=.FORCE:A!=.IGNORE)"
V += $(I)
end
end
end
return $(V)
.ARCLEAN : .AFTER .IGNORE .VIRTUAL .FORCE .REPEAT
$(.ARCLEAN.LIST.:K=$(RM) $(RMFLAGS))
.COMMAND.o : .USE .COMMAND (CCLD) (CCLDFLAGS) $$(LDLIBRARIES)
$(CCLD) $(CCLDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
.OBJECT.o : .USE (LD) (LDFLAGS)
$(LD) -r $(LDFLAGS) -o $(<) $(*)
/*
* match-all metarules
*/
for .S. $(.SUFFIX.c) $(.SUFFIX.C)
% : %$(.S.) (CC) (CCFLAGS) (CCLDFLAGS) $$(LDLIBRARIES)
$(CC) $(CCFLAGS) $(CCLDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
end
for .S. $(.SUFFIX.f) $(.SUFFIX.r)
% : %$(.S.) (F77) (F77FLAGS) (LDFLAGS) $$(LDLIBRARIES)
$(F77) $(F77FLAGS) $(LDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
end
% : %.fql (F77) (CCFLAGS) (F77FLAGS) (LDFLAGS) $$(LDLIBRARIES)
$(F77) $(CCFLAGS) $(F77FLAGS) $(LDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
% : %.s (ASFLAGS) (LDFLAGS) $$(LDLIBRARIES)
$(CC) $(ASFLAGS) $(LDFLAGS) -o $(<) $(.SHARED.LIST. $(.SHARED.LIST.LIBS.))
% : %.sh (SHELLMAGIC)
case $(-mam:N=(regress|static)*:/:.*//)$(-regress):$OPTIND:$RANDOM in
?*:*:*|*::*|*:*:$RANDOM)
;;
*) if ENV= LC_ALL=C x= $SHELL -nc '[[ a || b ]] && : ${list[level]} $$(( 1 + $x )) !(pattern)' 2>/dev/null
then if $(GREP) '### .*archaic.* ###' >/dev/null
then : $(<) contains archaic constructs :
else ENV= LC_ALL=C $SHELL -n $(>)
fi
fi
;;
esac
case '$(SHELLMAGIC)' in
"") case $(&:T=E:@O!) in
0) $(CP) $(>) $(<)
;;
*) {
i=`(read x; echo $x) < $(>)`
case $i in
'#!'*|*'||'*|':'*|'":"'*|"':'"*) echo "$i" ;;
esac
cat - $(>) <<'!'
$(&:T=E)
!
} > $(<)
;;
esac
;;
*) cat - $(>) > $(<) <<'!'
$(SHELLMAGIC)
$(&:T=E)
!
;;
esac
$(SILENT) test -w $(<) -a -x $(<) || $(CHMOD) u+w,+x $(<)
PERLMAGIC = $("#")!/usr/bin/perl
% : %.pl (PERLMAGIC)
case '$(PERLMAGIC)' in
"") case $(&:T=E:@O!) in
0) $(CP) $(>) $(<)
;;
*) {
i=`(read x; echo $x) < $(>)`
case $i in
'#!'*|*'||'*|':'*|'":"'*|"':'"*) echo "$i" ;;
esac
cat - $(>) <<'!'
$(&:T=E)
!
} > $(<)
;;
esac
;;
*) cat - $(>) > $(<) <<'!'
$(PERLMAGIC)
$(&:T=E)
!
;;
esac
$(SILENT) test -w $(<) -a -x $(<) || $(CHMOD) u+w,+x $(<)
if "$("/bin/cat.exe":T=F)"
%.exe : % .NULL
end
/*
* double suffix metarules
*/
for .S. $(.SUFFIX.c) $(.SUFFIX.C)
%.o : %$(.S.) (CC) (CCFLAGS)
$(CC) $(CCFLAGS) -c $(>)
end
for .S. $(.SUFFIX.f) $(.SUFFIX.r)
%.o : %$(.S.) (F77) (F77FLAGS)
$(F77) $(F77FLAGS) -c $(>)
end
%.o : %.s (AS) (ASFLAGS)
$(AS) $(ASFLAGS) -o $(<) $(>)
%.o : %.S (CC) (CCFLAGS)
$(CC) $(CCFLAGS) -c $(>)
%.c %.h : %.y .YACC.SEMAPHORE (YACC) (YACCFLAGS)
if silent $(YACC) --version >/dev/null 2>&1
then $(YACC) $(YACCFLAGS) -o$(<:N=*.c) $(YACCFIX.$(%):?-p$(YACCFIX.$(%))??) $(>)
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")!??)
$(MV) y.tab.c $(%).c
if $(SILENT) test -s y.tab.h
then $(STDED) $(STDEDFLAGS) y.tab.h <<'!'
1i
$("#")ifndef _$(%:F=%(upper)s)_H
$("#")define _$(%:F=%(upper)s)_H
.
$a
$("#")endif $("/")* _$(%:F=%(upper)s)_H *$("/")
.
w
q
!
$(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
then $(RM) $(RMFLAGS) y.tab.h
else $(MV) y.tab.h $(%).h
fi
fi
if $(SILENT) test -f y.output
then $(MV) y.output $(%).grammar
fi
fi
%.c : %.l .LEX.SEMAPHORE (LEX) (LEXFLAGS) (CC)
if silent $(LEX) --version >/dev/null 2>&1
then $(LEX) $(LEXFLAGS) -o$(<) $(LEXFIX.$(%):?-P$(LEXFIX.$(%))??) $(>)
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")!??)
$(MV) lex.yy.c $(<)
fi$(LEXHDR.$(%):?$("\n")$(STDED) $(STDEDFLAGS) $(<) <<!$("\n")1i$("\n")#include "$(LEXHDR.$(%))"$("\n").$("\n")w$("\n")q$("\n")!??)
%.mo : %.mk
$(MAKE) $(-+) --base --compile --file=$(>) $(CCFLAGS:N=-[I][!-]*) $(&:T=E)
/*
* library req support
*/
-L% : "" .MAKE .DONTCARE .VIRTUAL .FORCE .REPEAT .IGNORE
/* we should be able to do just .SOURCE.a here */
.SOURCE.%.ARCHIVE .SOURCE.a : $(<:/-L//)
if CC.SUFFIX.DYNAMIC
.SOURCE.%$(CC.SUFFIX.SHARED) : $(<:/-L//)
end
/*
* C alternate flags support
*/
cc-% : "" .ALWAYS .LOCAL .FORCE .RECURSE.SEMAPHORE
set -
if test -d $(<:V:Q)
then $(-silent:Y%%echo $(-errorid:C%$%/%)$(<:V:Q): >&2%)
cd $(<:V:Q)
$(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.$(<))
fi
/*
* feature test support -- the magic is in $(IFFE)
*/
$(IFFEGENDIR)/% : $(IFFESRCDIR)/%.c .SCAN.c (IFFE) (IFFEFLAGS)
$(IFFE) $(IFFEFLAGS) run $(>)
$(IFFEGENDIR)/% : $(IFFESRCDIR)/%.sh .SCAN.c (IFFE) (IFFEFLAGS)
$(IFFE) $(IFFEFLAGS) run $(>) $(?$(>):T=F)
$(IFFEGENDIR)/% : $(IFFESRCDIR)/% .SCAN.c (IFFE) (IFFEFLAGS)
$(IFFE) $(IFFEFLAGS) run $(>)
$(IFFEGENDIR)/% : %.iffe .SCAN.c (IFFE) (IFFEFLAGS)
$(IFFE) $(IFFEFLAGS) run $(>)
$(IFFEGENDIR)/% : "" .SCAN.c (IFFE) (IFFEFLAGS)
$(IFFE) $(IFFEFLAGS) def $(%)
%.h : %.iffe .SCAN.c (IFFE) (IFFEFLAGS)
$(IFFE) -o $(<) $(IFFEFLAGS) run $(>)
.IFFE.REF. : .FUNCTION
local T
set mam=hold
T := $(...:N=*.req:A=.TARGET)
.MAKE : $(T)
T := $(T:T=F:T=I:/[[:space:]][[:space:]]*/ /G:N!=-l($(T:B:C, ,|,G)))
T += $(LDLIBRARIES) $(IFFEREFS:N=-l*)
.R. : .CLEAR .MAKE $(T)
: $(*)
.MAKE : .R.
set mam=nohold
T := $(*.SOURCE.%.STD.INCLUDE:N=*/($(.PACKAGE.build:A!=.TARGET:/ /|/G)):T=FD:U!)
T := $(T:/^/-I/) $(T:D:U:/^/-I/) $(*.R.:N!=$(<:T=M:@/ /|/G):U)
if T
if "$(-mam:N=static*,port*)"
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*) :
else
return ref $(*.SOURCE.%.ARCHIVE:I=$$(T:N=-l*:P=D):$(.CC.NOSTDLIB.):P=A:/^/-L/) $(IFFEREFS:N!=-l*) $(T) :
end
end
/*
* C information abstractor support rules
*/
.SOURCE.db : $$(CIAFLAGS:N=-d*:/-d//)
CIA = $(CC.ALTPP.ENV) $(CC.DIALECT:N=C++:?CIA?cia?)
CIALD = $(CIA)
CIADBFLAGS =
CIAFLAGS =
CIAFILES = $(CC.DIALECT:N=C++:?Ref.db Sym.db?reference.db symbol.db?)
DOT = dot
DOTFLAGS = -Tps
DAGGER = $(CC.DIALECT:N=C++:?Dagger?dagger?)
DAGGERFLAGS =
(CIA) (CIADBFLAGS) (CIAFLAGS) : .PARAMETER
%.A : %.c (CIA) (CIAFLAGS)
$(CIA) $(CIAFLAGS) $(CPPFLAGS) -c $(>)
%.A : %.C (CIA) (CIAFLAGS)
$(CIA) $(CIAFLAGS) $(CPPFLAGS) -c $(>)
.CIADB.AGAIN =
.CIADB : .MAKE .VIRTUAL .FORCE .ONOBJECT .REPEAT .PROBE.INIT
local A S T U X
for S $(.SUFFIX.c) $(.SUFFIX.C)
T += $(.SOURCES.:G=%$(S):B:S=$(CC.SUFFIX.OBJECT))
end
if T
.SOURCE.c : $(IFFESRCDIR)
.CIA.REBIND : .MAKE .VIRTUAL .FORCE .AFTER .FOREGROUND
.REBIND : $(CIAFILES)
for U $(T)
X =
for S $(.SUFFIX.c) $(.SUFFIX.C)
X += $(*$(U):G=%$(S))
end
if ( X = "$(X:A!=.LCL.INCLUDE|.STD.INCLUDE)" )
$(U:B:S=.A) : .IMPLICIT $(X) $(~$(U):A=.STATEVAR)
A += $(U:B:S=.A)
end
end
$(CIAFILES:O=1) : (CIADBFLAGS) (CIAFLAGS) $(A) .CIA.REBIND
$(CIALD) $(CIAFLAGS) $(*)
.MAKE : $(CIAFILES:O=1)
elif .CIADB.AGAIN
error 3 ciadb: no source to generate database
else
.CIADB.AGAIN = 1
.ARGS : .INSERT $(<)
.MAKE : .ALL
end
.CIADOT : .CIADB
$(DAGGER) $(DAGGERFLAGS) | $(DOT) $(DOTFLAGS)
/*
* .USE action scripts
*/
.DO.COPY : .USE
$(CMP) $(CMPFLAGS) $(*:O=1) $(<) || { $(RM) $(RMFLAGS) $(<); $(SILENT) test -d $(<:D) || $(MKDIR) $(<:D); $(CP) $(*:O=1) $(<); }
.DO.INSTALL.OPT. = $(~:N=user=*:@C,.*,\&\& { $(CHOWN) & $(<) || true ;},:@C, user=, ,G) \
$(~:N=group=*:@C,.*,\&\& { $(CHGRP) & $(<) || true ;},:@C, group=, ,G) \
$(~:N=mode=*:@C,.*,\&\& $(CHMOD) & $(<),:@C, mode=\([-+]\), ugo\1,G:@C, mode=, ,G)
.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/\*$//'`; }
.DO.INSTALL.OLD. : .FUNCTION
if "$(-preserve)" == "\*" || "$(-preserve:N=*/*:?$$(%:N=$$(-preserve))?$$(%:B:S:N=$$(-preserve))?)"
return $(SILENT) test -d $(%:D:B=ETXTBSY) || $(MKDIR) $(%:D:B=ETXTBSY); $(MV) $(MVFLAGS) $(%) $(%:D:B=ETXTBSY)/$(%:B)#$(%:P=I)
elif "$(-clobber)" == "\*" || "$(-clobber:N=*/*:?$$(%:N=$$(-clobber))?$$(%:B:S:N=$$(-clobber))?)"
return { $(RM) $(RMFLAGS) $(%) || $(.DO.INSTALL.OLD.BUSY); }
else
return { $(MV) $(MVFLAGS) $(%) $(%).old || $(.DO.INSTALL.OLD.BUSY); }
end
.DO.INSTALL : .USE $$(<:N=*$$(CC.SUFFIX.ARCHIVE):?.ARCOPY??)
if $(SILENT) test '' != "$(*:O=1)"
then if $(SILENT) test '' != "$(*:O=1:P=I=$(<))"
then : $(<) linked to $(*:O=1)
elif $(SILENT) test -d "$(*:O=1)"
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)
else $(-compare:+$$(SILENT) $$(CMP) $$(CMPFLAGS) $$(*:O=1) $$(<) ||)
{
if $(SILENT) test -f "$(<)"
then $(.DO.INSTALL.OLD. $(<))
fi
$(-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.)
}
fi
fi
.DO.INSTALL.DIR : .USE .DO.TOP.LEVEL
if $(SILENT) test ! -d $(<)
then $(MKDIR) -p $(<)$(.DO.INSTALL.OPT.)
fi
.DO.TOP.LEVEL : .MAKE .VIRTUAL .FORCE .REPEAT .IGNORE
if ! "$(<<:A=.GLOBAL)" && ! "$(<<:P=L)"
force $(<<)
end
.DO.LINK.OLD. : .FUNCTION
if "$(-clobber)" == "\*" || "$(-clobber:N=*/*:?$$(%:N=$$(-clobber))?$$(%:B:S:N=$$(-clobber))?)"
return $(RM) $(RMFLAGS) $(%)
else
return $(CP) $(%) $(%).old$("\n")$(RM) $(RMFLAGS) $(%)
end
.DO.LINK : .USE /* .ACCEPT .ACCEPT until dual-time implementation */
if $(SILENT) test -f "$(<)"
then $(.DO.LINK.OLD. $(<))
fi
$(LN) $(*:O=1) $(<)
.DO.NOTHING : .USE .NULL
.NOOPTIMIZE.c .CC.NOOPTIMIZE /* drop .CC.* in 2004 */ : .MAKE .LOCAL
CCFLAGS := $(.MAM.CC.FLAGS|CCFLAGS:VP:N!=-O*|$(CC.OPTIMIZE)|$\(CC.OPTIMIZE\))
if "$(-mam)"
CCFLAGS := ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} $(<:A=.NOPROTECT.c:+${mam_cc_NOPROTECT}) $$(.MAM.STATE.VARS. $(<))
elif "$(-debug-symbols)"
CCFLAGS := $(CC.DEBUG) $(CCFLAGS:VP:N!=-g|$(CC.DEBUG)|$\(CC.DEBUG\))
end
.NOPROTECT.c : .MAKE .LOCAL
if "$(-mam)"
CCFLAGS := ${mam_cc_FLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT}
else
CCFLAGS += $(CC.NOPROTECT)
end
.READONLY. : .FUNCTION
local ( .ROSRC. .ROOBJ. ... RO ) $(%)
if RO == "-S.idat"
.ROSED. = s/^\([ ]*[.a-zA-Z0-9_$:]*[ ]*\.*\)idat/\1code/
return $(@.DO.READONLY.c.sed)
elif RO == "-S.data"
.ROSED. = s/^\([ ]*\.*\)data/\\1text/
return $(@.DO.READONLY.c.sed)
elif RO == "-S.rdata"
.ROSED. = s/^\([ ]*\.*\)data/\1rdata/
return $(@.DO.READONLY.c.sed)
end
return $$(CC) $$(CCFLAGS:N!=$(CC.DEBUG)) $(RO) -c $(.ROSRC.)
.READONLY.c : .USE .IMPLICIT
$(.READONLY. $(>) $(<) $(CC.READONLY))
.DO.READONLY.c.sed : .USE
$(CC) $(CCFLAGS:N!=$(CC.DEBUG)) -S $(.ROSRC.)
$(.ROSRC.:B:N=$(<:B):?$(":") convert $(<:B:S=.c) data to readonly text in $(<:B:S)$("\n")??)set -
$(SED) -e '$(.ROSED.)' \
-e 's/^\([ ]*[.a-zA-Z0-9_$:]*[ ]*\.*\)zero[ ][ ]*/\1set .,.+/' \
-e 's/^\([ ]*[.a-zA-Z0-9_$:]*[ ]*\.*\)space[ ][ ]*1/\1byte 0/' \
-e 's/^\([ ]*[.a-zA-Z0-9_$:]*[ ]*\.*\)space[ ][ ]*2/\1byte 0,0/' \
-e 's/^\([ ]*[.a-zA-Z0-9_$:]*[ ]*\.*\)space[ ][ ]*3/\1byte 0,0,0/' \
-e 's/^\([ ]*[.a-zA-Z0-9_$:]*[ ]*\.*\)space[ ][ ]*4/\1byte 0,0,0,0/' \
$(.ROSRC.:B:S=.s) > 1.$(tmp).s
$(AS) $(ASFLAGS) -o $(.ROOBJ.) 1.$(tmp).s
$(RM) $(RMFLAGS) $(.ROSRC.:B:S=.s) 1.$(tmp).s
.READONLY.l : .USE .IMPLICIT
$(".YYSUF.=.l":R)$(@.DO.READONLY.ly)
.READONLY.y : .USE .IMPLICIT
$(".YYSUF.=.y":R)$(@.DO.READONLY.ly)
.DO.READONLY.ly : .USE
: convert $(<:B:S=.c) tables to readonly text in $(<:B:S)
set -
$(CP) $(<:B:S=.c) 1.$(tmp).c
$(STDED) $(STDEDFLAGS) 1.$(tmp).c > 2.$(tmp).c <<!
$(@.YYSCRIPT$(.YYSUF.))
w
q
!
$(".ROSRC.=2.$(tmp).c":R)$(".ROOBJ.=2.$(tmp)$(CC.SUFFIX.OBJECT)":R)$(@.DO.READONLY.c.$(CC.READONLY))
$(CC) $(CCFLAGS) -c 1.$(tmp).c
$(LD) -r $(LDFLAGS) $(&:T=D:N=-[!DIOUl]*) -o $(<:B:S) 1.$(tmp)$(CC.SUFFIX.OBJECT) 2.$(tmp)$(CC.SUFFIX.OBJECT)
$(CHMOD) -x $(<:B:S)
$(RM) $(RMFLAGS) [12].$(tmp).[cos]
.YYSCRIPT.l : .USE
/struct yysvf[ ]*{/;.,/}/p
/define[ ][ ]*YYTYPE/p
/struct yywork[ ]*{/s/^.*}/&;\\
struct yywork /
-p
$(@.YYFIX:@/YY/yycrank/G)
$(@.YYFIX:@/YY/yyvstop/G)
$(@.YYFIX:@/YY/yysvec/G)
$(@.YYFIX:@/YY/yymatch/G)
$(@.YYFIX:@/YY/yyextra/G)
.YYSCRIPT.y : .USE .IMPLICIT
g/typedef.*yyt[a-z]*;/p
$(@.YYFIX:@/YY/yyexca/G)
$(@.YYFIX:@/YY/yyact/G)
$(@.YYFIX:@/YY/yypact/G)
$(@.YYFIX:@/YY/yypgo/G)
$(@.YYFIX:@/YY/yyr1/G)
$(@.YYFIX:@/YY/yyr2/G)
$(@.YYFIX:@/YY/yychk/G)
$(@.YYFIX:@/YY/yydef/G)
$(@.YYFIX.release)
.YYFIX :
/^\(.*\)YY[ ]*\[]/s//extern \1 YY[];\\
\1 YY []/
.ka
/}/kb
'a,'bp
'a,'bd
if "$(_release_:N=V)"
.YYFIX.release :
/^#[ ]*ifndef[ ][ ]*YYDEBUG/;/^#[ ]*endif/p
/^#[ ]*if[ ][ ]*YYDEBUG/p
$(@.YYFIX:@/YY/yytoks/G)
$(@.YYFIX:@/YY/yyreds/G)
/^#[ ]*endif/p
end
RECURSEROOT = .
.RECURSE : .MAKE .VIRTUAL .FORCE .NULL
.NORECURSE : .MAKE .VIRTUAL .FORCE .NULL
.RECURSE.SEMAPHORE : .VIRTUAL .FORCE .IGNORE .NULL
.RECURSE.ARGS. : .FUNCTION
local A L V
L = .TARGET
for A $(.ORIGINAL.ARGS.)
if ! "$(A:A=.TARGET)" && ( T = "$(A:/.*/.&/U:A=$(L))" )
A := $(T)
else
L = .ONOBJECT
end
if "$(A:A!=.ACTIVE:N!=.RECURSE)" || "$(A:A=.ONOBJECT)"
V += $(A)
end
end
if V && "$(~.ARGS:A=.ONOBJECT)"
V := .RECURSE $(V)
end
return $(V)
.RECURSE.OPTIONS. : .FUNCTION
local L O R
O = ..
R = --include=..
for L $(.RWD.:C,/, ,G)
O := $(O)/..
R += --include=$(O)
end
R := RECURSEROOT=$(O) /* += for --include -- not sure about that */
return $(R)
.RECURSE.INIT. : .FUNCTION
local D N P
if ! "$(-recurse)"
return
end
if ( D = "$(%)" )
.X. : .CLEAR
for N $(D)
if N == "-"
.X. : $(N)
elif "$(N:T=F=D)"
.X. : $(N)
else
P := $(".":L=$(N):T=F=D)
if P
.X. : $(P)
else
.X. : $(N)
end
end
end
D := $(~.X.)
else
D = .
end
if "$(-recurse)" == "*prereqs*"
print $(D:W=P=$(.RECURSE.ARGS.:A!=.ONOBJECT:N!=.RECURSE))
exit 0
end
if D == "."
D := $(D:W=R=$(.RECURSE.ARGS.:A!=.ONOBJECT:N!=.RECURSE))
end
if "$(-recurse)" == "*only*"
D := $(D:N=?(*/)($(.RECURSE.ARGS.:/ /|/G)))
end
if "$(-recurse)" == "*list*"
print $(D:/ /$("\n")/G)
exit 0
end
$(D) : .OBJECT
P := recurse .RECURSE $(D:B:S:N!=$(...:A=.ONOBJECT:N=.*:/.\(.*\)/\1/L:N!=*.*:/ /|/G)) $(<<) $(...:A>*.RECURSE.INIT.*)
P := $(P:U:/ /|/G)
.ORIGINAL.ARGS. := $(.ORIGINAL.ARGS.:N!=$(P))
.ARGS : .CLEAR $(~.ARGS:N!=$(P))
P := $(D:N!=-|.|.CC-*|cc-*)
if P == "* + *"
$(P:@/ + .*//:T!=FR) : .TERMINAL .RECURSE.DIR
$(P:@/.* + //:T!=FR) : .TERMINAL .NORECURSE.DIR
else
$(P:T!=FR) : .TERMINAL .RECURSE.DIR
end
$(P:T=FR) : .TERMINAL .RECURSE.FILE
.SELECT.EDIT. := $(.SELECT.EDIT.):N!=($(P:T=F:P=L=*:/ /|/G))?(/*)
return $(D:N!=+)
.RECURSE.FLUSH : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER
unbind $(<<)
.RECURSE.DIR : .USE .ALWAYS .LOCAL .FORCE .RECURSE.FLUSH .RECURSE.SEMAPHORE
set -
if $(*.VIEW:O=2:N=...:+2d) test -d $(<) $(-virtual:+|| $(MKDIR) $(<))
then $(-silent:~echo $$(-recurse-enter) $$(.RWD.:+$$$(<:N!=/*:+$$$$(.RWD.)/))$$(<)$$(":") >&2)
cd $(<)
$(MAKE) $(-) --errorid=$(<:Q) $(=:V:N!=MAKEPATH=*|VPATH=*) .RWD.=$(.RWD.:C%$%/%)$(<) $(.RECURSE.OPTIONS.) $(.ORIGINAL.ARGS.)
$(-recurse-leave:+$$(-silent:~echo $$$(-recurse-leave) $$$(.RWD.:+$$$$(<:N!=/*:+$$$$$(.RWD.)/))$$$(<)$$$(":") >&2))
else echo $(<): warning: cannot recurse on virtual directory >&2
fi
.NORECURSE.DIR : .USE .ALWAYS .LOCAL .FORCE .RECURSE.SEMAPHORE
set -
if $(*.VIEW:O=2:N=...:+2d) test -d $(<) $(-virtual:+|| $(MKDIR) $(<))
then $(-silent:~echo $(-recurse-enter) $(.RWD.:+$(<:N!=/*:+$(.RWD.)/))$(<)$$(":") >&2)
cd $(<)
$(MAKE) $(-) --norecurse --errorid=$(<:Q) $(=:V:N!=MAKEPATH=*|VPATH=*) .RWD.=$(.RWD.:C%$%/%)$(<) $(.RECURSE.ARGS.:N!=.RECURSE)
$(-recurse-leave:+$(-silent:~echo $(-recurse-leave) $(.RWD.:+$(<:N!=/*:+$$(.RWD.)/))$(<)$$$(":") >&2))
else echo $(<): warning: cannot recurse on virtual directory >&2
fi
.RECURSE.FILE : .USE .ALWAYS .LOCAL .FORCE .RECURSE.FLUSH .RECURSE.SEMAPHORE
set -
$(-silent:~echo $(.RWD.:+$(<:N!=/*:+$(.RWD.)/))$(<)$$(":") >&2)
$(MAKE) $(-) --errorid=$(<:B:Q) --file=$(<) $(=) .RWD.=$(.RWD.) $(.ORIGINAL.ARGS.)
/*
* source dependency operator
*/
"::" : .MAKE .OPERATOR .PROBE.INIT
if ! "$(<)"
if ! "$(>)"
.FILES. += .
else
$(>:N=[!-.]*|.[!A-Z]*) : .SPECIAL
.FILES. += $(>:N=.|[!-.]*|.[!A-Z]*)
end
elif "$(<:O=2)"
error 2 $(<:O=2): only one target expected
else
local T0 T1 T2 T3 T4 TA TL TP TS OBJ STATIC
if "$(>:V:G=%$(CC.SUFFIX.OBJECT))"
OBJ = 1
end
if ! "$(<:N=*$(CC.SUFFIX.OBJECT))"
$(<) : .COMMAND
end
T0 := $(.LD.KEEP.:/^/%/)
STATIC = 0
for T1 $(>:V:T=X)
if "$(T1:V:A=.ARCHIVE)" || T1 == "[-+]l*"
$(T1:V) : .ARCHIVE .MULTIPLE
if T1 == "$(CC.LD.STATIC)"
STATIC = 1
if CC.SUFFIX.DYNAMIC == ".dll"
continue
end
elif T1 == "$(CC.LD.DYNAMIC)"
STATIC = 0
if CC.SUFFIX.DYNAMIC == ".dll"
continue
end
elif T1 == "+l*" && "$(<:A=.COMMAND)"
.PACKAGE.$(T1:/+l//).library.$(<:B) := +l
end
TP += $(T1:V)
elif T2 = "$(T1:G=$(T0))"
TP += $(T2)
elif T1 == ".[a-zA-Z]*|[!-+]*=*|$\(*\)" || "$(T1:A=.ATTRIBUTE|.STATE)" || "$(T1:A=.MAKE:A=.LOCAL)"
TP += $(T1:V)
if "$(T1:A!=.USE)"
TA += $(T1:V)
end
elif T1 == "[-+]?*"
.OPTIONS.$(<) += $(T1)
elif T1 == "-"
T4 = 1
elif OBJ && ( T2 = "$(T1:G=%$(CC.SUFFIX.OBJECT))" )
if CC.SUFFIX.OBJECT == "$(T1:S)"
T2 := $(T1)
else
if "$(-target-context)"
T2 := $(T2:D=$(T1:D):B:S)
elif "$(-target-prefix)"
T2 := $(T2:D=$(T1:D):B:S:C%/%$(-target-prefix)%G)
end
$(T2) : .SPECIAL .IMPLICIT $(T1)
$(T1) : .SPECIAL .TERMINAL
end
if T2 != "$(<)?($(CC.SUFFIX.COMMAND))"
if STATIC
$(T2) : .SPECIAL CC.DLL= CC.DLLBIG=
if CC.SUFFIX.DYNAMIC == ".dll"
TS += $(T2)
continue
end
end
TP += $(T2)
end
T3 += $(T2)
elif "$(T1:N=*.*:G=%)" && T1 != "$(<)?($(CC.SUFFIX.COMMAND))"
if "$(T1:G=$(<))" || "$(T1:G=$(<)$(CC.SUFFIX.COMMAND))"
TP += .IMPLICIT
end
TP += $(T1)
elif T4
TP += $(T1)
end
end
T0 := $(<)
TL =
if "$(<:A=.ARCHIVE)" || "$(TP:V:A=.ATTRIBUTE:A=.ARCHIVE)"
TP += -COMMAND
if ! "$(@:V)" && ! "$(~:A=.USE)"
TP += .ARCHIVE$(CC.SUFFIX.OBJECT)
end
TL = 1
else
TA += $(.LIBRARY.ONLY.)
if "$(T3:N=$(<)?($(CC.SUFFIX.COMMAND)))"
TL = 1
elif OBJ || "$(>:V:A=.ARCHIVE)"
if "$(T0:N=*$(CC.SUFFIX.OBJECT))"
TP += .OBJECT$(CC.SUFFIX.OBJECT)
else
if ! "$(<:S)" && CC.SUFFIX.COMMAND
$(T0) : .VIRTUAL $(T0)$(CC.SUFFIX.COMMAND)
T0 := $(T0)$(CC.SUFFIX.COMMAND)
end
TP += .COMMAND$(CC.SUFFIX.OBJECT)
TL = 1
end
else
TP += .OBJECT
end
end
if TL
TL := CC.SHARED.LIBS.$(T0)
$(TL) := $$(*$(T0):VBFUI:A=.ARCHIVE:N=-l*:U)
($(TL)) : .PARAMETER
TP += ($(TL))
end
if T1 = "$(T3:A=.IMPLICIT)"
$(T1) : .SPECIAL $(TA:V:Q)
if "$(.OPTIONS.$(<))"
(.OPTIONS.$(<)) : .PARAMETER
$(T1) : .SPECIAL (.OPTIONS.$(<))
end
end
if TS
.LIBRARY.STATIC.$(<:B:/^$(CC.PREFIX.ARCHIVE)//) : $(CC.LD.STATIC) $(TS) $(CC.LD.DYNAMIC)
end
$(T0) : $(TP:V:Q)
if "$(@:V:?1??)"
eval
$$(T0) :
$(@:V)
end
end
if "$(<:N=*_*)" && ! "$(@$(<):V)" && ( T1 = "$(*$(<):@N=$(<:/.*_//).*)" )
T1 := $(T1:S)
T2 := %$(T1)>%
if "$(@$(T2):V)"
eval
$$(<) :
$(@$(T2):V:/$$(>)/$$(*:N=*$(T1):O=1)/G)
end
end
end
: $(.INSTALL.COMMON. - $(<) $(T0) $(>)) :
end
/*
* if no rhs then make all by default
* otherwise add rhs to all
*/
":ALL:" : .MAKE .OPERATOR
if "$(>:V)"
.ALL : $(>:V)
if ! "$(~.MAIN)"
.MAIN : .ALL
end
else
.MAIN : .CLEAR .ALL
if "$(<:V)"
$(<) : .ALL
end
end
/*
* DEPRECATED
* lhs builds rhs as a side effect
*/
":BUILD:" : .MAKE .OPERATOR
$(<) : $(>)
eval
$$(>) : .JOINT .FORCE
$(@:V)
end
/*
* DEPRECATED -- use $(sh ...) instead
* lhs is a variable whose value is the result
* of shell command substitution on the action
* wrt prerequisites on the rhs
*/
":COMMAND:" : .MAKE .OPERATOR
.RETAIN : $(<)
eval
$$(<) : .SPECIAL .VIRTUAL .FUNCTIONAL $$(-mam:N=static*:?.ALWAYS .LOCAL??) $$(>)
$(@:V)
end
/*
* lhs is a copy of rhs
*/
":COPY:" : .MAKE .OPERATOR
$(<:V) : .SPECIAL .DO.COPY $(>:V)
/*
* make dll via cc- if not already made at this level
*/
.RECURSE.DLL : .MAKE .USE
local DIR
if .DLL.TOP. && ! "$(-mam:N=static*,port*)" && ! "$(.SHARED.ON.)" && ( CC.SUFFIX.DYNAMIC || CC.SUFFIX.SHARED )
DIR := $(<:/^.DLL.//)
if ! "$(DIR:T=F)"
{ test -d $(DIR) || $(MKDIR) $(DIR) }
end
.ORIGINAL.ARGS. := .DLL.$(.ORIGINAL.ARGS.:N=install|.INSTALL:@?INSTALL?ALL?)
make $(DIR)
end
":DLL:" : .MAKE .OPERATOR
local DIR OPT
if "$(PWD:B)" == "cc-*"
.DLL.LIST. += $$(.LIBRARY.LIST.)
else
.DLL.TOP. = 1
if ! ( OPT = "$(>:N=-*)" )
OPT := $(CC.OPTIMIZE)
end
if "$(>:N=big|BIG)"
OPT += $(CC.DLLBIG)
else
OPT += $(CC.DLL)
end
DIR := cc$(OPT:/,/~/G:/ /,/G)
.VARIANT.$(DIR) := VARIANT=DLL
.ALL : .DLL.$(DIR)
.DLL.$(DIR) : .RECURSE.DLL
end
.DLL.ALL : $$(.DLL.LIST.)
.DLL.INSTALL. : .FUNCTION
local L R
for L $(.DLL.LIST.)
R += $(*.INSTALL:N=*/$(.DLL.NAME. $(L))*)
end
return $(R)
.DLL.INSTALL : $$(.DLL.INSTALL.)
.DLL.CHECK : .USE .MAKE .VIRTUAL .FORCE
local B L
B := $(<:/.DLL.CHECK.//)
if !.DLL.TOP. && ! .DLL.LIST. && ! "$(-mam:N=static*,port*)" && ! "$(.SHARED.ON.)" && ! "$(PWD:B:N=cc-*)" && ( L = "$(.DLL.NAME. $(B))" )
$(L) : .ARCHIVE
if L = "$(L:T=F)"
error 1 $(B): generating static library but dynamic $(L) already exists
end
end
/*
* lhs is a function
*/
":FUNCTION:" : .MAKE .OPERATOR
eval
$$(<:V) : .SPECIAL .FUNCTION $$(>:V)
$(@:V)
end
/*
* add an initialization make action
* rhs is optional name
*/
":INIT:" : .MAKE .OPERATOR
local T
if ( T = $(>:O=1) )
T := $(.GENSYM.)
end
if T != ".*"
T := .$(T)
end
if T != "*.(INIT|init)"
T := $(T).init
end
.MAKEINIT : $(T)
eval
$$(T) : .MAKE .VIRTUAL .FORCE
$(@:V)
end
/*
* install lhs from rhs
*/
":INSTALL:" : .MAKE .OPERATOR
local D O R S T X
if ! "$(<:V)" && ! "$(>:V)" && ! "$(@:V)"
.NO.INSTALL. = 1
else
if O = "$(>:N=*=*)"
$(O) : .SPECIAL .VIRTUAL .DONTCARE
end
if T = "$(>:N=-*:N!=-)"
error 1 use {user,group,mode}=... instead of -{u,g,m}...
T := $(T:/-u/user=/:/-g/group=/:/-m/mode=/)
$(T) : .SPECIAL .VIRTUAL .DONTCARE
O += $(T)
end
S := $(>:T=XS)
R := $(>:N!=-*|*=*:T!=XS)
if ! "$(<:V)"
if ! "$(R:V)"
eval
.DO.INSTALL : .USE
$(@:V)
end
else
.INSTALL : $(R)
if "$(@:V)"
eval
$$(R) :
$(@:V)
end
end
end
elif "$(.INSTALL.$(R:B:S))" != "."
if $(R:O) == 1
eval
.INSTALL.$(R:B:S) = $(<:V:D)
end
end
if "$(<:V:D)"
$(<:V:D) : .SPECIAL .DO.INSTALL.DIR
D := .DO.INSTALL.DIR.$(<:V:D:C,/,_,G)
$(D) : .VIRTUAL .IGNORE $(<:V:D)
.INSTALL : $(<:V:D)
end
.INSTALL : $(<:V)
if "$(@:V)"
eval
$$(<:V) : .SPECIAL .SCAN.IGNORE $$(D:V) $(S) $(R)
$(@:V)
end
elif "$(R)"
if "$(R:A=.DONTCARE)"
X = :T=F
else
X =
end
$(<:V) : .SPECIAL .SCAN.IGNORE $(D) $$("$(R)":N!=$$(<)|$$(<:P=U)$(X):@?$(O) $(S) $(R) .DO.INSTALL??)
else
$(<:V) : .SPECIAL .SCAN.IGNORE $(D) $$(<:B:S:N!=$$(<):@?$(O) $(S) $(R) $$(<:B:S) .DO.INSTALL??)
end
end
end
/*
* install rhs into lhs dir
*/
":INSTALLDIR:" : .MAKE .OPERATOR
local D O R T
if O = "$(>:N=*=*)"
$(O) : .SPECIAL .VIRTUAL .DONTCARE
end
if T = "$(>:N=-*:N!=-)"
error 1 use {user,group,mode}=... instead of -{u,g,m}...
T := $(T:/-u/user=/:/-g/group=/:/-m/mode=/)
$(T) : .SPECIAL .VIRTUAL .DONTCARE
O += $(T)
end
O += $(>:T=XS)
R := $(>:N!=-*|*=*:T!=XS)
if ! "$(<:V)" || "$(<:V)" == "."
for T $(R)
eval
.INSTALL.$(T:B:S) = .
end
end
elif ! "$(R)"
$(<:V) : .SPECIAL .DO.INSTALL.DIR $(>)
.INSTALL : $(<:V)
else
for T $(R)
eval
.INSTALL.$(T:B:S) =
end
for D $(<:V)
eval
$(T:D=$(D:V):B:S) :INSTALL: $(O) $(T)
$(@:V)
end
end
end
end
/*
* install in lhs dir using rhs pattern to select
*/
":INSTALLMAP:" : .MAKE .OPERATOR
if "$(<)"
local D T
T := $(.GENSYM.)
.INSTALL : $(<) $(T)
$(<) : .SPECIAL .DO.INSTALL.DIR
D := .DO.INSTALL.DIR.$(<:C,/,_,G)
$(D) : .VIRTUAL .IGNORE $(<)
.INSTALL.MAPS. += $(>)
eval
$$(T) : .MAKE .FORCE .IGNORE
local T
for T $$(...:$(>):A!=.ATTRIBUTE|.FUNCTIONAL|.MAKE|.VIRTUAL:T=F:N!=$(<)/*)
$$(T:D=$(<):B:S) : $$(T) .SPECIAL .SCAN.IGNORE $(D) .DO.INSTALL
.INSTALL : $$(T:D=$(<):B:S)
end
end
end
/*
* install $(PROTO) output of rhs in lhs dir
*/
":INSTALLPROTO:" : .MAKE .OPERATOR
local A P T
T := $(<:O=1)
if "$(T)" == "*.h"
A = :INSTALL:
else
A = :INSTALLDIR:
end
if P = "$(<:O=2)"
P := -f -e $(P)
end
eval
$(T) $(A) $(>) (PROTO) (PROTOFLAGS)
$$(PROTO) -p $$(PROTOFLAGS) $(P) $$(*) $$(PROTOINSTALL) > 1.$(tmp).x
if $$(CMP) $$(CMPFLAGS) $$(<) 1.$(tmp).x
then $$(RM) $$(RMFLAGS) 1.$(tmp).x
else $$(MV) 1.$(tmp).x $$(<)
fi
end
/*
* action jointly builds all targets on lhs wrt prerequisites on rhs
*/
":JOINT:" : .MAKE .OPERATOR
eval
$$(<:V) : .JOINT $$(>:V)
$(@:V)
end
/*
* <name> [<major.minor>] [option ...] :LIBRARY: <source> -[lL]*
*/
":LIBRARY:" : .MAKE .OPERATOR .PROBE.INIT
local A B H I L M N P Q R S T V X
P := $(.PACKAGE.plugin)
B := $(<:O=1)
M := $(B)
I = 1
for T $(<:O>1)
if T == "+([-+.0-9])"
V := $(T)
elif T == "DLL*"
if "$(PWD:B)" == "cc-*"
.DLL.LIST. += $(B)
else
.DLL.TOP. = 1
end
.ALL : .$(B)
else
if T == "--*"
T := $(T:/--//)
end
if T == "no*"
T := $(T:/no//}
X = 0
else
X = 1
end
if T == "id=*"
M := $(T:/id=//)
elif T == "install"
I := $(X)
elif T == "list=*"
H := $(T:/list=//)
elif T == "plugin=*"
P := $(T:/plugin=//)
elif T == "private"
let I = ! X
elif T == "shared=*"
N := $(T:/shared=//)
elif T == "static"
A := $(X)
end
end
end
if ! V
if P
V = 0.0
else
V = 1.0
end
elif V == "-"
V =
elif ! VERSION
VERSION := $(V)
end
if "$(B:A=.TARGET)"
T := .ALL
else
T := $(B)
.ALL : $(B)
end
.LIBRARY.LIST. += $(B)
if ! .MAIN.TARGET.
.MAIN.TARGET. := $(B:B:S)
end
L := $(.LIB.NAME. $(P)$(B) $(V))
$(L) : .ARCHIVE$(CC.SUFFIX.OBJECT)
.PLUGIN.$(B) := $(P)
.RETAIN : .PLUGIN.$(B)
if ! I || P
if ! I || ! A
:INSTALLDIR: $(L)
end
if P
X := $(.DLL.NAME. $(B) $(V):B:C%\..*%%)
if I && CC.SHARED.REGISTRY
.CC.SHARED.REGISTRY.$(X) := $(LIBDIR)/$(P)/registry.ld
$(.DLL.NAME. $(B) $(V)) : .CC.DLL.DIR.INIT
.CC.DLL.DIR.INIT : .VIRTUAL .IGNORE $(LIBDIR)/$(P)
$(LIBDIR)/$(P) : .DO.INSTALL.DIR
end
.CC.DLL.DIR.$(X) := $(LIBDIR)/$(P)
.INSTALL.$(X) := .
end
end
if CC.SHARED.NAME && N != "-"
if N == "-+([0-9])"
.PACKAGE.soname := $(N)
N =
end
if ! N
N := $(.DLL.NAME. $(B) $(V))
elif N == "+([-+.0-9])"
N := $(.DLL.NAME. $(B) $(N))
end
X := $(.DLL.NAME. $(B) $(V):B:C%\..*%%)
.CC.SHARED.NAME.$(X) := $(CC.SHARED.NAME)$(N)
end
if "$(>:G=%$(CC.SUFFIX.OBJECT):O=1)"
if ! I
X := $(.NO.INSTALL.)
.NO.INSTALL. := 1
end
eval
$(L) :: $(>:V:N!=[-+][lL]*)
$(@:V)
end
if ! I
.NO.INSTALL. := $(X)
end
end
.INSTALL : .DLL.CHECK.$(B)
.DLL.CHECK.$(B) : .DLL.CHECK
$(B).VERSION := $(V)
D := $(>:V:N=-L*)
if ! P || A
Q := $(P)$(B)
S := $(Q) $(>:V:N=[-+]l*::N!=[-+]l$(Q)) $(.PACKAGE.LIBRARIES. $(.PACKAGE.build:A!=.TARGET):N!=[-+]l$(Q)) $(LDLIBRARIES:N=[-+]l*:N!=[-+]l$(Q))
eval
if I && ! "$(.NO.INSTALL.)"
$$(LIBDIR)/lib/$(Q) :INSTALL: $(Q).req
end
.REQUIRE.$(Q) = $(S:U)
(.REQUIRE.$(Q)) : .PARAMETER
if "$(-mam:N=static*,port*)"
$(Q).req : (CC) (CCFLAGS) (LDFLAGS) (.REQUIRE.$(Q))
set -
echo 'int main(){return 0;}' > 1.$(tmp).c
$$(CC) $$(CCFLAGS) -c 1.$(tmp).c &&
x=`$$(CC) $$(CCFLAGS) $$(LDFLAGS) -o 1.$(tmp).x 1.$(tmp)$(CC.SUFFIX.OBJECT) -l'*' 2>&1 | $(SED) -e 's/[][()+@?]/#/g' || :` &&
{
case "$(D)" in
*?) echo " $(D)" ;;
esac
for i in $$(.MAM.REQ. $$(.REQUIRE.$(Q)))
do case $i in
"$(Q)"$(...:A=.ARCHIVE:A=.TARGET:N=$(CC.PREFIX.ARCHIVE)*$(CC.SUFFIX.ARCHIVE):/^$(CC.PREFIX.ARCHIVE)\(.*\)$(CC.SUFFIX.ARCHIVE)/|\1/:@/ //G))
;;
*) if test -f $$(LIBDIR)/lib/$i
then y=`cat $$(LIBDIR)/lib/$i`
case $y in
*-?*) echo "" $y ;;
esac
continue
elif test ! -f $$(LIBDIR)/$(CC.PREFIX.ARCHIVE)$i$(CC.SUFFIX.ARCHIVE)
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
*$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
*$x*) continue ;;
esac
;;
esac
fi
;;
esac
echo " -l$i"
done
} > $$(<)
$$(RM) $$(RMFLAGS) 1.$(tmp).*
else
$(Q).req : (CC) (.REQUIRE.$(Q)) .PREQUIRE
echo "" $$(.REQ. $$(.REQUIRE.$(Q))) > $$(<)
end
$(L) : .INSERT $(Q).req.REQUIRE
$(Q).req.REQUIRE : .VIRTUAL .IGNORE .NULL $(Q).req
end
end
eval
_BLD_$(M:B:S:/[^a-zA-Z0-9_]/_/G) == 1
end
.LIBRARY.ONLY. += _BLD_$(B:B:S:/[^a-zA-Z0-9_]/_/G)=
if P || ! A
$(T) : $(L) $(.SHARED. $(L) $(B) $(V|"-") $(>:V:N=[!-+]*=*) $(>:V:N=[-+]l*))
else
$(T) : $(L)
end
if H
L := $(M:B)
eval
$(L)src = $$(*$$(*$$(*$(L))):N=*.c:T=F)
$(L)list.h : ($(L)src) $$$(-mam:+$$$($(L)src))
{
cat <<!
$$("/")*
$$(" ")* -l$(L) function list -- define your own CMDLIST()
$$(" ")*/
!
$$(SED) \
-e '/^$(H)[a-z_][a-z_0-9]*(/!d' \
-e 's/^$(H)//' \
-e 's/(.*//' \
-e 's/.*/CMDLIST(&)/' \
$$($$(~):T=F) |
$$(SORT) -u
} > 1.$$(tmp).h
if $$(CMP) $$(CMPFLAGS) 1.$$(tmp).h $$(<)
then $$(RM) $$(RMFLAGS) 1.$$(tmp).h
else $$(MV) 1.$$(tmp).h $$(<)
fi
end
end
/*
* <pseudo-library> :REQUIRE: -[lL]*
*/
":REQUIRE:" : .MAKE .OPERATOR
if ! "$(.NO.INSTALL.)"
$$(LIBDIR)/lib/$(<) :INSTALL: $(<).req
end
.REQUIRE.$(<) := $(>)
(.REQUIRE.$(<)) : .PARAMETER
eval
$$(<:B:S=.req) : (.REQUIRE.$$(<))
echo "" $$(.REQ. $$(.REQUIRE.$(<))) > $$(<)
end
.REQ. : .FUNCTION
local B I Q R L
for I $(%)
if I == "[-+]l*"
B := $(I:/^[-+]l//)
else
B := $(I)
I := -l$(I)
end
if ! "$(.PACKAGE.$(B).private)"
if "$(.REQUIRE.$(B))"
R += $(I)
else
Q := $(.REQUIRE.-l% $(I))
if Q != "{ - }"
for L $(Q)
if "$(L:N=-l*)"
if "$(.REQUIRED.$(L:/-l//))"
R += $(I)
break
end
end
if "$(L:T=F)"
R += $(I)
break
end
end
end
end
end
end
return $(R)
.MAM.REQ. : .FUNCTION
local B I R
for I $(%)
if I == "[-+]l*"
B := $(I:/^[-+]l//)
else
B := $(I)
end
if ! "$(.PACKAGE.$(B).private)"
R += $(B)
end
end
return $(R)
.PREQUIRE : .MAKE .IGNORE
local B P R
B := $(<<:B)
P := $((.PREQUIRE.$(B)))
R := $(.REQ. $(.REQUIRE.$(B)))
if "$(R)" != "$(P)"
(.PREQUIRE.$(B)) := $(R)
force $(<<)
end
.SHARED.DEF. = .SHARED.DEF$(CC.SUFFIX.SHARED)
.SHARED.USE. = .SHARED$(CC.SUFFIX.SHARED)
.SHARED.FLAGS. = : $(CCFLAGS) :
.SHARED.ON. : .FUNCTION
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\)) *)" )
return 1
end
.SHARED.LIST.EXCLUDE. : .FUNCTION
local A L T X
T = <<<
while "$($(T):A=.MAKE)"
T := $(T)<
end
A := $(*$($(T)<):O=1)
if CC.SUFFIX.ARCHIVE && "$(A:N=*@($(CC.SUFFIX.ARCHIVE)))"
L := $(A:B)
if CC.PREFIX.ARCHIVE
L := $(L:/^$(CC.PREFIX.ARCHIVE)//)
end
else
T := $($(T):O=1)
if CC.SUFFIX.DYNAMIC && "$(T:N=*@($(CC.SUFFIX.DYNAMIC)))"
L := $(T:B)
if CC.PREFIX.DYNAMIC
L := $(L:/$(CC.PREFIX.DYNAMIC)//)
end
elif CC.SUFFIX.SHARED && "$(T:N=*@($(CC.SUFFIX.SHARED)))"
L := $(T:B)
if CC.PREFIX.SHARED
L := $(L:/$(CC.PREFIX.SHARED)//)
end
end
end
if L
L := $(L:/[0-9._]*$//)
X := N!=-l$(L)
if CC.SUFFIX.DYNAMIC
X := $(X)|?(*/)$(CC.PREFIX.DYNAMIC)$(L)*([0-9._])$(CC.SUFFIX.DYNAMIC)
end
if CC.SUFFIX.SHARED
X := $(X)|?(*/)$(CC.PREFIX.SHARED)$(L)*([0-9._])$(CC.SUFFIX.SHARED)
end
end
return $(X)
.SHARED.LIST.LIBS. : .FUNCTION
return $(~~:VBFUI)
.SHARED.LIST. : .FUNCTION
local A D L M R S T U N=0 X
X := $(.SHARED.LIST.EXCLUDE.)
M := [-+]l*|*$(CC.SUFFIX.ARCHIVE)|*$(CC.SUFFIX.SHARED)
S := $(%:O=1)
A := $(%:O>1:$(X):/^$(CC.PREFIX.ARCHIVE)\(.*\)\$(CC.SUFFIX.ARCHIVE)/+l\1/)
for L $(A)
if L == "{"
let N = N + 1
elif L == "}"
let N = N - 1
elif N <= 1
T += $(L)
end
end
N = 0
for L $(A:H=O)
if L == "}"
let N = N + 1
elif L == "{"
let N = N - 1
else
if L == "+l*"
if ! "$(T:N=$(L))" && ! "$(R:N=$(L))"
D := $(L:/+/-/)
if "$(R:N=$(D))" || ! "$(-all-static)" && "$(CC.STDLIB:N=$(D:T=F:P=D))" && "$(.PACKAGE.$(L:/+l//).library)" != "+l"
L := $(D)
end
end
end
if L != "$(M)" || ! "$(R:N=$(L))" || N <= 1 && "$(T:N=$(L))"
R += $(L)
end
end
end
return $(S:T=F) $(R:H=O:T=F)
.SHARED. : .FUNCTION
local A B D L S T
if "$(.SHARED.ON.)"
if "$(.SHARED.DEF.:A=.TARGET)"
return $($(.SHARED.DEF.) $(%))
end
A := $(%:O=1)
B := $(CC.PREFIX.SHARED)$(%:O=2)$(CC.SUFFIX.SHARED)
L := $(%:O>3:N=[-+]l*)
$(L) : .DONTCARE
if "$(%:O=3)" != "[0-9]*"
S := $(B)
else
S := $(B).$(%:O=3)
end
$(S) : .SHARED.o $(%:N=[!-+]*=*) $(A) $$(.SHARED.BIND. $(%:O=2) $(L))
if ! "$(.INSTALL.$(S))" && ! "$(.NO.INSTALL.)"
if ! ( D = "$(.CC.DLL.DIR.$(S:C%\..*%%))" )
D = $(DLLDIR)
end
$(D:V) :INSTALLDIR: $(S)
$(LD_PRELOAD:N=$(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%):?LD_PRELOAD=""; _RLD_LIST=DEFAULT;?)if $(SILENT) test -f $(<:C%\$(CC.SUFFIX.SHARED)\.%.oo.%)
then $(STDRM) $(RMFLAGS) $(<:C%\$(CC.SUFFIX.SHARED)\.%.oo.%)
fi
if $(SILENT) test -f $(<)
then $(STDMV) $(<) $(<:C%\$(CC.SUFFIX.SHARED)\.%.oo.%)
fi
$(STDCP) $(<:B:S) $(<)
if $(SILENT) test "$(<)" != "$(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)"
then if $(SILENT) test -f $(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)
then $(STDRM) $(RMFLAGS) $(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)
fi
$(STDLN) $(<) $(<:C%\$(CC.SUFFIX.SHARED)\..*%$(CC.SUFFIX.SHARED)%)
fi
chmod -w $(<)
end
end
return $(S)
.SHARED.BIND. : .FUNCTION
local ( B X ... ) $(%)
local A F L P S N
N := $(.SHARED.LIST.EXCLUDE.)
X += $("$(B).req":T=F:P=X:T=I:N!=$("\n")|[-+]l$(B)|$(X:/ /|/G):$(N))
if "$(X)"
let .NO.LIB.TYPE = .NO.LIB.TYPE + 1
for F $(X)
if "$(CC.SHARED)"
if F == "+l*|-ldl|-liconv" /* XXX: probe!!! */
S += $(F)
if F == "+l*"
if ! ( P = "$(<:T=M:A=.COMMAND:O=1)" )
P := $(<:T=M:B:S:N=$(CC.PREFIX.ARCHIVE)*$(CC.SUFFIX.ARCHIVE)|$(CC.PREFIX.SHARED)*$(CC.SUFFIX.SHARED)*:O=1)
end
if P
.PACKAGE.$(F:/+l//).library.$(P) := +l
end
end
else
L := $(F:T=F)
if L == "-l*|*$(CC.SUFFIX.DYNAMIC|CC.SUFFIX.SHARED|"..")|*/libm.a" /* XXX: probe!!! */
S += $(L)
if CC.SUFFIX.STATIC
if A = "$(L:P=B:/\(.*\)\$(CC.SUFFIX.SHARED)\([0-9.]*\)$/\1$(CC.SUFFIX.STATIC)\2/)"
S += $(A)
end
end
elif L && "$(L:A=.TARGET)"
S += $(.REQUIRE.-l% $(F))
else
P := lib/$(L:B:/$(CC.PREFIX.SHARED)//)
$(P) : .ARCHIVE
if "$(P:T=F)"
S += $(L)
end
end
end
else
L := $(F:T=F)
if L == "*$(CC.SUFFIX.ARCHIVE)"
S += $(L)
end
end
end
let .NO.LIB.TYPE = .NO.LIB.TYPE - 1
if S
return $(.SHARED.LIST. $(S))
end
end
.SHARED.o : .USE (LDSHARED) (LDFLAGS) $$(LDLIBRARIES)
$(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)
.SHARED.DEF.dll.a .SHARED.DEF.lib .SHARED.DEF.x : .FUNCTION
local A B D G I L S W X Y Z
Y := $(%:O=2)
B := $(Y)$(%:O=3:/[^0-9]//G)$(dll.custom:?_$(dll.custom)??)
D := $(CC.PREFIX.DYNAMIC)$(B:B)$(CC.SUFFIX.DYNAMIC)
if "$(%:O=1)" != "-"
L := $(CC.PREFIX.SHARED)$(Y:B)$(CC.SUFFIX.SHARED)
S := $(CC.PREFIX.SHARED)$(B:B)$(CC.SUFFIX.SHARED)
Z := $(%:O>3:N=+l*)
X :=
if ! "$(.PLUGIN.$(Y))"
X += $(Y)
end
X += $(Z:/^+l//)
Z += $(%:O>3:/^[-+]l//:N!=*=*|$(X:/ /|/):/^/-l/)
$(Z) : .DONTCARE
A := $(%:O=1)
if CC.DLL.DIR == "$\(BINDIR)"
W := $(Y:B:S=.so)
D := $(W)/$(D)
S := $(W)/$(S)
if CC.SUFFIX.DEBUG
G := $(D:D:B:S=$(CC.SUFFIX.DEBUG))
end
if "$(*.LIBRARY.STATIC.$(Y))"
Z += .LIBRARY.STATIC.$(Y)
.LIBRARY.STATIC.$(Y) : .VIRTUAL
end
if CC.HOSTTYPE == "win32.*" && ! "$(.NO.INSTALL.)" && "$(.INSTALL.$(S))" != "." && "$(ARFLAGS)" != "*I*" && ! "$(*$(A):G=%.def)"
ARFLAGS := $(ARFLAGS)I
end
end
$(D) $(S) $(G:+- $(G)) : .JOINT $(<:/DEF.//) $(*$(A):N=*@($(.LD.KEEP.:/ /|/G:/|$//))) $(A) $(Z)
.ALL : $(D) $(S)
if ! "$(.NO.INSTALL.)"
X := $(D:B:C%\..*%%)
if ! "$(.INSTALL.$(D))"
if ! ( I = "$(.CC.DLL.DIR.$(X))" )
I = $(DLLDIR)
end
$(I:V) :INSTALLDIR: $(D)
end
if ! "$(.INSTALL.$(S))" && ! "$(.INSTALL.$(X))"
$(LIBDIR)/$(L) :INSTALL: $(S)
if G
$(LIBDIR)/$(G:B:S) :INSTALL: $(G)
end
end
end
end
return $(D)
.SHARED.REF.dll.a .SHARED.REF.lib : .FUNCTION
local K L
K := *@($(.LD.KEEP.:/ /|/G:/|$//))
L := $(%:N=*$(CC.SUFFIX.ARCHIVE):O=1)
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)))
.SHARED.dll.a .SHARED.lib : .USE (LDSHARED) (LDFLAGS) $$(LDLIBRARIES)
$(SILENT) test -d $(<:O=1:D) || $(MKDIR) $(<:O=1:D)
$(LDSHARED) $(LDFLAGS) $(CCFLAGS:N=-[gG]*) $(CC.SHARED) -o $(<:O=1) $(.SHARED.REF.lib $(.SHARED.LIST.LIBS.)) $(CC.DLL.LIBRARIES)
.SHARED.REF.x : .FUNCTION
local L
L := $(%:N=*$(CC.SUFFIX.ARCHIVE):O=1)
return $(.CC.LIB.DLL.symbol $(L)) $(.SHARED.LIST. $(*.LIBRARY.STATIC.$(L:B:/^$(CC.PREFIX.ARCHIVE)//):T=*) $(%:N!=$(L)|*$(CC.SUFFIX.OBJECT)))
.SHARED.x : .USE (LDSHARED) (LDFLAGS) $$(LDLIBRARIES)
$(LDSHARED) $(LDFLAGS) $(CCFLAGS:N=-[gG]*) $(CC.SHARED) -o $(<:O=1:B:S) $(.SHARED.REF.x $(.SHARED.LIST.LIBS.)) $(CC.DLL.LIBRARIES)
/*
* link lhs to rhs
*/
":LINK:" : .MAKE .OPERATOR
local D L T U
for L $(<)
if "$(L:N=*/*)"
.ALL : $(L:D) $(L)
$(L:D) : .SPECIAL .DO.INSTALL.DIR
D := .DO.INSTALL.DIR.$(L:D)
$(D) : .VIRTUAL .IGNORE $(L:D)
$(L) : .DO.LINK $(D) $(>)
else
if U = "$(L:N!=/*:T!=FD:O=1)"
.ALL : $(U)
$(U) : .SPECIAL .DO.LINK $(>)
end
if ( T = "$(.INSTALL.$(>:B:S):V)" ) != "." && "$(>:A=.ARCHIVE|.COMMAND)"
if ! T
if "$(>:A=.ARCHIVE)"
T = $(LIBDIR)
else
T = $(BINDIR)
end
end
.INSTALL : $(U:D=$(T:V):B:S) $(L:N=/*)
$(U:D=$(T:V):B:S) $(L:N=/*) : .SPECIAL .SCAN.IGNORE .DO.LINK $(>:D=$(T:V):B:S)
end
end
end
/*
* if rhs is dir then make recursively, else just make
* rhs name=value are .SCRIPT for sub-makes
*/
":MAKE:" : .MAKE .OPERATOR
if "$(-recurse)" != "*combine*"
local ATT EXP LHS RHS SCR
if ! ( LHS = "$(<)" )
LHS = .RECURSE
.ALL .MAIN : $(LHS)
end
ATT := $(>:A=.ATTRIBUTE)
for SCR $(>:N=*=*)
eval
$(SCR)
end
script $(SCR:/=.*//)
end
RHS = $(>:N!=*=*:A!=.ATTRIBUTE)
eval
$$(<) :
$(@:V)
end
$(LHS) : $(ATT) $$(.RECURSE.INIT. $(RHS))
elif ! .NONRECURSIVE.PREFIX
local A B I P INS APP NB NP OB OP
A = ::
A := $(@$(A):V)
eval
":NONRECURSIVE_COMMAND:" : .MAKE .OPERATOR
$(A:V)
end
"::" : .MAKE .OPERATOR
if .NONRECURSIVE.PREFIX
local I P
.PACKAGE.build.$(<:O=1) := $(.PACKAGE.build)
for I $(>)
if I != "[-+]*|$(.NONRECURSIVE.PREFIX)/*"
P += $(I:C,^,$(.NONRECURSIVE.PREFIX)/,)
else
P += $(I)
end
end
eval
$$(<) :NONRECURSIVE_COMMAND: $$(P)
$(@:V)
end
else
eval
$$(<) :NONRECURSIVE_COMMAND: $$(>)
$(@:V)
end
end
.ASSERT..SOURCE% : ":NONRECURSIVE_SOURCE:"
":NONRECURSIVE_SOURCE:" : .MAKE .OPERATOR
if .NONRECURSIVE.PREFIX
local I P
for I $(>)
if I != "[-+]*|$(.NONRECURSIVE.PREFIX)/*"
P += $(I:C,^,$(.NONRECURSIVE.PREFIX)/,)
else
P += $(I)
end
end
eval
$$(<) : $$(P)
$(@:V)
end
else
eval
$$(<) : $$(>)
$(@:V)
end
end
A =
for I $(".":W=R=$(.RECURSE.ARGS.:A!=.ONOBJECT:N!=.RECURSE):N!=-)
A := $(I) $(A)
end
for I $(A)
.NONRECURSIVE.PREFIX := $(I)
OP := $(.PACKAGE.)
.PACKAGE. = -
OB := $(.PACKAGE.build)
.PACKAGE.build = -
include "$(I:X=$(MAKEFILES:/:/ /G):T=F:O=1)"
APP =
INS =
for P $(.PACKAGE.build)
if P == "-"
INS := $(APP)
APP =
else if ! "$(OB:N=$(P))"
APP += $(P)
end
end
.PACKAGE.build := $(INS) $(OB) $(APP)
APP =
INS =
for P $(.PACKAGE.)
if P == "-"
INS := $(APP)
APP =
else if ! "$(OP:N=$(P))"
APP += $(P)
end
end
.PACKAGE. := $(INS) $(OP) $(APP)
end
.NONRECURSIVE.PREFIX =
.ASSERT. : .DELETE .SOURCE%
eval
.NONRECURSIVE.PACKAGE.LIBRARIES. : .FUNCTION
$(@.PACKAGE.LIBRARIES.:V)
end
.PACKAGE.LIBRARIES. : .FUNCTION
if ! "$(%)"
return $(.NONRECURSIVE.PACKAGE.LIBRARIES. $(.PACKAGE.build.$(<<:O=1)))
end
LDLIBRARIES += $$(.PACKAGE.LIBRARIES.)
end
/*
* rhs compilation with no optimization
* lhs is CC.HOSTTYPE match pattern list to match
* activated for all architectures if lhs omitted
*/
":NOOPTIMIZE:" : .MAKE .OPERATOR .PROBE.INIT
local T P
.P. : .CLEAR $(<)
P := $(*.P.:/ /|/G)
if ! "$(P)" || "$(-mam:N=static*)" || CC.HOSTTYPE == "$(P)"
for T $(>)
if "$(@.NOOPTIMIZE$(T:S):V)"
$(T:B:S=$(CC.SUFFIX.OBJECT)) : .SPECIAL .NOOPTIMIZE$(T:S)
else
error 1 :NOOPTIMIZE: ignored for suffix $(T:S)
end
end
end
":NOPROTECT:" : .MAKE .OPERATOR .PROBE.INIT
local T P
.P. : .CLEAR $(<)
P := $(*.P.:/ /|/G)
if ! "$(P)" || "$(-mam:N=static*)" || CC.HOSTTYPE == "$(P)"
for T $(>)
if "$(@.NOPROTECT$(T:S):V)"
$(T:B:S=$(CC.SUFFIX.OBJECT)) : .SPECIAL .NOPROTECT$(T:S)
else
error 1 :NOPROTECT: ignored for suffix $(T:S)
end
end
end
/*
* force default and the usual suspects to do nothing
*/
":NOTHING:" : .MAKE .OPERATOR
.ALL .INSTALL .MAIN all cc- install : .CLEAR .DO.NOTHING
exit 0
/*
* var :OPTIONAL: src ...
*
* lhs var set to rhs src and rhs asserted on ::
*/
":OPTIONAL:" : .MAKE .OPERATOR
$(<) := $(>)
:: $(>)
/*
* rhs are package names used in compilation
* a package consists of a library and include directory
* the most recent :PACKAGE: assertion takes highest precedence
* .PACKAGE. is the ordered package list used to alter
* .SOURCE.h, INCLUDEDIR, LDLIBRARIES and ancestor
* .PACKAGE.build is the package list to build against
* $(PACKAGE_<package>_BIN) explicit bin dir for <package>
* $(PACKAGE_<package>_INCLUDE) explicit include for <package>
* $(PACKAGE_<package>_LIB) explicit lib dir for <package>
* $(PACKAGE_<package>) root dir for include|lib for <package>
* $(PACKAGE_PATH) default root dirs for all packages
* _PACKAGE_<package>==1 state var defined for <package>
* the following options either control all packages (: starts token)
* or individual packages (: appended to package name)
*
* :version=xxx: attempt version xxx first
* :noinstall: do not redefine INCLUDEDIR
* :nolibrary: do not link with library
* :static: attempt static library first
* :dynamic: attempt dynamic library first
* :insert: insert into package list
* :noregistry: do not link dll against address registry
* :soname: link dll with $(CC.SHARED.NAME), =-1 for :B: edit
*/
.PACKAGE. =
.PACKAGE.build =
.PACKAGE.install =
.PACKAGE.libraries =
.PACKAGE.license =
.PACKAGE.plugin =
.PACKAGE.registry = 1
.PACKAGE.soname =
.PACKAGE.stdlib = $(*.SOURCE.a) $(CC.STDLIB) /usr/lib /lib
.PACKAGE.strip =
.PACKAGE.LIBRARY. : .FUNCTION
local P R
if ! ( P = "$(<:T=M:A=.COMMAND:O=1)" )
P := $(<:T=M:B:S:N=$(CC.PREFIX.ARCHIVE)*$(CC.SUFFIX.ARCHIVE)|$(CC.PREFIX.SHARED)*$(CC.SUFFIX.SHARED)*:O=1)
end
if P
if R = "$(.PACKAGE.$(%).library.$(P))"
return $(R)
end
if R = "$(.PACKAGE.$(%).library.weak.$(P))"
return $(R)
end
end
return $(.PACKAGE.$(%).library)
.PACKAGE.LIBRARIES. : .FUNCTION
local L P R
for L $(%)
if P = "$(.PACKAGE.LIBRARY. $(L))"
if ! "$(**:B:S:N=[-+]l$(L)|$(.LIB.NAME. $(L)))"
$(P)$(L) : .DONTCARE
R += $(P)$(L)
end
end
end
.UNBIND : $(R)
R += $(.PACKAGE.libraries)
$(R) : .ARCHIVE .MULTIPLE
return $(R)
/*
* initialize the package args
* on return the following are set if found for package $(P)
* PACKAGE_$(P)_BIN package bin dir
* PACKAGE_$(P)_INCLUDE package include dir
* PACKAGE_$(P)_LIB package lib dir
* .PACKAGE.$(P).found 1 if at least one package lib or header found
* the canonicalized last package name is returned
*/
.PACKAGE.CONFIG. = lib/pkgconfig
.PACKAGE.GLOBAL. =
.PACKAGE.LOCAL. =
.PACKAGE.PROBE. =
.PACKAGE.INIT. : .FUNCTION .PROBE.INIT
local T1 T2 T3 T4 T5 T6 T7
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
if ! .PACKAGE.GLOBAL.
.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)
.PACKAGE.GLOBAL. := $(.PACKAGE.GLOBAL.:N!=$(PACKAGE_IGNORE):T=F:U)
.PACKAGE.CONFIG. := $(.PACKAGE.GLOBAL.:X=$(.PACKAGE.CONFIG.):T=F:U)
: $(.PACKAGE.PROBE.:V:R)
end
for P $(%)
if "$(_PACKAGE_$(P))" == "0"
continue
end
if "$(PACKAGE_$(P)_found)" != ""
.PACKAGE.$(P).found := $(PACKAGE_$(P)_found)
end
if "$(.PACKAGE.$(P).found)" != ""
continue
end
FOUND = 0
H := $(PACKAGE_$(P))
if ! H
H := $($(P:F=%(upper)s)_HOME)
if H && H == "*/*"
PACKAGE_$(P) := $(H)
end
end
E := $(PACKAGE_$(P)_BIN)
EP := $(.PACKAGE.$(P).bin)
if EP == "/*"
if ! E
E := $(EP)
end
EP =
end
if ! EP
EP = bin
end
I := $(PACKAGE_$(P)_INCLUDE)
IP := $(.PACKAGE.$(P).include)
if IP == "/*"
if ! I
I := $(IP)
end
IP =
end
if ! IP
IP = include
end
L := $(PACKAGE_$(P)_LIB)
LP := $(.PACKAGE.$(P).lib)
if LP == "/*"
if ! L
L := $(LP)
end
LP =
end
if ! LP
LP := $(CC.STDLIB.BASE)
end
if ( I && L || "$(.PACKAGE.$(P).rules)" != "-" && ( "$(I:T=F)" || "$(L:T=F)" ) )
FOUND = 1
else
if ! "$(CC.REQUIRE.$(P))"
if T1 = "$(.PACKAGE.CONFIG.:L!~?(lib)($(P)|$(P)-*).pc:O=1)"
T1 := $(T1:T=I:/${\([^}]*\)}/$$(\1)/G)
local $(T1:N=+([[:alnum:]_[:space:]])=*:/=.*//)
$(T1:N=+([[:alnum:]_[:space:]])[:]*:/:.*//) : .CLEAR
: $(T1:V:R)
if !I
I := $(~Cflags:N=-I*:/-I//)
PACKAGE_$(P)_INCLUDE := $(I)
end
if !L
L := $(~Libs:N=-L*:/-L//)
PACKAGE_$(P)_LIB := $(L)
end
CC.REQUIRE.$(P) := $(~Libs:N=[-+]l*)
PACKAGE_$(P) := /
FOUND = 1
end
end
T2 := $(PACKAGE_$(P))
if T2
if !I
T1 = $(T2)/$(IP)
if "$(T1:P=X)"
I := $(T1)
end
end
if !L
for T3 $(LP)
T1 = $(T2)/$(T3)
if "$(T1:P=X)"
L := $(T1)
break
end
end
end
elif !I && !L
T1 = $(INSTALLROOT)/$(IP)/$(P)
if "$(T1:P=X)"
for K SHARED ARCHIVE
for T3 $(LP)
T1 = $(INSTALLROOT)/$(T3)/$(CC.PREFIX.$(K))$(P)$(CC.SUFFIX.$(K))
if "$(T1:P=X)"
T2 := $(INSTALLROOT)
PACKAGE_$(P) := $(T2)
break 2
end
end
end
end
end
if !L || !I && !T2
T4 := $(PACKAGE_PATH:/:/ /G) $(.PACKAGE.DIRS.) $(.PACKAGE.GLOBAL.) $(.PACKAGE.GLOBAL.:/:/ /G:C%$%/$(P)%)
if P == "*[!0-9]+([0-9])"
T4 += $(.PACKAGE.GLOBAL.:/:/ /G:C%$%/$(P:C,[0-9]*$,,)%)
end
V =
if T5 = "$(PACKAGE_$(P)_VERSION)"
N := $(P)-$(T5) $(P)$(T5) $(P)R$(T5) $(P)r$(T5)
B =
for T5 $(T5:/\./ /G)
if V
V := $(V)*(?(.)$(T5)
B := $(B))
else
V := $(T5)
end
end
V := $(V)$(B)
elif P == "*[0-9][rR]+([0-9])"
N := $(P)
P := $(N:/[rR][0-9]*$//)
else
N :=
end
if B = "$(P:N=[!0-9]*+([0-9.]):/[0-9]*$//)"
B := @($(P)|$(B))
else
B := $(P)
end
N += $(P)
if P == "*[!0-9]+([0-9])"
N += $(P:C,[0-9]*$,,)
end
LPL := $(CC.STDLIB:B) $(T1) $(LP)
LPL := $(LPL:U)
T4 := $(T4:N!=//*:T=F:H=P:U)
T7 := $(T4:X=$(IP)/$(P):N!=//*:T=F:D:D)
T1 =
for K SHARED ARCHIVE
SFX := $(CC.SUFFIX.$(K))
PFX := $(CC.PREFIX.$(K))
for D $(N) /
T5 := $(T7) $(T4:N=*/$(D):D) $(T4)
T5 := $(T5:U)
if ! V
if ! .PACKAGE.LOCAL.
.PACKAGE.LOCAL. := $(PKGDIRS:T=F:P=A:U)
end
for X $(.PACKAGE.LOCAL.)
Y := $(X)/$(PFX)$(P)$(SFX)
if ( T1 = "$(Y:P=X:O=1:D)" )
break 3
end
Y := $(X)/$(PFX)$(P)$(CC.LIB.TYPE)$(SFX)
if ( T1 = "$(Y:P=X:O=1:D)" )
break 3
end
end
end
for LPV $(LPL)
X := $(T5:C%$%/$(D)/$(LPV)/$(PFX)$(P)$(SFX)%:C%^//%/%)
if ( T1 = "$(X:N!=//*:P=X:O=1:D)" )
break 3
end
if T6 = "$(X:D:N!=//*:P=X:O=1)"
if Z = "$(T6:L>=?(lib)$(B)*$(SFX)*([0-9.]))"
if V
if W = "$(Z:N=*$(V)*:O=1)"
T1 := $(T6)
break 3
end
end
T1 := $(T6)
break 3
end
end
end
end
end
if "$(T1)"
FOUND = 1
L := $(T1)
if T2
T1 := $(T2)
else
T1 := $(T1:D)
end
elif T2
T1 := $(T2)
elif ! ( T1 = "$(T4:C%$%/$(IP)/$(P)%:N!=//*:P=X:O=1:D:D)" )
T1 := $(T4:N=*/$(P):C%$%/$(IP)%:N!=//*:P=X:O=1:D)
end
if T1 == "/"
T1 = /usr
end
eval
PACKAGE_$(P) = $(T1:P=C)
end
else
T1 := $(T2)
end
if T1
.PACKAGE.DIRS. += $(T1)
if !I && IP != "-"
I := $(T1)/$(IP)
H := $(I)/$(P)/.
if "$(H:P=X)"
I := $(I)/$(P)
end
eval
PACKAGE_$(P)_INCLUDE = $(I:P=C)
end
end
if ! "$(PACKAGE_$(P)_LIB)" || !L && LP != "-"
if !L
L := $(T1)/$(LP:O=N)
end
eval
PACKAGE_$(P)_LIB = $(L:P=C)
end
if ! "$(.PACKAGE.stdlib:N=$(L))"
.SOURCE.a : $(L)
end
end
if ! "$(PACKAGE_$(P)_INCLUDE)" && "$(PACKAGE_$(P)_LIB)"
I := $(PACKAGE_$(P)_LIB:D)/$(IP)
H := $(I)/.
if "$(H:P=X)"
eval
PACKAGE_$(P)_INCLUDE = $(I:P=C)
end
end
end
eval
_PACKAGE_$(P) $(.INITIALIZED.:?=?==?) 1
end
if ! FOUND
for D $(I)/*.h*([!.]) $(I)/*/*.h*([!.])
if "$(D:P=G:O=1:P=X)"
FOUND = 1
break
end
end
if ! FOUND && "$(PACKAGE_$(P)_VERSION)"
PACKAGE_$(P)_VERSION :=
PACKAGE_$(P) :=
PACKAGE_$(P)_BIN :=
PACKAGE_$(P)_INCLUDE :=
PACKAGE_$(P)_LIB :=
return $(.PACKAGE.INIT. $(P))
end
end
end
end
if FOUND && ! "$(PACKAGE_$(P)_BIN)"
if EP == "-"
PACKAGE_$(P)_BIN :=
else
PACKAGE_$(P)_BIN := $(PACKAGE_$(P)_LIB:D:B=$(EP))
end
end
error -1 PACKAGE_$(P)=$(PACKAGE_$(P)) PACKAGE_$(P)_BIN=$(PACKAGE_$(P)_BIN) PACKAGE_$(P)_INCLUDE=$(PACKAGE_$(P)_INCLUDE) PACKAGE_$(P)_LIB=$(PACKAGE_$(P)_LIB)
.PACKAGE.$(P).found := $(FOUND)
end
return $(P)
/*
* evaluate a logical expression of package ids
* used by :VARIANT:
*/
PACKAGES : .SPECIAL .FUNCTION
local P M X
if ! "$(%)"
return 1
end
M := $(.PACKAGE.:/ /|/G)
for P $(%:/[^a-zA-Z0-9_.]/ /G)
if "$(P)" != "$(M)"
: $(.PACKAGE.INIT. $(P))
end
end
X := $(%)
for P $(.PACKAGE.)
X := $(X:/\<$(P)\>/1/G)
end
return $(X:/\([A-Za-z_.][A-Za-z0-9_.]*\)/"$$(.PACKAGE.\1.found)"=="1"/G:@/" *"/" \&\& "/G:E)
":PACKAGE:" : .MAKE .OPERATOR
local A H I T N O P Q V version insert=0 install=1 this_install library=-l options=1 private
if "$(<)"
/* a separate include handles package definitions */
eval
$$(<:V) :package: $$(>:V)
$(@:V)
end
return
end
if ! "$(-?ancestor)"
/* please convert me to long op names */
let I = $(".":P=L=*:C,[^/],,G:O!:H=N:O=1) - 2
if I > 3
I = 3
elif I < 0
I = 0
end
if I && "$(*.VIEW:O=2:P=I=..)"
let I = I + 1
end
set ancestor:=$(I)
end
for T $(>)
if T == "{" || T == "}"
.PACKAGE.build += $(T)
elif T == "+"
break
elif T == "-"
install = 0
elif T == "--"
options = 0
elif T == ":*" || T == "--*" && options || T != "--*" && T == "*=*" && T != "*:*"
for O $(T:/:/ /G)
N := $(O:/^--//)
if N == "no*"
V := 0
N := $(N:/no//)
else
V := 1
end
if N == "*=*"
V := $(N:/[^=]*=//)
N := $(N:/=.*//)
end
S =
Q := $(N)
if N == "optimize"
if "$(PACKAGE_OPTIONS:N=optimize-space)"
N = dynamic
.PACKAGE.strip = $(CC.LD.STRIP)
elif "$(PACKAGE_OPTIONS:N=optimize-time)"
N = static
else
N =
end
elif N == "private"
private = 1
N = static
elif N == "space"
if ! "$(PACKAGE_OPTIONS:N=optimize-time)"
N = dynamic
.PACKAGE.strip = $(CC.LD.STRIP)
else
N =
end
elif N == "time"
if ! "$(PACKAGE_OPTIONS:N=optimize-space)"
N = static
else
N =
end
end
if N == "dynamic"
library := -l
if N == "$(Q)"
.NO.LIB.TYPE = 1
end
elif N == "license"
if V && ! .PACKAGE.license
if V == "1"
.PACKAGE.license := $(P)
else
.PACKAGE.license := $(V)
end
end
elif N == "type"
if V
.NO.LIB.TYPE = 0
else
.NO.LIB.TYPE = 1
end
elif N == "static"
if V
library := +l
else
library := -l
end
elif N == "insert|install|version"
$(N) := $(V)
elif N == "registry|soname"
.PACKAGE.$(N) := $(V)
elif N == "ignore"
if PACKAGE_IGNORE
PACKAGE_IGNORE := $(PACKAGE_IGNORE)|$(V)
else
PACKAGE_IGNORE := $(V)
end
elif N == "latest"
_API_DEFAULT == 99999999
elif N == "api"
if V == 0
eval
_$(P:F=%(upper)s)_API_H == 1
end
else
if V == "latest"
V = 99999999
end
if V >= 19700101
eval
_API_DEFAULT == $(V)
end
end
fi
elif O == "--*" || N == "debug|profile|threads"
set $(O)
end
end
elif T == "[-+]*"
.PACKAGE.libraries += $(T)
elif T == "CC.*=*|noCC.*"
if T == "no*"
T := $(T:V:/no//) =
end
if .PACKAGE.GLOBAL.
eval
$(T:V)
end
else
.PACKAGE.PROBE. += $("\n")$(T:V)
end
elif T != "*:(command|force|order|prereq)"
if T == "*:*"
P := $(T:/:.*//)
T := $(T:/[^:]*//)
else
P := $(T)
T :=
end
if P == "/*"
V := $(P)
P := $(P:B)
if ! PACKAGE_$(P)
PACKAGE_$(P) := $(V)
end
end
if "$(_PACKAGE_$(P))" == "0"
continue
end
I = pkg-$(P).mk
V := $(version)
this_install := $(install)
while 1
if H = "$(I:T=F)"
.PACKAGE.$(P).rules := $(H)
break
elif "$(PACKAGE_$(P))$(PACKAGE_$(P)_INCLUDE)$(PACKAGE_$(P)_LIB)"
break
elif P == "*[0-9][rR]+([0-9.])"
N := $(P:/[rR][0-9.]*$//)
V := $(P:/$(N).\([0-9.]*\)$/\1/)
P := $(N)
elif P == "*?(-)+([0-9.])"
N := $(P:/-*[0-9.]*$//)
V := $(P:/$(N)-*\([0-9.]*\)$/\1/)
P := $(N)
else
break
end
end
if ! "$(.PACKAGE.$(P).rules)"
.PACKAGE.$(P).rules := -
end
.PACKAGE.$(P).library := $(library)
.PACKAGE.$(P).private := $(private)
if "$(V)"
PACKAGE_$(P)_VERSION := $(V)
end
I := $(insert)
A := 0
for N $(T:/:/ /G)
if N == "no*"
V := 0
N := $(N:/no//)
else
V := 1
end
if N == "*=*"
V := $(N:/[^=]*=//)
N := $(N:/=.*//)
end
Q := $(N)
if N == "optimize"
if "$(PACKAGE_OPTIONS:N=optimize-space)"
N = dynamic
elif "$(PACKAGE_OPTIONS:N=optimize-time)"
N = static
else
N =
end
elif N == "space"
if ! "$(PACKAGE_OPTIONS:N=optimize-time)"
N = dynamic
else
N =
end
elif N == "time"
if ! "$(PACKAGE_OPTIONS:N=optimize-space)"
N = static
else
N =
end
end
if N == "dontcare"
if V
.PACKAGE.$(P).dontcare := 1
end
elif N == "dynamic"
.PACKAGE.$(P).library := -l
if N == "$(Q)"
.PACKAGE.$(P).type := -
end
elif N == "static"
.PACKAGE.$(P).library := +l
elif N == "library"
if V
.PACKAGE.$(P).library := -l
else
.PACKAGE.$(P).library :=
end
elif N == "private"
if V
.PACKAGE.$(P).library := +l
.PACKAGE.$(P).private := 1
else
.PACKAGE.$(P).private :=
end
elif N == "include|lib"
if V != 1
if V == 0
V = -
end
.PACKAGE.$(P).$(N) := $(V)
end
elif N == "license"
if V && ! .PACKAGE.license
if V == "1"
.PACKAGE.license := $(P)
else
.PACKAGE.license := $(V)
end
end
elif N == "root"
if V == 0
.PACKAGE.$(P).include := -
.PACKAGE.$(P).lib := -
.PACKAGE.$(P).library :=
elif V
.PACKAGE.$(P) := $(V)
end
elif N == "type"
if V
.PACKAGE.$(P).type := $(V)
else
.PACKAGE.$(P).type := -
end
elif N == "version"
PACKAGE_$(P)_VERSION := $(V)
elif N == "install"
this_$(N) := $(V)
elif N == "insert"
I := 1
elif N == "attributes"
A := $(V)
elif N == "plugin"
A = 1
.PACKAGE.$(N) := $(P)
elif N == "api|[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
if V == 0
eval
_$(P:F=%(upper)s)_API_H == 1
end
else
if N != "api"
V := $(N)
end
if V == "latest"
V = 99999999
end
eval
_API_$(P) == $(N)
end
end
else
.PACKAGE.$(P).option.$(N) := $(V)
end
end
if ! A
eval
_PACKAGE_$(P) $(.INITIALIZED.:?=?==?) 1
end
if this_install && ! .PACKAGE.install
if "$(INCLUDEDIR:V)" == "\$\(INSTALLROOT\)/include"
.PACKAGE.install = 1
.PACKAGE.$(P).dontcare := 1
INCLUDEDIR := $(INCLUDEDIR:V)/$(P)
end
end
if ! "$(.PACKAGE.:N=$(P))"
if I
.PACKAGE. := $(P) $(.PACKAGE.)
.PACKAGE.build := $(P) $(.PACKAGE.build)
else
.PACKAGE. += $(P)
.PACKAGE.build += $(P)
end
end
if "$(H)"
include + "$(H)"
end
end
end
end
/*
* :PACKAGE_INIT: foo.c bar.c ...
*
* for source that compiles either standalone or with richer libraries
* rhs installed in $(BINDIR) using .ACCEPT semantics
* rhs appear in $(BINDIR) for .LIST.PACKAGE.BINARY
* lhs for pre-installed $(BINDIR) files listed by .LIST.PACKAGE.BINARY
*/
":PACKAGE_INIT:" : .MAKE .OPERATOR
local I B
.LIST.PACKAGE.BINARY : .LIST.PACKAGE.INIT
eval
.LIST.PACKAGE.INIT : .MAKE
local I
for I $$(*)
print ;;;$$(I:T=F:P=A);$$(BINDIR)/$$(I:B)
end
for I $(<)
if I != "/*"
I := $$(I:D=$$(BINDIR):B:S)
end
if I = "$$(I:T=F:P=A)"
print ;;;$$(I);$$(I)
end
end
end
for I $(>)
B := $(I:B)
if ! "$(.NO.INSTALL.)"
$(BINDIR) :INSTALLDIR: $(B)
$(BINDIR)/$(B) : .ACCEPT
end
$(B) :: $(I)
.LIST.PACKAGE.INIT : $(B)
end
/*
* rhs compilation to place tables and/or data in
* readonly text object section -- should go away
* when C const is used/implemented to do same
* lhs is CC.HOSTTYPE match pattern to match
* activated for all architectures if lhs omitted
*/
":READONLY:" : .MAKE .OPERATOR .PROBE.INIT
local T
if ! "$(<)" || "$(-mam:N=static*)" || CC.HOSTTYPE == "$(<)"
for T $(>)
if "$(@.READONLY$(T:S):V)"
$(T:B:S=$(CC.SUFFIX.OBJECT)) : .SPECIAL .READONLY$(T:S)
else
error 1 :READONLY: ignored for suffix $(T:S)
end
end
end
/*
* rhs are generated but still saved by save common actions
*/
":SAVE:" : .MAKE .OPERATOR
.COMMON.SAVE : $(>)
/*
* rhs are metarule patterns that do not generate %
*/
":TERMINAL:" : .MAKE .OPERATOR
.METARULE.X. : $(>)
/*
* cc-* variants
*
* id :VARIANT: [ package-expr ]
* n1 = v1
* n2 = v2
* ...
*
* :VARIANT: [ arch:suffix:option ]
*/
":VARIANT:" : .MAKE .OPERATOR
if "$(<)"
.VARIANTS. += cc-$(<)
.CLOBBER. += cc-$(<)
eval
cc-$$(<) : .ALWAYS .LOCAL .FORCE .SPECIAL .RECURSE.SEMAPHORE
set -
if test "0" != "$$(PACKAGES $(>))"
then if test ! -d $$(<)
then $(MKDIR) $$(<)
fi
$$(-silent:Y%%echo $$(.RWD.:C%$%/%)$$(<): >&2%)
cd $$(<)
$$(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)
fi
end
else
local V
for V $(>|CC.DLL.VARIANTS)
local ( A S O ... ) $(V:/:/ /G)
eval
-$(S) :VARIANT:
CC = cc $(O)
end
end
end
/*
* external distribution workarounds
*
* target :WORKAROUND: target is empty
* target :WORKAROUND: - target is .TERMINAL
* target :WORKAROUND: prereq target copied from prereq
* target :WORKAROUND: prereq target from action applied to prereq
* action
*/
.WORKAROUND.COVERED. :FUNCTION:
local T
if T = "$(^^)"
return $(T)
end
if T = "$(<<:P=L=*:O=2)"
return $(T)
end
":WORKAROUND:" : .MAKE .OPERATOR
if "$(>)" == "-"
$(<) : .TERMINAL
else
eval
$$(>) : .SCAN.NULL
$$(<) : -TERMINAL $$(>)
$(@: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) $$$$(*)%: >%) $$$(<)?)
end
end
/*
* :YYPREFIX: [prefix] [header.h] a.y a.y.c a.y.h b.l b.l.c
*/
":YYPREFIX:" : .MAKE .OPERATOR
local H P F PL PY PH B I O
for F $(>)
if "$(F)" != "*.*"
P := $(F)
elif "$(F)" == "*.l.c"
PL := $(F)
elif "$(F)" == "*.y.c"
PY := $(F)
elif "$(F)" == "*.y.h"
PH := $(F)
elif "$(F)" == "*.h"
H := $(F)
elif "$(F)" == "*.l"
LEXFIX.$(F:B) := $(P)
LEXHDR.$(F:B) := $(H)
elif "$(F)" == "*.y"
YACCFIX.$(F:B) := $(P)
YACCHDR.$(F:B) := $(H)
end
end
if PL
:: $(PL)
.PASS.AFTER.$(PL) : .VIRTUAL .FORCE .AFTER
{
echo "/* : : fallback $(<<) generated by $(LEX) -- do not edit : : */"
cat $(<<)
} > $(<<:B:S=.l.c)
.FAIL.AFTER.$(PL) : .VIRTUAL .FORCE .AFTER .FAILURE $(PL)
: $(<<) : falling back to previously generated $(*) :
$(CP) $(*) $(<<)
$(PL:B:B)$(PL:S) : .PASS.AFTER.$(PL) .FAIL.AFTER.$(PL)
end
if PY
:: $(PY)
O := $(PY:S)
I := $(PY:B::S)
B := $(PY:B:B)
if PH
.PASS.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER
{
echo "/* : : fallback $(<<:N=*.c:B:S=.c) generated by $(YACC) -- do not edit : : */"
cat $(<<:N=*.c)
} > $(<<:N=*.c:B:S=.y.c)
{
echo "/* : : fallback $(<<:N=*.h:B:S=.h) generated by $(YACC) -- do not edit : : */"
cat $(<<:N=*.h)
} > $(<<:N=*.h:B:S=.y.h)
.FAIL.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER .FAILURE $(PY) $(PH)
: $(<<) : falling back to previously generated { $(*) } :
$(CP) $(*:O=1) $(<<:O=1)
$(CP) $(*:O=2) $(<<:O=2)
else
.PASS.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER
{
echo "/* : : fallback $(<<) generated by $(YACC) -- do not edit : : */"
cat $(<<)
} > $(<<:B:S=.y.c)
.FAIL.AFTER.$(PY) : .VIRTUAL .FORCE .AFTER .FAILURE $(PY)
: $(<<) : falling back to previously generated $(*) :
$(CP) $(*) $(<<)
end
$(PY:B:B)$(PY:S) : .PASS.AFTER.$(PY) .FAIL.AFTER.$(PY)
end
/*
* rhs are compiled using $(cc) rather than $(CC)
* use like ::
* NOTE: case ignorant filesystems make this a little tricky
*/
":cc:" : .MAKE .OPERATOR .PROBE.INIT
if "$(CC)" != "$(cc)"
local O S T
for S $(.SUFFIX.$(CC.DIALECT:N=C++:?c?C?))
T := $(>:G=%$(S))
if T == "*$(S)" || S == ".c" && T != "*.C" || S == ".C" && T != "*.c"
O += $(T:B:S=$(CC.SUFFIX.OBJECT))
end
end
O := $(O:U)
.CLOBBER. += null.mo null.ms
:: $(>)
$(<) :: $(O)
$(O) : .CLEAR .JOINT .DO.cc
end
.DO.cc : .USE .ALWAYS .LOCAL .FORCE
$(-exec:?silent ??)$(MAKE) --file=/dev/null --file=$(MAKEFILE) $(-) --errorid=$(cc:N!=*=*:B) '.null : $(<)' .null $(=) CC=$(cc:@Q) CCFLAGS=$(CCFLAGS:VP:@Q)
/*
* make scripts
*/
.CLEARARGS : .MAKE .VIRTUAL .FORCE
.ARGS : .CLEAR
.SELECT. : .FUNCTION
local T X
.UNION. : .CLEAR
if T = "$(*.ARGS)"
.ARGS : .CLEAR
.MAIN.TARGET. := $(T:O=1:B:S)
for X $(T)
T := $(.FILES.$(X:B:S):N!=[-+]l*:T=F:T!=G)
$(T:N!=[-+]l*) : .SPECIAL -ARCHIVE -COMMAND -OBJECT
.UNION. : .SPECIAL $(T) $(?$(X:B:S):N!=[-+]l*:T=F:P=S:T!=G)
end
else
.UNION. : .SPECIAL $(.FILES.:V:T=F) $(.FILES.:T=F:T!=G)
$(*.UNION.:N!=[-+]l*) : .SPECIAL -ARCHIVE -COMMAND -OBJECT
.UNION. : .SPECIAL $(...:T!=XS:N!=[-+]l*:T=F:A=.REGULAR:P=S:T!=G)
.UNION. : .SPECIAL $(...:T=XSFA:N!=[-+]l*:T=F:A=.REGULAR:P=S:T!=G)
end
return $(*.UNION.:$(-select):$(.SELECT.EDIT.))
.GENSYM.COUNT. = 0
.RETAIN : .GENSYM.COUNT.
.GENSYM. : .FUNCTION
local N
if ! ( N = "$(%)" )
N = .GENSYM
end
let $(N).COUNT. = $(N).COUNT. + 1
return $(N).$($(N).COUNT.).
.INSTALL.COMMON. : .FUNCTION
local ( D T A P ... ) $(%)
local B T1 T2
if ! "$(A)" || "$(A)" == "-"
A := $(T)
end
B := $(T:B:S)
if B == "-"
B := $(.GENSYM. X)
end
eval
.FILES.$(B) = $(P:V:N=[!-.]*|.[!A-Z]*)
.RHS.$(B) = $(P:V)
end
.FILES. += $$(.FILES.$(B))
if ! .MAIN.TARGET.
.MAIN.TARGET. := $(B)
end
if ! "$(.NO.INSTALL.)"
if "$(.INSTALL.$(B):V)" != "."
.ALL : $(T)
end
if ! ( T1 = "$(.INSTALL.$(B):V)" )
if D != "-"
T1 := $(D:)
else
for T2 $(.INSTALL.MAPS.)
if "$(T:$(T2))"
T1 = .
break
end
end
end
if ! T1
if ( T1 = "$(T:A<=.INSTALL.)" )
T1 := $(*$(T1):V)
end
end
end
if A != "-*" && T1 && T1 != "." && T1 != "$(A:V:D)"
$(T1:V) :INSTALLDIR: $(A)
end
for T2 $(P:V:N=*.[[:digit:]]*([[:alpha:]]))
if A == "-*" || ! "$(*$(A):V:N=$(T2:V))"
$$(MANDIR)$(T2:V:/.*\.//) :INSTALLDIR: $(T2:V)
end
end
for T2 $(P:V:N=*.man?(=*))
if T2 == "*.man=*"
T1 := $(T2:V:/.*man=//)
T2 := $(T2:V:/=.*//)
else
T1 = 1
end
$$(MANDIR)$(T1)/$(T2:V:D:B:S=.$(T1)) :INSTALL: $(T2:V)
end
end
.INSTALL.LIST. : .FUNCTION
set noalias /* don't tell dmr */
: $(!.INSTALL)
.MAKE : $(~.INSTALL:A=.MAKE)
return $(*.INSTALL:N=$(INSTALLROOT)/*) $(*.INSTALL:N=$(INSTALLROOT)/*$(CC.SUFFIX.SHARED).+([0-9.]):/\.[0-9.]*$//)
.PROBE.LOAD : .MAKE .VIRTUAL .FORCE
.PROBE.SPECIAL. = CC.HOSTTYPE CC.LD.DYNAMIC CC.LD.STATIC CC.STDLIB.BASE
$(.PROBE.SPECIAL.) : .FUNCTION
$(.PROBE.SPECIAL.) : -FUNCTIONAL
make .PROBE.INIT
return "$($(<))"
.PROBE.INIT : .MAKE .VIRTUAL .FORCE .OPTION.COMPATIBILITY
local I J K
if "$(.COMMAND.CC:N=$(CC))"
if ! "$(PATH:/:/ /G:X=$(CC):P=X)"
for I $(.COMMAND.CC:N!=$(CC))
if "$(PATH:/:/ /G:X=$(I):P=X)"
CC := $(I)
break
end
end
end
end
$(.PROBE.SPECIAL.) : -FUNCTIONAL
if "$(-base)" || ! "$(CC)" || "$(-cctype)" == "[-0]"
set cctype:=0
.CC.PROBE. =
else
if ! "$(-cctype)"
set cctype:="$(CC:N!=*=*)"
if ! "$(-cctype)"
set cctype:=cc
end
end
I := $(-cctype:O=1:P=C) $(-cctype:O>1)
set cctype:="$(I)"
if ! ( .CC.PROBE. = "$(CC.PROBE)" )
.CC.PROBE. := $(-cctype|"cc":@P=P=C)
end
.CC.PROBE. : .VIRTUAL $(.CC.PROBE.)
$(.CC.PROBE.) : .SPECIAL .ACCEPT .DONTCARE
(AR) (AS) (CPP) (CC) (LD) : .CC.PROBE.
if .CC.PROBE.
include "$(.CC.PROBE.)"
if ! "$(CC.HOSTTYPE)"
CC.HOSTTYPE := $(_hosttype_)
end
else
if "$(-cctype)"
error 1 $(-cctype): C probe failed -- default assumed
end
if ! CC.STDINCLUDE
CC.STDINCLUDE = /usr/include
end
if ! CC.MAKE.OPTIONS
CC.MAKE.OPTIONS = nativepp=-1
end
end
end
if CC.MAKE.OPTIONS
set $(CC.MAKE.OPTIONS)
end
$(CC.LD.DYNAMIC) $(CC.LD.STATIC) : .MULTIPLE .ARCHIVE .IGNORE .DO.NOTHING
if ! CC.SUFFIX.ARCHIVE
CC.SUFFIX.ARCHIVE = .a
end
.ATTRIBUTE.%$(CC.SUFFIX.ARCHIVE) : .ARCHIVE
if CC.SUFFIX.STATIC
.ATTRIBUTE.%$(CC.SUFFIX.STATIC) : .ARCHIVE
end
if CC.SUFFIX.DYNAMIC && CC.SUFFIX.SHARED
.ATTRIBUTE.%$(CC.SUFFIX.SHARED) : .ARCHIVE .SCAN.IGNORE
.SOURCE.%$(CC.SUFFIX.SHARED) : .FORCE $$(*.SOURCE.%.ARCHIVE)
end
if ! CC.SUFFIX.OBJECT
CC.SUFFIX.OBJECT = .o
end
if ! CC.STDLIB.BASE
CC.STDLIB.BASE := $(CC.STDLIB:N=?(/usr)/lib?(64):B) lib
CC.STDLIB.BASE := $(CC.STDLIB.BASE:U)
end
if CCSPECIALIZE
CC.OPTIMIZE := $(CCSPECIALIZE)
end
.ATTRIBUTE.%$(CC.SUFFIX.OBJECT) : .OBJECT
if CC.SHARED.REGISTRY
CC.SHARED += $$(.CC.SHARED.REGISTRY.)
end
if CC.SHARED.NAME
CC.SHARED += $$(.CC.SHARED.NAME.)
end
if "$(-mam:N=static*,port*)"
.NO.LIB.TYPE = 1
end
if ! .NO.LIB.TYPE && "$(-lib-type)"
I :=
J :=
if "$(-instrument)"
I := $(-instrument:B:/\(...\).*/-\1/)
end
if "$(-threads)"
J := t$(J)
end
if "$(-debug-symbols)" || "$(CCFLAGS:N=$(CC.DEBUG))" && ! "$(CCFLAGS:N=-O*|$(CC.OPTIMIZE))"
J := $(J)g
end
if ! "$(J)"
if K = "$(CCFLAGS:N=-p|-pg)"
J := $(K:O=1:/-//)
elif K = "$(LDFLAGS:N=-O[1-9])"
J := $(K:O=1:/-//)
end
end
if J
J := -$(J)
end
/*
* insert default flags
*/
for K $(...:T=XQSV:N=\(*FLAGS\):/[()]//G)
if "$($(K)_DEFAULT:V)"
$(K) := $$($(K)_DEFAULT) $($(K):V)
end
end
CC.LIB.TYPE := $(I)$(J)
end
.REQUIRE.$(CC.PREFIX.ARCHIVE)%$(CC.SUFFIX.ARCHIVE) : .FUNCTION
if "$(%:N=-l*)"
return $(.REQUIRE.-l% $(%))
elif "$(%:N=+l*)"
return $(.REQUIRE.+l% $(%))
elif ! "$(%:A=.TARGET)" && CC.PREFIX.ARCHIVE && "$(%:B:S:N=$(CC.PREFIX.ARCHIVE)*.$(CC.SUFFIX.ARCHIVE))"
return $(.REQUIRE.-l% -l$(%:B:S:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.SUFFIX.ARCHIVE)$//:/$(CC.LIB.TYPE)$//))
end
/*
* this is a workaround hack to help packages with broken compilers
* don't rely on this hook
*
* sco.i386 may need
* export _MAKE_PROBE_WORKAROUND_='CC.LIB.DLL=broken --static=1'
*/
if "$(_MAKE_PROBE_WORKAROUND_)"
local I
for I $(_MAKE_PROBE_WORKAROUND_)
eval
$(I)
end
end
end
include - + pkg-default.mk
.FLAGSINIT : .VIRTUAL
.MAKEINIT : .MAKE .VIRTUAL .FORCE .OPTION.COMPATIBILITY
local A T1 T2 T3 T4 T5 T6 TI
/*
* .SOURCE.mk gets bound long before the first user makefile is read
* this assertion ensures that any user specified dirs appear
* before the internal defaults set in the initdynamic[] script
*/
.SOURCE.mk : .CLEAR . $(*.SOURCE.mk:N!=$(*.SOURCE.mk.INTERNAL:/ /|/G)) $(*.SOURCE.mk.INTERNAL)
.MAKE : .PROBE.INIT
if "$(-instrument)"
if ! ( instrument.root = "$(-instrument:O=1:D:N!=.:T=F)" )
T1 = $(PATH):$(OPTDIRS)
instrument.root := $(T1:/:/ /G:N!=.:X=$(-instrument:O=1:B)/.:P=X:D)
if ! instrument.root
instrument.root = $(.INSTRUMENT.notfound)
end
end
T2 := $(-instrument:O=1:B)
T1 := $(INSTRUMENT_$(T2))
if ! T1 || ! "$(T1:N!=*=*)"
T5 =
T6 =
for T3 $(T1:N=*=*:/command=/TI=/:/root=/T5=/:/bin=/T6=/)
eval
$(T3)
end
end
if ! TI
TI = CC
CCFLAGS := $(CCFLAGS:N!=-g|-O*|-p*|$(CC.DEBUG)|$(CC.OPTIMIZE)) $(CC.DEBUG)
end
T1 := $(TI) = $($(TI):N=*=*)
if ! T5
T2 := $(T2:F=%(upper)s)
T5 = $(T2)HOME
for T3 $(T2) $(T2)HOME $(T2)_HOME $(T2)ROOT $(T2)_ROOT
if "$($(T3):T=F)"
T5 := $(T3)
break
end
end
end
if "$($(T5))"
T5 := $($(T5))
else
T1 += $(T5)=$(instrument.root)
T5 := $(instrument.root)
end
if ! "$(PATH:/:/ /G:X=$(-instrument):P=X)"
if T6
T5 := $(T5)/$(T6)
end
T1 += PATH=$(PATH):$(T5)
end
T1 += $(-instrument) $($(TI):N!=*=*)
end
if T1
CC.READONLY =
set expandview
eval
$(T1:V)
end
end
end
if "$(-mam:N=(regress|static)*)"
set nativepp:=-1
end
if "$(-debug-symbols)" && ! "$(CCFLAGS:N=$(CC.DEBUG))"
CCFLAGS := $(CCFLAGS:V:N!=-O*|$(CC.OPTIMIZE)|$\(CC.OPTIMIZE\)) $(CC.DEBUG)
end
if "$(-profile)" && ! "$(CCFLAGS:N=$(CC.PROFILE))"
CCFLAGS += $(CC.PROFILE)
end
if ! CC.LIB.THREADS
CC.LIB.THREADS = -lpthreads
end
$(CC.LIB.THREADS) : .DONTCARE
if A = "$(-ancestor)"
if "$(-mam:N=(regress|static)*)"
T1 = ..
let T2 = 1
while T2 < A
let T2 = T2 + 1
T1 := ../$(T1)
end
.MAM.INSTALLROOT := $(T1)
print -um setv INSTALLROOT $(T1)
T4 =
for T3 $(.ANCESTOR.LIST)
if T4
$(T4) : $(T1)/$(T3)
T4 =
else
T4 := $(T3)
end
end
end
T1 = ..
let T2 = 0
while T2 < A
let T2 = T2 + 1
T4 =
for T3 $(.ANCESTOR.LIST)
if T4
$(T4) : $(T1)/$(T3)
T4 =
else
T4 := $(T3)
end
end
T1 := ../$(T1)
end
elif "$(-mam:N=(regress|static)*)"
.MAM.INSTALLROOT := $(INSTALLROOT:N=..*(/*):?$(INSTALLROOT)?$HOME?)
print -um setv INSTALLROOT $(.MAM.INSTALLROOT)
end
for T3 $(.ANCESTOR.LIST)
if T4
$(T4) : $($(T3:F=%(upper)s)DIR)
T4 =
else
T4 := $(T3)
end
end
.SOURCE.h : $(INSTALLROOT)/include
if "$(-mam:N=dynamic*)"
.MAM.INSTALLROOT := $(INSTALLROOT:N=$(HOME):?$HOME?$(INSTALLROOT)?)
print -um setv INSTALLROOT $(.MAM.INSTALLROOT)
end
.MAMEDIT. =
if "$(INSTALLROOT:N=..*(/*))"
.MAMROOT. := $(INSTALLROOT)
else
.MAMROOT. := $(PWD:C@.*/src/@/src/@:C@/[^/]*@/..@G:C@/@@)
end
.SOURCE.h : $(*.SOURCE.c:N!=.) $(*.SOURCE:N!=.)
.SOURCE .SOURCE.a .SOURCE.c .SOURCE.h : .INSERT .
if CC.PREROOT && "$(CC.PREROOT:P!=I=/)"
T1 := $(CC.PREROOT) /
CC.STDINCLUDE := $(T1:X=$$(CC.STDINCLUDE:C@^/@@))
CC.STDLIB := $(T1:X=$$(CC.STDLIB:C@^/@@))
end
if T1 = "$(.PACKAGE.build:A!=.TARGET)"
local B D H I L N P Q S T V W X Z K=0 K.0=0 KP IP LP
LDLIBRARIES += $$(.PACKAGE.LIBRARIES. $(T1))
T2 =
for P $(T1)
if P == "{"
if ! "$(-mam:N=static*)"
if K
KP := $(K.$(K))
else
KP = 0
end
let K = K + 1
local K.$(K)=$(KP)
local L.$(K)
end
continue
elif P == "}"
if ! "$(-mam:N=static*)" && K
if ! $(K.$(K))
error 3 at least one of the packages { $(L.$(K)) } must exist
end
let K = K - 1
end
continue
elif $(K.$(K)) > 0
continue
end
if K
L.$(K) += $(P)
end
P := $(.PACKAGE.INIT. $(P))
I := $(PACKAGE_$(P)_INCLUDE)
L := $(PACKAGE_$(P)_LIB)
if "$(.PACKAGE.$(P).found)" == "1"
if K
K.$(K) := 1
end
elif ! K && ! "$(.PACKAGE.$(P).dontcare)"
if ! "$(PKGDIRS:X=package/$(P).lic package/$(P).pkg:T=F)" && ! "$(.PACKAGE.$(P).library)"
error 3 $(P): package not found
end
.PACKAGE.$(P).dontcare := 1
end
T2 += $(P)
T4 =
if "$(-mam:N=static*)"
if "$(INCLUDEDIR:D:N=$(INSTALLROOT))" || "$(INCLUDEDIR:D:D:N=$(INSTALLROOT))"
T4 += P
end
if I && ( "$(I:D)" == "$(L:D)" || "$(I:D:D)" == "$(L:D)" )
if "$(I:D)" == "$(L:D)"
H := $(I:D)
else
H := $(I:D:D)
end
T := $(I:C,^$(H)/,,)
print -um setv PACKAGE_$(P) $(T4:N=P:?${INSTALLROOT}?$(H)?)
print -um setv PACKAGE_$(P)_INCLUDE ${PACKAGE_$(P)}/$(T)
print -um setv PACKAGE_$(P)_LIB ${PACKAGE_$(P)}/$(L:B:S)
T4 += I L
end
end
if I
if ! "$(CC.STDINCLUDE:N=$(I))"
.SOURCE.h : $(I)
if "$(I:B)" == "$(P)" && ! "$(CC.STDINCLUDE:N=$(I:D))"
.SOURCE.h : $(I:D)
end
elif "$(-mam:N=static*)"
.SOURCE.h : $(I)
CC.STDINCLUDE := $(CC.STDINCLUDE:N!=$(I))
if "$(I:B)" == "$(P)"
.SOURCE.h : $(I:D)
CC.STDINCLUDE := $(CC.STDINCLUDE:N!=$(I:D))
end
end
if "$(-mam:N=(regress|static)*)"
.MAMPACKAGE. += PACKAGE_$(P)_INCLUDE
if ! "$(T4:N=I)"
print -um setv PACKAGE_$(P)_INCLUDE $(T4:N=P:?${INSTALLROOT}/$(INSTALLROOT:P=R=$(I))?$(I)?)
end
end
end
if L && L != "/lib|/usr/lib"
if ! "$(CC.STDLIB:N=$(L))"
.SOURCE.a : $(L)
elif "$(-mam:N=static*)"
.SOURCE.a : $(L)
CC.STDLIB := $(CC.STDLIB:N!=$(L))
end
if "$(-mam:N=(regress|static)*)"
.MAMPACKAGE. += PACKAGE_$(P)_LIB
if ! "$(T4:N=L)"
print -um setv PACKAGE_$(P)_LIB $(T4:N=P:?${INSTALLROOT}/$(INSTALLROOT:P=R=$(L))?$(L)?)
end
end
end
end
T3 := $(*.SOURCE.h)
.SOURCE.h : $(CC.STDINCLUDE) $(LCLDIRS:/:/ /G:C,$,/include,)
T4 := $(*.SOURCE.a)
.SOURCE.a : $(CC.STDLIB)
if T2
T2 += .
T1 := $(*.SOURCE.h:C,.*,$$(T2:C%.*%&/\&%),)
.SOURCE.h : .CLEAR . $(T1:P=C)
T1 := $(*.SOURCE.a:C,.*,$$(T2:C%.*%&/\&%),)
.SOURCE.a : .CLEAR . $(T1:P=C)
end
else
T3 := $(*.SOURCE.h)
.SOURCE.h : $(CC.STDINCLUDE)
T4 := $(*.SOURCE.a)
.SOURCE.a : $(CC.STDLIB)
end
if "$(-mam:N=(regress|static)*)"
.CC.NOSTDINCLUDE. := $(CC.STDINCLUDE:V:N!=*[()]*|$(T3:@C@ @|@G):C@ @|@G:C@^@N!=@)
.CC.NOSTDLIB. := $(CC.STDLIB:V:N!=*[()]*|$(T4:@C@ @|@G):C@ @|@G:C@^@N!=@)
else
.CC.NOSTDINCLUDE. := $(CC.STDINCLUDE:N!=$(T3:@C@ @|@G):C@ @|@G:C@^@N!=@)
.CC.NOSTDLIB. := $(CC.STDLIB:N!=$(T4:@C@ @|@G):C@ @|@G:C@^@N!=@)
end
T3 = $(PACKAGE_PATH:/:/ /G) $(.PACKAGE.DIRS.) $(.PACKAGE.GLOBAL.)
.SOURCE.a : $(T3:X=lib:N!=$(.PACKAGE.stdlib:/ /|/G):T=F)
T3 =
if ! "$(CC.DIALECT:N=ANSI)"
stdarg.h : .SPECIAL .NULL .TERMINAL .DONTCARE .IGNORE /* courtesy to proto(1) */
end
if "$(CC.REPOSITORY)"
.PTR.PREREQS = $(!) $(!.PTR.CHECK)
if ! "$(*.SOURCE.ptr)"
.SOURCE.ptr : $(CC.REPOSITORY)
end
T3 += $$(.PTR.OPTIONS.)
end
if ! "$(CC.INCLUDE.LOCAL)" && "$(CC.DIALECT:N=-I-)" /* pre 2005-05-25 courtesy */
CC.INCLUDE.LOCAL = -I-
end
if "$(-separate-include)"
CC.SEPARATEINCLUDE := $(CC.INCLUDE.LOCAL)
end
if ! "$(-nativepp)"
if ! "$(-separate-include)" && "$(-?separate-include)"
set nativepp:=-1
if ! "$(-?prefix-include)"
set prefix-include:=0
end
elif "$(CC.SEPARATEINCLUDE)" && !CC.ALTPP.FLAGS && !CC.ALTPP.ENV
set nativepp:=1
end
end
if ! "$(-nativepp)"
if CC.CC && ! ( T4 = "$(CC.PROBEPP)" )
T4 := $(-cctype:@P=P=C,pp)
end
if ! "$(CC.DIALECT:N=LIBPP)" || CPP != "$\(MAKEPP\)"
if ! "$(-?prefix-include)" && CPP != "$\(MAKEPP\)"
set prefix-include:=1
end
(CC) : (CPP)
if CC.ALTPP.FLAGS || CC.ALTPP.ENV
T5 := $(CC.ALTPP.FLAGS)
T3 += $(T5:V)
if CC.ALTPP.ENV
.BIND : (CC)
CC := $$(CC.ALTPP.ENV) $(CC:V)
end
else
.BIND : (CC)
if "$(CCLD:V)" == "$$(CC)"
CCLD := $(CC:V)
end
CC := $(CC:N=*=*) $$(PPCC) $$(PPCCFLAGS) $$(CC.DIALECT:/^/-o /) $$(CPP) $(TI:@N=CC:?$(-instrument)?$(-cctype)?)
end
if T4
T5 := -I-D$(T4)
T3 += $(T5:V)
end
end
elif ! "$(-?prefix-include)" && ! "$(CC.SEPARATEINCLUDE)"
set prefix-include:=1
end
if ! "$(-?prefix-include)" && "$(CCFLAGS:N=$(CC.INCLUDE.LOCAL)|-I-)"
set prefix-include:=1
end
if "$(-prefix-include)" || ! "$(-separate-include)" || "$(-nativepp)" && ! "$(CC.SEPARATEINCLUDE)"
T3 += $$(*:A=.SCAN.c:@?$$$(*.SOURCE.%.LCL.INCLUDE:I=$$$$(!$$$$(*):A=.LCL.INCLUDE|.STD.INCLUDE:P=D:U):$(.CC.NOSTDINCLUDE.):/^/-I/)??) $$(&:T=D)
if "$(-nativepp)" == "[1-9]*"
error 1 local include files may be ignored by the native C preprocessor
end
else
if ! "$(-?prefix-include)"
set prefix-include:=0
end
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)
end
if "$(CC.DIALECT:N=TOUCHO)"
.TOUCHO : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER .FOREGROUND
.REBIND : $(*$(<<):N=*$(CC.SUFFIX.OBJECT))
.APPEND.%.COMMAND : .TOUCHO
end
if "$(CCFLAGS:N=-g|$(CC.DEBUG))"
_BLD_DEBUG == 1
end
if "$(-instrument)"
_BLD_INSTRUMENT == 1
end
if "$(-static-link)"
_BLD_STATIC_LINK == 1
end
if "$(-shared)" && ! "$(CCFLAGS:VP:N=$\(CC.DLL\))"
T4 = $(CC.DLL)
else
T4 =
end
if T3
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)
end
if T3 || T4
CCFLAGS &= $(T4:V)
end
T3 =
T4 =
if "$(CC.REPOSITORY)"
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)
.APPEND.%.COMMAND : .PTR.CHECK .PTR.UPDATE
T3 := $$(@:V:N=*$\(CC*(LD)\)*:@?$(T3:V)??)
end
if "$(CC.ARFLAGS)"
.ARCHIVE.o : .CLEAR .USE .ARPREVIOUS (CC) (AR)
$(.ARPREVIOUS.$(<:B:S):@?$(IGNORE) $$(AR) $$(ARHYPHEN)d $$(<) $$(.ARPREVIOUS.$$(<:B:S))$$("\n")??)$(CC) $(CC.ARFLAGS) $(CCLDFLAGS) -o $(<) $(*)
.SHARED.o : .CLEAR .USE (LDSHARED)
$(LDSHARED) $(CC.SHARED) $(CCLDFLAGS) -o $(<) $(*$(**):N!=*$(CC.SUFFIX.ARCHIVE))
.ATTRIBUTE.%.a : -ARCHIVE
end
IFFEFLAGS += -c '$$(IFFECC) $$(IFFECCFLAGS) $$(IFFELDFLAGS)' $$(-mam:N=(regress|static)*:??-S '$$(CC.STATIC)')
if "$(-cross)" || "$(CC.EXECTYPE)" && "$(CC.HOSTTYPE)" != "$(CC.EXECTYPE)"
set cross
IFFEFLAGS += -x $(CC.HOSTTYPE)
end
.BIND : (IFFEFLAGS)
IFFEFLAGS += $$(.IFFE.REF.)
if ! IFFE_huh
/* can't figure out why this .PARAMETER must be repeated */
(IFFEFLAGS) : .PARAMETER
end
if "$(-mam:N=(regress|static)*)"
LDFLAGS &= $(T3:V)
else
if "$(CC.LD.ORIGIN:V)"
T4 += $$(CC.LD.ORIGIN)
end
if "$(CC.LD.RUNPATH:V)"
T4 += $$(.CC.LD.RUNPATH.)
end
LDFLAGS &= $$(*.SOURCE.%.ARCHIVE:I=$$$(*:N=-l*:P=D):$(.CC.NOSTDLIB.):P=A:/^/-L/) $(T3:V)
end
CCLDFLAGS &= $$(CCFLAGS:N!=-[DIU]*:@C@$$(CC.ALTPP.FLAGS)@@) $$(LDFLAGS) $(T4:V)
if "$(CC.LD.STRIP:V)"
if "$(-strip-symbols)" || "$(PACKAGE_OPTIONS:N=optimize-space)"
.PACKAGE.strip = $(CC.LD.STRIP)
end
CCLDFLAGS += $$(.PACKAGE.strip)
end
M4FLAGS &= $$(*.SOURCE.%.M4.INCLUDE:I=$$$(!$$$(*):P=D):/^/-I/) $$(&:T=D)
make .FLAGSINIT
/*
* state var defaults
*/
if ERROR_CATALOG == ""
ERROR_CATALOG == "$(CATALOG)"
end
if USAGE_LICENSE == ""
USAGE_LICENSE == "$(LICENSEINFO:P=W=$(LICENSE),type=usage)$(CATALOG:N!=$(ID):Y%[--catalog?$(CATALOG)]%%)"
end
/*
* map unknown command line targets to common actions
*/
for T3 .ARGS .MAIN
T2 := $(~$(T3):V)
eval
.ORIGINAL$(T3). = $(T2:V)
end
$(T3) : .CLEAR .VIRTUAL
T4 = 0
for T1 $(T2)
if ! T4 && "$(T1:A!=.IMMEDIATE|.TARGET)"
T2 := $(".$(T1:F=%(upper)s)":A=.IMMEDIATE|.TARGET:A!=.ATTRIBUTE)
if T2
T1 := $(T2)
else
T4 = 1
end
end
$(T3) : $(T1:V)
end
end
/*
* pure recursion makefiles (only :MAKE:) make .RECURSE first by default
* .NORECURSE inhibits the default .RECURSE first
*/
if "$(~.MAIN:V)" == ".RECURSE" && "$(~.ALL:V)" == ".RECURSE" && ! "$(~.ARGS:V:N=.RECURSE|.NORECURSE)" && ! "$(~.ARGS:V:O=1:A=.IMMEDIATE)"
.ARGS : .INSERT .RECURSE
end
/*
* check make recursion limits
*/
T1 := $(-recurse:/:/ /G:N=[0-9]*:O=N)
if T1 > 0
T2 =
while T1 > 0
let T1 = T1 - 1
T2 += .SEMAPHORE
end
.RECURSE.SEMAPHORE : $(T2)
end
.INITIALIZED. = 1
.PTR.LOCAL =
.PTR.OPTIONS. : .CLEAR .FUNCTION .PTR.INIT
if ! "$(.PTR.LOCAL)"
.PTR.LOCAL := $(*.SOURCE.ptr:N!=.:O=1)
elif "$(.PTR.LOCAL)" != "$(*.SOURCE.ptr:N!=.:O=1)"
.UNBIND : $(.PTR.LOCAL)
.BIND : $(.PTR.LOCAL)
end
.UNION : .CLEAR $(*.SOURCE.ptr:N!=.:O=1) $(*.SOURCE.ptr:N!=.:O>1:T=F)
return $(*.UNION:@N!=$(CC.REPOSITORY):$(CC.DIALECT:N=PTRIMPLICIT:?D??):/^/-ptr/)
.PTR.DONTCARE : .MAKE .VIRTUAL .IGNORE .FORCE
.DONTCARE.% : .FUNCTION
if "$(<:T=M:N=.PTR.CHECK)"
return ok
end
.PTR.CHECK : .VIRTUAL .PTR.INIT .PTR.DONTCARE $$(.PTR.LIST.)
.PTR.INIT : .MAKE .VIRTUAL .FORCE .IGNORE
if "$(CC.DIALECT:N=PTRMKDIR)"
local X
.PTR.DIR. := $(~.SOURCE.ptr:N!=.:O=1)
$(.PTR.DIR.) : .MAKE .IGNORE
if "$(^)"
$(^) : -MAKE
if "$(CC.DIALECT:N=PTRCOPY)"
X := $("defmap":D=$(^):B:S:T=F)
end
.MAKE :
$(MKDIR) $(<) 2>/dev/null $(X:?&& $(CP) -p $(X) $(<))
end
.MAKE : $(.PTR.DIR.)
$(.PTR.DIR.) : -MAKE
end
.PTR.UPDATE : .MAKE .VIRTUAL .FORCE .REPEAT .AFTER .FOREGROUND
.PTR.CHECK : .CLEAR .VIRTUAL .IGNORE $$(.PTR.LIST.)
.UNBIND : $(*.PTR.CHECK)
.MAKE : .PTR.CHECK
.PTR.LIST. : .FUNCTION
local D
.UNION : .CLEAR
.UNBIND : $(*.SOURCE.ptr)
for D $(*.SOURCE.ptr:N!=.)
.UNION : $(D:T=F:L<=*@(.[cChH]*|$(CC.SUFFIX.SOURCE)|$(CC.SUFFIX.OBJECT)|$(CC.SUFFIX.ARCHIVE)):D=$(D):B:S)
end
$(*.UNION) : .TERMINAL
for D $(*.UNION:N=*.c)
$(D:D:B:S=$(CC.SUFFIX.OBJECT)) : $(D)
$(<<<:N=.PTR.UPDATE:??$$(<:T=F:D:P=L:Y%$$(RM) $$(RMFLAGS) $$(<)%%)?)
end
return $(*.UNION)
.NOSTATEFILE : .MAKE .VIRTUAL .FORCE
set nowritestate
.SETARGS : .MAKE .VIRTUAL .FORCE
if ! "$(*.ARGS)"
.ARGS : $(*.MAIN)
end
.MAMACTION. : .FUNCTION
local V
if ! .MAMEDIT.
local E P
.MAMEDIT. = :
E = N!=-[DI]-*:
for P $(.MAMPACKAGE.)
E := $(E)@C%$($(P):C@\.@\\.@G)%$("$"){$(P)}%G:
end
if VOFFSET != "."
V = INSTALLROOT
for P $(".":P=L=*:C%/$(VOFFSET)$%%)
E := $(E)@C%$(P)%$("$"){$(V)}%G:
V = PACKAGEROOT
end
end
if .MAMROOT.
P := $(.MAMROOT.:C@\.@\\.@G)
E := $(E)@C%$(P)/\.\./\.\.%$("$"){PACKAGEROOT}%G:
E := $(E)@C%$(P)%$("$"){INSTALLROOT}%G:
if VOFFSET == "."
E := $(E)@C%$(PWD:X=$(.MAMROOT.)/../..)%$("$"){PACKAGEROOT}%G:
E := $(E)@C%$(PWD:X=$(.MAMROOT.))%$("$"){INSTALLROOT}%G:
end
end
.MAMEDIT. := $(E)
end
V := $(%:$(.MAMEDIT.:V))
if V != "setv +([! ]) ${\1}"
return $(V:V)
elif V == "setv INSTALLROOT ${INSTALLROOT}"
return setv INSTALLROOT $(.MAM.INSTALLROOT)
elif V == "setv PACKAGEROOT ${PACKAGEROOT}"
if .MAM.INSTALLROOT == "$HOME"
.MAM.PACKAGEROOT = $HOME
end
return setv PACKAGEROOT $(.MAM.PACKAGEROOT)
end
.MAMNAME. : .FUNCTION
if "$(%)" == ".[A-Z]*" && "$(%)" != ".INIT|.DONE"
return $(%:/.//:F=%(lower)s)
end
if "$(%)" == "/*|$(.MAMROOT.)/*)"
return $(.MAMACTION. $(%))
end
if "$(%)" == "-l+([a-zA-Z0-9_])" && "$(-mam:N=*,port*)"
return $(%:/-l\(.*\)/${mam_lib\1}/)
end
.MAM.STATE.VARS. : .FUNCTION
local V R
for V $(?$(%):T=S:A!=.PARAMETER:T=U)
if ! "$($(V))"
R += $(V:/.*/${&+-D&=${&}})
end
end
return $(R)
/*
* common actions
*
* if the first command line target is not a known atom then
* the function .UNKNOWN translates the atom name to upper
* case preceded by a dot in an attempt to yield one of the
* common actions described below
*
* .COMMON.SAVE prerequisite of all common save actions
*
* $(.BUILT.) list of built targets
* $(.CLOBBER.) list of additional files to clobber
* $(.FILES.) all :: source files
* $(.FILES.targ) source files for :: target targ
* $(.MAIN.TARGET.)first :: target name
* $(.MANIFEST.) all source and miscellaneous files
* $(.ORIGINAL.ARGS.) original command line args
* $(.ORIGINAL.MAIN.) original .MAIN prereqs
* $(.RWD.) current directory via .RECURSE
* $(.SELECT.) list of all or selected source files
* $(.SOURCES.) non-generated source files in $(.SELECT.)
*/
test : .SPECIAL .DONTCARE .ONOBJECT $$("check":A=.TARGET:A!=.ARCHIVE|.COMMAND|.OBJECT)
.ALL : .VIRTUAL
.RETAIN : .BASE.
.BASE.DATE.FORMAT. = %Y%m%d
.BASE.VERIFY : .MAKE .VIRTUAL .FORCE .REPEAT
if ! "$(.BASE.)"
error 3 $(-archive-output): no base archive for delta
end
.BASE.UPDATE : .MAKE .VIRTUAL .FORCE
local B N
N := $("":T=R:F=%($(.BASE.DATE.FORMAT.))T)
if ( B = "$(N:T=F)" )
error $(-force:?1?3?) $(B): base archive already generated
end
.BASE. := $(N)
.BASE : .BASE.UPDATE .COMMON.SAVE
$(PAX) -d -w -f $(.BASE.) -z - $(PAXFLAGS) $(.MANIFEST.)
.DELTA : .BASE.VERIFY .COMMON.SAVE
$(PAX) -d -w -f $("":T=R:F=%($(.BASE.DATE.FORMAT.))T).$(.BASE.) -z $(.BASE.) $(PAXFLAGS) $(.MANIFEST.)
/*
* believe generated files and clean up archive intermediates
*/
.BELIEVE : .MAKE .VIRTUAL .ONOBJECT
local A O
set ignorelock keepgoing touch
make .INSTALL
set notouch
for A $(...:A=.TARGET:A=.ARCHIVE.o)
O += $(*$(A):N=*$(CC.SUFFIX.OBJECT):T=F)
end
if "$(O)"
make { $(RM) $(RMFLAGS) $(O) }
end
.CC- .VARIANTS : .ONOBJECT $$(*.SOURCE:L<=cc-*:$$(-variants:+N=$$(-variants))) $$(.VARIANTS.:$$(-variants:+N=$$(-variants)))
.CC-INSTALL : .ONOBJECT .ALL $$(CC.LIB.TYPE:+$$$(*.INSTALL:N=*$$$(CC.LIB.TYPE)$$$(CC.SUFFIX.ARCHIVE)))
.CC.LD.RUNPATH. : .FUNCTION
if "$(LDRUNPATH)" && CC.LD.RUNPATH && "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:V:N=$(CC.DYNAMIC)|$\(CC.DYNAMIC\))" || ! "$(CCLDFLAGS:V:N=$(CC.STATIC)|$\(CC.STATIC\))" )
local T
T := $(LDRUNPATH:N!=.) $(*.SOURCE.%.ARCHIVE:I=$$(**:N=-l*:P=D):N!=.:$(.CC.NOSTDLIB.):P=A:N!=$(LIBDIR))
if T = "$(T:@/ /:/G)"
return $(CC.LD.RUNPATH)$(T)
end
end
.CC.LIB.DLL. : .FUNCTION
return $(%)
.CC.LIB.DLL.export : .FUNCTION
local F J
J := $(--jobs) /* XXX: multiple :LIBRARY: may get botched with jobs>0 */
set nojobs
F := _$(%:O=1:B:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.LIB.TYPE)$//:/[^a-zA-Z0-9_]/_/G)_
F := $(F:/___*/_/G)
$(F).exp : .FORCE $(%:O=1)
: generate $(*) export symbols in $(<)
set -
$(NM) $(NMFLAGS) $(*) |
$(SED) $(NMEDIT) > $(<)
.MAKE : $(F).exp
set $(J)
return $(F).exp $(%)
.CC.LIB.DLL.object : .FUNCTION
local F J
J := $(--jobs) /* XXX: multiple :LIBRARY: may get botched with jobs>0 */
set nojobs
F := _$(%:O=1:B:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.LIB.TYPE)$//:/[^a-zA-Z0-9_]/_/G)_
F := $(F:/___*/_/G)
$(F) : .FORCE $(%:O=1)
: extract $(*) objects in $(<)
set -
$(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(<)
$(MKDIR) $(<)
cd $(<)
$(AR) $(ARHYPHEN)x $(*:P=A)
.MAKE : $(F)
.DONE : .DONE.$(F)
.DONE.$(F) : .FORCE
$(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(<:/.DONE.//)
set $(J)
return $(F)/* $(%:O>1)
.CC.LIB.DLL.option : .FUNCTION
return $(CC.LIB.ALL) $(%:O=1) $(CC.LIB.UNDEF) $(%:O>1)
.CC.LIB.DLL.symbol : .FUNCTION
local F J
J := $(--jobs) /* XXX: multiple :LIBRARY: may get botched with jobs>0 */
set nojobs
F := _$(%:O=1:B:/^$(CC.PREFIX.ARCHIVE)//:/$(CC.LIB.TYPE)$//:/[^a-zA-Z0-9_]/_/G)_
F := $(F:/___*/_/G)
$(F).c : .FORCE $(%:O=1)
: generate $(*) export symbols in $(<)
set -
$(NM) $(NMFLAGS) $(*) |
$(SED) $(NMEDIT) -e '/^[ ]*$/d' $(CC.PREFIX.SYMBOL:?-e 's/^$(CC.PREFIX.SYMBOL)//'??) |
$(SORT) -u > $(<:B:S=.i)
{
echo '/* $(*) export symbols */'
echo
echo 'typedef int (*Export_t)();'
echo
echo '#if defined(__cplusplus)'
echo 'extern "C" {'
echo '#endif'
echo
while read sym
do echo "extern int $sym();"
done < $(<:B:S=.i)
echo
echo 'extern int $(<:B)();'
echo 'extern Export_t $(<:B)export[];'
echo
echo '#if defined(__cplusplus)'
echo '}'
echo '#endif'
echo
echo 'Export_t $(<:B)export[] ='
echo '{'
while read sym
do echo " $sym,"
done < $(<:B:S=.i)
echo '};'
echo
echo 'int $(<:B)() { return 0; }'
$(RM) $(RMFLAGS) $(<:B:S=.i)
} > $(<)
.MAKE : $(F)$(CC.SUFFIX.OBJECT)
set $(J)
return $(F)$(CC.SUFFIX.OBJECT) $(%)
.CC.LIB.DLL.undef : .FUNCTION
return `$(NM) $(NMFLAGS) $(%:O=1) | $(SED) $(NMEDIT) -e "s/^/-u /"` $(%)
.CC.SHARED.NAME. : .FUNCTION
local R E
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\))" )
if R = "$(.CC.SHARED.NAME.$(R))"
while E < 0
let E = E + 1
R := $(R:B)
end
return $(R)
end
end
.CC.SHARED.REGISTRY. : .FUNCTION
local R
if ( R = "$(<<:B:C%\..*%%)" ) && .PACKAGE.registry && "$(CC.DIALECT:N=DYNAMIC)" && ( "$(CCLDFLAGS:V:N=$(CC.DYNAMIC)|$\(CC.DYNAMIC\))" || ! "$(CCLDFLAGS:V:N=$(CC.STATIC)|$\(CC.STATIC\))" )
if R = "$(.CC.SHARED.REGISTRY.$(R))"
local CC.SHARED.REGISTRY.PATH
CC.SHARED.REGISTRY.PATH := $(R)
end
return $(CC.SHARED.REGISTRY)
end
.COMMON.SAVE : .NULL .VIRTUAL .IGNORE .FOREGROUND
.CLEAN : .CLEARARGS .ONOBJECT
$(IGNORE) $(RM) $(RMFLAGS) $(.BUILT.:A=.REGULAR:A!=.ARCHIVE|.COMMAND:N!=*.(m[klos]|db$(CC.SUFFIX.SHARED:?|$(CC.SUFFIX.SHARED:/\.//).*??))$(-clean-ignore:+|($(-clean-ignore))))
.CLOBBER : .CLEARARGS .ONOBJECT .NOSTATEFILE
$(IGNORE) $(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(.CLOBBER.:T=F:P=L) $(.BUILT.:A=.REGULAR)
.CLOBBER.INSTALL : .ONOBJECT
$(IGNORE) $(RM) $(RMFLAGS) $(RMRECURSEFLAGS) $(.INSTALL.LIST.:T=F:P=L:A=.REGULAR)
if CPIO
.CPIO : .COMMON.SAVE
echo $(.MANIFEST.) | tr ' ' '\012' | $(CPIO) -o $(CPIOFLAGS) > $(-archive-output)$(-?archive-output:~.cpio)
end
if CTAGS
.CTAGS :
$(CTAGS) $(CTAGSFLAGS) $(.SOURCES.:N=*.[cfhly])
end
if VGRIND
.GRIND : $(CTAGS:@?.GRINDEX?.COMMON.SAVE?)
$(VGRIND) $(VGRINDFLAGS) $(.SOURCES.:N=*.[chly]|*.mk|$(MAKEFILE)) $(LPR:@?| $$(LPR) $$(LPRFLAGS)??)
if CTAGS
.GRINDEX : .COMMON.SAVE
$(CTAGS) $(CTAGSFLAGS) -v $(.SOURCES.:N=*.[chly]) | $(SORT) -f >index
$(VGRIND) $(VGRINDFLAGS) -x index $(LPR:@?| $$(LPR) $$(LPRFLAGS)??)
end
end
.INSTALL : .ALL .ONOBJECT
.LINT : .MAKE .VIRTUAL .FORCE .SETARGS
local T1 T2 LINT1ARGS
set nojobs nowritestate override
if "$(_release_:N=research|V)"
if "$(_release_:N=V)"
LINT1FLAGS += -H$$(<<:B:S=.lh)
else
LINT1FLAGS += -S$$(<<:B:S=.lh)
end
LINT1ARGS = $(*$(<):G=%$(<:S):O=2:??$(>)?O)
end
.LINTLIBRARIES. = $(*:A=.ARCHIVE) $(LINTLIBRARIES)
.SOURCE.ln : $(LINTLIB)
.INSERT.%.ARCHIVE .INSERT.%.COMMAND : .DO.NOTHING $$(<:A=.TARGET:?.LINT0??)
.LINT0 : .VIRTUAL .FORCE
$(SILENT) $(RM) $(RMFLAGS) $(<<:B:S=.l[hn])
for T1 % %.o
for T2 $(.METARULE.I.$(T1))
$(T1) : $(T2) .NULL
end
end
eval
%.o : %.c .FORCE
set -
$(_release_:N=V:??echo $$$(>):$$$("\n")?){ $$(CPP) $$(CPPFLAGS) -C -Dlint $$(>) | $$(LINT1) $$(LINT1FLAGS) $$(LINTFLAGS) $(LINT1ARGS:V) >> $$(<<:B:S=.ln) ;} 2>&1
end
.ARCHIVE.o : .CLEAR .USE
$(SILENT) $(RM) $(RMFLAGS) $(<:B:S=.lh)
if "$(_release_:N=V)"
.COMMAND.o :
set -
cat $(<:B:S=.ln) $(.LINTLIBRARIES.:B:S=.ln:/$(CC.PREFIX.ARCHIVE)\(.*\)/& llib-l\1/:T=F) > $(TMPDIR)/l$$.ln
$(LINT2) -T$(TMPDIR)/l$$.ln $(<:B:S=.lh:T=F:/^/-H/) $(LINTFLAGS)
$(RM) $(RMFLAGS) $(TMPDIR)/l$$.ln $(<:B:S=.l[hn])
elif "$(_release_:N=research)"
.COMMAND.o :
set -
echo $(<)::
cat $(<:B:S=.ln) $(.LINTLIBRARIES.:B:S=.ln:/$(CC.PREFIX.ARCHIVE)\(.*\)/& llib-l\1/:T=F) > $(TMPDIR)/l$$.ln
$(LINT2) $(TMPDIR)/l$$.ln -S$(<:B:S=.lh) $(LINTFLAGS)
$(RM) $(RMFLAGS) $(TMPDIR)/l$$.ln $(<:B:S=.l[hn])
else
.COMMAND.o :
set -
echo $(<)::
cat $(<:B:S=.ln) $(.LINTLIBRARIES.:B:S=.ln:/$(CC.PREFIX.ARCHIVE)\(.*\)/& llib-l\1/:T=F) > $(TMPDIR)/l$$.ln
$(LINT2) $(TMPDIR)/l$$.ln $(LINTFLAGS)
$(RM) $(RMFLAGS) $(TMPDIR)/l$$.ln $(<:B:S=.l[hn])
end
.LIST.GENERATED : .ONOBJECT .MAKE
print $(.INSTALL.LIST.:T=F:P=L:A=.REGULAR:/$/$("\n")/G) $(.CLOBBER.:T=F:P=L:/$/$("\n")/G) $(.BUILT.:A=.REGULAR:/ /$("\n")/G)
.LIST.INSTALL : .ONOBJECT .MAKE
print $(.INSTALL.LIST.:$(INSTALLROOT:N=.:?T=F?N=$(INSTALLROOT)/*:C%$(INSTALLROOT)/%%):C% %$("\n")%G)
.LIST.INSTALLED : .ONOBJECT .MAKE
print $(.INSTALL.LIST.:$(INSTALLROOT:N=.:?T=F?N=$(INSTALLROOT)/*:T=F:C%$(INSTALLROOT)/%%):C% %$("\n")%G)
.LIST.MANIFEST : .ONOBJECT .COMMON.SAVE .MAKE
if .RWD.
print $(.MANIFEST.:C,^\([^/]\),$(.RWD.)/\1,:/ /$("\n")/G)
else
print $(.MANIFEST.:/ /$("\n")/G)
end
.LIST.PACKAGE.DIRS. = $(VROOT:T=F:P=L=*) $(INSTALLROOT) $(PACKAGEROOT)
.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)
.LIST.PACKAGE.SOURCE.EDIT. = $(.LIST.PACKAGE.DIRS.:T=F:P=A:H=RU:C,.*,C%^&/%%,:C, ,:,G)
.LIST.PACKAGE.LICENSE : .ONOBJECT .MAKE
local I J E
if "$(package.license.class)"
if "$(LICENSECLASS)" != "$(package.license.class)"
if "$(LICENSECLASS)" != "."
error 1 $(LICENSECLASS): not a $(package.license.class) license -- ignored
end
exit 0
end
end
E := $(.LIST.PACKAGE.SOURCE.EDIT.)
if I = "$(LICENSEINFO:P!=S)"
print ;;;$(I);$(I:$(E))
for J $(I:T=I:N=*.def:D=$(I:D):B:S:T=F)
print ;;;$(J);$(J:$(E))
end
I := $(I:D)/LICENSES/$(I:B)
if I = "$(I:T=F)"
print ;;;$(I);$(I:$(E))
end
end
.LIST.PACKAGE.LOCAL : .ONOBJECT .COMMON.SAVE .MAKE
local I E
E := $(.LIST.PACKAGE.SOURCE.EDIT.)
for I $(.MANIFEST.:T=F:P=A)
print ;;;$(I);$(I:$(E))
end
.LIST.PACKAGE.BINARY : .ONOBJECT .MAKE .LIST.PACKAGE.LICENSE
local I E
.UNION : .CLEAR $(.INSTALL.LIST.:N=$(INSTALLROOT)/*:T=F)
E := $(.LIST.PACKAGE.BINARY.EDIT.)
if package.strip
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?(/*)%%))
if "$(I:T=Y)" == "*/?(x-)(dll|exe)"
print ;;filter $(STRIP) $(STRIPFLAGS) $(I);$(I);$(I:$(E))
else
print ;;;$(I);$(I:$(E))
end
end
else
for I $(*.UNION:T=F:P=A)
print ;;;$(I);$(I:$(E))
end
end
.LIST.PACKAGE.RUNTIME : .ONOBJECT .MAKE .LIST.PACKAGE.LICENSE
local E I X
X := /lib/lib*(/*) $(CC.SUFFIX.ARCHIVE) $(CC.SUFFIX.DYNAMIC) $(CC.SUFFIX.SHARED:?$(CC.SUFFIX.SHARED)+([-.0-9])??) $(CC.SUFFIX.STATIC)
.UNION : .CLEAR $(.INSTALL.LIST.:N=$(INSTALLROOT)/(bin|lib)/*:N!=*@($(X:N=?*:/ /|/G)):T=F)
E := $(.LIST.PACKAGE.BINARY.EDIT.)
if package.strip
for I $(*.UNION:T=F:P=A)
if "$(I:T=Y)" == "*/?(x-)(dll|exe)"
print ;;filter $(STRIP) $(STRIPFLAGS) $(I);$(I);$(I:$(E))
else
print ;;;$(I);$(I:$(E))
end
end
else
for I $(*.UNION:T=F:P=A)
print ;;;$(I);$(I:$(E))
end
end
.PROTO.LICENSE. : .FUNCTION
local F G
if .PACKAGE.license || LICENSE == "*=*"
G = 1
elif LICENSE
G = 0
elif F = "$(LICENSEFILE:T=F)"
G := $(sh egrep -c "^(contributor|license)=\($" $(F) || true)
else
G = 0
end
return $(G)
.LIST.PACKAGE.SOURCE : .ONOBJECT .COMMON.SAVE .MAKE .LIST.PACKAGE.LICENSE
local E F G
PROTOEDIT = P=A
E := $(.LIST.PACKAGE.SOURCE.EDIT.)
G := $(.PROTO.LICENSE.)
for F $(.MANIFEST.:T=F:P=A)
if G && F == "*.{1,3}(?)"
print ;;$(PROTO) $(PROTOFLAGS) -o source=$(F:T=ZR=%Y) -c '' -dp $(F);$(F);$(F:$(E))
else
print ;;;$(F);$(F:$(E))
end
end
.LIST.SOURCE.TGZ : .ONOBJECT .COMMON.SAVE .MAKE
local E N F P # vs # I N T J
PROTOEDIT = P=A
E := $(.LIST.PACKAGE.SOURCE.EDIT.)
N := $(.PROTO.LICENSE.)
for F $(.MANIFEST.)
P := $(F:T=F)
if N && F == "*.{1,3}(?)"
print ;;$(PROTO) $(PROTOFLAGS) -o source=$(F:T=ZR=%Y) -c '' -dp $(P);$(P);$(F:$(E))
else
print ;;;$(P);$(F:$(E))
end
end
.LIST.SYMBOLS : .ALWAYS
lib="$(...:A=.ARCHIVE:A=.TARGET:T=F:N!=*[-/]*)"
for lib in $lib
do $(NM) $(NMFLAGS) $lib | $(SED) $(NMEDIT) $(CC.PREFIX.SYMBOL:?-e 's/^$(CC.PREFIX.SYMBOL)//'??) | $(SORT) -u
done
if LPROF
.LPROF : .MAKE .VIRTUAL .FORCE .ONOBJECT .SETARGS
local T1 T2
set force noscan nowritestate override
.INSERT.%.COMMAND : .LPROF0 .LPROF1 $$(<:B:S=.cnt)
.LPROF0 : .MAKE .VIRTUAL .FORCE
.LPROFFILES. =
.LPROF1 : .AFTER .IGNORE $$(<<:B:S=.cnt)
$(LPROF) $(LPROFFLAGS) -r "$(.LPROFFILES.:/^ //)" -o $(<<) -c $(*)
for T1 % %.o
for T2 $(.METARULE.I.$(T1))
$(T1) : $(T2) .NULL
end
end
%.o : %.c .MAKE
.LPROFFILES. += $(>)
.ARCHIVE.o .COMMAND.o : .NULL
end
.OFFICIAL : .ONOBJECT
$(*.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?)
.PAX : .COMMON.SAVE $$(*.RECURSE:@?.PAX.RECURSE?.PAX.LOCAL)
.PAX.LOCAL : .COMMON.SAVE
$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.pax) $(PAXFLAGS) $(.MANIFEST.)
.PAX.RECURSE : .COMMON.SAVE
$(MAKE) --noexec --file=$(MAKEFILE) $(-) recurse list.manifest |
$(SORT) -u |
$(PAX) -w -f $(-archive-output)$(-?archive-output:~.pax) $(PAXFLAGS)
.PRINT : .COMMON.SAVE
$(PR) $(PRFLAGS) $(.SOURCES.:N!=*.[0-9]*([!./])) $(LPR:@?| $(LPR) $(LPRFLAGS)??)
.SAVE : .COMMON.SAVE
$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.$("":T=R:F=%($(.BASE.DATE.FORMAT.))T)) $(PAXFLAGS) $(.MANIFEST.)
.SHAR : .COMMON.SAVE
$(SHAR) $(SHARFLAGS) $(.MANIFEST.) > $(-archive-output)$(-?archive-output:~.shar)
.TAR : .COMMON.SAVE
$(TAR) cf$(TARFLAGS) $(-archive-output)$(-?archive-output:~.tar) $(.MANIFEST.)
.TARBALL : .COMMON.SAVE
$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.tgz) -x tar:gzip $(PAXFLAGS) -s ',^[^/],$(PWD:B:/-.*//)$(VERSION:@N!=-:?-$(VERSION)??)/,' $(.MANIFEST.)
.TGZ : .COMMON.SAVE $$(*.RECURSE:@?.TGZ.RECURSE?.TGZ.LOCAL)
.TGZ.LOCAL : .COMMON.SAVE
{ $(SILENT) print -r '$(.MANIFEST.:@/ /$("\n")/G)'; } |
$(PAX) -d -w -f $(-archive-output)$(-?archive-output:~.tgz) -x tar:gzip $(PAXFLAGS)
.TGZ.RECURSE : .COMMON.SAVE
$(MAKE) --noexec --file=$(MAKEFILE) $(-) recurse list.manifest |
$(SORT) -u |
$(PAX) -w -f $(-archive-output)$(-?archive-output:~.tgz) -x tar:gzip $(PAXFLAGS)
/*
* make abstract machine support
*/
.MAM.LOAD : .MAKE .VIRTUAL .FORCE
if "$(-mam:N=static*)"
set noreadstate reread strictview
set readonly
INSTALLROOT = $(.MAMROOT.)
PACKAGEROOT = $(.MAMROOT.)/../..
set noreadonly
if "$(-mam:N=*,port*)"
if ! "$(-?prefix-include)"
set noprefix-include
end
if ! "$(-?separate-include)"
set noseparate-include
end
end
end
.MAKEINIT : .MAM.INIT
.MAM.INIT : .MAKE .VIRTUAL .FORCE .AFTER
local T
if ! "$(-mam)"
return
end
LICENSEFILES := $(LICENSEINFO)
if "$(-mam:N=*,port*)"
for T $("<VARIABLES>":L=CC.+([[:upper:].]))
$(T) :=
end
CC.DEBUG = ${mam_cc_DEBUG}
CC.DIALECT =
CC.DLL = ${mam_cc_DLL}
CC.DLLBIG = ${mam_cc_DLLBIG}
CC.DYNAMIC =
CC.EXPORT.DYNAMIC = ${mam_cc_EXPORT_DYNAMIC}
CC.HOSTTYPE = ${mam_cc_HOSTTYPE}
CC.OPTIMIZE = ${mam_cc_OPTIMIZE}
CC.PIC = ${mam_cc_PIC}
CC.PICBIG = ${mam_cc_PICBIG}
CC.PREFIX.ARCHIVE = lib
CC.PREFIX.DYNAMIC = ${mam_cc_PREFIX_DYNAMIC}
CC.PREFIX.SHARED = ${mam_cc_PREFIX_SHARED}
CC.SHARED =
CC.SHELLMAGIC = ${mam_cc_SHELLMAGIC}
CC.STATIC =
CC.SUFFIX.ARCHIVE = .a
CC.SUFFIX.DYNAMIC = ${mam_cc_SUFFIX_DYNAMIC}
CC.SUFFIX.SHARED = ${mam_cc_SUFFIX_SHARED}
_hosttype_ = ${mam_cc_HOSTTYPE}
end
.MAM.PACKAGEROOT := $(".":P=R=$(PACKAGEROOT))
print -um setv PACKAGEROOT $(PACKAGEROOT)
PACKAGEROOT = ${PACKAGEROOT}
print -um setv AR ${mam_cc_AR} ${mam_cc_AR_ARFLAGS}
AR = ${AR}
print -um setv ARFLAGS $(ARHYPHEN)rc
ARFLAGS = $(ARHYPHEN)rc
print -um setv AS as
AS = ${AS}
print -um setv ASFLAGS
ASFLAGS = ${ASFLAGS}
print -um setv CC $(-mam:N=static*,port*:?$(-cctype:O=1:B:S)?$(CC)?)
CC = ${CC}
.MAM.CC.FLAGS := $(CCFLAGS:VP:N!=-O*|$(CC.OPTIMIZE)|$\(CC.OPTIMIZE\)|-g|$(CC.DEBUG)|$\(CC.DEBUG\))
print -um setv mam_cc_FLAGS $(.MAM.CC.FLAGS)
T := $(CCFLAGS:VP)
if "$(T:N=-O*|$(CC.OPTIMIZE))"
print -um setv CCFLAGS ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${mam_cc_OPTIMIZE}?}
elif "$(T:N=-g|$(CC.DEBUG))"
print -um setv CCFLAGS ${mam_cc_DEBUG}
else
print -um setv CCFLAGS ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG??}
end
CCFLAGS = ${mam_cc_FLAGS} ${CCFLAGS}
print -um setv CCLDFLAGS $(CCLDFLAGS:VP:N!=$\(*\)) ${-strip-symbols?1?${mam_cc_LD_STRIP}??}
CCLDFLAGS = ${CCLDFLAGS}
CC.NATIVE = ${CC}
CMP = cmp 2>/dev/null
print -um setv COTEMP $$
print -um setv CPIO cpio
CPIO = ${CPIO}
print -um setv CPIOFLAGS
CPIOFLAGS = ${CPIOFLAGS}
print -um setv CPP "${CC} -E"
CPP = ${CPP}
print -um setv F77 f77
F77 = ${F77}
print -um setv HOSTCC ${CC}
print -um setv IGNORE
INSTALLROOT = ${INSTALLROOT}
print -um setv LD ld
LD = ${LD}
print -um setv LDFLAGS $(LDFLAGS:VP:@Y&"$(LDFLAGS:VP)"&&)
LDFLAGS = ${LDFLAGS}
if "$(-mam:N=*,port*)"
LDFLAGS &= $$(*.SOURCE.%.ARCHIVE:I=$$$(*:N=${mam_lib+([a-zA-Z0-9_])}:P=D):$(.CC.NOSTDLIB.):/.*/${mam_cc_L+-L&}/)
end
print -um setv LEX lex
LEX = ${LEX}
print -um setv LEXFLAGS
LEXFLAGS = ${LEXFLAGS}
print -um setv LPR lpr
LPR = ${LPR}
print -um setv LPRFLAGS
LPRFLAGS = ${LPRFLAGS}
M4 = ${M4}
print -um setv M4FLAGS $(M4FLAGS:VP:@?"$(M4FLAGS:VP)"??)
M4FLAGS = ${M4FLAGS}
print -um setv NMAKE nmake
MAKE := $(-never:?${NMAKE}?$$$(<:A=.ALWAYS:@Y%$(MAKE)%${NMAKE}%)?)
print -um setv NMAKEFLAGS
NMAKEFLAGS = ${NMAKEFLAGS}
print -um setv PR pr
PR = ${PR}
print -um setv PRFLAGS
PRFLAGS = ${PRFLAGS}
print -um setv SHELL /bin/sh
SHELL = ${SHELL}
print -um setv SILENT
STDCMP = ${STDCMP} 2>/dev/null
STDCP = ${STDCP}
STDED = ${STDED}
STDEDFLAGS = ${STDEDFLAGS}
STDLN = ${STDLN}
STDMV = ${STDMV}
STDRM = ${STDRM}
print -um setv TAR tar
TAR = ${TAR}
print -um setv YACC yacc
YACC = ${YACC}
print -um setv YACCFLAGS -d
YACCFLAGS = ${YACCFLAGS}
.ARUPDATE .ARCOPY :
$(<<:N=*$(CC.SUFFIX.ARCHIVE):?(ranlib $$(<<)) >/dev/null 2>&1 || true??)
.ARCLEAN : .NULL
.DO.INSTALL :
test '' = '$(*)' || $(STDCMP) $(CMPFLAGS) $(*) $(<) || { $(STDMV) $(<) $(<).old 2>/dev/null || true; $(STDCP) $(*) $(<) $(.DO.INSTALL.OPT.) ;}
for T .READONLY.*
$(T) : .CLEAR .NULL .VIRTUAL
end
/*
* force some make...prev
* bindfile() should probably do this
* but right now its too noisy
*/
make (USAGE_LICENSE) $(LICENSEFILES)
/*
* miscellaneous support
*/
include - "msgcat.mk"
/*
* local installation info
*/
include "Makeinstall.mk"
/*
* architecture specific additions
*/
include - "rules-$(_hosttype_).mk"
if _hosttype_ != "$(_hosttype_:B)"
include - "rules-$(_hosttype_:B).mk"
if "$(_hosttype_:B)" != "$(_hosttype_:B:/\([0-9][0-9]*\)[^0-9][^0-9]*[0-9]*$/\1/)"
include - "rules-$(_hosttype_:B:/\([0-9][0-9]*\)[^0-9][^0-9]*[0-9]*$/\1/).mk"
end
end
/*
* local additions
*/
include - "Localrules.mk"