Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/nmake/SYSTEM.mk
1808 views
/*
 * system / subsystem support
 *
 * lhs is subsystem directory name
 * rhs is list of subsystem source file names relative to lhs
 * no* entries disable subsystem prerequisites
 * SS.MAIN is set to the first subsystem and its option table
 * controls all other subsystems
 *
 * rhs supports 2 { ... } grouping forms
 *
 *	{ lhs-identifier ... : rhs-file ... }
 *
 *		if any lhs-identifier is selected then rhs-file selected
 *
 *	{ rhs-file ... }
 *
 *		rhs-file always selected
 *
 * table options are controlled by specifiying no lhs
 * the default setting is in $(SS.TABLE)
 * to clear or reset a table option
 *
 *	:SYSTEM: nostate nomap format=lower
 *
 * no lhs and no rhs clears SS.MAIN
 */

set targetcontext

SS.MAIN =
SS.CURRENT =
SS.TABLE = state format=upper map=obsolete
SS.CALLER =
SS.EXCLUDE =
SS.INTERCEPT = : :: :LIBRARY:

":SYSTEM:" : .MAKE .OPERATOR .PROBEINIT
	if "$(<)"
		.ASSERT : ":_SS_ASSERT_:"
		.INIT : .SS.NOASSERT
		.SS.NOASSERT : .MAKE .FORCE .VIRTUAL
			.ASSERT : .DELETE ":_SS_ASSERT_:"
		if "$(>)" || "$(@:V)" || "$(<:N=*$(CC.SUFFIX.OBJECT))"
			SS.MAIN =
			eval
			$$(<) :SS: $$(>)
				$(@:V)
			end
		else
			SS.CURRENT := $(<)
		end
	else if "$(>)"
		local I N O P
		for I $(>)
			if I == "?(no)(format|map|state)?(=*)"
				O := $(I:/no//)
				SS.TABLE := $(SS.TABLE:N!=$(O)?(=*))
				if I != "no*"
					SS.TABLE += $(I)
				end
			else if I == "?(no)(caller|exclude|intercept)?([-+]=*)"
				O := $(I:/no//)
				N := SS.$(O:/[-+]*=.*//:F=%(upper)s)
				P := $(O:/[^-+=]*[-+]*=//)
				O := $(O:/$(P)//)
				T := $(O:/[-+]*=//)
				O := $(O:/$(T)//)
				if I == "no*"
					O = =
					P =
				else if ! O
					O = =
					P = 1
				end
				if O == "="
					$(N) := $(P)
				else if O == "+="
					if ! "$($(N):N=$$(P))"
						$(N) += $(P)
					end
				else
					$(N) := $($(N):N!=$$(P))
				end
			else
				error 1 $(I): invalid $(%) option
			end
		end
	else
		SS.MAIN =
		SS.CURRENT =
	end

":SS:" : .MAKE .OPERATOR .PROBEINIT
	local DD NN SS G I M N P R S T Y
	SS := $(<:O=1)
	DD := $(<:O=2)
	if ! DD
		DD = .
	else if DD == "-"
		DD := $(SS:D)
	else
		DD := $(DD:D)
	end
	if SS.MAIN
		SS.CURRENT := $(SS)
		if ! SS.ALL
			if "$(SS:D)" != "."
				Y := $($(SS.OPTIONS).$(SS:D:C,/,.,G))
				N := $(no$(SS.OPTIONS).$(SS:D:C,/,.,G)) $(NO$(SS.OPTIONS).$(SS:D:C,/,.,G))
			else
				Y := $($(SS.OPTIONS))
				N := $(no$(SS.OPTIONS)) $(NO$(SS.OPTIONS))
			end
			if ! "$(Y:N=$(SS:B))"
				if "$(N:N=$(SS:B))" || "$(Y:N=no$(SS:B))" || "$(Y:N=NO$(SS:B))"
					NN = 1
				end
			end
				N := $(no$(SS.OPTIONS).$(SS:C,/,.,G)) $(NO$(SS.OPTIONS).$(SS:C,/,.,G))
		end
		Y := $($(SS.OPTIONS).$(SS:C,/,.,G))
	else if "$(>)" || "$(@:V)" || "$(SS:N=*$(CC.SUFFIX.OBJECT))"
		SS.MAIN := $(SS)
		SS.CURRENT =
		if ( SS.OPTIONS = "$(.TABLE.INIT. $(SS.MAIN))" )
			SS.ALL =
		else
			SS.ALL = 1
		end
	else
		SS.CURRENT := $(SS)
	end
	if "$(@:V)" || "$(SS:N=*$(CC.SUFFIX.OBJECT))"
		G := $(SS)
		if ! "$(>)" && ! "$(@:V)"
			$(G) : .OBJECT$(CC.SUFFIX.OBJECT)
		end
	else
		G := $(SS)$(CC.SUFFIX.OBJECT)
	end
	if SS.EXCLUDE
		S = R
		for I $(N)
			if I == "-"
				break
			end
			if I == "{"
				if S != "R"
					error 3 "$(SS): nested {"
				end
				S = T
				T =
				P =
			else if I == ":"
				if S == "T"
					S = P
				else
					error 3 "$(SS): too many :'s"
				end
			else if I == "}"
				if S == "P"
					S = R
					if "$(N:N=$(T:/ /|/G))"
						R += $(P)
					end
				else if S == "T"
					S = R
				else
					error 3 "$(SS): unmatched }"
				end
			else
				$(S) += $(I)
			end
		end
		if S != "R"
			error 3 "$(SS): missing }"
		end
		P =
		for I $(R)
			if "$(I:A=.ATTRIBUTE)" || "$(I)" == "*=*"
				P += $(I)
			else
				S := $(I:D)
				if ! "$(I:A=.TARGET)"
					S := $(SS.CURRENT)/$(S)
				end
				if "$(I:S)"
					P += $(I:D=$(S):B:S)
				else
					P += $(I:D=$(S):B:S=$(CC.SUFFIX.OBJECT))
				end
			end
		end
		no$(SS.MAIN) : $(P)
		R =
		P =
	end
	S = R
	for I $(>) $(Y)
		if I == "-"
			break
		end
		if I == "{"
			if S != "R"
				error 3 "$(SS): nested {"
			end
			S = T
			T =
			P =
		else if I == ":"
			if S == "T"
				S = P
			else
				error 3 "$(SS): too many :'s"
			end
		else if I == "}"
			if S == "P"
				S = R
				I := $(SS.OPTIONS).$(SS:C,/,.,G)
				T := $(T:/ /|/G)
				while I == "*.*"
					if "$($(I):N=$(T))"
						R += $(P)
						break
					end
					I := $(I:B)
				end
			else if S == "T"
				S = R
				R += $(T)
				M += $(T)
			else
				error 3 "$(SS): unmatched }"
			end
		else
			$(S) += $(I)
		end
	end
	if S != "R"
		error 3 "$(SS): missing }"
	end
	if NN && ! SS.EXCLUDE
		if ! M
			return
		end
		R := $(M)
	end
	P =
	for I $(R)
		if "$(I:A=.ATTRIBUTE)" || "$(I)" == "*=*"
			P += $(I)
		else
			S := $(I:D)
			if ! "$(I:A=.TARGET)"
				S := $(SS.CURRENT)/$(S)
			end
			if "$(I:S)"
				P += $(I:D=$(S):B:S)
			else
				P += $(I:D=$(S):B:S=$(CC.SUFFIX.OBJECT))
			end
		end
	end
	eval
	$$(G) :: $$(P)
		$(@:V)
	end
	if SS.EXCLUDE && NN
		no$(SS.MAIN) : $(G)
	else
		if SS.CURRENT
			T := $(SS)
			while 1
				T := $(T:D)
				if T == "$(DD)"
					$(SS.MAIN) : $(G)
					break
				end
				T := $(T:D:B:S=$(CC.SUFFIX.OBJECT))
				$(T) : .OBJECT$(CC.SUFFIX.OBJECT) $(G)
				G := $(T)
			end
		end	
	end

":_SS_ASSERT_:" : .MAKE .OPERATOR
	if "$(SS.CURRENT)" && ! "$(SS:A=.IMMEDIATE)" && ( ! "$(%%:A=.MAKE|.IMMEDIATE)" || "$(%%)" == "$(SS.CALLER:/ /|/G)" ) && "$(%)" == "$(SS.INTERCEPT:/ /|/G))"
		local I T P
		for I $(<)
			if "$(I:A=.ATTRIBUTE|.TARGET)" && ! "$(I:D=$$(SS.CURRENT):B:S:A=.TARGET)"
				T += $(I)
			else
				T += $(I:D=$$(SS.CURRENT):B:S)
			end
		end
		for I $(>)
			if I == "*=*|/*" || "$(I:A=.ATTRIBUTE|.TARGET)"
				P += $(I)
			else
				P += $(I:D=$$(SS.CURRENT)/$$(I:D):B:S)
			end
		end
		eval
		$$(T) $(%) $$(P)
			$(@:V)
		end	
	else
		eval
		$$(<) $(%) $$(>)
			$(@:V)
		end
	end