From 0f371949ece5f7a5e0bcbc3283bb14fba2cc4737 Mon Sep 17 00:00:00 2001 From: cas Date: Fri, 22 Oct 1999 18:05:40 +0000 Subject: [PATCH] Initial revision --- src/WOKMake/FILES | 4 + src/WOKMake/WOKMake.cdl | 132 ++ src/WOKMake/WOKMake_AdmFileTypes.hxx | 18 + src/WOKMake/WOKMake_BuildProcess.cdl | 140 ++ src/WOKMake/WOKMake_BuildProcess.cxx | 384 +++++ src/WOKMake/WOKMake_BuildProcess.lxx | 95 ++ src/WOKMake/WOKMake_BuildProcessGroup.cdl | 59 + src/WOKMake/WOKMake_BuildProcessGroup.cxx | 91 + src/WOKMake/WOKMake_BuildProcessIterator.cdl | 57 + src/WOKMake/WOKMake_BuildProcessIterator.cxx | 664 ++++++++ src/WOKMake/WOKMake_DepItem.cdl | 77 + src/WOKMake/WOKMake_DepItem.cxx | 237 +++ src/WOKMake/WOKMake_DepItem.lxx | 45 + src/WOKMake/WOKMake_DepItemHasher.cdl | 24 + src/WOKMake/WOKMake_DepItemHasher.cxx | 30 + src/WOKMake/WOKMake_InputFile.cdl | 80 + src/WOKMake/WOKMake_InputFile.cxx | 322 ++++ src/WOKMake/WOKMake_InputFile.lxx | 16 + src/WOKMake/WOKMake_MetaStep.cdl | 89 + src/WOKMake/WOKMake_MetaStep.cxx | 567 +++++++ src/WOKMake/WOKMake_OutputFile.cdl | 81 + src/WOKMake/WOKMake_OutputFile.cxx | 353 ++++ src/WOKMake/WOKMake_OutputFile.lxx | 28 + src/WOKMake/WOKMake_Step.cdl | 352 ++++ src/WOKMake/WOKMake_Step.cxx | 1548 ++++++++++++++++++ src/WOKMake/WOKMake_Step.lxx | 62 + src/WOKMake/WOKMake_StepAccessMacro.hxx | 24 + src/WOKMake/WOKMake_StepBuilder.cdl | 59 + src/WOKMake/WOKMake_StepBuilder.cxx | 400 +++++ src/WOKMake/WOKMake_StepConstructPtr.hxx | 23 + src/WOKMake/WOKMake_StepFile.cdl | 83 + src/WOKMake/WOKMake_StepFile.cxx | 124 ++ src/WOKMake/WOKMake_StepFile.lxx | 105 ++ src/WOKMake/WOKMake_Step_1.cxx | 458 ++++++ src/WOKMake/WOKMake_TriggerStep.cdl | 76 + src/WOKMake/WOKMake_TriggerStep.cxx | 312 ++++ 36 files changed, 7219 insertions(+) create mode 100755 src/WOKMake/FILES create mode 100755 src/WOKMake/WOKMake.cdl create mode 100755 src/WOKMake/WOKMake_AdmFileTypes.hxx create mode 100755 src/WOKMake/WOKMake_BuildProcess.cdl create mode 100755 src/WOKMake/WOKMake_BuildProcess.cxx create mode 100755 src/WOKMake/WOKMake_BuildProcess.lxx create mode 100755 src/WOKMake/WOKMake_BuildProcessGroup.cdl create mode 100755 src/WOKMake/WOKMake_BuildProcessGroup.cxx create mode 100755 src/WOKMake/WOKMake_BuildProcessIterator.cdl create mode 100755 src/WOKMake/WOKMake_BuildProcessIterator.cxx create mode 100755 src/WOKMake/WOKMake_DepItem.cdl create mode 100755 src/WOKMake/WOKMake_DepItem.cxx create mode 100755 src/WOKMake/WOKMake_DepItem.lxx create mode 100755 src/WOKMake/WOKMake_DepItemHasher.cdl create mode 100755 src/WOKMake/WOKMake_DepItemHasher.cxx create mode 100755 src/WOKMake/WOKMake_InputFile.cdl create mode 100755 src/WOKMake/WOKMake_InputFile.cxx create mode 100755 src/WOKMake/WOKMake_InputFile.lxx create mode 100755 src/WOKMake/WOKMake_MetaStep.cdl create mode 100755 src/WOKMake/WOKMake_MetaStep.cxx create mode 100755 src/WOKMake/WOKMake_OutputFile.cdl create mode 100755 src/WOKMake/WOKMake_OutputFile.cxx create mode 100755 src/WOKMake/WOKMake_OutputFile.lxx create mode 100755 src/WOKMake/WOKMake_Step.cdl create mode 100755 src/WOKMake/WOKMake_Step.cxx create mode 100755 src/WOKMake/WOKMake_Step.lxx create mode 100755 src/WOKMake/WOKMake_StepAccessMacro.hxx create mode 100755 src/WOKMake/WOKMake_StepBuilder.cdl create mode 100755 src/WOKMake/WOKMake_StepBuilder.cxx create mode 100755 src/WOKMake/WOKMake_StepConstructPtr.hxx create mode 100755 src/WOKMake/WOKMake_StepFile.cdl create mode 100755 src/WOKMake/WOKMake_StepFile.cxx create mode 100755 src/WOKMake/WOKMake_StepFile.lxx create mode 100755 src/WOKMake/WOKMake_Step_1.cxx create mode 100755 src/WOKMake/WOKMake_TriggerStep.cdl create mode 100755 src/WOKMake/WOKMake_TriggerStep.cxx diff --git a/src/WOKMake/FILES b/src/WOKMake/FILES new file mode 100755 index 0000000..766326d --- /dev/null +++ b/src/WOKMake/FILES @@ -0,0 +1,4 @@ +WOKMake_Step_1.cxx +WOKMake_AdmFileTypes.hxx +WOKMake_StepAccessMacro.hxx +WOKMake_StepConstructPtr.hxx diff --git a/src/WOKMake/WOKMake.cdl b/src/WOKMake/WOKMake.cdl new file mode 100755 index 0000000..c0d4714 --- /dev/null +++ b/src/WOKMake/WOKMake.cdl @@ -0,0 +1,132 @@ +-- File: WOKMake.cdl +-- Created: Wed 28 Jun 15:22:48 1995 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1995 + + +package WOKMake + + ---Purpose: umake Command + -- + -- Implements the Notion of a WOKernel Entities Construction + -- + -- WOKMake Handles the link beetween WOKernel and WOKBuilder + -- + +uses + WOKernel, + WOKBuilder, + WOKUtils, + WOKTools, + TColStd, + TCollection, + MMgt, + Standard +is + + enumeration DependStatus is Unknown, TargetNotFound, DepListChanged, OutOfDate + ---Purpose: Lists various cases of dependance status + end DependStatus; + + enumeration Status is Uptodate, Success, Incomplete, Failed, Processed, Unprocessed; + ---Purpose: Status of Step Execution + -- + -- UpToDate : All out Entities are built and UpToDate + -- Success : Entities out of date where processed successfully + -- Incomplete : Available Entities out of date where processed successfully + -- (but some are still missing) + -- Failed : Some of the entities could not be processed. + + enumeration StepOption is Force, None; + + enumeration FileStatus is Undetermined, Disappeared, New, Same, Moved; + + --class StepDescrExplorer; + + deferred class StepFile; + class InputFile; + class OutputFile; + + class DepItem; + + imported StepConstructPtr; + class StepBuilder; + + deferred class Step; + + class MetaStep; + class TriggerStep; + + --class StepDescr; + class BuildProcessGroup; + class BuildProcess; + ---Purpose: BuildProcess handles Step Sequence execution + -- (within a unit or units) + + class BuildProcessIterator; + + pointer BuildProcessPtr to BuildProcess from WOKMake; + +-- INSTANTIATIONS + + class SequenceOfInputFile + instantiates Sequence from TCollection ( InputFile from WOKMake ); + class HSequenceOfInputFile + instantiates HSequence from TCollection ( InputFile from WOKMake , + SequenceOfInputFile from WOKMake ); + class SequenceOfOutputFile + instantiates Sequence from TCollection ( OutputFile from WOKMake ); + class HSequenceOfOutputFile + instantiates HSequence from TCollection ( OutputFile from WOKMake , + SequenceOfOutputFile from WOKMake ); + + class SequenceOfStepOption + instantiates Sequence from TCollection ( StepOption from WOKMake ); + + class HSequenceOfStepOption + instantiates HSequence from TCollection ( StepOption from WOKMake, + SequenceOfStepOption from WOKMake ); + + class IndexedDataMapOfBuildProcessGroup + instantiates IndexedDataMap from WOKTools ( HAsciiString from TCollection, + BuildProcessGroup from WOKMake, + HAsciiStringHasher from WOKTools ); + + private class DataMapOfHAsciiStringOfDevUnit + ---Purpose: Used To List Known DevUnits in a visibility + -- Accelerates Step ImplementationDep + instantiates DataMap from WOKTools ( HAsciiString from TCollection, + DevUnit from WOKernel, + HAsciiStringHasher from WOKTools ); + + class IndexedDataMapOfHAsciiStringOfInputFile + instantiates IndexedDataMap from WOKTools ( HAsciiString from TCollection, + InputFile from WOKMake, + HAsciiStringHasher from WOKTools ); + + class IndexedDataMapOfHAsciiStringOfOutputFile + instantiates IndexedDataMap from WOKTools ( HAsciiString from TCollection, + OutputFile from WOKMake, + HAsciiStringHasher from WOKTools ); + + private class DepItemHasher; + class IndexedMapOfDepItem + instantiates IndexedMap from WOKTools ( DepItem from WOKMake, + DepItemHasher from WOKMake ); + + class DataMapOfHAsciiStringOfStep + instantiates DataMap from WOKTools ( HAsciiString from TCollection, + Step from WOKMake, + HAsciiStringHasher from WOKTools ); + + class DataMapOfHAsciiStringOfSequenceOfHAsciiString + instantiates DataMap from WOKTools ( HAsciiString from TCollection, + SequenceOfHAsciiString from TColStd, + HAsciiStringHasher from WOKTools ); + + class DataMapOfHAsciiStringOfStepBuilder + instantiates DataMap from WOKTools ( HAsciiString from TCollection, + StepBuilder from WOKMake, + HAsciiStringHasher from WOKTools ); +end WOKMake; diff --git a/src/WOKMake/WOKMake_AdmFileTypes.hxx b/src/WOKMake/WOKMake_AdmFileTypes.hxx new file mode 100755 index 0000000..4686acf --- /dev/null +++ b/src/WOKMake/WOKMake_AdmFileTypes.hxx @@ -0,0 +1,18 @@ +// File: WOKMake_AdmFileTypes.hxx +// Created: Wed Mar 6 20:10:35 1996 +// Author: Jean GAUTIER +// + + +#ifndef WOKMake_AdmFileTypes_HeaderFile +#define WOKMake_AdmFileTypes_HeaderFile + +static const char ADMFILE[] = "admfile"; +static const char DBADMFILE[] = "dbadmfile"; +static const char STADMFILE[] = "stadmfile"; + +static const char TMPDIR[] = "tmpdir"; +static const char DBTMPDIR[] = "dbtmpdir"; +static const char STTMPDIR[] = "sttmpdir"; + +#endif diff --git a/src/WOKMake/WOKMake_BuildProcess.cdl b/src/WOKMake/WOKMake_BuildProcess.cdl new file mode 100755 index 0000000..acdcd58 --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcess.cdl @@ -0,0 +1,140 @@ +-- File: WOKMake_BuildProcess.cdl +-- Created: Wed Mar 19 16:20:44 1997 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1997 + + +class BuildProcess from WOKMake +inherits TShared from MMgt + + ---Purpose: + +uses + HAsciiString from TCollection, + Shell from WOKUtils, + DevUnit from WOKernel, + UnitGraph from WOKernel, + Locator from WOKernel, + MSTranslatorIterator from WOKBuilder, + BuildProcessGroup from WOKMake, + Step from WOKMake, + DataMapOfHAsciiStringOfStep from WOKMake, + IndexedDataMapOfBuildProcessGroup from WOKMake, + HSequenceOfHAsciiString from TColStd, + SequenceOfHAsciiString from TColStd, + Boolean from Standard, + MapOfHAsciiString from WOKTools, + IndexedDataMapOfHAsciiStringOfInputFile from WOKMake, + DataMapOfHAsciiStringOfSequenceOfHAsciiString from WOKMake + +is + + Create(alocator : Locator from WOKernel; ashell : Shell from WOKUtils; aunitgraph : UnitGraph from WOKernel) + returns mutable BuildProcess from WOKMake; + + + UnitGraph(me) + ---C++: return const & + ---C++: inline + returns UnitGraph from WOKernel; + + Locator(me) + ---C++: return const & + ---C++: inline + returns Locator from WOKernel; + + Shell(me) + ---C++: return const & + ---C++: inline + returns Shell from WOKUtils; + + TranslatorIterator(me:mutable) + ---C++: return & + ---C++: inline + returns MSTranslatorIterator from WOKBuilder; + + GetKnownUnits(me:mutable); + + KnownUnits(me:mutable) + ---C++: return & + ---C++: inline + returns MapOfHAsciiString from WOKTools; + + MakeState(me:mutable) + ---C++: return & + ---C++: inline + returns IndexedDataMapOfHAsciiStringOfInputFile from WOKMake; + + ComputeSteps(me:mutable; aunit : DevUnit from WOKernel) + returns Boolean from Standard; + + RemoveStep(me:mutable; aid : HAsciiString from TCollection) + returns Boolean from Standard; + + RemoveUnit(me:mutable; aname : HAsciiString from TCollection) + returns Boolean from Standard; + + ClearUnits(me:mutable); + + Steps(me) + ---C++: return const & + ---C++: inline + returns DataMapOfHAsciiStringOfStep from WOKMake; + + ClearGroups(me:mutable); + + Groups(me) + ---C++: return const & + ---C++: inline + returns IndexedDataMapOfBuildProcessGroup from WOKMake; + + Units(me) + ---C++: return const & + ---C++: inline + returns DataMapOfHAsciiStringOfSequenceOfHAsciiString from WOKMake; + + GetGroup(me:mutable; aname : HAsciiString from TCollection) + returns BuildProcessGroup from WOKMake; + + AddStep(me:mutable; astep : Step from WOKMake) is private; + + StepExists(me:mutable; aunit : DevUnit from WOKernel; acode : HAsciiString from TCollection) + returns Boolean from Standard; + + GetStepFromID(me:mutable; anid : HAsciiString from TCollection) + returns Step from WOKMake; + + GetAndAddStep(me:mutable; aunit : DevUnit from WOKernel; acode, asubcode : HAsciiString from TCollection) + ---C++: return const & + returns Step from WOKMake; + + IsUnitInProcess(me; aname : HAsciiString from TCollection) + returns Boolean from Standard; + + GetUnitSteps(me; aunit : HAsciiString from TCollection) + ---C++: return const & + returns SequenceOfHAsciiString from TColStd; + + Find(me; aunit : DevUnit from WOKernel; acode, asubcode : HAsciiString from TCollection) + ---C++: return const & + returns Step from WOKMake; + + Find(me; anid : HAsciiString from TCollection) + ---C++: return const & + returns Step from WOKMake; + +fields + + myunitgraph : UnitGraph from WOKernel; + mylocator : Locator from WOKernel; + myshell : Shell from WOKUtils; + mycdlit : MSTranslatorIterator from WOKBuilder; + myknownunits : MapOfHAsciiString from WOKTools; + mymakestate : IndexedDataMapOfHAsciiStringOfInputFile from WOKMake; + + mysteps : DataMapOfHAsciiStringOfStep from WOKMake; + mygroups : IndexedDataMapOfBuildProcessGroup from WOKMake; + myunits : DataMapOfHAsciiStringOfSequenceOfHAsciiString from WOKMake; + +end BuildProcess; diff --git a/src/WOKMake/WOKMake_BuildProcess.cxx b/src/WOKMake/WOKMake_BuildProcess.cxx new file mode 100755 index 0000000..31d9d38 --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcess.cxx @@ -0,0 +1,384 @@ +// File: WOKMake_BuildProcess.cxx +// Created: Mon Mar 24 13:45:01 1997 +// Author: Jean GAUTIER +// + +#include + +#include + +#include + +#include +#include + +#include + +#include + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_BuildProcess +//purpose : +//======================================================================= +WOKMake_BuildProcess::WOKMake_BuildProcess(const Handle(WOKernel_Locator)& alocator, + const Handle(WOKUtils_Shell)& ashell, + const Handle(WOKernel_UnitGraph)& agraph) +: mylocator(alocator), myshell(ashell), myunitgraph(agraph), mycdlit(WOKBuilder_MSTool::GetMSchema()) +{ +} + +//======================================================================= +//function : GetKnownUnits +//purpose : +//======================================================================= +void WOKMake_BuildProcess::GetKnownUnits() +{ + if(!myknownunits.Extent()) + { + // Liste des Uds connues + Handle(TColStd_HSequenceOfHAsciiString) aseq = mylocator->Visibility(); + Handle(TColStd_HSequenceOfHAsciiString) units; + Handle(TCollection_HAsciiString) aunitname; + Handle(TCollection_HAsciiString) afullname, abasename; + Standard_Integer i,j; + + for(i=1; i<=aseq->Length(); i++) + { + const Handle(WOKernel_UnitNesting)& anesting = mylocator->Session()->GetUnitNesting(aseq->Value(i)); + anesting->Open(); + + units = anesting->Units(); + + for(j=1; j<=units->Length(); j++) + { + aunitname = mylocator->Session()->GetDevUnit(units->Value(j))->Name(); + if(!myknownunits.Contains(aunitname)) + { + myknownunits.Add(aunitname); + } + } + } + } + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ComputeSteps +//purpose : +//======================================================================= +Standard_Boolean WOKMake_BuildProcess::ComputeSteps(const Handle(WOKernel_DevUnit)& aunit) +{ + + + if(myunits.IsBound(aunit->Name())) return Standard_False; + + Handle(TCollection_HAsciiString) groups = aunit->Params().Eval("%WOKSteps_Groups"); + + if(groups.IsNull()) + { + ErrorMsg << "WOKMake_BuildProcess::ComputeSteps" + << "Could not eval %WOKSteps_Groups setting build process groups" << endm; + return Standard_True; + } + + Standard_Integer i = 1; + Handle(TCollection_HAsciiString) group = groups->Token(" \t", i); + + myunits.Bind(aunit->Name(), TColStd_SequenceOfHAsciiString()); + + TColStd_SequenceOfHAsciiString& unitsteps = myunits(aunit->Name()); + + while(!group->IsEmpty()) + { + Handle(WOKMake_BuildProcessGroup) agroup = GetGroup(group); + + + Handle(TCollection_HAsciiString) groupstepsname = new TCollection_HAsciiString("%WOKSteps_"); + + groupstepsname->AssignCat(group); + groupstepsname->AssignCat("Group"); + + Handle(TCollection_HAsciiString) groupsteps = aunit->Params().Eval(groupstepsname->ToCString()); + + if(!groupsteps.IsNull()) + { + Standard_Integer j=1; + Handle(TCollection_HAsciiString) step = groupsteps->Token(" \t", j); + + while(!step->IsEmpty()) + { + Handle(WOKMake_Step) thestep = WOKMake_StepBuilder::BuildStep(this, aunit, step, Handle(TCollection_HAsciiString)()); + + if(!thestep.IsNull()) + { + agroup->AddStep(thestep->UniqueName()); + unitsteps.Append(thestep->UniqueName()); + if(!mysteps.IsBound(thestep->UniqueName())) mysteps.Bind(thestep->UniqueName(), thestep); + } + else + { + ErrorMsg << "WOKMake_BuildProcess::ComputeSteps" + << "Could not build step " << step << " for unit " << aunit->Name() << endm; + } + j++; + step = groupsteps->Token(" \t", j); + } + } + else + { + WarningMsg << "WOKMake_BuildProcess::ComputeSteps" + << "Could not eval step group " << group << " (%WOKSteps_" << group << "Group" << ")" << endm; + } + + if(!mygroups.Contains(agroup->Name())) + mygroups.Add(agroup->Name(), agroup); + + i++; + group = groups->Token(" \t", i); + } + + + return Standard_False; +} + +//======================================================================= +//function : RemoveStep +//purpose : +//======================================================================= +Standard_Boolean WOKMake_BuildProcess::RemoveStep(const Handle(TCollection_HAsciiString)& anid) +{ + if(mysteps.IsBound(anid)) + { + mysteps.UnBind(anid); + return Standard_True; + } + return Standard_False; +} + +//======================================================================= +//function : RemoveStep +//purpose : +//======================================================================= +Standard_Boolean WOKMake_BuildProcess::RemoveUnit(const Handle(TCollection_HAsciiString)& aname) +{ + if(myunits.IsBound(aname)) + { + TColStd_SequenceOfHAsciiString& steps = myunits.ChangeFind(aname); + + for(Standard_Integer i=1; iName(), result); + return result; + } +} + +//======================================================================= +//function : ClearGroups +//purpose : +//======================================================================= +void WOKMake_BuildProcess::ClearGroups() +{ + mygroups.Clear(); +} + +//======================================================================= +//function : StepExists +//purpose : +//======================================================================= +Standard_Boolean WOKMake_BuildProcess::StepExists(const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode) +{ + Handle(TCollection_HAsciiString) anid = WOKMake_Step::UniqueName(aunit, acode, Handle(TCollection_HAsciiString)()); + + if(mysteps.IsBound(anid)) return Standard_True; + + if(myunits.IsBound(aunit->Name())) + { + return Standard_False; + } + else + { + Handle(WOKMake_Step) thestep = WOKMake_StepBuilder::BuildStep(this, aunit, acode,Handle(TCollection_HAsciiString)()); + if(!thestep.IsNull()) + return Standard_True; + else + return Standard_False; + } +} + +//======================================================================= +//function : GetStepFromID +//purpose : +//======================================================================= +Handle(WOKMake_Step) WOKMake_BuildProcess::GetStepFromID(const Handle(TCollection_HAsciiString)& anid) +{ + Handle(WOKMake_Step) result; + + if(mysteps.IsBound(anid)) + { + result = mysteps.Find(anid); + } + + if(result.IsNull()) + { + Handle(TCollection_HAsciiString) uname, acode, asubcode; + + WOKMake_Step::SplitUniqueName(anid, uname, acode, asubcode); + + Handle(WOKernel_DevUnit) aunit = Locator()->LocateDevUnit(uname); + + if(!aunit.IsNull()) + { + result = WOKMake_StepBuilder::BuildStep(this, aunit, acode,asubcode); + + if(result.IsNull()) + { + ErrorMsg << "WOKMake_BuildProcess::GetStepFromID" + << "Cannot get step " << acode << " for unit " << aunit->Name() << " (type : " << aunit->Type() << ")" << endm; + return result; + } + mysteps.Bind(result->UniqueName(), result); + } + else + { + ErrorMsg << "WOKMake_BuildProcess::GetStepFromID" + << "Cannot locate dev unit : " << uname << endm; + return result; + } + } + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetAndAddStep +//purpose : +//======================================================================= +const Handle(WOKMake_Step)& WOKMake_BuildProcess::GetAndAddStep(const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Handle(TCollection_HAsciiString)& asubcode) +{ + static Handle(WOKMake_Step) NULLRESULT; + Handle(TCollection_HAsciiString) anid = WOKMake_Step::UniqueName(aunit, acode, asubcode); + + if(mysteps.IsBound(anid)) + { + const Handle(WOKMake_Step)& result = mysteps.Find(anid); + + if(result.IsNull()) + return NULLRESULT; + else return result; + } + + if(myunits.IsBound(aunit->Name()) && asubcode.IsNull()) + { + ErrorMsg << "WOKMake_BuildProcess::GetAndAddStep" + << "Cannot get step (" << acode << ") for unit " << aunit->Name() << " (type : " << aunit->Type() << ")" << endm; + return NULLRESULT; + } + else + { + Handle(WOKMake_Step) thestep = WOKMake_StepBuilder::BuildStep(this, aunit, acode,asubcode); + if(!thestep.IsNull()) + { + thestep->SetSubCode(asubcode); + mysteps.Bind(thestep->UniqueName(), thestep); + return mysteps.Find(thestep->UniqueName()); + } + else + { + ErrorMsg << "WOKMake_BuildProcess::GetAndAddStep" + << "Cannot get step " << acode << " for unit " << aunit->Name() << " (type : " << aunit->Type() << ")" << endm; + return NULLRESULT; + } + } +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsUnitInProcess +//purpose : +//======================================================================= +Standard_Boolean WOKMake_BuildProcess::IsUnitInProcess(const Handle(TCollection_HAsciiString)& aname) const +{ + return myunits.IsBound(aname); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetUnitSteps +//purpose : +//======================================================================= +const TColStd_SequenceOfHAsciiString& WOKMake_BuildProcess::GetUnitSteps(const Handle(TCollection_HAsciiString)& aname) const +{ + static TColStd_SequenceOfHAsciiString EMPTYRESULT; + + if(!myunits.IsBound(aname)) + { + return EMPTYRESULT; + } + else + return myunits.Find(aname); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetStep +//purpose : +//======================================================================= +const Handle(WOKMake_Step)& WOKMake_BuildProcess::Find(const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Handle(TCollection_HAsciiString)& asubcode) const +{ + Handle(TCollection_HAsciiString) anid = WOKMake_Step::UniqueName(aunit, acode, asubcode); + + static Handle(WOKMake_Step) NULLRESULT; + + if(mysteps.IsBound(anid)) return mysteps.Find(anid); + + return NULLRESULT; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetStep +//purpose : +//======================================================================= +const Handle(WOKMake_Step)& WOKMake_BuildProcess::Find(const Handle(TCollection_HAsciiString)& astepid) const +{ + static Handle(WOKMake_Step) NULLRESULT; + + if(mysteps.IsBound(astepid)) return mysteps.Find(astepid); + return NULLRESULT; +} + diff --git a/src/WOKMake/WOKMake_BuildProcess.lxx b/src/WOKMake/WOKMake_BuildProcess.lxx new file mode 100755 index 0000000..8ab1fc6 --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcess.lxx @@ -0,0 +1,95 @@ +// File: WOKMake_BuildProcess.lxx +// Created: Mon Mar 24 15:12:08 1997 +// Author: Jean GAUTIER +// + +//======================================================================= +//Author : Jean Gautier (jga) +//function : UnitGraph +//purpose : +//======================================================================= +inline const Handle(WOKernel_UnitGraph)& WOKMake_BuildProcess::UnitGraph() const +{ + return myunitgraph; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Locator +//purpose : +//======================================================================= +inline const Handle(WOKernel_Locator)& WOKMake_BuildProcess::Locator() const +{ + return mylocator; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Shell +//purpose : +//======================================================================= +inline const Handle(WOKUtils_Shell)& WOKMake_BuildProcess::Shell() const +{ + return myshell; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Steps +//purpose : +//======================================================================= +inline const WOKMake_DataMapOfHAsciiStringOfStep& WOKMake_BuildProcess::Steps() const +{ + return mysteps; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Groups +//purpose : +//======================================================================= +inline const WOKMake_IndexedDataMapOfBuildProcessGroup& WOKMake_BuildProcess::Groups() const +{ + return mygroups; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Units +//purpose : +//======================================================================= +inline const WOKMake_DataMapOfHAsciiStringOfSequenceOfHAsciiString& WOKMake_BuildProcess::Units() const +{ + return myunits; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : TranslatorIterator +//purpose : +//======================================================================= +inline WOKBuilder_MSTranslatorIterator& WOKMake_BuildProcess::TranslatorIterator() +{ + return mycdlit; +} + +//======================================================================= +//function : KnownUnits +//purpose : +//======================================================================= +inline WOKTools_MapOfHAsciiString& WOKMake_BuildProcess::KnownUnits() +{ + return myknownunits; +} + +//======================================================================= +//function : MakeState +//purpose : +//======================================================================= +inline WOKMake_IndexedDataMapOfHAsciiStringOfInputFile& WOKMake_BuildProcess::MakeState() +{ + return mymakestate; +} diff --git a/src/WOKMake/WOKMake_BuildProcessGroup.cdl b/src/WOKMake/WOKMake_BuildProcessGroup.cdl new file mode 100755 index 0000000..22a45df --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcessGroup.cdl @@ -0,0 +1,59 @@ +-- File: WOKMake_BuildProcessGroup.cdl +-- Created: Thu Jun 12 11:13:05 1997 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1997 + + +class BuildProcessGroup from WOKMake +inherits TShared from MMgt + + ---Purpose: + +uses + BuildProcess from WOKMake, + BuildProcessPtr from WOKMake, + Step from WOKMake, + UnitGraph from WOKernel, + SequenceOfHAsciiString from TColStd, + HAsciiString from TCollection + + +is + + Create(abp : BuildProcess from WOKMake; aname : HAsciiString from TCollection) + returns BuildProcessGroup from WOKMake; + + Name(me) + returns HAsciiString from TCollection; + + AddStep(me:mutable; astep : HAsciiString from TCollection); + + Steps(me) + ---C++: return const & + returns SequenceOfHAsciiString from TColStd; + + Step(me; anidx : Integer from Standard) + ---C++: return const & + returns Step from WOKMake; + + Length(me) + returns Integer from Standard; + + + ChangeSteps(me:mutable; aseq : SequenceOfHAsciiString from TColStd); + + + IsOrdered(me) + returns Boolean; + + SetOrdered(me:mutable); + +fields + + myname : HAsciiString from TCollection; + mybp : BuildProcessPtr from WOKMake; + mysteps : SequenceOfHAsciiString from TColStd; + myordered : Boolean from Standard; + +end BuildProcessGroup; diff --git a/src/WOKMake/WOKMake_BuildProcessGroup.cxx b/src/WOKMake/WOKMake_BuildProcessGroup.cxx new file mode 100755 index 0000000..0d03327 --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcessGroup.cxx @@ -0,0 +1,91 @@ +// File: WOKMake_BuildProcessGroup.cxx +// Created: Thu Jun 12 11:21:26 1997 +// Author: Jean GAUTIER +// + + +#include + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_BuildProcessGroup +//purpose : +//======================================================================= +WOKMake_BuildProcessGroup::WOKMake_BuildProcessGroup(const Handle(WOKMake_BuildProcess)& abp, + const Handle(TCollection_HAsciiString)& aname) +: myname(aname), mybp(abp.operator->()),myordered(Standard_True) +{ +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Name +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_BuildProcessGroup::Name() const +{ + return myname; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AddStep +//purpose : +//======================================================================= +void WOKMake_BuildProcessGroup::AddStep(const Handle(TCollection_HAsciiString)& astep) +{ + mysteps.Append(astep); + myordered = Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Steps +//purpose : +//======================================================================= +const TColStd_SequenceOfHAsciiString& WOKMake_BuildProcessGroup::Steps() const +{ + return mysteps; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Step +//purpose : +//======================================================================= +const Handle(WOKMake_Step)& WOKMake_BuildProcessGroup::Step(const Standard_Integer anidx) const +{ + return mybp->Find(mysteps.Value(anidx)); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Length +//purpose : +//======================================================================= +Standard_Integer WOKMake_BuildProcessGroup::Length() const +{ + return mysteps.Length(); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ChangeSteps +//purpose : +//======================================================================= +void WOKMake_BuildProcessGroup::ChangeSteps(const TColStd_SequenceOfHAsciiString& thesteps) +{ + mysteps.Clear(); + mysteps.Assign(thesteps); + myordered = Standard_False; +} + +Standard_Boolean WOKMake_BuildProcessGroup::IsOrdered() const +{ + return myordered; +} + +void WOKMake_BuildProcessGroup::SetOrdered() +{ + myordered = Standard_True; +} diff --git a/src/WOKMake/WOKMake_BuildProcessIterator.cdl b/src/WOKMake/WOKMake_BuildProcessIterator.cdl new file mode 100755 index 0000000..3959430 --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcessIterator.cdl @@ -0,0 +1,57 @@ +-- File: WOKMake_BuildProcessIterator.cdl +-- Created: Thu Jun 19 11:00:07 1997 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1997 + + +class BuildProcessIterator from WOKMake + + ---Purpose: + +uses + + BuildProcess from WOKMake, + BuildProcessGroup from WOKMake, + Step from WOKMake, + Status from WOKMake, + MapOfHAsciiString from WOKTools + +is + + Create(aprocess : BuildProcess from WOKMake; alogflag : Boolean from Standard) + returns BuildProcessIterator from WOKMake; + + CurGroup(me) + ---C++: return const & + returns BuildProcessGroup from WOKMake; + + CurStep(me) + ---C++: return const & + returns Step from WOKMake; + + MakeStep(me:out) + returns Status from WOKMake; + + Next(me:out); + + More(me) + returns Boolean from Standard; + + Terminate(me:out) + returns Status from WOKMake; + + ReorderCurrentGroup(me:in out) + is private; + +fields + + myprocess : BuildProcess from WOKMake; + mystatus : Status from WOKMake; + + mygrpidx : Integer from Standard; + mystepidx : Integer from Standard; + myprocessed : MapOfHAsciiString from WOKTools; + mylogflag : Boolean from Standard; + +end BuildProcessIterator; diff --git a/src/WOKMake/WOKMake_BuildProcessIterator.cxx b/src/WOKMake/WOKMake_BuildProcessIterator.cxx new file mode 100755 index 0000000..bc5ee6d --- /dev/null +++ b/src/WOKMake/WOKMake_BuildProcessIterator.cxx @@ -0,0 +1,664 @@ +// File: WOKMake_BuildProcessIterator.cxx +// Created: Thu Jun 19 11:08:47 1997 +// Author: Jean GAUTIER +// + +#include + +#include + +#include +#include +#include + +#ifndef WNT +#include +#include +#else +#include +#define WOKUtils_ProcessManager WOKUtils_ShellManager +#include +#endif + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +// ###### REFERENCER LE STORAGE MANAGER DES COLLECTIONS ###### +extern Standard_IMPORT MMgt_StorageManager aStorageManager; + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_BuildProcessIterator +//purpose : +//======================================================================= +WOKMake_BuildProcessIterator::WOKMake_BuildProcessIterator(const Handle(WOKMake_BuildProcess)& aprocess, + const Standard_Boolean alogflag) +: myprocess(aprocess), mygrpidx(1), mystepidx(1), mystatus(WOKMake_Unprocessed), mylogflag(alogflag) +{ + Handle(WOKMake_Step) curstep = CurStep(); + + while(curstep.IsNull() && More()) + { + Next(); + curstep = CurStep(); + } +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : CurGroup +//purpose : +//======================================================================= +const Handle(WOKMake_BuildProcessGroup)& WOKMake_BuildProcessIterator::CurGroup() const +{ + if(mygrpidx <= myprocess->Groups().Extent()) + { + return myprocess->Groups()(mygrpidx); + } + else + { + static Handle(WOKMake_BuildProcessGroup) NULLRESULT; + return NULLRESULT; + } + +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : CurStep +//purpose : +//======================================================================= +const Handle(WOKMake_Step)& WOKMake_BuildProcessIterator::CurStep() const +{ + if(mygrpidx <= myprocess->Groups().Extent()) + { + const Handle(WOKMake_BuildProcessGroup)& group = myprocess->Groups()(mygrpidx); + + if(mystepidx <= group->Steps().Length()) + { + return myprocess->Find(group->Steps().Value(mystepidx)); + } + else + { + static Handle(WOKMake_Step) NULLRESULT; + return NULLRESULT; + } + } + else + { + static Handle(WOKMake_Step) NULLRESULT; + return NULLRESULT; + } +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : MakeStep +//purpose : +//======================================================================= +WOKMake_Status WOKMake_BuildProcessIterator::MakeStep() +{ + const Handle(WOKMake_Step)& step = CurStep(); + + if(step.IsNull()) + { + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" + << "Invalid NULL step in iterator" << endm; + mystatus = WOKMake_Failed; + return mystatus; + } + + const Handle(TColStd_HSequenceOfHAsciiString)& precsteps = step->PrecedenceSteps(); + + if(!precsteps.IsNull()) + { + for(Standard_Integer i=1; i<=precsteps->Length(); i++) + { + const Handle(WOKMake_Step)& precstep = myprocess->Find(precsteps->Value(i)); + + if(precstep.IsNull()) + { + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" + << "Could not find precedence step : " << precsteps->Value(i) << endm; + mystatus = WOKMake_Failed; + return mystatus; + } + + switch(precstep->Status()) + { + case WOKMake_Failed: + case WOKMake_Incomplete: + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" + << "Step " << step->Code() << " not done : almost " << precsteps->Value(i) << " failed" << endm; + if(myprocessed.Contains(step->Unit()->Name())) myprocessed.Remove(step->Unit()->Name()); + step->SetStatus(WOKMake_Failed); + return WOKMake_Failed; + default: + break; + } + } + } + + if(step->IsToExecute()) + { + WOKTools_MsgStreamPtr astream = NULL; + Handle(WOKernel_File) logfile; + + WOKTools_Info theinfo = InfoMsg; + + if(!mylogflag) + { + theinfo .DontPrintHeader(); + theinfo << "WOKMake_BuildProcessIterator::MakeStep" << endm; + theinfo << "WOKMake_BuildProcessIterator::MakeStep" << "=====> " << step->UniqueName() << endm; + theinfo << "WOKMake_BuildProcessIterator::MakeStep" << endm; + theinfo.DoPrintHeader(); + } + else + { + theinfo.DontPrintHeader(); + theinfo << "WOKMake_BuildProcessIterator::MakeStep" << "=====> " << step->UniqueName() << flushm; + theinfo.DoPrintHeader(); + } + + if(mylogflag) + { + logfile = step->AdmFile(step->LogFileName()); + + logfile->GetPath(); + astream = new ofstream(logfile->Path()->Name()->ToCString(), ios::out); + + if(astream->good()) + { + InfoMsg.LogToStream(astream); + WarningMsg.LogToStream(astream); + ErrorMsg.LogToStream(astream); + VerboseMsg.LogToStream(astream); + } + } + + try { + + step->Make(); + + //myprocess->TranslatorIterator().Reset(); + //WOKBuilder_MSTool::GetMSchema()->Clear(); + + } + catch (Standard_Failure) { + + step->SetFailed(); + + Handle(Standard_Failure) E = Standard_Failure::Caught(); + +#ifndef WNT + if(E->IsKind(STANDARD_TYPE(OSD_SIGINT))) +#else + if(E->IsKind(STANDARD_TYPE(OSD_Exception_CTRL_BREAK))) +#endif + { + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Process received interupt signal" << endm; + WOKUtils_ProcessManager::KillAll(); + mygrpidx = myprocess->Groups().Extent()+1; + + } + else + { + strstream astream; + astream << E << ends; + + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Exception was raised : " << astream.str() << endm; + } + } + + + if(mylogflag && astream) + { + InfoMsg.EndLogging(); + WarningMsg.EndLogging(); + ErrorMsg.EndLogging(); + VerboseMsg.EndLogging(); + astream->close(); + delete astream; + } + + if(!mylogflag) + { + theinfo << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code(); + } + + switch(step->Status()) + { + case WOKMake_Uptodate: + theinfo << " is up to date" << endm; + break; + case WOKMake_Success: + if(!myprocessed.Contains(step->Unit()->Name())) myprocessed.Add(step->Unit()->Name()); + theinfo << " is successfull" << endm; + break; + case WOKMake_Processed: + if(!myprocessed.Contains(step->Unit()->Name())) myprocessed.Add(step->Unit()->Name()); + //theinfo << " is processed" << endm; + break; + case WOKMake_Incomplete: + if(myprocessed.Contains(step->Unit()->Name())) myprocessed.Remove(step->Unit()->Name()); + theinfo << endm; + WarningMsg << " is incomplete" << endm; + if(mylogflag) + {WarningMsg << "WOKMake_BuildProcessIterator::MakeStep" + << "Consult " << logfile->Path()->Name()->ToCString() << " for details" << endm;} + return WOKMake_Incomplete; + + case WOKMake_Failed: + if(myprocessed.Contains(step->Unit()->Name())) myprocessed.Remove(step->Unit()->Name()); + theinfo << endm; + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " failed" << endm; + if(mylogflag) + {ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" + << "Consult " << logfile->Path()->Name()->ToCString() << " for details" << endm;} + return WOKMake_Failed; + + case WOKMake_Unprocessed: + theinfo << endm; + WarningMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " is still unprocessed" << endm; + if(mylogflag) + {WarningMsg << "WOKMake_BuildProcessIterator::MakeStep" + << "Consult " << logfile->Path()->Name()->ToCString() << " for details" << endm;} + break; + } + + } + else + { + step->Make(); + + switch(step->Status()) + { + case WOKMake_Uptodate: + InfoMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " is up to date" << endm; + break; + case WOKMake_Success: + if(!myprocessed.Contains(step->Unit()->Name())) myprocessed.Add(step->Unit()->Name()); + InfoMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " is successfull" << endm; + break; + case WOKMake_Processed: + if(!myprocessed.Contains(step->Unit()->Name())) myprocessed.Add(step->Unit()->Name()); + //InfoMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " is processed" << endm; + break; + case WOKMake_Incomplete: + if(myprocessed.Contains(step->Unit()->Name())) myprocessed.Remove(step->Unit()->Name()); + WarningMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " is incomplete" << endm; + return WOKMake_Incomplete; + + case WOKMake_Failed: + if(myprocessed.Contains(step->Unit()->Name())) myprocessed.Remove(step->Unit()->Name()); + ErrorMsg << "WOKMake_BuildProcessIterator::MakeStep" << "Step " << step->Code() << " failed" << endm; + return WOKMake_Failed; + + case WOKMake_Unprocessed: + break; + } + } + + return WOKMake_Success; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Next +//purpose : +//======================================================================= +void WOKMake_BuildProcessIterator::Next() +{ + const Handle(WOKMake_BuildProcessGroup)& curgroup = CurGroup(); + + if(!curgroup.IsNull()) + { + if(mystepidx >= curgroup->Steps().Length()) + { + mygrpidx++; + if(mygrpidx <= myprocess->Groups().Extent()) + { + if(myprocess->Groups().FindFromIndex(mygrpidx)->Steps().Length()) { + mystepidx = 1; + ReorderCurrentGroup(); + } + else { + Next(); + } + } + } + else + { + mystepidx++; + } + } +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : More +//purpose : +//======================================================================= +Standard_Boolean WOKMake_BuildProcessIterator::More() const +{ + if(mygrpidx < myprocess->Groups().Extent()) + { + return Standard_True; + } + else if(mygrpidx == myprocess->Groups().Extent()) + { + if(mystepidx <= myprocess->Groups().FindFromIndex(mygrpidx)->Steps().Length()) + { + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Terminate +//purpose : +//======================================================================= +WOKMake_Status WOKMake_BuildProcessIterator::Terminate() +{ + WOKMake_Status result = WOKMake_Success; + myprocess->ClearGroups(); + + WOKMake_DataMapIteratorOfDataMapOfHAsciiStringOfSequenceOfHAsciiString anit(myprocess->Units()); + + InfoMsg << "WOKMake_BuildProcessIterator::Terminate" + << "------------------ Process report ------------------" << endm; + + while(anit.More()) + { + Handle(WOKernel_DevUnit) aunit = myprocess->Locator()->LocateDevUnit(anit.Key()); + + Handle(TColStd_HSequenceOfHAsciiString) unitfiles = aunit->FileList(); + + if(unitfiles.IsNull()) + { + unitfiles = new TColStd_HSequenceOfHAsciiString; + aunit->SetFileList(unitfiles); + } + + const TColStd_SequenceOfHAsciiString& steps = anit.Value(); + + // UPDATE : + // 0 : nothing decided + // 1 : decided to update + // 2 : decided to not update + Standard_Integer update = 0; + Handle(TCollection_HAsciiString) failedlist = new TCollection_HAsciiString; + + for(Standard_Integer i=1; i<=steps.Length(); i++) + { + const Handle(WOKMake_Step)& step = myprocess->Find(steps.Value(i)); + + if(!step.IsNull()) + { + switch(step->Status()) + { + case WOKMake_Success: + case WOKMake_Processed: + if(update < 1 ) update = 1; + break; + case WOKMake_Unprocessed: + case WOKMake_Uptodate: + break; + case WOKMake_Incomplete: + case WOKMake_Failed: + if(update < 2 ) update = 2; + failedlist->AssignCat(step->Code()); + failedlist->AssignCat(" "); + break; + default: + break; + } + } + } + + switch(update) + { + case 0: + //InfoMsg << "WOKMake_BuildProcessIterator::Terminate" + // << "Not done " << anit.Key() << endm; + break; + case 1: + { + InfoMsg << "WOKMake_BuildProcessIterator::Terminate" + << "Success " << anit.Key() << endm; + for(Standard_Integer i=1; i<=steps.Length(); i++) { + const Handle(WOKMake_Step)& step = myprocess->Find(steps.Value(i)); + + if(!step.IsNull()) { + const Handle(WOKMake_HSequenceOfOutputFile)& outlist = step->OutputFileList(); + + if(!outlist.IsNull()) { + for(Standard_Integer j=1; j<=outlist->Length(); j++) { + const Handle(WOKMake_OutputFile)& outfile = outlist->Value(j); + + if(outfile->IsProduction() && + outfile->IsPhysic() && + outfile->IsLocateAble() && + outfile->IsMember()) { + unitfiles->Append(outfile->ID()); + } + } + Handle(WOKMake_MetaStep) mstep = Handle(WOKMake_MetaStep)::DownCast(step); + if (!mstep.IsNull()) { + Handle(TColStd_HSequenceOfHAsciiString) substeps = mstep->UnderlyingSteps(); + if (!substeps.IsNull()) { + for (Standard_Integer k=1; k<= substeps->Length(); k++) { + const Handle(WOKMake_Step)& substep = myprocess->Find(substeps->Value(k)); + if(!substep.IsNull()) { + const Handle(WOKMake_HSequenceOfOutputFile)& outslist = substep->OutputFileList(); + if(!outslist.IsNull()) { + for(Standard_Integer l=1; l<=outslist->Length(); l++) { + const Handle(WOKMake_OutputFile)& outfile = outslist->Value(l); + if(outfile->IsProduction() && + outfile->IsPhysic() && + outfile->IsLocateAble() && + outfile->IsMember()) { + unitfiles->Append(outfile->ID()); + } + } + } + } + } + } + } + } + } + else { + ErrorMsg << "WOKMake_BuildProcessIterator::Terminate" + << "Could not obtain step " << steps.Value(i) << endm; + return WOKMake_Failed; + } + } + aunit->DumpFileList(myprocess->Locator()); + } + break; + case 2: + { + result = WOKMake_Failed; + InfoMsg << "WOKMake_BuildProcessIterator::Terminate" + << "Failed " << anit.Key() << " (" << failedlist << ")"<< endm; + } + } + + // On va arreter de bouffer la memoire pour rien + myprocess->RemoveUnit(aunit->Name()); + aunit->Close(); + + anit.Next(); + } + + myprocess->ClearUnits(); + + InfoMsg << "WOKMake_BuildProcessIterator::Terminate" + << "----------------------------------------------------" << endm; + + WOKUtils_ProcessManager::KillAll(); + //aStorageManager.Purge(); + + return result; +} + +void WOKMake_BuildProcessIterator::ReorderCurrentGroup() +{ + if (!strcmp(CurGroup()->Name()->ToCString(),"Lib")) { + if (!CurGroup()->IsOrdered()) { + + TColStd_SequenceOfHAsciiString thesteps; + Handle(WOKernel_Locator) theloc = myprocess->Locator(); + Handle(TCollection_HAsciiString) pkgstype = new TCollection_HAsciiString("PACKAGES"); + WOKernel_SortedImpldepFromIterator algo; + WOKMake_DataMapOfHAsciiStringOfSequenceOfHAsciiString lsttksteps; + WOKTools_MapOfHAsciiString udadded; + Standard_Integer i; + Standard_Boolean toadd; + + for (i=1; i<= CurGroup()->Steps().Length(); i++) { + Handle(WOKMake_Step) astep = myprocess->Find(CurGroup()->Steps().Value(i)); + // on traite uniquement que les UDS ad hoc (default shema et toolkit) + toadd = Standard_False; + if (!astep->IsToExecute()) { + toadd = Standard_True; + } + else { + // on sait si une UD convient par %WOKSteps_IsOrdered + if (strcmp(astep->Unit()->Params().Eval("%WOKSteps_IsOrdered")->ToCString(),"Yes")) { + toadd = Standard_True; + } + } + if (toadd) { + thesteps.Append(CurGroup()->Steps().Value(i)); + } + else { + + if (lsttksteps.IsBound(astep->Unit()->Name())) { + lsttksteps(astep->Unit()->Name()).Append(CurGroup()->Steps().Value(i)); + } + else { + TColStd_SequenceOfHAsciiString aseq; + lsttksteps.Bind(astep->Unit()->Name(),aseq); + + lsttksteps(astep->Unit()->Name()).Append(CurGroup()->Steps().Value(i)); + + algo.FromVertex(astep->Unit()->Name()); + + + // ajout des ImplDep dans le UnitGraph + + Handle(WOKernel_File) impldepfile = astep->Unit()->ImplDepFile(theloc,astep->Unit()->Name()); + if (impldepfile.IsNull()) { + ErrorMsg << "WOKMake_BuildProcessIterator::ReorderCurrentGroup" << + "Unable to get ImplDep file for unit " << astep->Unit()->Name()->ToCString() << endm; + } + else { + impldepfile->GetPath(); + Handle(TColStd_HSequenceOfHAsciiString) deps = astep->Unit()->ReadImplDepFile(impldepfile->Path(), + theloc, + Standard_False); + myprocess->UnitGraph()->Add(astep->Unit()->Name(),deps); + } + + if (WOKernel_IsToolkit(astep->Unit())) { + // ajout du package dans UnitGraph + // le tk est fournisseur des uds qui le composent + + Handle(TCollection_HAsciiString) PACKAGESname = astep->Unit()->Params().Eval("%FILENAME_PACKAGES"); + Handle(WOKernel_File) filepack = theloc->Locate(astep->Unit()->Name(), + pkgstype, + PACKAGESname); + if (filepack.IsNull()) { + ErrorMsg << "WOKMake_BuildProcessIterator::ReorderCurrentGroup" << + "Unable to get PACKAGES file for unit " << astep->Unit()->Name()->ToCString() << endm; + } + else { + filepack->GetPath(); + WOKUtils_AdmFile afile(filepack->Path()); + Handle(TColStd_HSequenceOfHAsciiString) udsoftk = afile.Read(); + + for (Standard_Integer j=1;j<= udsoftk->Length(); j++) { + myprocess->UnitGraph()->Add(udsoftk->Value(j),astep->Unit()->Name()); + udadded.Add(udsoftk->Value(j)); + } + } + } + } + } + } + + + // on y va ! + + if (lsttksteps.Extent() > 1) { + algo.Perform(myprocess->UnitGraph()); + + Standard_Boolean IsCyclic = Standard_False; + Handle(TColStd_HSequenceOfHAsciiString) orderedtks = new TColStd_HSequenceOfHAsciiString ; + while(algo.More()) { + if(algo.NbVertices() > 1) { + ErrorMsg << "WOKMake_BuildProcessIterator::ReorderCurrentGroup" + << "Cyclic dependency detected between: "; + + for(i=1; i<= algo.NbVertices(); i++) { + ErrorMsg << algo.Value(i) << " "; + } + + ErrorMsg << endm; + + IsCyclic = Standard_True; + } + else { + if (lsttksteps.IsBound(algo.Value(1))) { + orderedtks->Prepend(algo.Value(1)); + } + } + algo.Next(); + } + if (!IsCyclic) { + for (i=1;i<=orderedtks->Length();i++) { + const TColStd_SequenceOfHAsciiString& aseq = lsttksteps(orderedtks->Value(i)); + for (Standard_Integer j=1; j<= aseq.Length(); j++) { + thesteps.Append(aseq(j)); + } + } + CurGroup()->ChangeSteps(thesteps); + } + WOKTools_MapIteratorOfMapOfHAsciiString itadd(udadded); + // on remet le UnitGraph en etat + while (itadd.More()) { + myprocess->UnitGraph()->Remove(itadd.Key()); + itadd.Next(); + } + } + CurGroup()->SetOrdered(); + } + } +} + + diff --git a/src/WOKMake/WOKMake_DepItem.cdl b/src/WOKMake/WOKMake_DepItem.cdl new file mode 100755 index 0000000..240d99b --- /dev/null +++ b/src/WOKMake/WOKMake_DepItem.cdl @@ -0,0 +1,77 @@ +-- File: WOKMake_DepItem.cdl +-- Created: Mon Nov 20 19:58:42 1995 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1995 + + +class DepItem from WOKMake +inherits TShared from MMgt + + ---Purpose: Handles Single Output Item within a step + +uses + IndexedMapOfDepItem from WOKMake, + FileStatus from WOKMake, + Path from WOKUtils, + HAsciiString from TCollection, + Boolean from Standard + +is + + Create(afile : HAsciiString from TCollection ; issuedfrom : HAsciiString from TCollection) + returns mutable DepItem from WOKMake; + + + SetOrigin(me:mutable; anorigin : HAsciiString from TCollection); + IssuedFrom(me) + ---C++: return const & + ---C++: inline + returns HAsciiString from TCollection; + + SetOutputFile(me:mutable; afile : HAsciiString from TCollection); + OutputFile(me) + ---C++: return const & + ---C++: inline + returns HAsciiString from TCollection; + + SetDirect(me:mutable); + SetIndirect(me:mutable); + IsDirectDep(me) + ---C++: inline + returns Boolean from Standard; + + SetStatus(me:mutable; astatus : FileStatus from WOKMake); + Status(me) + ---C++: inline + returns FileStatus from WOKMake; + + -- + -- READ/WRITE OUTPUT FILES + -- + + ReadLine(myclass; astream : out IStream from Standard; + anitem : out DepItem from WOKMake; + lastone : DepItem from WOKMake) + is private; + + WriteLine(myclass; astream : out OStream from Standard; + anitem : DepItem from WOKMake; + lastone : DepItem from WOKMake) + is private; + + -- Into/From a seq + ReadFile(myclass; afile : Path from WOKUtils; + aseq : out IndexedMapOfDepItem from WOKMake) + returns Integer from Standard; + + WriteFile(myclass; afile : Path from WOKUtils; aseq : IndexedMapOfDepItem from WOKMake) + returns Integer from Standard; + + +fields + myfile : HAsciiString from TCollection; + myorigin : HAsciiString from TCollection; + mydirect : Boolean from Standard; + mystatus : FileStatus from WOKMake; +end DepItem; diff --git a/src/WOKMake/WOKMake_DepItem.cxx b/src/WOKMake/WOKMake_DepItem.cxx new file mode 100755 index 0000000..a92564d --- /dev/null +++ b/src/WOKMake/WOKMake_DepItem.cxx @@ -0,0 +1,237 @@ +// File: WOKMake_DepItem.cxx +// Created: Mon Nov 20 20:11:59 1995 +// Author: Jean GAUTIER +// + +#include + +#include + +#include + +#include + +#define READBUF_SIZE 1024 + +//======================================================================= +//function : WOKMake_DepItem +//purpose : +//======================================================================= +WOKMake_DepItem::WOKMake_DepItem(const Handle(TCollection_HAsciiString)& afile, + const Handle(TCollection_HAsciiString)& issuedfrom) +: myfile(afile), myorigin(issuedfrom) +{ +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetOrigin +//purpose : +//======================================================================= +void WOKMake_DepItem::SetOrigin(const Handle(TCollection_HAsciiString)& afile) +{ + myorigin = afile; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetOutputFile +//purpose : +//======================================================================= +void WOKMake_DepItem::SetOutputFile(const Handle(TCollection_HAsciiString)& aoutfile) +{ + myfile = aoutfile; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetDirect +//purpose : +//======================================================================= +void WOKMake_DepItem::SetDirect() +{ + mydirect = Standard_True; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetIndirect +//purpose : +//======================================================================= +void WOKMake_DepItem::SetIndirect() +{ + mydirect = Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetStatus +//purpose : +//======================================================================= +void WOKMake_DepItem::SetStatus(const WOKMake_FileStatus astatus) +{ + mystatus = astatus; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadLine +//purpose : +//======================================================================= +void WOKMake_DepItem::ReadLine(Standard_IStream& astream, Handle(WOKMake_DepItem)& anitem, const Handle(WOKMake_DepItem)& lastone) +{ + static char aflag; + static char aoutbuf[READBUF_SIZE], afrombuf[READBUF_SIZE]; + + *aoutbuf = *afrombuf = '\0'; + aflag = 0; + + if(!astream) + { + anitem.Nullify(); + return; + } + + astream.get(aflag); + astream.ignore(READBUF_SIZE, ' '); + astream.get(aoutbuf, READBUF_SIZE, ' '); + astream.ignore(READBUF_SIZE, ' '); + astream.get(afrombuf, READBUF_SIZE); + astream.ignore(READBUF_SIZE, '\n'); + //astream >> aflag >> setw(READBUF_SIZE) >> aoutbuf >> setw(READBUF_SIZE) >> afrombuf; + + if(aflag == 0 || aoutbuf[0] == '\0' || afrombuf[0] == '\0') + { + anitem.Nullify(); + return; + } + + if(aoutbuf[0] == '*') + { + if(!lastone.IsNull()) + { + anitem = new WOKMake_DepItem(lastone->OutputFile(), + new TCollection_HAsciiString(afrombuf)); + } + else + { + ErrorMsg << "WOKMake_DepItem::ReadLine" + << "Could not read invalid first line" << endm; + anitem.Nullify(); + return; + } + } + else + { + anitem = new WOKMake_DepItem(new TCollection_HAsciiString(aoutbuf), + new TCollection_HAsciiString(afrombuf)); + } + + if(aflag == '+') + { + anitem->SetDirect(); + } + else + { + anitem->SetIndirect(); + } +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteLine +//purpose : +//======================================================================= +void WOKMake_DepItem::WriteLine(Standard_OStream& astream, const Handle(WOKMake_DepItem)& anitem, const Handle(WOKMake_DepItem)& lastone) +{ + + if(anitem->IsDirectDep()) + { + astream << "+ "; + } + else + { + astream << "- "; + } + + if(!lastone.IsNull()) + { + if(!strcmp(anitem->OutputFile()->ToCString(), lastone->OutputFile()->ToCString())) + { + astream << "* " << anitem->IssuedFrom()->ToCString() << endl; + return; + } + } + astream << anitem->OutputFile()->ToCString() << " " << anitem->IssuedFrom()->ToCString() << endl; + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_DepItem::ReadFile(const Handle(WOKUtils_Path)& afile, + WOKMake_IndexedMapOfDepItem& amap) +{ + if(afile.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_DepItem::ReadFile : NullInput"); + } + + if(afile->Exists()) + { + Standard_Integer i; + ifstream astream(afile->Name()->ToCString(), ios::in); + Handle(WOKMake_DepItem) item, lastone; + Handle(TCollection_HAsciiString) locatorname; + + ReadLine(astream, item,lastone); + lastone = item; + + while(!item.IsNull()) + { + i++; + amap.Add(item); + ReadLine(astream, item,lastone); + lastone = item; + } + + astream.close(); + return i; + } + return 0; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_DepItem::WriteFile(const Handle(WOKUtils_Path)& apath, + const WOKMake_IndexedMapOfDepItem& amap) +{ + if(apath.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_DepItem::WriteFile : NullInput"); + } + + ofstream astream(apath->Name()->ToCString(), ios::out); + + if(!astream) + { + ErrorMsg << "WOKMake_DepItem::WriteFile" << "Could not open " << apath->Name() << endm; + Standard_ProgramError::Raise(""); + } + + Handle(WOKMake_DepItem) lastone; + Standard_Integer i; + for(i=1; i<=amap.Extent(); i++) + { + const Handle(WOKMake_DepItem)& item = amap(i); + WriteLine(astream, item, lastone); + lastone = item; + } + astream.close(); + return 0; +} diff --git a/src/WOKMake/WOKMake_DepItem.lxx b/src/WOKMake/WOKMake_DepItem.lxx new file mode 100755 index 0000000..cc2e71c --- /dev/null +++ b/src/WOKMake/WOKMake_DepItem.lxx @@ -0,0 +1,45 @@ +// File: WOKMake_DepItem.lxx +// Created: Thu Mar 7 11:58:45 1996 +// Author: Jean GAUTIER +// + + + +//======================================================================= +//function : IssuedFrom +//purpose : +//======================================================================= +const Handle(TCollection_HAsciiString)& WOKMake_DepItem::IssuedFrom() const +{ + return myorigin; +} + +//======================================================================= +//function : OutputFile +//purpose : +//======================================================================= +const Handle(TCollection_HAsciiString)& WOKMake_DepItem::OutputFile() const +{ + return myfile; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsDirectDep +//purpose : +//======================================================================= +Standard_Boolean WOKMake_DepItem::IsDirectDep() const +{ + return mydirect; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Status +//purpose : +//======================================================================= +WOKMake_FileStatus WOKMake_DepItem::Status() const +{ + return mystatus; +} + diff --git a/src/WOKMake/WOKMake_DepItemHasher.cdl b/src/WOKMake/WOKMake_DepItemHasher.cdl new file mode 100755 index 0000000..4593da0 --- /dev/null +++ b/src/WOKMake/WOKMake_DepItemHasher.cdl @@ -0,0 +1,24 @@ +-- File: WOKMake_DepItemHasher.cdl +-- Created: Fri Oct 3 16:14:37 1997 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1997 + +private class DepItemHasher from WOKMake +uses + DepItem from WOKMake +is + + HashCode(myclass; Key : DepItem from WOKMake) returns Integer; + ---Level: Public + ---Purpose: Returns a HasCode value for the Key in the + -- range 0..Upper. + -- Default ::HashCode(K,Upper) + + IsEqual(myclass; K1, K2 : DepItem from WOKMake) returns Boolean; + ---Level: Public + ---Purpose: Returns True when the two keys are the same. Two + -- same keys must have the same hashcode, the + -- contrary is not necessary. + -- Default K1 == K2 +end; diff --git a/src/WOKMake/WOKMake_DepItemHasher.cxx b/src/WOKMake/WOKMake_DepItemHasher.cxx new file mode 100755 index 0000000..62b3827 --- /dev/null +++ b/src/WOKMake/WOKMake_DepItemHasher.cxx @@ -0,0 +1,30 @@ +// File: WOKMake_DepItemHasher.cxx +// Created: Fri Oct 3 16:15:43 1997 +// Author: Jean GAUTIER +// + + +#include + + +#include + +#include + + +Standard_Integer WOKMake_DepItemHasher::HashCode (const Handle(WOKMake_DepItem) &Value) +{ + return + (WOKTools_HAsciiStringHasher::HashCode(Value->IssuedFrom()) + + WOKTools_HAsciiStringHasher::HashCode(Value->OutputFile())); +} + +Standard_Boolean WOKMake_DepItemHasher::IsEqual(const Handle(WOKMake_DepItem) &K1, const Handle(WOKMake_DepItem) &K2) +{ + if (!strcmp(K1->IssuedFrom()->ToCString(), K2->IssuedFrom()->ToCString()) && + !strcmp(K1->OutputFile()->ToCString(), K2->OutputFile()->ToCString())) + return Standard_True; + else + return Standard_False; +} + diff --git a/src/WOKMake/WOKMake_InputFile.cdl b/src/WOKMake/WOKMake_InputFile.cdl new file mode 100755 index 0000000..03b5787 --- /dev/null +++ b/src/WOKMake/WOKMake_InputFile.cdl @@ -0,0 +1,80 @@ +-- File: WOKMake_InputFile.cdl +-- Created: Mon Nov 20 19:56:42 1995 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1995 + + +class InputFile from WOKMake +inherits StepFile from WOKMake + + ---Purpose: Handles Single Input Item within a step + +uses + IndexedDataMapOfHAsciiStringOfInputFile from WOKMake, + HSequenceOfInputFile from WOKMake, + FileStatus from WOKMake, + OutputFile from WOKMake, + Locator from WOKernel, + File from WOKernel, + Entity from WOKBuilder, + Path from WOKUtils, + HAsciiString from TCollection, + Boolean from Standard +is + + Create returns mutable InputFile from WOKMake; + + Create(anid : HAsciiString from TCollection; + afile : File from WOKernel; + abuildent : Entity from WOKBuilder; + aoldpath : Path from WOKUtils) + returns mutable InputFile from WOKMake; + + Create(outfile : OutputFile from WOKMake) + returns mutable InputFile from WOKMake; + + + -- + -- READ/WRITE INPUT FILES + -- + + ReadLine(myclass; astream : out IStream from Standard; + locator : Locator from WOKernel; + infile : out InputFile from WOKMake) + is private; + + WriteLine(myclass; astream : out OStream from Standard; + infile : InputFile from WOKMake) + is private; + + -- Into/From a map + ReadFile(myclass; afile : Path from WOKUtils; + alocator : Locator from WOKernel; + amap : out IndexedDataMapOfHAsciiStringOfInputFile from WOKMake) + returns Integer from Standard; + + WriteFile(myclass; afile : Path from WOKUtils; amap : IndexedDataMapOfHAsciiStringOfInputFile from WOKMake) + returns Integer from Standard; + + -- Into/From a seq + ReadFile(myclass; afile : Path from WOKUtils; + alocator : Locator from WOKernel; + aseq : HSequenceOfInputFile from WOKMake) + returns Integer from Standard; + + WriteFile(myclass; afile : Path from WOKUtils; aseq : HSequenceOfInputFile from WOKMake) + returns Integer from Standard; + + -- Mgt Flags + + SetDirectFlag(me:mutable; aflag : Boolean from Standard); + IsDirectInput(me) + ---Purpose: True if File is in Input Flow of Step + -- False if it is a deducted dependency input + ---C++: inline + returns Boolean from Standard; + +end InputFile; + + diff --git a/src/WOKMake/WOKMake_InputFile.cxx b/src/WOKMake/WOKMake_InputFile.cxx new file mode 100755 index 0000000..d9482ae --- /dev/null +++ b/src/WOKMake/WOKMake_InputFile.cxx @@ -0,0 +1,322 @@ +// File: WOKMake_InputFile.cxx +// Created: Mon Nov 20 20:11:05 1995 +// Author: Jean GAUTIER +// + +#include + +#include + +#include + +#include + +#include + +#define READBUF_SIZE 1024 + +//======================================================================= +//function : WOKMake_InputFile +//purpose : +//======================================================================= +WOKMake_InputFile::WOKMake_InputFile() +{ +} + +//======================================================================= +//function : WOKMake_InputFile +//purpose : +//======================================================================= +WOKMake_InputFile::WOKMake_InputFile(const Handle(TCollection_HAsciiString)& anid, + const Handle(WOKernel_File)& afile, + const Handle(WOKBuilder_Entity)& anent, + const Handle(WOKUtils_Path)& apath) +: WOKMake_StepFile(anid, afile, anent, apath) +{ +} + +//======================================================================= +//function : WOKMake_InputFile +//purpose : +//======================================================================= +WOKMake_InputFile::WOKMake_InputFile(const Handle(WOKMake_OutputFile)& outfile) + : WOKMake_StepFile(outfile->ID(), outfile->File(), outfile->BuilderEntity(), outfile->LastPath()) +{ + SetLocateFlag(outfile->IsLocateAble()); + SetPhysicFlag(outfile->IsPhysic()); + SetStepID(outfile->IsStepID()); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadLine +//purpose : +//======================================================================= +void WOKMake_InputFile::ReadLine(Standard_IStream & astream, + const Handle(WOKernel_Locator)& alocator, + Handle(WOKMake_InputFile)& infile) +{ + Standard_Integer i,len; + Handle(TCollection_HAsciiString) id; + Handle(TCollection_HAsciiString) aunitname, atype, aname; + Handle(TCollection_HAsciiString) oldpath; + Handle(WOKernel_File) afile; + Handle(WOKMake_InputFile) ainfile; + static char flags[READBUF_SIZE]; + static char anamebuf[READBUF_SIZE], apathbuf[READBUF_SIZE]; + + *flags = *anamebuf = *apathbuf = '\0'; + + if(!astream) + { + infile.Nullify(); + return; + } + + //astream >> setw(READBUF_SIZE) >> flags >> setw(READBUF_SIZE) >> anamebuf >> setw(READBUF_SIZE) >> apathbuf; + astream.get(flags, READBUF_SIZE, ' '); + astream.ignore(READBUF_SIZE, ' '); + astream.get(anamebuf, READBUF_SIZE, ' '); + astream.ignore(READBUF_SIZE, ' '); + astream.get(apathbuf, READBUF_SIZE); + astream.ignore(READBUF_SIZE, '\n'); + + + if(anamebuf[0] == '\0' || flags[0] == '\0' || apathbuf[0] == '\0' ) + { + infile.Nullify(); + return; + } + + oldpath = new TCollection_HAsciiString(apathbuf); + ainfile = new WOKMake_InputFile; + + len = strlen(flags); + for(i=0; iSetDirectFlag(Standard_True); + break; + case '-': + ainfile->SetDirectFlag(Standard_False); + break; + case 'V': + ainfile->SetPhysicFlag(Standard_False); + break; + case 'S': + ainfile->SetStepID(Standard_True); + break; + } + } + + if(anamebuf[0] != '.') + { + Handle(TCollection_HAsciiString) id = new TCollection_HAsciiString(anamebuf); + + if(ainfile->IsPhysic()) + { + afile = alocator->Locate(id); + + if(!afile.IsNull()) + { + id = afile->LocatorName(); + } + } + + ainfile->SetID(id); + ainfile->SetFile(afile); + ainfile->SetLastPath(new WOKUtils_Path(oldpath)); + ainfile->SetLocateFlag(Standard_True); + + //if(!strcmp(id->Token(":", 2)->ToCString(), "msentity")) + //{ + // ainfile->SetPhysicFlag(Standard_False); + //} + } + else + { + ainfile->SetID(oldpath); + ainfile->SetLastPath(new WOKUtils_Path(oldpath)); + ainfile->SetLocateFlag(Standard_False); + } + + + infile = ainfile; + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteLine +//purpose : +//======================================================================= +void WOKMake_InputFile::WriteLine(Standard_OStream& astream, + const Handle(WOKMake_InputFile)& infile) +{ + if(infile.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_InputFile::WriteLine : Null Input"); + } + + if(infile->IsDirectInput()) astream << "+"; + else astream << "-"; + if(!infile->IsPhysic()) astream << "V"; + if(infile->IsStepID()) astream << "S"; + + astream << " "; + + if(!infile->IsLocateAble()) + { + astream << ". " << infile->LastPath()->Name()->ToCString() << endl; + } + else + { + if(infile->IsPhysic()) + { + astream << infile->File()->LocatorName()->ToCString() << " " << infile->LastPath()->Name()->ToCString() << endl; + } + else + { + astream << infile->ID()->ToCString() << " ." << endl; + } + } + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_InputFile::ReadFile(const Handle(WOKUtils_Path)& apath, + const Handle(WOKernel_Locator)& alocator, + WOKMake_IndexedDataMapOfHAsciiStringOfInputFile& amap) +{ + if(apath->Exists()) + { + Standard_Integer i; + ifstream astream(apath->Name()->ToCString()); + Handle(WOKMake_InputFile) infile; + Handle(TCollection_HAsciiString) locatorname; + + ReadLine(astream, alocator, infile); + + while(!infile.IsNull()) + { + i++; + amap.Add(infile->ID(), infile); + ReadLine(astream, alocator, infile); + } + + astream.close(); + return i; + } + return 0; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_InputFile::WriteFile(const Handle(WOKUtils_Path)& apath, + const WOKMake_IndexedDataMapOfHAsciiStringOfInputFile& amap) +{ + Standard_Integer i; + ofstream astream(apath->Name()->ToCString(), ios::out); + + if(!astream) + { + ErrorMsg << "WOKMake_StepInput::Dump" << "Could not open " << apath->Name() << endm; + Standard_ProgramError::Raise(""); + } + + + for(i=1; i<=amap.Extent(); i++) + { + WriteLine(astream, amap(i)); + } + astream.close(); + return 0; +} + + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_InputFile::ReadFile(const Handle(WOKUtils_Path)& apath, + const Handle(WOKernel_Locator)& alocator, + const Handle(WOKMake_HSequenceOfInputFile)& aseq) +{ + if(apath.IsNull() || aseq.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_InputFile::ReadFile : NullInput"); + } + + if(apath->Exists()) + { + Standard_Integer i; + ifstream astream(apath->Name()->ToCString(), ios::in); + Handle(WOKMake_InputFile) infile; + Handle(TCollection_HAsciiString) locatorname; + + ReadLine(astream, alocator, infile); + + while(!infile.IsNull()) + { + i++; + aseq->Append(infile); + ReadLine(astream, alocator, infile); + } + + astream.close(); + return i; + } + return 0; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_InputFile::WriteFile(const Handle(WOKUtils_Path)& apath, + const Handle(WOKMake_HSequenceOfInputFile)& aseq) +{ + Standard_Integer i; + ofstream astream(apath->Name()->ToCString(), ios::out); + + if(!astream) + { + ErrorMsg << "WOKMake_StepInput::Dump" << "Could not open " << apath->Name() << endm; + Standard_ProgramError::Raise(""); + } + + + for(i=1; i<=aseq->Length(); i++) + { + WriteLine(astream, aseq->Value(i)); + } + astream.close(); + return 0; +} + + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetDirectFlag +//purpose : +//======================================================================= +void WOKMake_InputFile::SetDirectFlag(const Standard_Boolean aflag) +{ + if(aflag) + myattr |= STEPFILE_DIRECT; + else + myattr &= (STEPFILE_DIRECT ^ myattr); +} diff --git a/src/WOKMake/WOKMake_InputFile.lxx b/src/WOKMake/WOKMake_InputFile.lxx new file mode 100755 index 0000000..63a5531 --- /dev/null +++ b/src/WOKMake/WOKMake_InputFile.lxx @@ -0,0 +1,16 @@ +// File: WOKMake_InputFile.lxx +// Created: Tue Jun 18 14:05:56 1996 +// Author: Jean GAUTIER +// + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsDirectInput +//purpose : +//======================================================================= +Standard_Boolean WOKMake_InputFile::IsDirectInput() const +{ + if(myattr & STEPFILE_DIRECT) return Standard_True; + else return Standard_False; +} diff --git a/src/WOKMake/WOKMake_MetaStep.cdl b/src/WOKMake/WOKMake_MetaStep.cdl new file mode 100755 index 0000000..c8a669b --- /dev/null +++ b/src/WOKMake/WOKMake_MetaStep.cdl @@ -0,0 +1,89 @@ +-- File: WOKMake_MetaStep.cdl +-- Created: Mon Aug 26 17:06:37 1996 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1996 + + +class MetaStep from WOKMake +inherits Step from WOKMake + + ---Purpose: + +uses + BuildProcess from WOKMake, + HSequenceOfInputFile from WOKMake, + OutputFile from WOKMake, + InputFile from WOKMake, + Status from WOKMake, + DevUnit from WOKernel, + HSequenceOfHAsciiString from TColStd, + HAsciiString from TCollection + +is + + Create( aprocess : BuildProcess from WOKMake; + aunit : DevUnit from WOKernel; + acode : HAsciiString from TCollection; + checked, hidden : Boolean from Standard); + + HandleInputFile(me:mutable; anitem : InputFile from WOKMake) + returns Boolean from Standard + is redefined protected; + + SetAdmFileType(me:mutable; atype : HAsciiString from TCollection); + AdmFileType(me) + returns HAsciiString from TCollection + is redefined protected; + + SetOutputDirTypeName(me:mutable; atype : HAsciiString from TCollection); + OutputDirTypeName(me) + returns HAsciiString from TCollection + is redefined protected; + + GetUnderlyingSteps(me:mutable) + ---Purpose: Get Underlying steps using output of input steps + returns HSequenceOfHAsciiString from TColStd + is virtual protected; + + GetLastUnderlyingSteps(me:mutable) + ---Purpose: Get Underlying steps using last output of step + returns HSequenceOfHAsciiString from TColStd + is virtual protected; + + UnderlyingSteps(me:mutable) + returns HSequenceOfHAsciiString from TColStd + is virtual; + SetUnderlyingSteps(me:mutable; steps : HSequenceOfHAsciiString from TColStd); + + + + Parts(me) + returns HSequenceOfHAsciiString from TColStd; + SetParts(me:mutable; parts : HSequenceOfHAsciiString from TColStd); + + Execute(me:mutable; execlist : HSequenceOfInputFile from WOKMake) + ---Purpose: Executes underlying steps + -- Computes output files + is redefined private; + + Make(me:mutable) + ---Purpose: Computes dependances + -- Decides if perform is needed. + -- Performs Step on needed entities + -- returns status + returns Status from WOKMake is redefined; + + HandleOutputFile(me:mutable; anfile : OutputFile from WOKMake) + ---Purpose: Handles Output file new/same/disappereread + returns Boolean from Standard + is redefined protected; + +fields + + myadmtype : HAsciiString from TCollection; + myouttype : HAsciiString from TCollection; + myparts : HSequenceOfHAsciiString from TColStd; + myundersteps : HSequenceOfHAsciiString from TColStd; + +end MetaStep; diff --git a/src/WOKMake/WOKMake_MetaStep.cxx b/src/WOKMake/WOKMake_MetaStep.cxx new file mode 100755 index 0000000..e9f4bf6 --- /dev/null +++ b/src/WOKMake/WOKMake_MetaStep.cxx @@ -0,0 +1,567 @@ +// File: WOKMake_MetaStep.cxx +// Created: Mon Aug 26 17:12:32 1996 +// Author: Jean GAUTIER +// + +#include + +#include +#include + +#include + +#include +#include +#include + +#include + + + +//======================================================================= +//function : WOKMake_MetaStep +//purpose : +//======================================================================= +WOKMake_MetaStep::WOKMake_MetaStep(const Handle(WOKMake_BuildProcess)& aprocess, + const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Standard_Boolean checked, + const Standard_Boolean hidden) + : WOKMake_Step(aprocess, aunit, acode, checked, hidden) +{ + +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetAdmFileType +//purpose : +//======================================================================= +void WOKMake_MetaStep::SetAdmFileType(const Handle(TCollection_HAsciiString)& atype) +{ + myadmtype = atype; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AdmFileType +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_MetaStep::AdmFileType() const +{ + return myadmtype; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetOutputDirTypeName +//purpose : +//======================================================================= +void WOKMake_MetaStep::SetOutputDirTypeName(const Handle(TCollection_HAsciiString)& atype) +{ + myouttype = atype; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : OutputDirTypeName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_MetaStep::OutputDirTypeName() const +{ + return myadmtype; +} + +//======================================================================= +//function : HandleInputFile +//purpose : +//======================================================================= +Standard_Boolean WOKMake_MetaStep::HandleInputFile(const Handle(WOKMake_InputFile)& infile) +{ + if(infile->IsStepID()) + return Standard_True; + return Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetUnderlyingSteps +//purpose : +//======================================================================= +Handle(TColStd_HSequenceOfHAsciiString) WOKMake_MetaStep::GetUnderlyingSteps() +{ + Standard_Integer i,j; + Handle(TColStd_HSequenceOfHAsciiString) subcodeseq = new TColStd_HSequenceOfHAsciiString; + Handle(TColStd_HSequenceOfHAsciiString) result = new TColStd_HSequenceOfHAsciiString; + Handle(TColStd_HSequenceOfHAsciiString) NULLRESULT; + + for(i=1; i<=myinflow.Extent(); i++) + { + Handle(WOKMake_InputFile) infile = myinflow(i); + + if(infile->IsStepID()) + { + Handle(TCollection_HAsciiString) aunit = infile->ID()->Token(":", 1); + Handle(TCollection_HAsciiString) acode = infile->ID()->Token(":", 2); + Handle(TCollection_HAsciiString) apart = infile->ID()->Token(":", 3); + Standard_Boolean known = Standard_False; + + if(!apart->IsEmpty()) + { + for(j=1;j<=subcodeseq->Length(); j++) + if(!strcmp(apart->ToCString(), subcodeseq->Value(j)->ToCString())) + known = Standard_True; + + if(!known) + { + subcodeseq->Append(apart); + } + } + } + } + + for(i=1; i<=subcodeseq->Length(); i++) + { + Handle(TCollection_HAsciiString) thesubcode = subcodeseq->Value(i); + Handle(WOKMake_Step) thestep = BuildProcess()->GetAndAddStep(Unit(), Code(), thesubcode); + + if(thestep.IsNull()) + { + ErrorMsg << "WOKMake_MetaStep::GetUnderlyingSteps" + << "Could not obtain step for code : " << Code() << " in unit " << Unit()->Name() << endm; + SetFailed(); + return NULLRESULT; + } + + Handle(TColStd_HSequenceOfHAsciiString) precsteps = new TColStd_HSequenceOfHAsciiString; + + for(j=1; j<=myinflow.Extent(); j++) + { + Handle(WOKMake_InputFile) infile = myinflow(j); + Handle(TCollection_HAsciiString) aunit = infile->ID()->Token(":", 1); + Handle(TCollection_HAsciiString) acode = infile->ID()->Token(":", 2); + Handle(TCollection_HAsciiString) apart = infile->ID()->Token(":", 3); + Handle(WOKMake_Step) precstep; + + + Handle(WOKernel_DevUnit) precunit = Locator()->LocateDevUnit(aunit); + + if(precunit.IsNull()) + { + ErrorMsg << "WOKMake_MetaStep::Execute" + << "Specified unit (" << aunit << ") in input of step " << Code() + << " of " << Unit()->Name() << " could not be found" << endm; + SetFailed(); + return NULLRESULT; + } + + if(apart->IsEmpty()) + { + precstep = BuildProcess()->GetAndAddStep(precunit, acode, Handle(TCollection_HAsciiString)()); + } + else + { + precstep = BuildProcess()->GetAndAddStep(precunit, acode, apart); + } + + if(precstep.IsNull()) + { + ErrorMsg << "WOKMake_MetaStep::GetUnderlyingSteps" + << "Could not obtain step for code : " << acode << " in unit " << precunit->Name() << endm; + SetFailed(); + return NULLRESULT; + } + + if(!strcmp(thesubcode->ToCString(), apart->ToCString()) || apart->IsEmpty()) + { + precsteps->Append(precstep->UniqueName()); + } + } + + // verifer que chaque precedence step de la MetaStep est une precedence step de + // la sous step. sinon l'ajouter telle quelle. + + for(Standard_Integer l=1; l<=PrecedenceSteps()->Length(); l++) + { + const Handle(WOKMake_Step)& precstep = BuildProcess()->Find(PrecedenceSteps()->Value(l)); + const Standard_CString preccode = precstep->Code()->ToCString(); + Standard_Boolean found = Standard_False; + + for(Standard_Integer k=1; k<=precsteps->Length() && !found; k++) + { + const Handle(WOKMake_Step)& subprec = BuildProcess()->Find(precsteps->Value(k)); + const Standard_CString subpreccode = subprec->Code()->ToCString(); + if(!strcmp(preccode, BuildProcess()->Find(precsteps->Value(k))->Code()->ToCString())) + found = Standard_True; + } + + if(!found) + { + precsteps->Append(precstep->UniqueName()); + Handle(WOKMake_InputFile) infile = new WOKMake_InputFile(precstep->StepOutputID(), + Handle(WOKernel_File)(), + Handle(WOKBuilder_Entity)(), + Handle(WOKUtils_Path)()); + infile->SetLocateFlag(Standard_True); + infile->SetStepID(Standard_True); + infile->SetDirectFlag(Standard_True); + infile->SetPhysicFlag(Standard_False); + myinflow.Add(infile->ID(), infile); + } + } + + if(IsToExecute()) + thestep->DoExecute(); + + thestep->SetPrecedenceSteps(precsteps); + thestep->SetTargets(Targets()); + thestep->SetOptions(Options()); + + result->Append(thestep->UniqueName()); + + } + + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetLastUnderlyingSteps +//purpose : +//======================================================================= +Handle(TColStd_HSequenceOfHAsciiString) WOKMake_MetaStep::GetLastUnderlyingSteps() +{ + Standard_Integer i; + + Handle(WOKMake_HSequenceOfOutputFile) out = OutputFileList(); + Handle(TColStd_HSequenceOfHAsciiString) result = new TColStd_HSequenceOfHAsciiString; + Handle(TColStd_HSequenceOfHAsciiString) NULLRESULT; + + + if (out.IsNull()) return result; + + for(i=1; i<=out->Length(); i++) + { + const Handle(WOKMake_OutputFile)& outfile = out->Value(i); + + if(outfile->IsStepID()) + { + Handle(TCollection_HAsciiString) aunit = outfile->ID()->Token(":", 1); + Handle(TCollection_HAsciiString) acode = outfile->ID()->Token(":", 2); + Handle(TCollection_HAsciiString) apart = outfile->ID()->Token(":", 3); + + Handle(WOKMake_Step) thestep = BuildProcess()->GetAndAddStep(Unit(), acode, apart); + + if(thestep.IsNull()) + { + return NULLRESULT; + } + + thestep->DontExecute(); + + result->Append(thestep->UniqueName()); + } + + } + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetUnderlyingSteps +//purpose : +//======================================================================= +void WOKMake_MetaStep::SetUnderlyingSteps(const Handle(TColStd_HSequenceOfHAsciiString)& steps) +{ + myparts = new TColStd_HSequenceOfHAsciiString; + Standard_Integer i; + + if(steps.IsNull()) + { + myparts.Nullify(); + myundersteps.Nullify(); + } + + for(i=1; i<=steps->Length(); i++) + { + myparts->Append(BuildProcess()->Find(steps->Value(i))->SubCode()); + } + myundersteps = steps; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : UnderlyingSteps +//purpose : +//======================================================================= +Handle(TColStd_HSequenceOfHAsciiString) WOKMake_MetaStep::UnderlyingSteps() +{ + if(!myundersteps.IsNull()) + { + return myundersteps; + } + if(!IsToExecute()) + { + SetUnderlyingSteps(GetLastUnderlyingSteps()); + return myundersteps; + } + else + { + SetUnderlyingSteps(GetUnderlyingSteps()); + return myundersteps; + } +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Execute +//purpose : +//======================================================================= +void WOKMake_MetaStep::Execute(const Handle(WOKMake_HSequenceOfInputFile)& execlist) +{ + Standard_Integer i,j; + Standard_Boolean ok = Standard_True; + Handle(TColStd_HSequenceOfHAsciiString) subcodeseq = new TColStd_HSequenceOfHAsciiString; + + Handle(TColStd_HSequenceOfHAsciiString) thesteps; + + thesteps = UnderlyingSteps(); + + for(j=1;j<=thesteps->Length(); j++) + { + Handle(WOKMake_Step) thestep = BuildProcess()->Find(thesteps->Value(j)); + + thestep->DontExecute(); + } + + for(i=1; i<=execlist->Length(); i++) + { + const Handle(WOKMake_InputFile)& infile = execlist->Value(i); + + if(infile->IsStepID()) + { + Handle(TCollection_HAsciiString) aunit = infile->ID()->Token(":", 1); + Handle(TCollection_HAsciiString) acode = infile->ID()->Token(":", 2); + Handle(TCollection_HAsciiString) apart = infile->ID()->Token(":", 3); + + if(!apart->IsEmpty()) + { + for(j=1;j<=thesteps->Length(); j++) + { + Handle(WOKMake_Step) thestep = BuildProcess()->Find(thesteps->Value(j)); + + if(!thestep->SubCode().IsNull()) + { + if(!strcmp(apart->ToCString(), thestep->SubCode()->ToCString())) + { + thestep->DoExecute(); + } + } + } + } + } + } + + + for(i=1; i<=thesteps->Length(); i++) + { + Handle(WOKMake_Step) thestep = BuildProcess()->Find(thesteps->Value(i)); + + if (thestep->IsToExecute()) + { + InfoMsg << "WOKMake_MetaStep::Execute" + << "========> " << thestep->SubCode() << endm; + } + + thestep->Make(); + + if (thestep->IsToExecute()) + { + switch(thestep->Status()) + { + case WOKMake_Uptodate: + InfoMsg << "WOKMake_MetaStep::Execute" + << "========> " << thestep->SubCode() << " is uptodate" << endm; + break; + case WOKMake_Success: + InfoMsg << "WOKMake_MetaStep::Execute" + << "========> " << thestep->SubCode() << " succeeded" << endm; + break; + case WOKMake_Incomplete: + WarningMsg << "WOKMake_MetaStep::Execute" + << "========> " << thestep->SubCode() << " is incomplete" << endm; + break; + case WOKMake_Failed: + ErrorMsg << "WOKMake_MetaStep::Execute" + << "========> " << thestep->SubCode() << " failed" << endm; + ok = Standard_False; + break; + case WOKMake_Unprocessed: + WarningMsg << "WOKMake_MetaStep::Execute" + << "========> " << thestep->SubCode() << " is still unprocessed" << endm; + ok=Standard_False; + break; + } + } + + Handle(WOKMake_OutputFile) outfile = new WOKMake_OutputFile; + + outfile->SetID(thestep->StepOutputID()); + outfile->SetLocateFlag(Standard_True); + outfile->SetPhysicFlag(Standard_False); + outfile->SetStepID(Standard_True); + + Handle(TColStd_HSequenceOfHAsciiString) precsteps = thestep->PrecedenceSteps(); + + for(j=1; j<=precsteps->Length(); j++) + { + Handle(TCollection_HAsciiString) unitname = precsteps->Value(j)->Token(":", 1); + Handle(TCollection_HAsciiString) precid = BuildProcess()->Find(precsteps->Value(j))->StepOutputID(); + Handle(WOKMake_InputFile) infile = myinflow.FindFromKey(precid); + + if(infile.IsNull()) + { + WarningMsg << "WOKMake_MetaStep::Execute" + << "Ignoring precedence step dependence on " << precid << " (not in input list)" << endm; + } + else + { + AddExecDepItem(infile, outfile, Standard_True); + } + } + } + + thesteps.Nullify(); + + if(ok) SetSucceeded(); + else SetFailed(); + return; +} + + + +//======================================================================= +//function : Make +//purpose : +//======================================================================= +WOKMake_Status WOKMake_MetaStep::Make() +{ + + if(IsToExecute()) + { + GetInputFlow(); + if(CheckStatus("getting input list")) return Status(); + + Handle(WOKMake_HSequenceOfInputFile) execlist; + + execlist = ExecutionInputList(); + + if(CheckStatus("determine exec list")) return Status(); + + if(execlist->Length() || IsChecked()) + { + Execute(execlist); + + if(CheckStatus("execution")) return Status(); + } + else + { + SetUptodate(); + } + + AcquitExecution(execlist); + + if(CheckStatus("acquit execution")) return Status(); + } + else + { + Standard_Integer i; + + Handle(TColStd_HSequenceOfHAsciiString) steps = GetLastUnderlyingSteps(); + + if(!steps.IsNull()) + { + for(i=1;i<=steps->Length(); i++) + { + BuildProcess()->Find(steps->Value(i))->Make(); + } + } + } + + Handle(WOKMake_HSequenceOfOutputFile) outlist = OutputFileList(); + Handle(TColStd_HSequenceOfHAsciiString) unitfiles = Unit()->FileList(); + + if(unitfiles.IsNull()) + { + unitfiles = new TColStd_HSequenceOfHAsciiString; + Unit()->SetFileList(unitfiles); + } + + if(!outlist.IsNull()) + { + for(Standard_Integer j=1; j<=outlist->Length(); j++) + { + Handle(WOKMake_OutputFile) outfile = outlist->Value(j); + + if(outfile->IsProduction() && + outfile->IsPhysic() && + outfile->IsLocateAble() && + outfile->IsMember()) + { + unitfiles->Append(outfile->ID()); + } + } + } + + return Status(); +} + +//======================================================================= +//function : HandleOutputFile +//purpose : +//======================================================================= +Standard_Boolean WOKMake_MetaStep::HandleOutputFile(const Handle(WOKMake_OutputFile)& afile) +{ + if(afile.IsNull()) return Standard_False; + + if(afile->IsStepID()) + { + switch(afile->Status()) + { + case WOKMake_New: + case WOKMake_Same: + case WOKMake_Moved: + break; + case WOKMake_Disappeared: + { + Handle(TCollection_HAsciiString) apart = afile->ID()->Token(":", 3); + Handle(WOKMake_Step) thesubstep = BuildProcess()->GetAndAddStep(Unit(), Code(), apart); + if (!thesubstep.IsNull()) + { + Handle(WOKernel_File) asubout; + asubout = thesubstep->LocateAdmFile(thesubstep->OutLocator(),thesubstep->OutputFilesFileName()); + + if (!asubout.IsNull()) + { + //substep production has to be removed + Handle(WOKMake_HSequenceOfOutputFile) outsubfiles = new WOKMake_HSequenceOfOutputFile; + + WOKMake_OutputFile::ReadFile(asubout->Path(), thesubstep->OutLocator(), outsubfiles); + + for (Standard_Integer i=1; i<= outsubfiles->Length(); i++) + { + Handle(WOKMake_OutputFile) outsubfile = outsubfiles->Value(i); + if (!outsubfile.IsNull()) + outsubfile->SetStatus(WOKMake_Disappeared); + + thesubstep->HandleOutputFile(outsubfile); + } + } + } + } + break; + } + } + return Standard_False; +} diff --git a/src/WOKMake/WOKMake_OutputFile.cdl b/src/WOKMake/WOKMake_OutputFile.cdl new file mode 100755 index 0000000..1ec102d --- /dev/null +++ b/src/WOKMake/WOKMake_OutputFile.cdl @@ -0,0 +1,81 @@ +-- File: WOKMake_OutputFile.cdl +-- Created: Thu Apr 25 21:54:16 1996 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1996 + + +class OutputFile from WOKMake +inherits StepFile from WOKMake + + ---Purpose: + +uses + Locator from WOKernel, + File from WOKernel, + Entity from WOKBuilder, + IndexedDataMapOfHAsciiStringOfOutputFile from WOKMake, + HSequenceOfOutputFile from WOKMake, + FileStatus from WOKMake, + InputFile from WOKMake, + Path from WOKUtils, + HAsciiString from TCollection + +is + + Create returns mutable OutputFile from WOKMake; + + Create(anid : HAsciiString from TCollection; + afile : File from WOKernel; + abuildent : Entity from WOKBuilder; + aoldpath : Path from WOKUtils) + returns mutable OutputFile from WOKMake; + + Create(aninfile : InputFile from WOKMake) + returns mutable OutputFile from WOKMake; + + -- + -- READ/WRITE OUTPUT FILES + -- + + ReadLine(myclass; astream : out IStream from Standard; + locator : Locator from WOKernel; + infile : out OutputFile from WOKMake) + is private; + + WriteLine(myclass; astream : out OStream from Standard; + infile : OutputFile from WOKMake) + is private; + + -- Into/From a map + ReadFile(myclass; afile : Path from WOKUtils; + alocator : Locator from WOKernel; + amap : out IndexedDataMapOfHAsciiStringOfOutputFile from WOKMake) + returns Integer from Standard; + + WriteFile(myclass; afile : Path from WOKUtils; amap : IndexedDataMapOfHAsciiStringOfOutputFile from WOKMake) + returns Integer from Standard; + + -- Into/From a seq + ReadFile(myclass; afile : Path from WOKUtils; + alocator : Locator from WOKernel; + aseq : HSequenceOfOutputFile from WOKMake) + returns Integer from Standard; + + WriteFile(myclass; afile : Path from WOKUtils; aseq : HSequenceOfOutputFile from WOKMake) + returns Integer from Standard; + + SetReference(me:mutable); + SetProduction(me:mutable); + + IsProduction(me) returns Boolean from Standard; + ---C++: inline + + SetMember(me:mutable); + SetExtern(me:mutable); + + IsMember(me) + ---C++: inline + returns Boolean from Standard; + +end OutputFile; diff --git a/src/WOKMake/WOKMake_OutputFile.cxx b/src/WOKMake/WOKMake_OutputFile.cxx new file mode 100755 index 0000000..d15a03c --- /dev/null +++ b/src/WOKMake/WOKMake_OutputFile.cxx @@ -0,0 +1,353 @@ +// File: WOKMake_OutputFile.cxx +// Created: Thu Apr 25 21:57:20 1996 +// Author: Jean GAUTIER +// + +#include + +#include + +#include + +#include + +#include + + +#define READBUF_SIZE 1024 + +//======================================================================= +//function : WOKMake_OutputFile +//purpose : +//======================================================================= +WOKMake_OutputFile::WOKMake_OutputFile() +{ + SetMember(); +} + +//======================================================================= +//function : WOKMake_OutputFile +//purpose : +//======================================================================= +WOKMake_OutputFile::WOKMake_OutputFile(const Handle(TCollection_HAsciiString)& anid, + const Handle(WOKernel_File)& afile, + const Handle(WOKBuilder_Entity)& anent, + const Handle(WOKUtils_Path)& apath) + : WOKMake_StepFile(anid, afile, anent, apath) +{ + SetMember(); +} + +//======================================================================= +//function : WOKMake_OutputFile +//purpose : +//======================================================================= +WOKMake_OutputFile::WOKMake_OutputFile(const Handle(WOKMake_InputFile)& infile) + : WOKMake_StepFile(infile->ID(), infile->File(), infile->BuilderEntity(), infile->LastPath()) +{ + SetLocateFlag(infile->IsLocateAble()); + SetPhysicFlag(infile->IsPhysic()); + SetStepID(infile->IsStepID()); + //if(infile->IsMember()) SetMember(); + //else SetExtern(); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadLine +//purpose : +//======================================================================= +void WOKMake_OutputFile::ReadLine(Standard_IStream & astream, + const Handle(WOKernel_Locator)& alocator, + Handle(WOKMake_OutputFile)& outfile) +{ + Handle(TCollection_HAsciiString) id; + Handle(TCollection_HAsciiString) oldpath; + Handle(WOKernel_File) afile; + Handle(WOKMake_OutputFile) aoutfile; + Standard_Integer i,len; + static char flags[READBUF_SIZE]; + static char anamebuf[READBUF_SIZE], apathbuf[READBUF_SIZE]; + + *flags = *anamebuf = *apathbuf = '\0'; + + if(!astream) + { + outfile.Nullify(); + return; + } + + //astream >> setw(READBUF_SIZE) >> flags >> setw(READBUF_SIZE) >> anamebuf >> setw(READBUF_SIZE) >> apathbuf; + astream.get(flags, READBUF_SIZE, ' '); + astream.ignore(READBUF_SIZE, ' '); + astream.get(anamebuf, READBUF_SIZE, ' '); + astream.ignore(READBUF_SIZE, ' '); + astream.get(apathbuf, READBUF_SIZE); + astream.ignore(READBUF_SIZE, '\n'); + + if(flags[0] == '\0' || anamebuf[0] == '\0' || apathbuf[0] == '\0') + { + outfile.Nullify(); + return; + } + + aoutfile = new WOKMake_OutputFile; + + len = strlen(flags); + for(i=0; iSetProduction(); + break; + case '-': + aoutfile->SetReference(); + break; + case 'V': + aoutfile->SetPhysicFlag(Standard_False); + break; + case 'S': + aoutfile->SetStepID(Standard_True); + break; + case 'M': + aoutfile->SetMember(); + break; + case 'E': + aoutfile->SetExtern(); + break; + } + } + + oldpath = new TCollection_HAsciiString(apathbuf); + + if(anamebuf[0] != '.') + { + Handle(TCollection_HAsciiString) id = new TCollection_HAsciiString(anamebuf); + + if( aoutfile->IsPhysic()) + { + afile = alocator->Locate(id); + + if(!afile.IsNull()) + { + id = afile->LocatorName(); + } + } + + aoutfile->SetID(id); + aoutfile->SetFile(afile); + aoutfile->SetLastPath(new WOKUtils_Path(oldpath)); + aoutfile->SetLocateFlag(Standard_True); + + //if(!strcmp(id->Token(":", 2)->ToCString(), "msentity")) + //{ + // aoutfile->SetPhysicFlag(Standard_False); + //} + } + else + { + aoutfile->SetID(oldpath); + aoutfile->SetLastPath(new WOKUtils_Path(oldpath)); + aoutfile->SetLocateFlag(Standard_False); + } + + outfile = aoutfile; + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteLine +//purpose : +//======================================================================= +void WOKMake_OutputFile::WriteLine(Standard_OStream& astream, + const Handle(WOKMake_OutputFile)& outfile) +{ + if(outfile.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_OutputFile::WriteLine : Null Output"); + } + + if(outfile->IsProduction()) astream << "+"; + else astream << "-"; + if(!outfile->IsPhysic()) astream << "V"; + if(outfile->IsStepID()) astream << "S"; + if(outfile->IsMember()) astream << "M"; + else astream << "E"; + + astream << " "; + + if(outfile->IsLocateAble()) + { + if(outfile->IsPhysic()) + { + astream << outfile->File()->LocatorName()->ToCString() << " " << outfile->LastPath()->Name()->ToCString() << endl; + } + else + { + astream << outfile->ID()->ToCString() << " ." << endl; + } + } + else + { + astream << ". " << outfile->LastPath()->Name()->ToCString() << endl; + } + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_OutputFile::ReadFile(const Handle(WOKUtils_Path)& apath, + const Handle(WOKernel_Locator)& alocator, + WOKMake_IndexedDataMapOfHAsciiStringOfOutputFile& amap) +{ + if(apath->Exists()) + { + Standard_Integer i; + ifstream astream(apath->Name()->ToCString()); + Handle(WOKMake_OutputFile) outfile; + + ReadLine(astream, alocator, outfile); + + while(!outfile.IsNull()) + { + i++; + amap.Add(outfile->ID(), outfile); + ReadLine(astream, alocator, outfile); + } + astream.close(); + return i; + } + return 0; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_OutputFile::WriteFile(const Handle(WOKUtils_Path)& apath, + const WOKMake_IndexedDataMapOfHAsciiStringOfOutputFile& amap) +{ + Standard_Integer i; + ofstream astream(apath->Name()->ToCString(), ios::out); + + if(!astream) + { + ErrorMsg << "WOKMake_StepOutput::Dump" << "Could not open " << apath->Name() << endm; + Standard_ProgramError::Raise(""); + } + + for(i=1; i<=amap.Extent(); i++) + { + WriteLine(astream, amap(i)); + } + astream.close(); + return 0; +} + + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ReadFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_OutputFile::ReadFile(const Handle(WOKUtils_Path)& apath, + const Handle(WOKernel_Locator)& alocator, + const Handle(WOKMake_HSequenceOfOutputFile)& aseq) +{ + if(apath.IsNull() || aseq.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_OutputFile::ReadFile : NullOutput"); + } + + if(apath->Exists()) + { + Standard_Integer i; + ifstream astream(apath->Name()->ToCString(), ios::in); + Handle(WOKMake_OutputFile) outfile; + + ReadLine(astream, alocator, outfile); + while(!outfile.IsNull()) + { + i++; + aseq->Append(outfile); + ReadLine(astream, alocator, outfile); + } + + astream.close(); + return i; + } + return 0; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WriteFile +//purpose : +//======================================================================= +Standard_Integer WOKMake_OutputFile::WriteFile(const Handle(WOKUtils_Path)& apath, + const Handle(WOKMake_HSequenceOfOutputFile)& aseq) +{ + Standard_Integer i; + ofstream astream(apath->Name()->ToCString(), ios::out); + + if(!astream) + { + ErrorMsg << "WOKMake_StepOutput::Dump" << "Could not open " << apath->Name() << endm; + Standard_ProgramError::Raise(""); + } + + for(i=1; i<=aseq->Length(); i++) + { + WriteLine(astream, aseq->Value(i)); + } + astream.close(); + return 0; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetReference +//purpose : +//======================================================================= +void WOKMake_OutputFile::SetReference() +{ + myattr &= (STEPFILE_REFPROD ^ myattr); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetReference +//purpose : +//======================================================================= +void WOKMake_OutputFile::SetProduction() +{ + myattr |= STEPFILE_REFPROD; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetReference +//purpose : +//======================================================================= +void WOKMake_OutputFile::SetMember() +{ + myattr |= STEPFILE_MEMBEXT; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetReference +//purpose : +//======================================================================= +void WOKMake_OutputFile::SetExtern() +{ + myattr &= (STEPFILE_MEMBEXT ^ myattr); +} + diff --git a/src/WOKMake/WOKMake_OutputFile.lxx b/src/WOKMake/WOKMake_OutputFile.lxx new file mode 100755 index 0000000..6bb694e --- /dev/null +++ b/src/WOKMake/WOKMake_OutputFile.lxx @@ -0,0 +1,28 @@ +// File: WOKMake_OutputFile.lxx +// Created: Wed Jun 19 15:38:08 1996 +// Author: Jean GAUTIER +// + + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsProduction +//purpose : +//======================================================================= +Standard_Boolean WOKMake_OutputFile::IsProduction() const +{ + if(myattr & STEPFILE_REFPROD) return Standard_True; + else return Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsMember +//purpose : +//======================================================================= +Standard_Boolean WOKMake_OutputFile::IsMember() const +{ + if(myattr & STEPFILE_MEMBEXT) return Standard_True; + else return Standard_False; +} diff --git a/src/WOKMake/WOKMake_Step.cdl b/src/WOKMake/WOKMake_Step.cdl new file mode 100755 index 0000000..a7483d0 --- /dev/null +++ b/src/WOKMake/WOKMake_Step.cdl @@ -0,0 +1,352 @@ +-- File: WOKMake_Step.cdl +-- Created: Wed Aug 23 11:21:00 1995 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1995 + +deferred class Step from WOKMake +inherits TShared from MMgt + + ---Purpose: Base class for umake Process + +uses + Status from WOKMake, + HSequenceOfStepOption from WOKMake, + HSequenceOfInputFile from WOKMake, + HSequenceOfOutputFile from WOKMake, + IndexedMapOfDepItem from WOKMake, + IndexedDataMapOfHAsciiStringOfInputFile from WOKMake, + IndexedDataMapOfHAsciiStringOfOutputFile from WOKMake, + StepFile from WOKMake, + InputFile from WOKMake, + OutputFile from WOKMake, + DepItem from WOKMake, + FileStatus from WOKMake, + Status from WOKMake, + BuildProcess from WOKMake, + BuildProcessPtr from WOKMake, + DevUnit from WOKernel, + HSequenceOfFile from WOKernel, + File from WOKernel, + Locator from WOKernel, + UnitGraph from WOKernel, + HSequenceOfEntity from WOKBuilder, + Entity from WOKBuilder, + Shell from WOKUtils, + Path from WOKUtils, + HSequenceOfHAsciiString from TColStd, + HArray2OfInteger from TColStd, + HAsciiString from TCollection + +raises + ProgramError from Standard + +is + Initialize(aprocess : BuildProcess from WOKMake; + aunit : DevUnit from WOKernel; + acode : HAsciiString from TCollection; + checked, hidden : Boolean from Standard); + + + --- Contruction D'une WOKBuilder_Entity a partir d'un WOKernel_File + BuilderEntity(me; afile : File from WOKernel) + returns mutable Entity from WOKBuilder + is virtual protected; + + BuilderEntity(me; apath : Path from WOKUtils) + returns mutable Entity from WOKBuilder + is virtual protected; + + -- Calcul des entites en entree de l'etape + -- + -- 1 - les entites propres a l'etape dans cette ud + -- 2 - les composants externes utilises par cette ud (autres specs, + -- includes ...) + + HandleInputFile(me:mutable; anitem : InputFile from WOKMake) + ---Purpose: 1 - Adds File In list if file is an input of step + -- 2 - Sets Build Flag if file is a candidate to construction + returns Boolean from Standard + is deferred protected; + + GetInputFromStep(me:mutable; astep : Step from WOKMake); + + GetInputFlow(me:mutable) + ---Purpose: Computes Entity list involved in step preforming + -- in the InputFlow list. + is virtual protected; + + -- Calcul des dependances liees a l'etape : + -- + -- 1 - L'etape (ou un de ses composants) est-elle a (re)faire ? + -- 2 - Quels sont les entites d'entree de l'etape a refaire ? + + InputFileList(me : mutable) + ---C++: return const & + returns HSequenceOfInputFile from WOKMake; + + LoadDependencies(me:mutable) + is virtual protected; + + StepFileStatus(me:mutable; afile : mutable StepFile from WOKMake; alocator : Locator from WOKernel) + returns FileStatus from WOKMake + is private; + + OutOfDateEntities(me:mutable) + ---Purpose: Set Build flag to OutOfDate entities + -- Clears Build flag to Uptodate Entities + -- This base implementation does nothing + returns HSequenceOfInputFile from WOKMake + is virtual protected; + + HandleTargets(me:mutable) + returns HSequenceOfInputFile from WOKMake + is virtual protected; + + ForceBuild(me:mutable) + returns HSequenceOfInputFile from WOKMake + is virtual protected; + ---Purpose: Force construction of step + + CompleteExecList(me:mutable; alist : HSequenceOfInputFile from WOKMake) + is virtual protected; + + -- Construction + -- + + ExecutionInputList(me:mutable) + returns HSequenceOfInputFile from WOKMake + is virtual protected; + + CheckStatus(me; acontext : CString from Standard) + returns Boolean from Standard + is protected; + + AddExecDepItem(me: mutable; input : InputFile from WOKMake; + output : OutputFile from WOKMake; + adirectflag : Boolean from Standard); + ---Purpose: Add an execution item in sequence + + Execute(me:mutable; execlist : HSequenceOfInputFile from WOKMake) + ---Purpose: Executes step + -- Computes output files + is deferred private; + + AcquitExecution(me:mutable; execlist : HSequenceOfInputFile from WOKMake) + is virtual protected; + + Init(me:mutable) + is virtual protected; + + + Make(me:mutable) + ---Purpose: Computes dependances + -- Decides if perform is needed. + -- Performs Step on needed entities + -- returns status + returns Status from WOKMake is virtual; + + Terminate(me:mutable) + is virtual protected; + + OutputFileList(me) + returns HSequenceOfOutputFile from WOKMake; + + -- + -- Ouput file Management + -- + + HandleOutputFile(me:mutable; anfile : OutputFile from WOKMake) + ---Purpose: Handles Output file new/same/disappereread + returns Boolean from Standard + is virtual ; + + -- + -- + -- + -- + + BuildProcess(me) + ---C++: inline + returns BuildProcess from WOKMake + is protected; + + Unit(me) + ---C++: return const & + ---C++: inline + returns DevUnit from WOKernel; + + StepOutputID(myclass; aname, acode: HAsciiString from TCollection) + returns HAsciiString from TCollection; + + StepOutputID(myclass; aname, acode, asubcode : HAsciiString from TCollection) + returns HAsciiString from TCollection; + + StepOutputID(me) + returns HAsciiString from TCollection; + + + AdmFileType(me) + returns HAsciiString from TCollection + is deferred protected; + + InputFilesFileName(me) + returns HAsciiString from TCollection + is virtual; + DepItemsFileName(me) + returns HAsciiString from TCollection + is virtual; + OutputFilesFileName(me) + returns HAsciiString from TCollection + is virtual; + + LogFileName(me) + returns HAsciiString from TCollection + is virtual; + + AdmFile(me; aname : HAsciiString from TCollection) + returns mutable File from WOKernel + is virtual; + + LocateAdmFile(me; alocator : Locator from WOKernel; aname : HAsciiString from TCollection) + returns mutable File from WOKernel; + + + -- Step Properties Management + -- + + UniqueName(myclass; aunit : DevUnit from WOKernel; acode, asubcode : HAsciiString from TCollection) + returns HAsciiString from TCollection; + + SplitUniqueName(myclass; anid : HAsciiString from TCollection; auname, acode, asubcode : out HAsciiString from TCollection); + + UniqueName(me:mutable) + ---C++: return const & + returns HAsciiString from TCollection; + + Code(me) returns HAsciiString from TCollection; + + SetSubCode(me:mutable; acode : HAsciiString from TCollection) is private; + SubCode(me) returns HAsciiString from TCollection; + + IsHidden(me) returns Boolean from Standard; + IsChecked(me) returns Boolean from Standard; + + -- Step Status Management + -- + + SetUptodate(me:mutable); + SetSucceeded(me:mutable); + SetIncomplete(me:mutable); + SetFailed(me:mutable); + SetUnprocessed(me:mutable); + SetStatus(me:mutable; astatus : Status from WOKMake); + + Status(me) returns Status from WOKMake; + + + IsOrIsSubStepOf(me; acode : HAsciiString from TCollection) + ---Purpose: return true if step has that code or if step is sub + -- of thet code + returns Boolean from Standard; + + Shell(me) + ---C++: return const & + ---C++: inline + returns Shell from WOKUtils; + + UnitGraph(me) + ---C++: return const & + ---C++: inline + returns UnitGraph from WOKernel; + + Locator(me) + ---C++: return const & + ---C++: inline + returns Locator from WOKernel; + + InLocator(me) + returns mutable Locator from WOKernel + is virtual; + + OutLocator(me) + returns mutable Locator from WOKernel + is virtual; + + OutputDirTypeName(me) + returns HAsciiString from TCollection + is deferred protected; + + SetOutputDir(me:mutable; adir : Path from WOKUtils); + OutputDir(me:mutable) returns Path from WOKUtils; + + IsDBMSDependent(me) + returns Boolean from Standard; + IsStationDependent(me) + returns Boolean from Standard; + + + -- Options Management + -- + + SetOptions(me:mutable; options : HSequenceOfStepOption from WOKMake); + Options(me) returns HSequenceOfStepOption from WOKMake; + + -- Targets Management + -- + + SetTargets(me:mutable; targets : HSequenceOfHAsciiString from TColStd); + Targets(me) returns HSequenceOfHAsciiString from TColStd; + + -- Gestion des etapes precedentes + -- + + PrecedenceSteps(me) returns HSequenceOfHAsciiString from TColStd; + SetPrecedenceSteps(me:mutable; steps : HSequenceOfHAsciiString from TColStd); + + IsToExecute(me) returns Boolean from Standard; + DoExecute(me:mutable); + DontExecute(me:mutable); + +fields + myunit : DevUnit from WOKernel; + myunique : HAsciiString from TCollection; + + mycode : HAsciiString from TCollection; + mysubcode : HAsciiString from TCollection; + + myprocess : BuildProcessPtr from WOKMake; + + myinputcomp : Boolean from Standard; + myinflow : IndexedDataMapOfHAsciiStringOfInputFile from WOKMake is protected; + myinput : HSequenceOfInputFile from WOKMake; + + mydeploaded : Boolean from Standard; + mydepin : IndexedDataMapOfHAsciiStringOfInputFile from WOKMake is protected; + mydepitems : IndexedMapOfDepItem from WOKMake is protected; + mydepmatrix : HArray2OfInteger from TColStd is protected; + mydepout : IndexedDataMapOfHAsciiStringOfOutputFile from WOKMake is protected; + + myoutflow : IndexedDataMapOfHAsciiStringOfOutputFile from WOKMake is protected; + myitems : IndexedMapOfDepItem from WOKMake; + + myoutput : HSequenceOfOutputFile from WOKMake; + + myprecsteps : HSequenceOfHAsciiString from TColStd; + mystatus : Status from WOKMake; + mycheck : Boolean from Standard; + myhidden : Boolean from Standard; + myexecflag : Boolean from Standard; + mytargets : HSequenceOfHAsciiString from TColStd; + myoptions : HSequenceOfStepOption from WOKMake; + + myoutputdir : Path from WOKUtils; + + +friends + + class StepBuilder from WOKMake, + class BuildProcess from WOKMake + +end Step; + diff --git a/src/WOKMake/WOKMake_Step.cxx b/src/WOKMake/WOKMake_Step.cxx new file mode 100755 index 0000000..b26fb78 --- /dev/null +++ b/src/WOKMake/WOKMake_Step.cxx @@ -0,0 +1,1548 @@ +// File: WOKMake_Step.cxx +// Created: Wed Aug 23 14:46:05 1995 +// Author: Jean GAUTIER +// + +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef WNT +# include +# include +#endif // WNT + +#include +#include +#include +#include +#include +#include +#include + +#include + +//======================================================================= +//function : WOKMake_Step +//purpose : +//======================================================================= +WOKMake_Step::WOKMake_Step(const Handle(WOKMake_BuildProcess)& aprocess, + const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Standard_Boolean checked, + const Standard_Boolean hidden) +: myprocess(aprocess.operator->()), myunit(aunit), mycode(acode), mycheck(checked), myhidden(hidden), + mystatus(WOKMake_Unprocessed), myexecflag(Standard_False), mydeploaded(Standard_False), myinputcomp(Standard_False) +{ +} + +//======================================================================= +//function : BuilderEntity +//purpose : +//======================================================================= +Handle(WOKBuilder_Entity) WOKMake_Step::BuilderEntity(const Handle(WOKernel_File)& afile) const +{ + Handle(WOKBuilder_Entity) result; + if(!afile.IsNull()) + { + return BuilderEntity(afile->Path()); + } + return result; +} + +//======================================================================= +//function : BuilderEntity +//purpose : +//======================================================================= +Handle(WOKBuilder_Entity) WOKMake_Step::BuilderEntity(const Handle(WOKUtils_Path)& apath) const +{ + Handle(WOKBuilder_Entity) result; + if(!apath.IsNull()) + { + switch(apath->Extension()) + { + case WOKUtils_CFile: return new WOKBuilder_Compilable(apath); + case WOKUtils_HFile: return new WOKBuilder_Include(apath); + case WOKUtils_CDLFile: return new WOKBuilder_CDLFile(apath); + case WOKUtils_CXXFile: return new WOKBuilder_Compilable(apath); + case WOKUtils_HXXFile: return new WOKBuilder_Include(apath); + case WOKUtils_INCFile: return new WOKBuilder_Include(apath); + case WOKUtils_IXXFile: return new WOKBuilder_Include(apath); + case WOKUtils_JXXFile: return new WOKBuilder_Include(apath); + case WOKUtils_LXXFile: return new WOKBuilder_Include(apath); + case WOKUtils_GXXFile: return new WOKBuilder_Include(apath); + case WOKUtils_LexFile: return new WOKBuilder_CodeGenFile(apath); + case WOKUtils_YaccFile: return new WOKBuilder_CodeGenFile(apath); + case WOKUtils_PXXFile: return new WOKBuilder_Include(apath); + case WOKUtils_LWSFile: return new WOKBuilder_CodeGenFile(apath); + case WOKUtils_F77File: return new WOKBuilder_Compilable(apath); + case WOKUtils_PSWFile: return new WOKBuilder_CodeGenFile(apath); + case WOKUtils_CSHFile: return new WOKBuilder_Miscellaneous(apath); + case WOKUtils_ObjectFile: return new WOKBuilder_ObjectFile(apath); + case WOKUtils_MFile: return new WOKBuilder_MFile(apath); + case WOKUtils_CompressedFile: return new WOKBuilder_CompressedFile(apath); + case WOKUtils_ArchiveFile: return new WOKBuilder_ArchiveLibrary(apath); + case WOKUtils_DSOFile: return new WOKBuilder_SharedLibrary(apath); + case WOKUtils_DATFile: return new WOKBuilder_Miscellaneous(apath); + case WOKUtils_LispFile: return new WOKBuilder_Miscellaneous(apath); + case WOKUtils_IconFile: return new WOKBuilder_Miscellaneous(apath); + case WOKUtils_TextFile: return new WOKBuilder_Miscellaneous(apath); + case WOKUtils_TarFile: return new WOKBuilder_TarFile(apath); + case WOKUtils_UnknownFile: return new WOKBuilder_Miscellaneous(apath); + case WOKUtils_NoExtFile: return new WOKBuilder_Miscellaneous(apath); +#ifdef WNT + case WOKUtils_LIBFile: return new WOKBuilder_StaticLibrary ( apath ); + case WOKUtils_IMPFile: return new WOKBuilder_ImportLibrary ( apath ); +#endif // WNT + + default: return new WOKBuilder_Miscellaneous(apath); + } + } + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetInputFromStep +//purpose : +//======================================================================= +void WOKMake_Step::GetInputFromStep(const Handle(WOKMake_Step)& astep) +{ + Standard_Integer j; + Handle(WOKMake_HSequenceOfOutputFile) out = astep->OutputFileList(); + + WOK_TRACE { + VerboseMsg("WOK_MAKE") << "WOKMake_Step::GetInputFromStep" + << "Compute Input Flow from step: " << astep->Unit()->Name() << ":" << astep->Code() << endm; + } + + if(out.IsNull()) + { + ErrorMsg << "WOKMake_Step::GetInputFromStep" + << "Output file list of step (" << astep->Code() << ") is not available" << endm; + ErrorMsg << "WOKMake_Step::GetInputFromStep" + << "Please perform this step before using step : " << Code() << endm; + SetFailed(); + return; + } + + for(j=1; j<=out->Length(); j++) + { + const Handle(WOKMake_OutputFile)& outfile = out->Value(j); + Handle(WOKMake_InputFile) infile; + + if(!myinflow.Contains(outfile->ID())) + { + if(!outfile->IsStepID() && outfile->IsLocateAble()) + { + if(outfile->File().IsNull()) + { + if(!outfile->IsPhysic()) + { + Handle(TCollection_HAsciiString) type = outfile->ID()->Token(":", 2); + if(!strcmp("msentity", type->ToCString())) + { + Handle(TCollection_HAsciiString) name = outfile->ID()->Token(":", 3); + Handle(WOKernel_DevUnit) aunit = OutLocator()->LocateDevUnit(outfile->ID()->Token(":", 1)); + + if(aunit.IsNull()) + { + WarningMsg << "WOKMake_Step::GetInputFromStep" + << "Skipping msentity " << name << " : unit " + << outfile->ID()->Token(":", 1) << " not found" << endm; + } + else + { + infile = new WOKMake_InputFile(outfile->ID(), Handle(WOKernel_File)(), + Handle(WOKBuilder_Entity)(), outfile->LastPath()); + infile->SetLocateFlag(Standard_True); + infile->SetDirectFlag(Standard_True); + infile->SetPhysicFlag(Standard_False); + } + } + else + { + infile = new WOKMake_InputFile(outfile); + infile->SetDirectFlag(Standard_True); + } + } + else + { + WarningMsg << "WOKMake_Step::GetInputFromStep" + << "Skipping file " << outfile->LastPath()->Name() << " : not found" << endm; + } + } + else + { + infile = new WOKMake_InputFile(outfile); + infile->SetDirectFlag(Standard_True); + } + } + else if(outfile->IsStepID()) + { + Handle(WOKMake_MetaStep) meta = Handle(WOKMake_MetaStep)::DownCast(this); + + if(!meta.IsNull()) + { + // In MetaSteps keep identical + infile = new WOKMake_InputFile(outfile); + infile->SetPhysicFlag(Standard_False); + infile->SetDirectFlag(Standard_True); + } + else + { + // in other ones expand underlying steps output + Handle(WOKMake_Step) ustep = myprocess->Find(outfile->ID()); + if(!ustep.IsNull()) + { + GetInputFromStep(ustep); + } + } + } + if(!outfile->IsLocateAble()) + { + infile = new WOKMake_InputFile(outfile); + infile->SetDirectFlag(Standard_True); + } + } + + if(!infile.IsNull()) + { + if(HandleInputFile(infile)) + { + myinflow.Add(infile->ID(), infile); + } + } + } +} + +//======================================================================= +//function : GetInputFlow +//purpose : +//======================================================================= +void WOKMake_Step::GetInputFlow() +{ + if(myinputcomp) return; + + Standard_Integer i; + Handle(TColStd_HSequenceOfHAsciiString) steps = PrecedenceSteps(); + + WOK_TRACE { + VerboseMsg("WOK_MAKE") << "WOKMake_Step::GetInputFlow" + << "Computing Input Flow" << endm; + } + + if(steps.IsNull()) return; + + for(i=1; i<=steps->Length(); i++) + { + GetInputFromStep(myprocess->Find(steps->Value(i))); + if(CheckStatus("WOKMake_Step::GetInputFlow")) return; + } + + myinputcomp = Standard_True; + return; +} + +//======================================================================= +//function : InputFileList +//purpose : +//======================================================================= +const Handle(WOKMake_HSequenceOfInputFile)& WOKMake_Step::InputFileList() +{ + if(!myinput.IsNull()) return myinput; + + GetInputFlow(); + + myinput = new WOKMake_HSequenceOfInputFile; + + for(Standard_Integer i=1; i<=myinflow.Extent(); i++) + { + const Handle(WOKMake_InputFile)& afile = myinflow(i); + + if(afile->IsDirectInput()) + { + switch(afile->Status()) + { + case WOKMake_Undetermined: + case WOKMake_New: + case WOKMake_Same: + case WOKMake_Moved: + myinput->Append(afile); + break; + default: + break; + } + } + } + return myinput; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : LoadDependencies +//purpose : +//======================================================================= +void WOKMake_Step::LoadDependencies() +{ + if(mydeploaded) return; + + Standard_Integer i; + + Handle(WOKernel_File) inputfile = LocateAdmFile(InLocator(), InputFilesFileName()); + if(inputfile.IsNull()) return; + + Handle(WOKernel_File) outputfile = LocateAdmFile(OutLocator(), OutputFilesFileName()); + if(outputfile.IsNull()) return; + + Handle(WOKernel_File) depfile = LocateAdmFile(InLocator(), DepItemsFileName()); + if(depfile.IsNull()) return; + + WOKMake_InputFile::ReadFile(inputfile->Path(), InLocator(), mydepin); + WOKMake_OutputFile::ReadFile(outputfile->Path(), OutLocator(), mydepout); + WOKMake_DepItem::ReadFile(depfile->Path(), mydepitems); + + + if(mydepout.Extent() && mydepin.Extent()) + { + mydepmatrix = new TColStd_HArray2OfInteger(1, mydepout.Extent(), 1, mydepin.Extent(), 0); + + for(i=1; i<=mydepitems.Extent(); i++) + { + const Handle(WOKMake_DepItem)& anitem = mydepitems(i); + Standard_Integer in_index, out_index; + + if(!mydepin.Contains(anitem->IssuedFrom())) + { + ErrorMsg << "WOKMake_Step::LoadDependencies" + << "Unknown origin : " << anitem->IssuedFrom() << endm; + ErrorMsg << "WOKMake_Step::LoadDependencies" + << "Dependences could not be loaded : will force step" << endm; + mydepmatrix.Nullify(); + mydepitems.Clear(); + mydepin.Clear(); + mydepout.Clear(); + return; + //Standard_ProgramError::Raise("WOKMake_Step::LoadDependencies : Unknown origin"); + } + else + in_index = mydepin.FindIndex(anitem->IssuedFrom()); + + if(!mydepout.Contains(anitem->OutputFile())) + { + ErrorMsg << "WOKMake_Step::LoadDependencies" + << "Unknown output : " << anitem->OutputFile() << endm; + ErrorMsg << "WOKMake_Step::LoadDependencies" + << "Dependences could not be loaded : will force step" << endm; + mydepmatrix.Nullify(); + mydepitems.Clear(); + mydepin.Clear(); + mydepout.Clear(); + mydeploaded = Standard_True; + return; + //Standard_ProgramError::Raise("WOKMake_Step::LoadDependencies : Unknown output"); + } + else + out_index = mydepout.FindIndex(anitem->OutputFile()); + + if(mydepmatrix->Value(out_index, in_index)) + { + WarningMsg << "WOKMake_Step::LoadDependencies" + << "Ignoring duplicate line in depfile (" << anitem->OutputFile() << " : " << anitem->IssuedFrom() << ")" << endm; + } + else + { + mydepmatrix->SetValue(out_index, in_index, i); + } + } + } + mydeploaded = Standard_True; + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : StepFileStatus +//purpose : +//======================================================================= +WOKMake_FileStatus WOKMake_Step::StepFileStatus(const Handle(WOKMake_StepFile)& afile, const Handle(WOKernel_Locator)& alocator) +{ + if(afile->IsLocateAble() && afile->IsPhysic()) + { + Handle(WOKernel_File) current = alocator->Locate(afile->ID()); + + if(current.IsNull()) + { + afile->SetStatus(WOKMake_Disappeared); + return WOKMake_Disappeared; + } + else + { + if(!current->Path()->Name()->IsSameString(afile->LastPath()->Name())) + { + afile->SetStatus(WOKMake_Moved); + return WOKMake_Moved; + } + } + } + else if(afile->IsPhysic()) + { + if(!afile->LastPath()->Exists()) + { + afile->SetStatus(WOKMake_Disappeared); + return WOKMake_Disappeared; + } + } + + afile->SetStatus(WOKMake_Undetermined); + return WOKMake_Undetermined; +} + +//======================================================================= +//function : OutOfDateEntities +//purpose : +//======================================================================= +Handle(WOKMake_HSequenceOfInputFile) WOKMake_Step::OutOfDateEntities() +{ + LoadDependencies(); + + Handle(WOKMake_HSequenceOfInputFile) result = new WOKMake_HSequenceOfInputFile; + Handle(WOKMake_InputFile) infile; + Handle(WOKMake_OutputFile) outfile; + WOKTools_MapOfHAsciiString amap; + Standard_Integer i,j, value; + + + if(mydepmatrix.IsNull()) + { + return ForceBuild(); + } + + + for(i=1; i<=mydepin.Extent(); i++) + { + const Handle(WOKMake_InputFile)& infile = mydepin(i); + + if(infile->IsDirectInput()) + { + if(!myinflow.Contains(infile->ID())) + { + infile->SetStatus(WOKMake_Disappeared); + } + else + StepFileStatus(infile, InLocator()); + } + else + StepFileStatus(infile, InLocator()); + + switch(infile->Status()) + { + case WOKMake_New: + case WOKMake_Moved: + if(myinflow.Contains(infile->ID())) + { + const Handle(WOKMake_InputFile)& inflowfile = myinflow.FindFromKey(infile->ID()); + amap.Add(inflowfile->ID()); + result->Append(inflowfile); + } + break; + case WOKMake_Disappeared: + if(myinflow.Contains(infile->ID())) + { + ErrorMsg << "WOKMake_Step::OutOfDateEntities" + << "Could not locate input file : " << infile->ID() << endm; + SetFailed(); + return result; + } + break; + case WOKMake_Same: + case WOKMake_Undetermined: + break; + } + } + + for(i=1; i<=myinflow.Extent(); i++) + { + const Handle(WOKMake_InputFile)& infile = myinflow(i); + if(!mydepin.Contains(infile->ID())) + { + if(amap.Add(infile->ID())) + result->Append(infile); + } + } + + for(i=mydepmatrix->LowerRow(); i<=mydepmatrix->UpperRow(); i++) + { + Standard_Boolean outofdate = Standard_False; + Standard_Boolean founddirectdep = Standard_False; + Handle(WOKMake_InputFile) adirect; + + const Handle(WOKMake_OutputFile)& outfile = mydepout(i); + + switch(StepFileStatus(outfile, OutLocator())) + { + case WOKMake_New: + outofdate = Standard_True; + break; + case WOKMake_Disappeared: + outofdate = Standard_True; + break; + case WOKMake_Moved: + case WOKMake_Same: + case WOKMake_Undetermined: + break; + } + + + for(j=mydepmatrix->LowerCol(); j<=mydepmatrix->UpperCol() && !outofdate ; j++) + { + value = mydepmatrix->Value(i,j); + + if(value) + { + const Handle(WOKMake_InputFile)& infile = mydepin(j); + switch(infile->Status()) + { + case WOKMake_New: + case WOKMake_Moved: + outofdate = Standard_True; + break; + case WOKMake_Disappeared: + outofdate = Standard_True; + break; + case WOKMake_Same: + case WOKMake_Undetermined: + if(infile->IsPhysic()) + { + if(infile->LastPath()->IsNewer(outfile->LastPath())) + outofdate = Standard_True; + } + else + { + if (infile->IsStepID()) + outofdate = Standard_True; + else + outofdate = Standard_False; + } + break; + } + if(outofdate) + { + const Handle(WOKMake_DepItem)& anitem = mydepitems(value); + if(anitem->IsDirectDep()) + if(myinflow.Contains(anitem->IssuedFrom())) + { + if(amap.Add(anitem->IssuedFrom())) + result->Append(myinflow.FindFromKey(anitem->IssuedFrom())); + founddirectdep = Standard_True; + } + + } + } + } + + if(outofdate && (! founddirectdep)) + { + // rechercher une dep directe valide + for(j=mydepmatrix->LowerCol(); j<=mydepmatrix->UpperCol() && !founddirectdep ; j++) + { + value = mydepmatrix->Value(i,j); + if(value) + { + const Handle(WOKMake_DepItem)& anitem = mydepitems(value); + if(anitem->IsDirectDep()) + { + outofdate = Standard_True; + founddirectdep = Standard_True; + if(myinflow.Contains(anitem->IssuedFrom())) + if(amap.Add(anitem->IssuedFrom())) + result->Append(myinflow.FindFromKey(anitem->IssuedFrom())); + } + } + } + } + } + + return result; +} + +//======================================================================= +//function : HandleTargets +//purpose : +//======================================================================= +Handle(WOKMake_HSequenceOfInputFile) WOKMake_Step::HandleTargets() +{ + Standard_Integer i; + Handle(TColStd_HSequenceOfHAsciiString) targets = Targets(); + Handle(WOKMake_HSequenceOfInputFile) result = new WOKMake_HSequenceOfInputFile; + Handle(WOKMake_InputFile) infile; + WOKTools_MapOfHAsciiString amap; + + for(i=1; i<=targets->Length(); i++) + { + if(!amap.Contains(targets->Value(i))) + { + amap.Add(targets->Value(i)); + } + } + + for(i=1; i<=myinflow.Extent(); i++) + { + infile = myinflow(i); + if (infile->IsLocateAble()) + { + Handle(TCollection_HAsciiString) astr = infile->ID()->Token(":", 3); + if(!astr.IsNull()) + { + if(amap.Contains(astr)) + { + result->Append(infile); + } + } + } + else + { + if (!infile->LastPath().IsNull()) + { + if(amap.Contains(infile->LastPath()->FileName())) + { + result->Append(infile); + } + } + } + } + + return result; +} + +//======================================================================= +//function : ForceBuild +//purpose : +//======================================================================= +Handle(WOKMake_HSequenceOfInputFile) WOKMake_Step::ForceBuild() +{ + Standard_Integer i; + Handle(WOKMake_HSequenceOfInputFile) result = new WOKMake_HSequenceOfInputFile; + Handle(WOKMake_InputFile) infile; + + for(i=1; i<=myinflow.Extent(); i++) + { + result->Append(myinflow(i)); + } + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : CompleteExecList +//purpose : +//======================================================================= +void WOKMake_Step::CompleteExecList(const Handle(WOKMake_HSequenceOfInputFile)& alist) +{ + Standard_Integer i; + Handle(WOKMake_InputFile) infile; + WOKTools_MapOfHAsciiString inmap; + + + for(i=1; i<=alist->Length(); i++) + { + inmap.Add(alist->Value(i)->ID()); + } + + LoadDependencies(); + + if(!mydepmatrix.IsNull()) + { + for(i=1; i<=myinflow.Extent(); i++) + { + infile = myinflow(i); + + if(mydepin.Contains(infile->ID())) + { + // Regarder s'il existe d'autres entrees directes + Standard_Integer in_index = mydepin.FindIndex(infile->ID()); + Standard_Integer j, k; + Standard_Boolean generatedoutput = Standard_False; + + for(j=mydepmatrix->LowerRow(); j<=mydepmatrix->UpperRow(); j++) + { + const Standard_Integer value = mydepmatrix->Value(j,in_index); + + if(value) + { + const Handle(WOKMake_DepItem)& item = mydepitems(value); + if(item->IsDirectDep() && inmap.Contains(item->IssuedFrom())) + { + for(k=mydepmatrix->LowerCol(); k<=mydepmatrix->UpperCol(); k++) + { + const Standard_Integer value = mydepmatrix->Value(j,k); + if(value) + { + const Handle(WOKMake_DepItem)& item = mydepitems(value); + if(myinflow.Contains(item->IssuedFrom())) + { + const Handle(WOKMake_InputFile)& infile = myinflow.FindFromKey(item->IssuedFrom()); + + + if(item->IsDirectDep()) + { + if(!inmap.Contains(item->IssuedFrom())) + { + inmap.Add(infile->ID()); + alist->Append(infile); + } + } + } + } + } + } + generatedoutput=Standard_True; + } + } + + if(!generatedoutput && infile->IsDirectInput()) + { + if(!inmap.Contains(infile->ID()) ) + { + inmap.Add(infile->ID()); + alist->Append(infile); + } + } + } + } + } + return; +} + + +//======================================================================= +//function : ExecutionInputList +//purpose : +//======================================================================= +Handle(WOKMake_HSequenceOfInputFile) WOKMake_Step::ExecutionInputList() +{ + + Handle(WOKMake_HSequenceOfInputFile) result; + + if(IsChecked() && !mytargets.IsNull() && !IsKind(STANDARD_TYPE(WOKMake_MetaStep))) return ForceBuild(); + + if(!mytargets.IsNull() && SubCode().IsNull()) + { + result = HandleTargets(); + } + else + { + if (IsChecked()) return ForceBuild(); + else + result = new WOKMake_HSequenceOfInputFile; + } + + if(!result->Length()) + { + if(!myoptions.IsNull()) + { + Standard_Integer i; + for(i=1; i<=myoptions->Length(); i++) + { + if(myoptions->Value(i) == WOKMake_Force) + return ForceBuild(); + } + } + result = OutOfDateEntities(); + } + + CompleteExecList(result); + return result; +} + + +//======================================================================= +//function : CheckStatus +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::CheckStatus(const Standard_CString amsg) const +{ + switch(Status()) + { + case WOKMake_Uptodate: + case WOKMake_Success: + case WOKMake_Unprocessed: + case WOKMake_Incomplete: + case WOKMake_Processed: + break; + case WOKMake_Failed: + ErrorMsg << "WOKMake_Step::Make" << "Failed during " << amsg << endm; + return Standard_True; + } + return Standard_False; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AddExecDepItem +//purpose : +//======================================================================= +void WOKMake_Step::AddExecDepItem(const Handle(WOKMake_InputFile)& infile, + const Handle(WOKMake_OutputFile)& outfile, + const Standard_Boolean adirectflag) +{ + if(infile.IsNull() || outfile.IsNull()) + Standard_ProgramError::Raise("WOKMake_Step::AddExecDepItem : Null Input"); + + myinflow.Add(infile->ID(), infile); + myoutflow.Add(outfile->ID(), outfile); + + Handle(WOKMake_DepItem) item = new WOKMake_DepItem(outfile->ID(), infile->ID()); + if(adirectflag) item->SetDirect(); + else item->SetIndirect(); + + myitems.Add(item); + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AcquitExecution +//purpose : +//======================================================================= +void WOKMake_Step::AcquitExecution(const Handle(WOKMake_HSequenceOfInputFile)& execlist) +{ + WOKMake_IndexedDataMapOfHAsciiStringOfInputFile inmap; + WOKMake_IndexedDataMapOfHAsciiStringOfOutputFile outmap; + WOKMake_IndexedMapOfDepItem items; + Handle(WOKMake_InputFile) infile; + Handle(WOKMake_OutputFile) outfile; + Handle(WOKMake_DepItem) item; + Standard_Integer i, j, index; + + LoadDependencies(); + + if(!PrecedenceSteps().IsNull()) + { + Handle(WOKernel_File) outs[3]; + + outs[0] = new WOKernel_File(InputFilesFileName(), Unit(), Unit()->GetFileType(AdmFileType())); + outs[1] = new WOKernel_File(OutputFilesFileName(), Unit(), Unit()->GetFileType(AdmFileType())); + outs[2] = new WOKernel_File(DepItemsFileName(), Unit(), Unit()->GetFileType(AdmFileType())); + + for(i=0; i<3; i++) + { + outs[i]->GetPath(); + Handle(WOKMake_OutputFile) outfile = new WOKMake_OutputFile(outs[i]->LocatorName(), outs[i], Handle(WOKBuilder_Entity)(), outs[i]->Path()); + + outfile->SetLocateFlag(Standard_True); + outfile->SetProduction(); + + for(j=1; j<=PrecedenceSteps()->Length(); j++) + { + const Handle(WOKMake_Step)& precstep = BuildProcess()->Find(PrecedenceSteps()->Value(j)); + + Handle(WOKernel_File) afile = precstep->LocateAdmFile(precstep->OutLocator(), precstep->OutputFilesFileName()); + + if(afile.IsNull()) + { + WarningMsg << "WOKMake_Step::AcquitExecution" + << "Could not find precedence step (" << precstep->UniqueName() + << ") admin file : " << precstep->OutputFilesFileName() << endm; + } + else + { + Handle(WOKMake_InputFile) infile = new WOKMake_InputFile(afile->LocatorName(), afile, Handle(WOKBuilder_Entity)(), afile->Path()); + infile->SetLocateFlag(Standard_True); + infile->SetDirectFlag(Standard_False); + + AddExecDepItem(infile, outfile, Standard_True); + } + } + } + } + else + { + Handle(WOKernel_File) outs[3]; + + outs[0] = new WOKernel_File(InputFilesFileName(), Unit(), Unit()->GetFileType(AdmFileType())); + outs[1] = new WOKernel_File(OutputFilesFileName(), Unit(), Unit()->GetFileType(AdmFileType())); + outs[2] = new WOKernel_File(DepItemsFileName(), Unit(), Unit()->GetFileType(AdmFileType())); + + + for(i=0; i<3; i++) + { + outs[i]->GetPath(); + Handle(WOKMake_OutputFile) outfile = new WOKMake_OutputFile(outs[i]->LocatorName(), outs[i], Handle(WOKBuilder_Entity)(), outs[i]->Path()); + outfile->SetLocateFlag(Standard_True); + outfile->SetProduction(); + + + Handle(WOKMake_InputFile) infile = new WOKMake_InputFile(outs[i]->LocatorName(), outs[i], Handle(WOKBuilder_Entity)(), outs[i]->Path()); + infile->SetLocateFlag(Standard_True); + infile->SetDirectFlag(Standard_False); + + AddExecDepItem(infile, outfile, Standard_True); + } + } + + // Chargement de la map d'execution + WOKTools_MapOfHAsciiString execmap; + + for(i=1; i<=execlist->Length(); i++) + { + execmap.Add(execlist->Value(i)->ID()); + } + + // BILAN INPUT + for(i=1; i<= mydepin.Extent(); i++) + { + const Handle(WOKMake_InputFile)& infile = mydepin(i); + infile->SetStatus(WOKMake_Disappeared); + inmap.Add(infile->ID(), infile); + } + + for(i=1; i<= myinflow.Extent(); i++) + { + const Handle(WOKMake_InputFile)& infile = myinflow(i); + + index = inmap.FindIndex(infile->ID()); + + if(index) + { + const Handle(WOKMake_InputFile)& oldfile = inmap(index); + + inmap(index) = infile; + + if(infile->IsPhysic()) + { + if(infile->LastPath()->Name()->IsSameString(oldfile->LastPath()->Name())) + infile->SetStatus(WOKMake_Same); + else + infile->SetStatus(WOKMake_Moved); + } + else + infile->SetStatus(WOKMake_Same); + } + else + { + inmap.Add(infile->ID(), infile); + infile->SetStatus(WOKMake_New); + } + } + myinflow.Clear(); + + // BILAN OUTPUT + + for(i=1; i<= mydepout.Extent(); i++) + { + const Handle(WOKMake_OutputFile)& outfile = mydepout(i); + outfile->SetStatus(WOKMake_Disappeared); + outmap.Add(outfile->ID(), outfile); + } + + for(i=1; i<= myoutflow.Extent(); i++) + { + const Handle(WOKMake_OutputFile)& outfile = myoutflow(i); + + index = outmap.FindIndex(outfile->ID()); + + if(index) + { + const Handle(WOKMake_OutputFile)& oldfile = outmap(index); + + outmap(index) = outfile; + + if(outfile->IsPhysic()) + { + if(outfile->LastPath()->Name()->IsSameString(oldfile->LastPath()->Name())) + outfile->SetStatus(WOKMake_Same); + else + outfile->SetStatus(WOKMake_Moved); + } + else + outfile->SetStatus(WOKMake_Same); + } + else + { + outmap.Add(outfile->ID(), outfile); + outfile->SetStatus(WOKMake_New); + } + } + myoutflow.Clear(); + + + // BILAN MATRIX/ITEMS + Handle(TCollection_HAsciiString) inid, outid; + Handle(TColStd_HArray2OfInteger) matrix; + + Standard_Integer in_index, out_index; + Standard_Integer depvalue, value; + + if(outmap.Extent() && inmap.Extent()) + { + matrix = new TColStd_HArray2OfInteger(1, outmap.Extent(), 1, inmap.Extent(), 0); + + if(myitems.Extent()) + { + for(i=1; i<=myitems.Extent(); i++) + { + item = myitems(i); + out_index = outmap.FindIndex(item->OutputFile()); + in_index = inmap.FindIndex(item->IssuedFrom()); + items.Add(item); + matrix->SetValue(out_index, in_index, items.Extent()); + item->SetStatus(WOKMake_New); + } + } + + + if(!mydepmatrix.IsNull()) + { + Standard_Integer* idxtab = new Standard_Integer[mydepmatrix->UpperCol()+1]; + + for (j = mydepmatrix->LowerCol(); j <= mydepmatrix->UpperCol(); j++) + { + idxtab[j] = inmap.FindIndex(mydepin.FindKey(j)); + } + + for (i = mydepmatrix->LowerRow(); i <= mydepmatrix->UpperRow(); i++) + { + Standard_Boolean stillproduced = Standard_False; + Standard_Boolean stillforexec = Standard_False; + out_index = outmap.FindIndex(mydepout.FindKey(i)); + + const Handle(WOKMake_OutputFile)& outfile = outmap(out_index); + + for (j = mydepmatrix->LowerCol(); j <= mydepmatrix->UpperCol(); j++) + { + //in_index = inmap.FindIndex(mydepin.FindKey(j)); + in_index = idxtab[j]; + + const Handle(WOKMake_InputFile)& infile = inmap(in_index); + + depvalue = mydepmatrix->Value(i,j); + value = matrix->Value(out_index, in_index); + + + if(!stillproduced) + { + if(depvalue) + { + const Handle(WOKMake_DepItem)& depitem = mydepitems(depvalue); + Standard_Boolean isinexec = execmap.Contains(depitem->IssuedFrom()); + + if( depitem->IsDirectDep() && infile->Status() != WOKMake_Disappeared) + { + if( value ) + { + stillproduced = Standard_True; + stillforexec = Standard_True; + } + else if (depvalue && !isinexec ) + { + stillproduced = Standard_True; + } + } + } + else if(value) + { + const Handle(WOKMake_DepItem)& item = items(value); + //Standard_Boolean isinexec = execmap.Contains(item->IssuedFrom()); + + if(!stillproduced && item->IsDirectDep()) + { + stillproduced = Standard_True; + stillforexec = Standard_True; + } + } + + if(stillproduced) + { + // Here I shoul roll back + } + } + + if(depvalue && value) + { + // A LA FOIS AVANT et APRES + const Handle(WOKMake_DepItem)& item = items(value); + item->SetStatus(WOKMake_Same); + } + else if(depvalue) + { + + // Dans les dependances seulement, on l'ajoute. + const Handle(WOKMake_DepItem)& depitem = mydepitems(depvalue); + items.Add(depitem); + depitem->SetStatus(WOKMake_Disappeared); + matrix->SetValue(out_index, in_index, items.Extent()); + + Standard_Boolean isinexec = execmap.Contains(depitem->IssuedFrom()); + + if(!isinexec) + { + if(infile->Status() != WOKMake_Disappeared) + { + depitem->SetStatus(WOKMake_Same); + } + } + + if(stillproduced && !stillforexec ) + { + if(!depitem->IsDirectDep()) + { + infile->SetStatus(WOKMake_Same); + depitem->SetStatus(WOKMake_Same); + } + } + } + else if(value) + { + const Handle(WOKMake_DepItem)& item = items(value); + item->SetStatus(WOKMake_New); + } + } + + if(stillproduced) + { + const Handle(WOKMake_OutputFile)& depoutfile = mydepout(i); + const Handle(WOKMake_OutputFile)& outfile = outmap(out_index); + if(depoutfile->IsPhysic()) + { + if(depoutfile->LastPath()->Name()->IsSameString(outmap(out_index)->LastPath()->Name())) + outfile->SetStatus(WOKMake_Same); + else + outfile->SetStatus(WOKMake_Moved); + } + else + { + outfile->SetStatus(WOKMake_Same); + } + } + else + { + outmap(out_index)->SetStatus(WOKMake_Disappeared); + } + } + delete [] idxtab; + } + } + + mydepmatrix.Nullify(); + mydepin.Clear(); + mydepout.Clear(); + + // BILAN ITEMS + myinflow.Clear(); + myoutflow.Clear(); + myitems.Clear(); + + if(!matrix.IsNull()) + { + for (i = matrix->LowerRow(); i <= matrix->UpperRow(); i++) + { + if (outmap(i)->Status() != WOKMake_Disappeared) { + for (j = matrix->LowerCol(); j <= matrix->UpperCol(); j++) + { + value = matrix->Value(i,j); + if(value) + { + const Handle(WOKMake_DepItem)& item = items(value); + if((item->Status() == WOKMake_Same) || (item->Status() == WOKMake_New) ) + { + myitems.Add(items(value)); + } + } + } + } + } + } + + for(i=1; i<=inmap.Extent(); i++) + { + const Handle(WOKMake_InputFile)& infile = inmap(i); + + switch(inmap(i)->Status()) + { + case WOKMake_New: + case WOKMake_Moved: + if(mystatus == WOKMake_Uptodate) mystatus = WOKMake_Processed; + case WOKMake_Same: + { + const Handle(WOKernel_File)& file = infile->File(); + if(!file.IsNull()) + { + const Handle(WOKUtils_Path)& path = file->Path(); + if(!path.IsNull()) infile->SetLastPath(path); + } + myinflow.Add(infile->ID(), infile); + } + break; + case WOKMake_Undetermined: + case WOKMake_Disappeared: + if(mystatus == WOKMake_Uptodate) mystatus = WOKMake_Processed; + break; + } + } + + myoutput = new WOKMake_HSequenceOfOutputFile; + + for(i=1; i<=outmap.Extent(); i++) + { + const Handle(WOKMake_OutputFile)& outfile = outmap(i); + + switch(outmap(i)->Status()) + { + case WOKMake_New: + case WOKMake_Moved: + if(mystatus == WOKMake_Uptodate) mystatus = WOKMake_Processed; + case WOKMake_Same: + { + const Handle(WOKernel_File)& file = outfile->File(); + if(!file.IsNull()) + { + const Handle(WOKUtils_Path)& path = file->Path(); + if(!path.IsNull()) outfile->SetLastPath(path); + } + myoutput->Append(outfile); + myoutflow.Add(outfile->ID(), outfile); + HandleOutputFile(outfile); + if(outfile->IsLocateAble() && outfile->IsPhysic()) + { + if (!outfile->File().IsNull()) { + OutLocator()->ChangeAdd(outfile->File()); + } + } + } + break; + case WOKMake_Undetermined: + case WOKMake_Disappeared: + HandleOutputFile(outfile); + if(mystatus == WOKMake_Uptodate) mystatus = WOKMake_Processed; + break; + } + } + +// if(mystatus != WOKMake_Uptodate) + { + Handle(WOKernel_File) infile = AdmFile(InputFilesFileName()); + + if(mystatus != WOKMake_Uptodate || !infile->Path()->Exists()) + { + WOKMake_InputFile::WriteFile(infile->Path(), myinflow); + InLocator()->ChangeAdd(infile); + } + + Handle(WOKernel_File) outfile = AdmFile(OutputFilesFileName()); + + if(mystatus != WOKMake_Uptodate || !outfile->Path()->Exists()) + { + WOKMake_OutputFile::WriteFile(outfile->Path(), myoutflow); + OutLocator()->ChangeAdd(outfile); + } + + Handle(WOKernel_File) items = AdmFile(DepItemsFileName()); + + if(mystatus != WOKMake_Uptodate || !items->Path()->Exists()) + { + WOKMake_DepItem::WriteFile(items->Path(), myitems); + InLocator()->ChangeAdd(items); + } + } + + myinflow.Clear(); + myoutflow.Clear(); + myitems.Clear(); + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Init +//purpose : +//======================================================================= +void WOKMake_Step::Init() +{ + +} + +//======================================================================= +//function : Make +//purpose : +//======================================================================= +WOKMake_Status WOKMake_Step::Make() +{ + + Init(); + + if(CheckStatus("perform init of step")) {Terminate(); return Status();} + + if(IsToExecute()) + { + Handle(WOKMake_HSequenceOfInputFile) execlist; + + GetInputFlow(); + + if(CheckStatus("getting input list")) {Terminate(); return Status();} + + execlist = ExecutionInputList(); + + if(CheckStatus("determine exec list")) {Terminate(); return Status();} + + if(execlist->Length() || IsChecked()) + { + Execute(execlist); + + if(CheckStatus("execution")) {Terminate(); return Status();} + } + else + { + SetUptodate(); + } + + AcquitExecution(execlist); + + if(CheckStatus("acquit execution")) {Terminate(); return Status();} + } + + Standard_Boolean process = Standard_False; + + if(!IsToExecute()) + { + if(!PrecedenceSteps().IsNull()) + { + for(Standard_Integer k=1; k<=PrecedenceSteps()->Length() && !process ; k++) + { + const Handle(WOKMake_Step)& astep = BuildProcess()->Find(PrecedenceSteps()->Value(k)); + + if(!astep.IsNull()) + { + switch(astep->Status()) + { + case WOKMake_Unprocessed: + case WOKMake_Uptodate: + case WOKMake_Failed: + break; + default: + process = Standard_True; + break; + } + } + } + } + else + { + process = Standard_False; + } + } + else + { + switch(Status()) + { + case WOKMake_Uptodate: + case WOKMake_Unprocessed: + break; + default: + process = Standard_True; + } + } + + if(process) + { + if(mystatus == WOKMake_Unprocessed) mystatus = WOKMake_Processed; + } + + Terminate(); + return Status(); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Terminate +//purpose : +//======================================================================= +void WOKMake_Step::Terminate() +{ + +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : OutputFileList +//purpose : +//======================================================================= +Handle(WOKMake_HSequenceOfOutputFile) WOKMake_Step::OutputFileList() const +{ + Handle(WOKMake_HSequenceOfOutputFile) result; + + if(Locator().IsNull()) + { + Standard_ProgramError::Raise("WOKMake_Step::OutputFileList Null Locator"); + } + + if(myoutput.IsNull()) + { + Handle(WOKernel_File) afile; + + afile = LocateAdmFile(OutLocator(), OutputFilesFileName()); + + if(afile.IsNull()) return result; + + result = new WOKMake_HSequenceOfOutputFile; + + WOKMake_OutputFile::ReadFile(afile->Path(), OutLocator(), result); + } + else + { + result = myoutput; + } + return result; +} + +//======================================================================= +//function : HandleOutputFile +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::HandleOutputFile(const Handle(WOKMake_OutputFile)& afile) +{ + if(afile.IsNull()) return Standard_False; + if(afile->File().IsNull()) return Standard_False; + + if((afile->IsLocateAble() && afile->IsProduction() && afile->IsPhysic()) || afile->IsStepID()) + { + switch(afile->Status()) + { + case WOKMake_New: + case WOKMake_Same: + case WOKMake_Moved: + break; + case WOKMake_Disappeared: + { + Handle(WOKernel_Entity) nesting = Unit()->Session()->GetEntity(afile->File()->Nesting()); + + if(nesting->FullName()->IsSameString(Unit()->FullName())) + { + Handle(WOKUtils_Shell) ashell = Shell(); + Handle(TCollection_HAsciiString) astr, atempl, acmd; + + if(!ashell->IsLaunched()) ashell->Launch(); + ashell->Lock(); + + astr = new TCollection_HAsciiString("%WOKSteps_Del_"); + astr->AssignCat(afile->File()->TypeName()); + + if(! Unit()->Params().IsSet(astr->ToCString())) + { + astr = new TCollection_HAsciiString("%WOKSteps_Del_Default"); + if(Unit()->Params().IsSet(astr->ToCString())) + { + atempl = Unit()->Params().Eval(astr->ToCString(),Standard_True); + } + } + else + { + atempl = Unit()->Params().Eval(astr->ToCString(),Standard_True); + } + + if(atempl.IsNull()) + { + WarningMsg << "WOKMake_Step::HandleOutputFile" + << "Could not determine Del action for type : " << afile->File()->TypeName() << endm; + ashell->UnLock(); + return Standard_False; + } + + if(! Unit()->Params().IsSet(atempl->ToCString())) + { + ErrorMsg << "WOKMake_Step::HandleOutputFile" + << "Could not eval Del action (" << atempl << ") for type : " << afile->File()->TypeName() << endm; + ashell->UnLock(); + return Standard_False; + } + + + if(afile->File()->Path()->Exists() || afile->File()->Path()->IsSymLink()) + { + Unit()->Params().Set("%FilePath", afile->File()->Path()->Name()->ToCString()); + + acmd = Unit()->Params().Eval(atempl->ToCString(),Standard_True); + + if(!acmd.IsNull()) + { + InfoMsg << "WOKMake_Step::HandleOutputFile" + << "Invoking " << atempl << " on " << afile->File()->Path()->Name() << endm; + + ashell->Execute(acmd); + + if(ashell->Status()) + { + Handle(TColStd_HSequenceOfHAsciiString) resseq = ashell->Errors(); + Standard_Boolean ph = ErrorMsg.PrintHeader(); + + ErrorMsg << "WOKMake_Step::HandleOutputFile" << "Errors occured in Shell" << endm; + ErrorMsg.DontPrintHeader(); + for(Standard_Integer i=1; i<= resseq->Length(); i++) + { + ErrorMsg << "WOKMake_Step::HandleOutputFile" << resseq->Value(i) << endm; + } + if(ph) ErrorMsg.DoPrintHeader(); + } + OutLocator()->ChangeRemove(afile->File()); + ashell->ClearOutput(); + return Standard_True; + } + } + else + { + if(afile->File()->Path()->IsSymLink()) + { + WarningMsg << "WOKMake_Step::HandleOutputFile" + << "Disappeared File (" << afile->File()->UserPathName() << ") does not exists " << endm; + } + } + ashell->UnLock(); + + } + else + { + WarningMsg << "WOKMake_Step::HandleOutputFile" + << "File " << afile->File()->UserPathName() << " is not in " << Unit()->UserPathName() + << " : Disappeared and left untouched" << endm; + return Standard_False; + } + } + break; + } + } + return Standard_False; +} diff --git a/src/WOKMake/WOKMake_Step.lxx b/src/WOKMake/WOKMake_Step.lxx new file mode 100755 index 0000000..b8426f7 --- /dev/null +++ b/src/WOKMake/WOKMake_Step.lxx @@ -0,0 +1,62 @@ +// File: WOKMake_Step.lxx +// Created: Mon Dec 4 15:31:20 1995 +// Author: Jean GAUTIER +// + + + +#include + +//======================================================================= +//Author : Jean Gautier (jga) +//function : BuildProcess +//purpose : +//======================================================================= +Handle(WOKMake_BuildProcess) WOKMake_Step::BuildProcess() const +{ + return myprocess; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Unit +//purpose : +//======================================================================= +const Handle(WOKernel_DevUnit)& WOKMake_Step::Unit() const +{ + return myunit; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Locator +//purpose : +//======================================================================= +const Handle(WOKernel_Locator)& WOKMake_Step::Locator() const +{ + return myprocess->Locator(); +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Locator +//purpose : +//======================================================================= +const Handle(WOKUtils_Shell)& WOKMake_Step::Shell() const +{ + return myprocess->Shell(); +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Locator +//purpose : +//======================================================================= +const Handle(WOKernel_UnitGraph)& WOKMake_Step::UnitGraph() const +{ + return myprocess->UnitGraph(); +} + diff --git a/src/WOKMake/WOKMake_StepAccessMacro.hxx b/src/WOKMake/WOKMake_StepAccessMacro.hxx new file mode 100755 index 0000000..ed82beb --- /dev/null +++ b/src/WOKMake/WOKMake_StepAccessMacro.hxx @@ -0,0 +1,24 @@ +// File: WOKMake_StepAccessMacro.hxx +// Created: Thu Jun 27 20:28:11 1996 +// Author: Jean GAUTIER +// + + +#ifndef WOKMake_StepAccessMacro_HeaderFile +#define WOKMake_StepAccessMacro_HeaderFile + +#ifndef _Standard_Macro_HeaderFile +# include +#endif + +#define DECLARE_STEP(STEPMAME) \ +extern "C" { \ + Standard_EXPORT Handle(WOKMake_Step) STEPMAME##_(const Handle(WOKMake_BuildProcess)&,const Handle(WOKernel_DevUnit)&, const Handle(TCollection_HAsciiString)&, \ + Standard_Boolean, Standard_Boolean); \ +} \ +Handle(WOKMake_Step) STEPMAME##_(const Handle(WOKMake_BuildProcess)&aprocess, const Handle(WOKernel_DevUnit)& aunit, const Handle(TCollection_HAsciiString)& acode, \ + Standard_Boolean checked, Standard_Boolean hidden) \ +{return new STEPMAME(aprocess,aunit,acode,checked,hidden);} + + +#endif diff --git a/src/WOKMake/WOKMake_StepBuilder.cdl b/src/WOKMake/WOKMake_StepBuilder.cdl new file mode 100755 index 0000000..1c4183b --- /dev/null +++ b/src/WOKMake/WOKMake_StepBuilder.cdl @@ -0,0 +1,59 @@ +-- File: WOKMake_StepBuilder.cdl +-- Created: Wed Oct 23 17:00:00 1996 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1996 + + +class StepBuilder from WOKMake + + ---Purpose: + +uses + BuildProcess from WOKMake, + HAsciiString from TCollection, + DevUnit from WOKernel, + StepConstructPtr from WOKMake, + Step from WOKMake, + DataMapOfHAsciiStringOfStepBuilder from WOKMake + +is + + Create + returns StepBuilder from WOKMake; + + Create(aname : HAsciiString from TCollection; aptr : StepConstructPtr from WOKMake) + returns StepBuilder from WOKMake; + + Name(me) + returns HAsciiString from TCollection; + + Builder(me) + returns StepConstructPtr from WOKMake; + + StepBuilders(myclass) + ---C++: return & + returns DataMapOfHAsciiStringOfStepBuilder from WOKMake; + + Add(me); + + BuildStep(myclass; aprocess : BuildProcess from WOKMake; + thename : HAsciiString from TCollection; + aunit : DevUnit from WOKernel; + acode : HAsciiString from TCollection; + checked,hidden : Boolean from Standard) + returns Step from WOKMake; + + BuildStep(myclass; aprocess : BuildProcess from WOKMake; + aunit : DevUnit from WOKernel; + acode : HAsciiString from TCollection; + asubcode : HAsciiString from TCollection) + ---Warning: This entry point does not set precedence steps + returns Step from WOKMake; + +fields + + myname : HAsciiString from TCollection; + myptr : StepConstructPtr from WOKMake; + +end StepBuilder; diff --git a/src/WOKMake/WOKMake_StepBuilder.cxx b/src/WOKMake/WOKMake_StepBuilder.cxx new file mode 100755 index 0000000..21aaccf --- /dev/null +++ b/src/WOKMake/WOKMake_StepBuilder.cxx @@ -0,0 +1,400 @@ +// File: WOKMake_StepBuilder.cxx +// Created: Wed Oct 23 17:37:55 1996 +// Author: Jean GAUTIER +// + + +#include + +#include + +#include + +#include + +#include + +#include +#include +#include + + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_StepBuilder +//purpose : +//======================================================================= +WOKMake_StepBuilder::WOKMake_StepBuilder() +{ +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_StepBuilder +//purpose : +//======================================================================= +WOKMake_StepBuilder::WOKMake_StepBuilder(const Handle(TCollection_HAsciiString)& aname, const WOKMake_StepConstructPtr& aptr) + : myname(aname), myptr(aptr) +{ +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Name +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_StepBuilder::Name() const +{ + return myname; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Builder +//purpose : +//======================================================================= +WOKMake_StepConstructPtr WOKMake_StepBuilder::Builder() const +{ + return myptr; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : StepBuilders +//purpose : +//======================================================================= +WOKMake_DataMapOfHAsciiStringOfStepBuilder& WOKMake_StepBuilder::StepBuilders() +{ + static WOKMake_DataMapOfHAsciiStringOfStepBuilder builders; + return builders; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Add +//purpose : +//======================================================================= +void WOKMake_StepBuilder::Add() const +{ + WOK_TRACE { + VerboseMsg("WOK_STEP") << "WOKMake_StepBuilder::Add" + << "Adding " << myname << " in cache" << endm; + } + WOKMake_StepBuilder::StepBuilders().Bind(Name(), *this); +} + + +//purpose : + +//======================================================================= +//Author : Jean Gautier (jga) +//function : BuildStep +//purpose : +//======================================================================= +Handle(WOKMake_Step) WOKMake_StepBuilder::BuildStep(const Handle(WOKMake_BuildProcess)& aprocess, + const Handle(TCollection_HAsciiString)& name, + const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Standard_Boolean checked, + const Standard_Boolean hidden) +{ + Handle(WOKMake_Step) result; + WOKMake_DataMapOfHAsciiStringOfStepBuilder& knownsteps = WOKMake_StepBuilder::StepBuilders(); + Standard_Integer i; + + if(name.IsNull() || aunit.IsNull() || acode.IsNull()) + { + ErrorMsg << "WOKMake_StepBuilder::BuildStep" + << "Invalid Input to WOKMake_StepBuilder::BuildStep" << endm; + Standard_ProgramError::Raise("Invalid Input to WOKMake_StepBuilder::BuildStep"); + } + + Handle(TCollection_HAsciiString) libs = aunit->Params().Eval("%WOKSteps_StepLibs",Standard_True); + + if(libs.IsNull()) + { + ErrorMsg << "WOKMake_Step::GetStep" + << "Could not eval parameter %WOKSteps_StepLibs" << endm; + return result; + } + + if(knownsteps.IsBound(name)) + { + WOK_TRACE { + VerboseMsg("WOK_STEP") << "WOKMake_StepBuilder::BuildStep" + << "Got " << name << " in cache at pos " << i << endm; + } + return (*knownsteps.Find(name).Builder())(aprocess,aunit,acode,checked,hidden); + } + + Handle(TCollection_HAsciiString) key = new TCollection_HAsciiString(name); + Handle(TCollection_HAsciiString) keyword; + + keyword = new TCollection_HAsciiString(" "); + keyword->AssignCat(key); + keyword->AssignCat(" "); + + key->AssignCat("_"); + + i=1; + Handle(TCollection_HAsciiString) alib = libs->Token(" ", i); + while(!alib->IsEmpty()) + { + Handle(WOKUtils_Path) alibpath; + TCollection_AsciiString stepprm("%"); + + stepprm.AssignCat(alib->ToCString()); + stepprm.AssignCat("_DefinedSteps"); + + Handle(TCollection_HAsciiString) steps = aunit->Params().Eval(stepprm.ToCString(),Standard_True); + + if(steps->Search(keyword) != -1) + { + // la lib contient l'etape recherchee + TCollection_AsciiString libparam("%"); + + libparam.AssignCat(alib->ToCString()); + libparam.AssignCat("_LibPath"); + + Handle(TCollection_HAsciiString) libpath = aunit->Params().Eval(libparam.ToCString(),Standard_True); + + if(libpath.IsNull()) + { + ErrorMsg << "WOKMake_Step::GetStep" + << "Could not eval parameter " << libparam.ToCString() << endm; + return result; + } + + alibpath = new WOKUtils_Path(libpath); + + if(!alibpath->Exists()) + { + alibpath = aunit->Params().SearchFile(libpath); + + if(alibpath.IsNull()) + { + ErrorMsg << "WOKMake_Step::GetStep" + << "Could not eval find library " << libpath << endm; + return result; + } + } + + + OSD_SharedLibrary ashlib(alibpath->Name()->ToCString()); + + if(!ashlib.DlOpen(OSD_RTLD_LAZY)) + { + ErrorMsg << "WOKMake_Step::GetStep" + << "Could not open " << libpath << " : " << ashlib.DlError() << endm; + return result; + } + + WOKMake_StepConstructPtr ptr = (WOKMake_StepConstructPtr) ashlib.DlSymb(key->ToCString()); + + if(ptr == NULL) + { + ErrorMsg << "WOKMake_Step::GetStep" + << "Could not find " << key << " in " << libpath << endm; + return result; + } + + WOKMake_StepBuilder builder(name, ptr); + + WOK_TRACE { + VerboseMsg("WOK_STEP") << "WOKMake_Step::GetStep" + << "Adding main : " << name->ToCString() << endm; + } + + builder.Add(); + result = (*ptr) (aprocess, aunit, acode, checked, hidden); + + //profitons du DLOpen + Standard_Integer k=1; + Handle(TCollection_HAsciiString) astr = steps->Token(" ", k); + + while(!astr->IsEmpty()) + { + if(!astr->IsSameString(name)) + { + Handle(TCollection_HAsciiString) otherkey = new TCollection_HAsciiString(astr); + otherkey->AssignCat("_"); + + WOKMake_StepConstructPtr ptr = (WOKMake_StepConstructPtr) ashlib.DlSymb(otherkey->ToCString()); + + if(ptr == NULL) + { + WarningMsg << "WOKMake_Step::GetStep" + << "Could not find declared " << otherkey << " in " << libpath << endm; + } + else + { + WOKMake_StepBuilder builder(astr, ptr); + + WOK_TRACE { + VerboseMsg("WOK_STEP") << "WOKMake_Step::GetStep" + << "Adding : " << astr->ToCString() << endm; + } + builder.Add(); + } + } + k++; + astr = steps->Token(" ", k); + } + + + return result; + } + i++; + alib = libs->Token(" ", i); + } + + if(result.IsNull()) + { + WOK_TRACE { + VerboseMsg("WOK_STEP") << "WOKMake_Step::GetStep" + << key << " is a triggerred step" << endm; + } + + Handle(WOKMake_TriggerStep) trigg = new WOKMake_TriggerStep(aprocess,aunit, acode, checked, hidden); + trigg->SetName(name); + result = trigg; + return result; + } + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : BuildStep +//purpose : +//======================================================================= +Handle(WOKMake_Step) WOKMake_StepBuilder::BuildStep(const Handle(WOKMake_BuildProcess)& aprocess, + const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Handle(TCollection_HAsciiString)& asubcode) +{ + Handle(WOKMake_Step) result; + + if(aunit.IsNull()) + { + ErrorMsg << "WOKMake_StepBuilder::BuildStep" + << "Invalid Null Unit" << endm; + return result; + } + if(acode.IsNull()) + { + ErrorMsg << "WOKMake_StepBuilder::BuildStep" + << "Invalid Null Step code" << endm; + return result; + } + + + Handle(TCollection_HAsciiString) keyword; + Handle(TCollection_HAsciiString) key; + TCollection_AsciiString astepdescrprm; + + astepdescrprm.AssignCat("%WOKSteps_"); + astepdescrprm.AssignCat(acode->ToCString()); + astepdescrprm.ChangeAll('.', '_'); + + key = aunit->Params().Eval(astepdescrprm.ToCString(),Standard_True); + + if(key.IsNull()) + { + return result; + } + + Standard_Character ctlchar; + Standard_Boolean checked = Standard_False; + Standard_Boolean hidden = Standard_False; + Standard_Boolean meta = Standard_False; + + Standard_Integer begin = 1, end; + + // Carateres de controle en debut d'etape + while(!IsAlphabetic((ctlchar=key->Value(begin)))) + { + switch(ctlchar) + { + case '*': + checked = Standard_True; + begin++; + break; + case '.': + hidden = Standard_True; + begin++; + break; + case '#': + meta = Standard_True; + begin++; + break; + case ' ': + case '\t': + begin++; + break; + default: + ErrorMsg << "WOKMake_StepDescrExplorer" << "Bad WOKMake Step ctl Character in : " << key << endm; + Standard_ProgramError::Raise("WOKMake_StepDescrExplorer"); + } + } + + Handle(TCollection_HAsciiString) steprec; + Handle(TColStd_HSequenceOfHAsciiString) precseq; + Standard_Integer precbegin, precend; + // A t'elle des etapes precedente + if((precbegin = key->Location(1,'(', begin, key->Length())) == 0 ) + { + end = key->Length(); + precseq.Nullify(); + } + else + { + end = precbegin-1; + precbegin++; + precend = key->Location(1, ')', precbegin, key->Length()); + + if(precend == 0) + { + ErrorMsg << "WOKMake_StepBuilder::GetStep" << "Bad WOKMake Step format : " << key << endm; + Standard_ProgramError::Raise("WOKMake_StepBuilder::GetStep"); + } + + precend--; + steprec = key->SubString(precbegin, precend); + + precseq = new TColStd_HSequenceOfHAsciiString; + + Standard_Integer precind =1; + + Handle(TCollection_HAsciiString) curstepprec = steprec->Token(",",precind); + + while(!curstepprec->IsEmpty()) + { + Handle(TCollection_HAsciiString) precname = WOKMake_Step::UniqueName(aunit, curstepprec, Handle(TCollection_HAsciiString)()); + + precseq->Append(precname); + precind++; + curstepprec = steprec->Token(",",precind); + } + } + + Handle(TCollection_HAsciiString) stepdef = key->SubString(begin,end); + + result = BuildStep(aprocess,stepdef, aunit, acode, checked, hidden); + + if(meta && asubcode.IsNull()) + { + Handle(WOKMake_MetaStep) astep = new WOKMake_MetaStep(aprocess, aunit, + acode, checked, hidden); + astep->SetAdmFileType(result->AdmFileType()); + astep->SetOutputDirTypeName(result->OutputDirTypeName()); + result = astep; + } + + if(!result.IsNull()) + { + result->SetPrecedenceSteps(precseq); + } + return result; +} diff --git a/src/WOKMake/WOKMake_StepConstructPtr.hxx b/src/WOKMake/WOKMake_StepConstructPtr.hxx new file mode 100755 index 0000000..2b0148d --- /dev/null +++ b/src/WOKMake/WOKMake_StepConstructPtr.hxx @@ -0,0 +1,23 @@ +// File: WOKMake_StepConstructPtr.hxx +// Created: Thu Jun 27 14:01:54 1996 +// Author: Jean GAUTIER +// + + +#ifndef WOKMake_StepConstructPtr_HeaderFile +#define WOKMake_StepConstrucPtr_HeaderFile + +#include + +#include + +#include + + +typedef Handle(WOKMake_Step) (*WOKMake_StepConstructPtr) (const Handle(WOKMake_BuildProcess)&, + const Handle(WOKernel_DevUnit)&, + const Handle(TCollection_HAsciiString)&, + Standard_Boolean , Standard_Boolean ); + + +#endif diff --git a/src/WOKMake/WOKMake_StepFile.cdl b/src/WOKMake/WOKMake_StepFile.cdl new file mode 100755 index 0000000..0cee473 --- /dev/null +++ b/src/WOKMake/WOKMake_StepFile.cdl @@ -0,0 +1,83 @@ +-- File: WOKMake_StepFile.cdl +-- Created: Mon Jun 17 15:40:38 1996 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1996 + + +deferred class StepFile from WOKMake +inherits TShared from MMgt + ---Purpose: + +uses + FileStatus from WOKMake, + File from WOKernel, + Entity from WOKBuilder, + Path from WOKUtils, + HAsciiString from TCollection + +is + + Initialize; + + Initialize(anid : HAsciiString from TCollection; + afile : File from WOKernel; + abuildent : Entity from WOKBuilder; + aoldpath : Path from WOKUtils); + + SetFile(me:mutable; afile : File from WOKernel); + File(me) + ---C++: return const & + ---C++: inline + returns File from WOKernel; + + SetBuilderEntity(me:mutable; aent : Entity from WOKBuilder); + BuilderEntity(me) + ---C++: return const & + ---C++: inline + returns Entity from WOKBuilder; + + SetID(me:mutable; aname : HAsciiString from TCollection); + ID(me) + ---C++: return const & + ---C++: inline + returns HAsciiString from TCollection; + + SetLastPath(me:mutable; apath : Path from WOKUtils); + LastPath(me) + ---C++: return const & + ---C++: inline + returns Path from WOKUtils; + + SetStatus(me:mutable; astatus : FileStatus from WOKMake); + Status(me) + ---C++: inline + returns FileStatus from WOKMake; + + SetLocateFlag(me:mutable; aflg : Boolean from Standard); + IsLocateAble(me) + ---Purpose: True if File is Known to be in WOK Entity + -- False if File is not in WOK (ex: .:.:/usr/include/stream.h) + ---C++: inline + returns Boolean from Standard; + + SetPhysicFlag(me:mutable; aflag : Boolean from Standard); + IsPhysic(me) + ---C++: inline + returns Boolean from Standard; + + SetStepID(me:mutable; aflag : Boolean from Standard); + IsStepID(me) + ---C++: inline + returns Boolean from Standard; + +fields + + myfile : File from WOKernel; + myid : HAsciiString from TCollection; + myent : Entity from WOKBuilder; + mylastpath : Path from WOKUtils; + myattr : Integer from Standard is protected; + mystatus : FileStatus from WOKMake; + +end StepFile; diff --git a/src/WOKMake/WOKMake_StepFile.cxx b/src/WOKMake/WOKMake_StepFile.cxx new file mode 100755 index 0000000..c609e62 --- /dev/null +++ b/src/WOKMake/WOKMake_StepFile.cxx @@ -0,0 +1,124 @@ +// File: WOKMake_StepFile.cxx +// Created: Tue Jun 18 10:08:26 1996 +// Author: Jean GAUTIER +// + + +#include + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_StepFile +//purpose : +//======================================================================= +WOKMake_StepFile::WOKMake_StepFile() + : mystatus(WOKMake_Undetermined), myattr(0) +{ + SetPhysicFlag(Standard_True); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : WOKMake_StepFile +//purpose : +//======================================================================= +WOKMake_StepFile::WOKMake_StepFile(const Handle(TCollection_HAsciiString)& anid, + const Handle(WOKernel_File)& afile, + const Handle(WOKBuilder_Entity)& abuildent, + const Handle(WOKUtils_Path)& aoldpath) + : myid(anid), myfile(afile), myent(abuildent), mylastpath(aoldpath), mystatus(WOKMake_Undetermined), myattr(0) +{ + SetPhysicFlag(Standard_True); +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetID +//purpose : +//======================================================================= +void WOKMake_StepFile::SetID(const Handle(TCollection_HAsciiString)& anid) +{ + myid = anid; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetFile +//purpose : +//======================================================================= +void WOKMake_StepFile::SetFile(const Handle(WOKernel_File)& afile) +{ + myfile = afile; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetBuilderEntity +//purpose : +//======================================================================= +void WOKMake_StepFile::SetBuilderEntity(const Handle(WOKBuilder_Entity)& anent) +{ + myent = anent; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetLastPath +//purpose : +//======================================================================= +void WOKMake_StepFile::SetLastPath(const Handle(WOKUtils_Path)& apath) +{ + mylastpath = apath; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetLocateFlag +//purpose : +//======================================================================= +void WOKMake_StepFile::SetLocateFlag(const Standard_Boolean aflag) +{ + if(aflag) + myattr |= STEPFILE_LOCATE; + else + myattr &= (STEPFILE_LOCATE ^ myattr); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetStatus +//purpose : +//======================================================================= +void WOKMake_StepFile::SetStatus(const WOKMake_FileStatus astatus) +{ + mystatus = astatus; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetPhysicFlag +//purpose : +//======================================================================= +void WOKMake_StepFile::SetPhysicFlag(const Standard_Boolean aflag) +{ + if(aflag) + myattr |= STEPFILE_PHYSIC; + else + myattr &= (STEPFILE_PHYSIC ^ myattr); +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetStepID +//purpose : +//======================================================================= +void WOKMake_StepFile::SetStepID(const Standard_Boolean aflag) +{ + if(aflag) + myattr |= STEPFILE_STEPID; + else + myattr &= (STEPFILE_STEPID ^ myattr); +} + diff --git a/src/WOKMake/WOKMake_StepFile.lxx b/src/WOKMake/WOKMake_StepFile.lxx new file mode 100755 index 0000000..cb3e649 --- /dev/null +++ b/src/WOKMake/WOKMake_StepFile.lxx @@ -0,0 +1,105 @@ +// File: WOKMake_StepFile.lxx +// Created: Tue Jun 18 13:44:56 1996 +// Author: Jean GAUTIER +// + +// BASE CLASS STEPFILE defines +#define STEPFILE_PHYSIC 0x01 +#define STEPFILE_LOCATE 0x02 +#define STEPFILE_STEPID 0x04 + +// INPUT FILES defines + +#define STEPFILE_DIRECT 0x08 + +// OUTPUT FILES defines + +#define STEPFILE_REFPROD 0x10 +#define STEPFILE_MEMBEXT 0x20 + +//======================================================================= +//Author : Jean Gautier (jga) +//function : ID +//purpose : +//======================================================================= +const Handle(TCollection_HAsciiString)& WOKMake_StepFile::ID() const +{ + return myid; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : File +//purpose : +//======================================================================= +const Handle(WOKernel_File)& WOKMake_StepFile::File() const +{ + return myfile; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : BuilderEntity +//purpose : +//======================================================================= +const Handle(WOKBuilder_Entity)& WOKMake_StepFile::BuilderEntity() const +{ + return myent; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : LastPath +//purpose : +//======================================================================= +const Handle(WOKUtils_Path)& WOKMake_StepFile::LastPath() const +{ + return mylastpath; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Status +//purpose : +//======================================================================= +WOKMake_FileStatus WOKMake_StepFile::Status() const +{ + return mystatus; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsLocateAble +//purpose : +//======================================================================= +Standard_Boolean WOKMake_StepFile::IsLocateAble() const +{ + if(myattr & STEPFILE_LOCATE) return Standard_True; + else return Standard_False; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsPhysic +//purpose : +//======================================================================= +Standard_Boolean WOKMake_StepFile::IsPhysic() const +{ + if(myattr & STEPFILE_PHYSIC) return Standard_True; + else return Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsXStep +//purpose : +//======================================================================= +Standard_Boolean WOKMake_StepFile::IsStepID() const +{ + if(myattr & STEPFILE_STEPID) return Standard_True; + else return Standard_False; +} + diff --git a/src/WOKMake/WOKMake_Step_1.cxx b/src/WOKMake/WOKMake_Step_1.cxx new file mode 100755 index 0000000..84a4523 --- /dev/null +++ b/src/WOKMake/WOKMake_Step_1.cxx @@ -0,0 +1,458 @@ +// File: WOKMake_Step_1.cxx +// Created: Mon Dec 4 18:26:15 1995 +// Author: Jean GAUTIER +// + +#include + +#include + +#include + +//======================================================================= +//Author : Jean Gautier (jga) +//function : InLocator +//purpose : +//======================================================================= +Handle(WOKernel_Locator) WOKMake_Step::InLocator() const +{ + return myprocess->Locator(); +} +//======================================================================= +//Author : Jean Gautier (jga) +//function : OutLocator +//purpose : +//======================================================================= +Handle(WOKernel_Locator) WOKMake_Step::OutLocator() const +{ + return myprocess->Locator(); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : StepOutputID +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::StepOutputID(const Handle(TCollection_HAsciiString)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Handle(TCollection_HAsciiString)& asubcode) +{ + Handle(TCollection_HAsciiString) id = new TCollection_HAsciiString(aunit); + id->AssignCat(":"); + id->AssignCat(acode); + if(!asubcode.IsNull()) + { + id->AssignCat(":"); + id->AssignCat(asubcode); + } + return id; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : StepOutputID +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::StepOutputID(const Handle(TCollection_HAsciiString)& aunit, + const Handle(TCollection_HAsciiString)& acode) +{ + Handle(TCollection_HAsciiString) id = new TCollection_HAsciiString(aunit); + id->AssignCat(":"); + id->AssignCat(acode); + return id; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : StepOutputID +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::StepOutputID() const +{ + return WOKMake_Step::StepOutputID(Unit()->Name(), Code(), SubCode()); +} + +//======================================================================= +//function : InputFilesFileName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::InputFilesFileName() const +{ + Handle(TCollection_HAsciiString) astr = new TCollection_HAsciiString(Unit()->Name()); + Handle(TCollection_HAsciiString) stepcode = new TCollection_HAsciiString(Code()); + + stepcode->ChangeAll('.', '_'); + + astr->AssignCat("_"); + astr->AssignCat(stepcode); + + if(!SubCode().IsNull()) + { + Handle(TCollection_HAsciiString) subcode = new TCollection_HAsciiString(SubCode()); + subcode->ChangeAll('.', '_'); + + astr->AssignCat("_"); + astr->AssignCat(subcode); + } + astr->AssignCat(".In"); + return astr; +} + +//======================================================================= +//function : DepItemsFileName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::DepItemsFileName() const +{ + Handle(TCollection_HAsciiString) astr = new TCollection_HAsciiString(Unit()->Name()); + Handle(TCollection_HAsciiString) stepcode = new TCollection_HAsciiString(Code()); + + stepcode->ChangeAll('.', '_'); + astr->AssignCat("_"); + astr->AssignCat(stepcode); + + if(!SubCode().IsNull()) + { + Handle(TCollection_HAsciiString) subcode = new TCollection_HAsciiString(SubCode()); + subcode->ChangeAll('.', '_'); + + astr->AssignCat("_"); + astr->AssignCat(subcode); + } + + astr->AssignCat(".Dep"); + return astr; +} + +//======================================================================= +//function : OutputFilesFileName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::OutputFilesFileName() const +{ + Handle(TCollection_HAsciiString) astr = new TCollection_HAsciiString(Unit()->Name()); + Handle(TCollection_HAsciiString) stepcode = new TCollection_HAsciiString(Code()); + + stepcode->ChangeAll('.', '_'); + astr->AssignCat("_"); + astr->AssignCat(stepcode); + + if(!SubCode().IsNull()) + { + Handle(TCollection_HAsciiString) subcode = new TCollection_HAsciiString(SubCode()); + subcode->ChangeAll('.', '_'); + + astr->AssignCat("_"); + astr->AssignCat(subcode); + } + + astr->AssignCat(".Out"); + return astr; +} + +//======================================================================= +//function : LogFileName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::LogFileName() const +{ + Handle(TCollection_HAsciiString) astr = new TCollection_HAsciiString(Unit()->Name()); + Handle(TCollection_HAsciiString) stepcode = new TCollection_HAsciiString(Code()); + + stepcode->ChangeAll('.', '_'); + astr->AssignCat("_"); + astr->AssignCat(stepcode); + + if(!SubCode().IsNull()) + { + Handle(TCollection_HAsciiString) subcode = new TCollection_HAsciiString(SubCode()); + subcode->ChangeAll('.', '_'); + + astr->AssignCat("_"); + astr->AssignCat(subcode); + } + + astr->AssignCat(".Log"); + + return astr; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AdmFile +//purpose : +//======================================================================= +Handle(WOKernel_File) WOKMake_Step::AdmFile(const Handle(TCollection_HAsciiString)& aname) const +{ + Handle(WOKernel_File) result; + + result = new WOKernel_File(aname, Unit(), Unit()->GetFileType(AdmFileType())); + result->GetPath(); + return result; +} +//======================================================================= +//Author : Jean Gautier (jga) +//function : LocateAdmFile +//purpose : +//======================================================================= +Handle(WOKernel_File) WOKMake_Step::LocateAdmFile(const Handle(WOKernel_Locator)& aloc, + const Handle(TCollection_HAsciiString)& aname) const +{ + Handle(WOKernel_File) result; + + if(!aloc.IsNull()) + { + result = aloc->Locate(Unit()->Name(), AdmFileType(), aname); + } + return result; +} + + +//======================================================================= +//function : IsOrIsSubStepOf +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::IsOrIsSubStepOf(const Handle(TCollection_HAsciiString)& acode) const +{ + Handle(TCollection_HAsciiString) astr; + + if(Code()->IsSameString(acode)) + { + return Standard_True; + } + astr = new TCollection_HAsciiString(acode); + astr->AssignCat("."); + + if(Code()->Search(astr) == 1) + { + // le nom d'etape commence par acode. + return Standard_True; + } + return Standard_False; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : UniqueName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::UniqueName(const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Handle(TCollection_HAsciiString)& asubcode) +{ + Handle(TCollection_HAsciiString) result = new TCollection_HAsciiString(aunit->Name()); + + result->AssignCat(":"); + result->AssignCat(acode); + if(!asubcode.IsNull()) + { + result->AssignCat(":"); + result->AssignCat(asubcode); + } + return result; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : UniqueName +//purpose : +//======================================================================= +void WOKMake_Step::SplitUniqueName(const Handle(TCollection_HAsciiString)& anid, + Handle(TCollection_HAsciiString)& auname, + Handle(TCollection_HAsciiString)& acode, + Handle(TCollection_HAsciiString)& asubcode) +{ + auname = anid->Token(":",1); + acode = anid->Token(":",2); + asubcode = anid->Token(":",3); + + if(auname->IsEmpty()) auname.Nullify(); + if(acode->IsEmpty()) acode.Nullify(); + if(asubcode->IsEmpty()) asubcode.Nullify(); + return; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : UniqueName +//purpose : +//======================================================================= +const Handle(TCollection_HAsciiString)& WOKMake_Step::UniqueName() +{ + if( !myunique.IsNull() ) return myunique; + return (myunique = WOKMake_Step::UniqueName(Unit(), Code(), SubCode())); +} + +//======================================================================= +//function : Code +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::Code() const +{ + return mycode; +} + +//======================================================================= +//function : IsHidden +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::IsHidden() const +{ + return myhidden; +} +//======================================================================= +//function : IsChecked +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::IsChecked() const +{ + return mycheck; +} + +//======================================================================= +//function : SubCode +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_Step::SubCode() const +{ + return mysubcode; +} + +//======================================================================= +//function : SetSubCode +//purpose : +//======================================================================= +void WOKMake_Step::SetSubCode(const Handle(TCollection_HAsciiString)& acode) +{ + mysubcode = acode; +} + +//======================================================================= +//function : Status +//purpose : +//======================================================================= +WOKMake_Status WOKMake_Step::Status() const +{ + return mystatus; +} + +void WOKMake_Step::SetUptodate() {mystatus = WOKMake_Uptodate;} +void WOKMake_Step::SetSucceeded() {mystatus = WOKMake_Success;} +void WOKMake_Step::SetIncomplete() {mystatus = WOKMake_Incomplete;} +void WOKMake_Step::SetFailed() {mystatus = WOKMake_Failed;} +void WOKMake_Step::SetUnprocessed() {mystatus = WOKMake_Unprocessed;} +void WOKMake_Step::SetStatus(const WOKMake_Status astatus) {mystatus = astatus;} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetOutputDir +//purpose : +//======================================================================= +void WOKMake_Step::SetOutputDir(const Handle(WOKUtils_Path)& apath) {myoutputdir = apath;} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : OutputDir +//purpose : +//======================================================================= +Handle(WOKUtils_Path) WOKMake_Step::OutputDir() +{ + if(myoutputdir.IsNull()) + { + Handle(WOKernel_File) afile = new WOKernel_File(Unit(), Unit()->GetFileType(OutputDirTypeName())); + afile->GetPath(); + + myoutputdir = afile->Path(); + } + return myoutputdir; +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsDBMSDependent +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::IsDBMSDependent() const +{ + Handle(TCollection_HAsciiString) admtype = AdmFileType(); + Handle(WOKernel_FileType) atype = Unit()->GetFileType(admtype); + + if(atype.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_Step::IsDBMSDependent"); + } + + return atype->IsDBMSDependent(); + +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : IsStationDependent +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::IsStationDependent() const +{ + Handle(TCollection_HAsciiString) admtype = AdmFileType(); + Handle(WOKernel_FileType) atype = Unit()->GetFileType(admtype); + + if(atype.IsNull()) + { + Standard_ProgramError::Raise("WOKMake_Step::IsStationDependent"); + } + + return atype->IsStationDependent(); + +} + +//======================================================================= +//function : PrecedenceSteps +//purpose : +//======================================================================= +Handle(TColStd_HSequenceOfHAsciiString) WOKMake_Step::PrecedenceSteps() const +{ + return myprecsteps; +} + +//======================================================================= +//function : SetPrecedenceSteps +//purpose : +//======================================================================= +void WOKMake_Step::SetPrecedenceSteps(const Handle(TColStd_HSequenceOfHAsciiString)& steps) +{ + myprecsteps = steps; +} + +//======================================================================= +//function : SetOptions +//purpose : +//======================================================================= +void WOKMake_Step::SetOptions(const Handle(WOKMake_HSequenceOfStepOption)& opts) +{ + myoptions = opts; +} +Handle(WOKMake_HSequenceOfStepOption) WOKMake_Step::Options() const {return myoptions;} + + +//======================================================================= +//function : SetTargets +//purpose : +//======================================================================= +void WOKMake_Step::SetTargets(const Handle(TColStd_HSequenceOfHAsciiString)& targets) +{ + mytargets = targets; +} +Handle(TColStd_HSequenceOfHAsciiString) WOKMake_Step::Targets() const {return mytargets;} + + + +//======================================================================= +//function : IsToExecute +//purpose : +//======================================================================= +Standard_Boolean WOKMake_Step::IsToExecute() const {return myexecflag;} +void WOKMake_Step::DoExecute() {myexecflag = Standard_True;} +void WOKMake_Step::DontExecute() {myexecflag = Standard_False;} diff --git a/src/WOKMake/WOKMake_TriggerStep.cdl b/src/WOKMake/WOKMake_TriggerStep.cdl new file mode 100755 index 0000000..7f4c7a2 --- /dev/null +++ b/src/WOKMake/WOKMake_TriggerStep.cdl @@ -0,0 +1,76 @@ +-- File: WOKMake_TriggerStep.cdl +-- Created: Tue Oct 8 14:22:59 1996 +-- Author: Jean GAUTIER +-- +---Copyright: Matra Datavision 1996 + + +class TriggerStep from WOKMake +inherits Step from WOKMake + ---Purpose: + +uses + + BuildProcess from WOKMake, + HSequenceOfInputFile from WOKMake, + InputFile from WOKMake, + OutputFile from WOKMake, + Status from WOKMake, + DevUnit from WOKernel, + HAsciiString from TCollection, + Boolean from Standard + +is + + Create(aprocess : BuildProcess from WOKMake; + aunit : DevUnit from WOKernel; + acode : HAsciiString from TCollection; + checked, hidden : Boolean from Standard) + returns mutable TriggerStep from WOKMake; + + CurrentTriggerStep(myclass) + ---C++: return & + returns TriggerStep from WOKMake; + + SetName(me:mutable; aname : HAsciiString from TCollection); + Name(me) + returns HAsciiString from TCollection; + + AdmFileType(me) + returns HAsciiString from TCollection + is redefined protected; + + OutputDirTypeName(me) + returns HAsciiString from TCollection + is redefined protected; + + HandleInputFile(me:mutable; anitem : InputFile from WOKMake) + returns Boolean from Standard + is redefined protected; + + Init(me:mutable) + is redefined protected; + + AddInputFile(me:mutable; inputfile : InputFile from WOKMake); + + GetInputFile(me; anid : HAsciiString from TCollection) + returns InputFile from WOKMake; + + AddOutputFile(me:mutable; Outputfile : OutputFile from WOKMake); + + GetOutputFile(me; anid : HAsciiString from TCollection) + returns OutputFile from WOKMake; + + Execute(me:mutable; execlist : HSequenceOfInputFile from WOKMake) + ---Purpose: Executes step + -- Computes output files + is redefined private; + + Terminate(me:mutable) + is redefined protected; + + +fields + + myname : HAsciiString from TCollection; +end TriggerStep; diff --git a/src/WOKMake/WOKMake_TriggerStep.cxx b/src/WOKMake/WOKMake_TriggerStep.cxx new file mode 100755 index 0000000..39fe7ba --- /dev/null +++ b/src/WOKMake/WOKMake_TriggerStep.cxx @@ -0,0 +1,312 @@ +// File: WOKMake_TriggerStep.cxx +// Created: Tue Oct 8 14:24:59 1996 +// Author: Jean GAUTIER +// + + +#include + +#include +#include +#include + +#include + +#include + + +#include + +#include + + +//======================================================================= +//function : WOKMake_TriggerStep +//purpose : +//======================================================================= +WOKMake_TriggerStep::WOKMake_TriggerStep(const Handle(WOKMake_BuildProcess)& aprocess, + const Handle(WOKernel_DevUnit)& aunit, + const Handle(TCollection_HAsciiString)& acode, + const Standard_Boolean checked, + const Standard_Boolean hidden) + : WOKMake_Step(aprocess,aunit, acode, checked, hidden) +{ +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : CurrentTriggerStep +//purpose : +//======================================================================= +Handle(WOKMake_TriggerStep)& WOKMake_TriggerStep::CurrentTriggerStep() +{ + static Handle(WOKMake_TriggerStep) TheCurStep; + return TheCurStep; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : SetName +//purpose : +//======================================================================= +void WOKMake_TriggerStep::SetName(const Handle(TCollection_HAsciiString)& aname) +{ + myname = aname; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Name +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_TriggerStep::Name() const +{ + return myname; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AdmFileType +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_TriggerStep::AdmFileType() const +{ + Handle(TCollection_HAsciiString) result; + Handle(TCollection_HAsciiString) trigname = new TCollection_HAsciiString(Name()); + + trigname->AssignCat("::AdmFileType"); + + WOKUtils_Trigger execute; + + execute(trigname) << endt >> result; + + switch(execute.Status()) + { + case WOKUtils_Unknown: + case WOKUtils_NotSetted: + { + static Handle(TCollection_HAsciiString) sresult = new TCollection_HAsciiString((char*)STADMFILE); + result = sresult; + } + break; + case WOKUtils_Succeeded: + break; + case WOKUtils_Failed: + //SetFailed(); + break; + } + + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : OutputDirTypeName +//purpose : +//======================================================================= +Handle(TCollection_HAsciiString) WOKMake_TriggerStep::OutputDirTypeName() const +{ + Handle(TCollection_HAsciiString) result; + Handle(TCollection_HAsciiString) trigname = new TCollection_HAsciiString(Name()); + + trigname->AssignCat("::OutputDirTypeName"); + + WOKUtils_Trigger execute; + + execute(trigname) << endt >> result; + + switch(execute.Status()) + { + case WOKUtils_Unknown: + case WOKUtils_NotSetted: + { + static Handle(TCollection_HAsciiString) sresult = new TCollection_HAsciiString((char*)STTMPDIR); + result = sresult; + } + break; + case WOKUtils_Succeeded: + break; + case WOKUtils_Failed: + //SetFailed(); + break; + } + + return result; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : HandleInputFile +//purpose : +//======================================================================= +Standard_Boolean WOKMake_TriggerStep::HandleInputFile(const Handle(WOKMake_InputFile)& infile) +{ + WOKUtils_Trigger execute; + Standard_Boolean b=Standard_False; + + Handle(TCollection_HAsciiString) trigname = new TCollection_HAsciiString(Name()); + + trigname->AssignCat("::HandleInputFile"); + + execute(trigname) << infile->ID() << endt >> b; + + switch ( execute.Status()) + { + case WOKUtils_Succeeded: + if(b) + { + infile->SetBuilderEntity(BuilderEntity(infile->File())); + } + break; + case WOKUtils_Unknown: + case WOKUtils_Failed: + case WOKUtils_NotSetted: + break; + } + + return b; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Init +//purpose : +//======================================================================= +void WOKMake_TriggerStep::Init() +{ + + CurrentTriggerStep() = Handle(WOKMake_TriggerStep)(this); + + WOKUtils_Trigger execute; + + // for Tcl8.0 + // execute("namespace") << "eval" << Name() << "{}" << endt; + + + Handle(TCollection_HAsciiString) trigfile = new TCollection_HAsciiString(Name()); + trigfile->AssignCat(".tcl"); + + Handle(WOKUtils_Path) apath = Unit()->Params().SearchFile(trigfile); + + if(apath.IsNull()) + { + WarningMsg << "WOKMake_TriggerStep::Init" + << "Could not find file associated with trigger step " << Name() << endm; + WarningMsg << "WOKMake_TriggerStep::Init" + << "Nothing done" << endm; + } + + execute(trigfile, Unit()->Params(), WOKTools_TclInterp) << endt; + +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AddInputFile +//purpose : +//======================================================================= +void WOKMake_TriggerStep::AddInputFile(const Handle(WOKMake_InputFile)& infile) +{ + if(infile.IsNull()) + Standard_ProgramError::Raise("WOKMake_TriggerStep::AddInputFile : Null Input"); + + myinflow.Add(infile->ID(), infile); +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetInputFile +//purpose : +//======================================================================= +Handle(WOKMake_InputFile) WOKMake_TriggerStep::GetInputFile(const Handle(TCollection_HAsciiString)& anid) const +{ + Handle(WOKMake_InputFile) nullhandle; + + if(myinflow.Contains(anid)) + return myinflow.FindFromKey(anid); + return nullhandle; +} + +//======================================================================= +//Author : Jean Gautier (jga) +//function : AddOutputFile +//purpose : +//======================================================================= +void WOKMake_TriggerStep::AddOutputFile(const Handle(WOKMake_OutputFile)& outfile) +{ + if(outfile.IsNull()) + Standard_ProgramError::Raise("WOKMake_TriggerStep::AddOutputFile : Null Input"); + + myoutflow.Add(outfile->ID(), outfile); +} + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : GetoutputFile +//purpose : +//======================================================================= +Handle(WOKMake_OutputFile) WOKMake_TriggerStep::GetOutputFile(const Handle(TCollection_HAsciiString)& anid) const +{ + Handle(WOKMake_OutputFile) nullhandle; + + if(myoutflow.Contains(anid)) + return myoutflow.FindFromKey(anid); + return nullhandle; +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +void WOKMake_TriggerStep::Execute(const Handle(WOKMake_HSequenceOfInputFile)& execlist) +{ + Standard_Integer i; + Standard_Boolean status; + WOKUtils_Trigger execute; + + Handle(TCollection_HAsciiString) trigname = new TCollection_HAsciiString(Name()); + trigname->AssignCat("::Execute"); + + execute(trigname) << Unit()->UserPathName(); + + for(i=1; i<=execlist->Length(); i++) + { + execute << execlist->Value(i)->ID(); + } + + execute << endt >> status; + + switch(execute.Status()) + { + case WOKUtils_Failed: + SetFailed(); + break; + case WOKUtils_Succeeded: + if(status) + SetFailed(); + else + SetSucceeded(); + break; + case WOKUtils_NotSetted: + SetUnprocessed(); + break; + default: + break; + } + return; +} + + + + +//======================================================================= +//Author : Jean Gautier (jga) +//function : Init +//purpose : +//======================================================================= +void WOKMake_TriggerStep::Terminate() +{ + WOKMake_TriggerStep::CurrentTriggerStep() = Handle(WOKMake_TriggerStep)(); +} + -- 2.39.5