DIRECTORY BasicTime USING [GMT, nullGMT], Commander USING [Handle], IO USING [STREAM], List USING [AList], RefTab USING [Ref], Rope USING [ROPE]; MakeDo: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; RopeList: TYPE = LIST OF ROPE; RefTable: TYPE = RefTab.Ref; PropList: TYPE = List.AList; Time: TYPE = BasicTime.GMT; notExistTime: Time = BasicTime.nullGMT; unknownTime: Time = LOOPHOLE[FIRST[LONG CARDINAL]]; NodeList: TYPE = LIST OF Node; Node: TYPE = REF NodeRep; NodeRep: TYPE; ActionList: TYPE = LIST OF Action; Action: TYPE = REF ActionRep; ActionRep: TYPE; Warning: SIGNAL [message: ROPE]; IsNode: PROC [REF ANY] RETURNS [BOOL]; NarrowToNode: PROC [REF ANY] RETURNS [Node]; IsAction: PROC [REF ANY] RETURNS [BOOL]; NarrowToAction: PROC [REF ANY] RETURNS [Action]; existsFSWatch: READONLY BOOL; Ensure: PROC [goals: RefTable, modifiabilitySpec: ModifiabilitySpec, supportFiles: RefTable, PerMissedSupportFile: PROC [Node], parent: Commander.Handle] RETURNS [okGoalCount, nonOKGoalCount, nSteps: NAT, failedSteps: ActionList, nonOKGoalList: NodeList]; ModifiabilitySpec: TYPE = RefTable; Modifiability: TYPE = {yes, guess, no, uninitialized}; Explain: PROC [ch: Commander.Handle, nodes: RefTable]; GetActions: PROC [goals: RefTable, modifiabilitySpec: ModifiabilitySpec, report: ReportSpec, neededLeaves, optionalLeaves, determiningLeaves, brokenGoals: RefTable ¬ NIL] RETURNS [actions: ActionList]; ReportSpec: TYPE = {none, toBeDone, all}; DestructivelyReverseActionList: PROC [ActionList] RETURNS [ActionList]; Verify: PROC [pkgList: LIST OF ROPE]; SuspectNodeChange: PROC [n: Node]; SuspectNodesChange: PROC [RefTable]; UncurrentNode: PROC [n: Node]; UncurrentNodes: PROC [RefTable]; UncurrentProducer: PROC [n: Node]; UncurrentProducers: PROC [RefTable]; ForAll: PROC [suspectChange, uncurrent: BOOL]; DestroyGraph: PROC; RetryToProduce: PROC [Node]; MakeRefTable: PROC RETURNS [table: RefTable]; AddToRefTable: PROC [ra: REF ANY, t: RefTable]; EnsureRefInTable: PROC [ra: REF ANY, t: RefTable]; DeleteFromRefTable: PROC [ra: REF ANY, t: RefTable] RETURNS [found: BOOL]; RefInTable: PROC [ra: REF ANY, t: RefTable] RETURNS [BOOL]; ScanRefTable: PROC [table: RefTable, EachNode: PROC [REF ANY] RETURNS [stop: BOOL ¬ FALSE]]; EnumerateNodes: PROC[table: RefTable, EachNode: PROC [Node]]; AnalyzeDFFile: PROC [dfName: ROPE, goals, supportFiles: RefTable, modifiable: ModifiabilitySpec, doToVerifyGoals, doToOtherOwns, doToImports: DoToFile]; DoToFile: TYPE = {ignore, makeGoal, makeModifiable, makeSupport}; FindNode: PROC [someName: ROPE, class: NodeClass] RETURNS [node: Node]; LookupNodeClass: PROC [className: ROPE] RETURNS [class: NodeClass]; ForkParms: TYPE ~ REF ForkParmsRep; ForkParmsRep: TYPE; ForkParmsFromStream: PROC [in: IO.STREAM] RETURNS [ForkParms]; GetForkParms: PROC RETURNS [ForkParms]; SetForkParms: PROC [ForkParms]; ForkParmsFromProfile: PROC RETURNS [ForkParms]; AddFinder: PROC [finder: Finder, end: End]; End: TYPE = {front, back}; Finder: TYPE = RECORD [name: ROPE, finderProc: FinderProc, finderData: REF ANY ¬ NIL]; FinderProc: TYPE = PROC [resultName: ROPE, finderData: REF ANY] RETURNS [found: BOOLEAN, sought: Node, makes, cmdFrom: NodeList, from: From, cmd: ROPE, class: ActionClass, foundData: REF ANY]; From: TYPE = RECORD [mustHave, optional: NodeList]; ActionClass: TYPE = REF ActionClassRep; ActionClassRep: TYPE = RECORD [ CheckConsistency: ConsistencyChecker, Rederive: RederiveProc, EnumHiddenDeps: HiddenDependencyEnumerator ¬ NIL, ClearCaches: ClearCachesProc ¬ NIL, classData: REF ANY ¬ NIL]; ConsistencyChecker: TYPE = PROC [a: Action, result: Node] RETURNS [consistent: BOOL, reason: ROPE]; RederiveProc: TYPE = PROC [a: Action] RETURNS [from: From, cmd: ROPE]; HiddenDependencyEnumerator: TYPE ~ PROC [a: Action, Consume: PROC [Node]]; ClearCachesProc: TYPE ~ PROC [ac: ActionClass]; GetNode: PROC [someName: ROPE, class: NodeClass, mayAdd: BOOL ¬ TRUE] RETURNS [node: Node]; NodeClass: TYPE = REF NodeClassRep; NodeClassRep: TYPE; IsNodeClass: PROC [REF ANY] RETURNS [BOOL]; NarrowToNodeClass: PROC [REF ANY] RETURNS [NodeClass]; DeclareNodeClass: PROC [ name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetInfo: GetInfoProc ] RETURNS [nodeClass: NodeClass]; GetInfoProc: TYPE = PROC [n: Node] RETURNS [created: Time, length: INT]; fileClass: NodeClass; PublicPartsOfNode: PROC [n: Node] RETURNS [name: ROPE, class: NodeClass]; PublicPartsOfNodeClass: PROC [nc: NodeClass] RETURNS [name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetInfo: GetInfoProc]; DescribeNode: PROC [n: Node] RETURNS [ROPE]; GetProp: PROC [n: Node, prop: REF ANY] RETURNS [val: REF ANY]; SetProp: PROC [n: Node, prop, val: REF ANY]; GetProducer: PROC [n: Node] RETURNS [producer: Action]; InnerGetInfo: GetInfoProc; InnerGetCreated: PROC [n: Node] RETURNS [t: Time]; InnerExists: PROC [n: Node, zeroLenExists: BOOL _ TRUE] RETURNS [exists: BOOL]; PublicPartsOfAction: PROC [a: Action] RETURNS [cmd: ROPE, foundData: REF ANY, class: ActionClass]; InnerEnumerateSources: PROC [a: Action, which: ActionDep, to: PROC [n: Node, which: ActionDep, optional: BOOL]]; ActionDep: TYPE = {cmd, data}; FmtTime: PROC [Time] RETURNS [ROPE]; GetCreated: PROC [n: Node] RETURNS [t: Time]; GetInfo: GetInfoProc; Exists: PROC [n: Node, zeroLenExists: BOOL _ TRUE] RETURNS [exists: BOOL]; EnumerateConsumers: PROC [n: Node, which: ActionDep, to: PROC [Action, ActionDep]]; EnumerateResults: PROC [a: Action, to: PROC [Node]]; EnumerateSources: PROC [a: Action, which: ActionDep, to: PROC [n: Node, which: ActionDep, optional: BOOL]]; END. ° MakeDo.Mesa Copyright Ó 1991 by Xerox Corporation. All rights reserved. Last Edited by: Spreitzer, May 9, 1986 8:37:53 pm PDT Eduardo Pelegri-Llopart November 18, 1988 8:49:52 am PST Last tweaked by Mike Spreitzer on October 6, 1992 11:03 am PDT Carl Hauser, April 11, 1985 3:34:27 pm PST New Types & Stuff: For deriving dependecies and ensuring consistency: Ensure that given goal nodes are current. If supportFiles is non-nil, every leaf file node that the goals recursively depend on and that wasn't already in supportFiles is added and passed to PerMissedSupportFile (if given). NIL means guess, #NIL means modifiable iff in Table. List edges of the nodes, and give status of their producers. Recursively explores graph to leaves. Returns some actions, according to report. The order of those actions is: actions to do later appear earlier. It is recommended that you not try to interrupt the following: If it has no producer (other than leaf), try (again) to get one. class may not be NIL. For controlling concurrency: ForkParms is dependent on the target system For Stating dependency rules: Missing inputs necessitate any result being consistent; but then, this won't be called if there are missing inputs. Called when one of the action's determiners changes. When destroying the entire dependency graph, this PROC is also called to clear any caches the ActionClass may be keeping. class may not be NIL. name will first be canonized. = {exists _ (created # notExistTime) AND (zeroLenExists OR length#0)} Should only be used from inside ActionClass procs only when called from MakeDo impl. For Extracting the Dependency Graph: = {exists _ (created # notExistTime) AND (zeroLenExists OR length#0)} Ê •NewlineDelimiter –(cedarcode) style™code™ Kšœ Ïeœ1™K™*—K˜šÏk ˜ Kšœ žœžœ ˜Kšœ žœ ˜Kšžœžœžœ˜Kšœžœ ˜Kšœžœ˜Kšœžœžœ˜—K˜KšÐbxœžœž œ˜K˜Kšž˜K˜Kšžœžœžœ˜Kš œ žœžœžœžœ˜Kšœ žœ˜Kšœ žœ˜Kšœžœ žœ˜K˜'Kš œžœžœžœžœ˜3head™Kšœ žœžœžœ˜Kšœžœžœžœ˜(Kšœ žœžœžœ˜"Kšœžœžœžœ˜.K˜KšÐblœžœ žœ˜ K˜Kš Ïnœžœžœžœžœžœ˜&Kš ¡ œžœžœžœžœ˜,Kš ¡œžœžœžœžœžœ˜(Kš ¡œžœžœžœžœ ˜0K˜Kšœžœžœ˜—™2š ¡œžœQ¡œžœ#žœ'žœ4˜ÿKšœ)™)Kšœ œb œ8™µ—K˜šœžœ ˜#K™4—K˜Kšœžœ#˜6K˜š¡œžœ)˜6K™<—K˜š¡ œžœ–žœžœ˜ÉK™%Kšœ#œ™*K™BK˜Kšœ žœ˜)Kš¡œžœžœ˜G—K˜Kš ¡œžœ žœžœžœ˜%K˜K™>Kš¡œžœ ˜"Kš¡œžœ ˜$Kš¡ œžœ ˜Kš¡œžœ ˜ Kš¡œžœ ˜"Kš¡œžœ ˜$Kš¡œžœžœ˜.Kš¡ œžœ˜š¡œžœ˜K™@—K˜Kš¡ œžœžœ˜-Kš¡ œžœžœžœ˜/Kš¡œžœžœžœ˜2Kš ¡œžœžœžœžœ žœ˜JKš ¡ œžœžœžœžœžœ˜;Kš¡ œžœ¡œžœžœžœžœžœžœ˜\Kš¡œžœ¡œžœ ˜=K˜K˜š¡ œžœ žœw˜˜Kšœ žœ3˜A—K˜š¡œžœ žœžœ˜GK™—K˜Kš¡œžœ žœžœ˜C—™Kšœ žœžœžœ˜7Kš ¡œžœžœžœžœ ˜>Kš¡ œžœžœ ˜'Kš¡ œžœ ˜š¡žœžœ ˜/K™+——™Kš¡ œžœ˜+Kšœžœ˜K˜Kš œžœžœžœ&žœžœžœ˜VK˜Kš¡ œžœžœžœžœžœžœ žœ;žœ!žœžœ˜ÀK˜Kšœžœžœ ˜3K˜Kšœ žœžœ˜'šœžœžœ˜Kš¡œ˜%Kš¡œ˜Kš¡œžœ˜1Kš¡ œžœ˜#Kšœ žœžœžœ˜—K˜š œžœžœžœžœ žœ˜cK™s—K˜š œžœžœ žœžœ˜FK™4—K˜Kš œžœžœ ¡œžœ ˜JK˜šœžœžœ˜/Kšœy™yK˜—š ¡œžœ žœžœžœžœ˜[K™K™—K˜Kšœ žœžœ˜#Kšœžœ˜K˜Kš ¡ œžœžœžœžœžœ˜+Kš ¡œžœžœžœžœ ˜6K˜š¡œ˜šžœ˜Kšœžœ˜ Kš ¡ œžœžœžœžœ˜)Kš¡œ ˜Kšœ˜—Kšžœ˜—K˜Kš ¡ œžœžœ žœžœ˜HK˜K˜Kš¡œžœ žœžœ˜IKš¡œžœžœžœ¡ œžœžœžœžœ¡œ˜‚Kš¡ œžœ žœžœ˜,Kš¡œžœžœžœžœžœžœ˜>Kš¡œžœžœžœ˜,Kš¡ œžœ žœ˜7Kš¡ œ˜Kš¡œžœ žœ ˜2š ¡ œžœžœžœžœ žœ˜OKšœE™E—K˜Kš ¡œžœ žœžœ žœžœ˜bš¡œžœ#žœ'žœ˜pKšœT™T—K˜Kšœ žœ˜K˜Kš¡œžœžœžœ˜$—K˜™$Kš¡ œžœ žœ ˜-Kš¡œ˜š ¡œžœžœžœžœ žœ˜JKšœE™E—Kš¡œžœ!žœ˜SKš¡œžœžœ ˜4Kš¡œžœ#žœ'žœ˜k—K˜Kšžœ˜—…—à%£