ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Scram/ScramFunctions.pm
Revision: 1.16
Committed: Wed Nov 7 19:49:38 2001 UTC (23 years, 6 months ago) by sashby
Content type: text/plain
Branch: MAIN
Changes since 1.15: +2 -3 lines
Log Message:
ADding some changes. RELEASETOP can now be set using setroot.

File Contents

# User Rev Content
1 williamc 1.2 #
2     # ScramFunctions.pm
3     #
4     # Written by Christopher Williams
5     #
6     # Description
7     #
8     # Interface
9     # ---------
10     # new() : A new ScramCommands object
11     # project(urlstring,dir[,areaname]): Create a project from the given url file
12     # return the area
13     # satellite(name,version,installdirectory[,areaname]): create a satellite
14     # project from the specified name version
15     # addareatoDB(ConfigArea[,name[,version]]) : add area to the db
16     # globalcache([cachedirectory])) : return the global cache object/set at dir.
17     # scramprojectdb() : return the scram project DB object
18     # areatoolbox(ConfigArea) : return the toolbox of the specified area
19     # setuptoolsinarea($area[,$toolname[,$toolversion[,toolfile]) : setup
20     # arch() : get/set the architecture string
21 williamc 1.6 # scramobjectinterface(Class) : print out the interface of a scram class
22 williamc 1.10 # webget(area,url) : get the url into the cache of the specified area
23 williamc 1.8 # getversion() : return the current scram version
24     # spawnversion(version,@args) : spawn the scram version with the given args
25 williamc 1.10 # classverbose(classstring,setting) : Set the class verbosity level
26     # toolruntime(ConfigArea): Get a runtime object withthe settings from
27     # the specified toolbox
28 williamc 1.2
29     package Scram::ScramFunctions;
30     use URL::URLcache;
31     use Utilities::Verbose;
32     require 5.004;
33    
34     @ISA=qw(Utilities::Verbose);
35    
36 sashby 1.11 sub new
37     {
38     my $class=shift;
39     $self={};
40     bless $self, $class;
41     # -- default settings
42     $self->{cachedir}=$ENV{HOME}."/.scramrc/globalcache";
43     $self->{scramprojectsdbdir}=$ENV{SCRAM_LOOKUPDB};
44     ($self->{scram_top})=( $ENV{SCRAM_HOME}=~/(.*)\//) ;
45    
46     return $self;
47     }
48 williamc 1.2
49 williamc 1.10 sub classverbose {
50     my $self=shift;
51     my $class=shift;
52     my $val=shift;
53    
54     $ENV{"VERBOSE_".$class}=$val;
55     }
56    
57 williamc 1.2 sub project {
58     my $self=shift;
59     my $url=shift;
60     my $installarea=shift;
61    
62     my $areaname="";
63     if ( @_ ) {
64     $areaname=shift;
65     }
66     require Configuration::BootStrapProject;
67     my $bs=Configuration::BootStrapProject->
68     new($self->globalcache(),$installarea);
69     $self->verbose("BootStrapping $url");
70     my $area=$bs->boot($url,$areaname);
71     if ( ! defined $area ) {
72     $self->error("Unable to create project area");
73     }
74     $area->archname($self->arch());
75    
76     # -- download all tool description files
77     my $req=$self->arearequirements($area);
78     if ( defined $req ) {
79     $req->download($self->areatoolbox($area));
80     }
81    
82     return $area;
83     }
84    
85     sub setuptoolsinarea {
86     my $self=shift;
87     my $area=shift;
88    
89 sashby 1.14 # -- initialise
90     print "Initialising setup procedure......","\n";
91 williamc 1.2 $self->_allprojectinitsearcher();
92    
93     # -- create a new toolbox object
94     my $toolbox=$self->areatoolbox($area);
95 williamc 1.10 $toolbox->searcher($self->_allprojectinitsearcher());
96 williamc 1.2
97     if ( @_ ) {
98     # -- specific tool specified
99     if ( my $rv=$toolbox->toolsetup(@_) ) {
100     if ( $rv eq 1 ) {
101     print "Unknown tool $toolname @ARGV\n";
102     exit 1;
103     }
104     }
105     }
106     else {
107     # -- setup all tools specified in the requirements doc
108     my $reqs=$self->arearequirements($area);
109     $self->verbose("Setup ToolBox from Requirements doc ($reqs)");
110     $reqs->setup($toolbox);
111     }
112     }
113    
114     sub satellite {
115     my $self=shift;
116     my $name=shift;
117     my $version=shift;
118     my $installarea=shift;
119    
120 williamc 1.4 my $areaname=undef;
121 williamc 1.2 if ( @_ ) {
122     $areaname=shift;
123     }
124    
125     # -- look up scram database for location
126     my $relarea=$self->_lookupareaindb($name,$version);
127     if ( ! defined $relarea ) {
128     $self->error("Unable to Find Project $name $version");
129 williamc 1.4 }
130    
131     # -- fix for old broken areas
132     if ( (! defined $relarea->version()) || ($relarea->version() eq "") ) {
133     $relarea->version($version);
134 williamc 1.2 }
135    
136     # -- create satellite
137     my $area=$relarea->satellite($installarea,$areaname);
138     $area->archname($self->arch());
139    
140     # -- copy toolbox
141     my $rtb=$self->areatoolbox($relarea);
142     my $tb=$self->areatoolbox($area);
143     $rtb->copytools($tb);
144    
145     # -- copy configuration directory
146     if ( ! -d $area->location()."/".$area->configurationdir() ) {
147     use Utilities::AddDir;
148     AddDir::copydir($relarea->location()."/".$relarea->configurationdir(),
149     $area->location()."/".$area->configurationdir() );
150     }
151    
152     # -- copy RequirementsDoc
153     if ( ! -f $area->requirementsdoc() ) {
154 williamc 1.3 use File::Copy;
155 williamc 1.2 copy( $relarea->requirementsdoc() , $area->requirementsdoc());
156     }
157    
158     return $area;
159 williamc 1.7 }
160    
161 williamc 1.10 sub toolruntime {
162 williamc 1.7 my $self=shift;
163     my $area=shift;
164    
165 williamc 1.10 my $name=$area->location();
166     if ( ! defined $self->{toolruntime}{$name} ) {
167     require Runtime;
168     my $toolbox=$self->areatoolbox($area);
169     $self->{toolruntime}{$name}=Runtime->new();
170    
171     # -- add scram area specific runtimes
172     $self->{toolruntime}{$name}->addvar("LD_LIBRARY_PATH",
173     $area->location()."/lib/".$self->arch(),"path");
174     $self->{toolruntime}{$name}->addvar("PATH",
175     $area->location()."/bin/".$self->arch(),"path");
176     if ( defined $area->linkarea() ) {
177     my $reltop=$area->linkarea()->location();
178     $self->{toolruntime}{$name}->addvar("LD_LIBRARY_PATH",
179     $reltop."/lib/".$self->arch(),"path");
180     $self->{toolruntime}{$name}->addvar("PATH",
181     $reltop."/bin/".$self->arch(),"path");
182     }
183    
184     # -- get the runtime environment from all the tools
185     my $tool;
186     foreach $toolname ( $toolbox->tools() ) {
187     $tool=$toolbox->gettool($toolname);
188     if ( defined $tool ) {
189     # -- get runtime paths
190     foreach $f ( $tool->listtype("runtime_path")) {
191     foreach $val ( $tool->getfeature($f) ) {
192     $self->{toolruntime}{$name}->addvar($f,$val,"path");
193     }
194     }
195     # -- get runtime vars
196     foreach $f ( $tool->listtype("runtime")) {
197     foreach $val ( $tool->getfeature($f) ) {
198     $self->{toolruntime}{$name}->addvar($f,$val);
199     }
200     }
201     }
202     }
203    
204     # -- Get the project level environment
205     my $runtimefile=$area->location()."/".$area->configurationdir()
206     ."/Runtime";
207     if ( -f $runtimefile ) {
208     $self->{toolruntime}{$name}->file($runtimefile);
209     }
210     }
211     return $self->{toolruntime}{$name};
212     }
213    
214     sub webget {
215     my $self=shift;
216     my $area=shift;
217     my $url=shift;
218    
219     require URL::URLhandler;
220     my $handler=URL::URLhandler->new($area->cache());
221     return ($handler->download($url));
222 williamc 1.2 }
223    
224     sub addareatoDB {
225     my $self=shift;
226     my $area=shift;
227     my $tagname=shift;
228     my $version=shift;
229    
230     # -- create defaults if necessary
231     if ( (! defined $version) || ( $version eq "") ) {
232     $version=$area->version();
233     }
234     if ( (! defined $tagname) || ( $tagname eq "") ) {
235     $tagname=$area->name();
236     }
237    
238     # -- Add to the DB
239     $self->scramprojectdb()->addarea($tagname,$version,$area);
240     }
241    
242 sashby 1.13
243     sub removeareafromDB
244     {
245     ###############################################################
246     # removearefromDB() #
247     ###############################################################
248     # modified : Thu Jun 14 10:46:22 2001 / SFA #
249     # params : projectname, projectversion #
250     # : #
251     # : #
252     # : #
253     # function : Remove project <projectname> from DB file. #
254     # : #
255     # : #
256     ###############################################################
257     my $self=shift;
258     my $projname=shift;
259     my $version=shift;
260    
261     # -- Remove from the DB:
262     $self->scramprojectdb()->removearea($projname,$version);
263     }
264    
265    
266 sashby 1.12 sub spawnversion
267     {
268 sashby 1.15 ###############################################################
269     # spawnversion #
270     ###############################################################
271     # modified : Fri Aug 10 15:42:08 2001 / SFA #
272     # params : #
273     # : #
274     # : #
275     # : #
276     # function : Check for version of scram to run, and run it. #
277     # : #
278     # : #
279     ###############################################################
280    
281 sashby 1.12 my $self=shift;
282     my $version=shift;
283     my $rv=0;
284    
285     my $thisversion=$self->getversion();
286 williamc 1.8
287 sashby 1.12 if ( defined $version )
288     {
289     if ( $version ne $thisversion )
290     {
291     # first try to use the correct version
292     if ( -d $self->{scram_top}."/".$version )
293     {
294     $ENV{SCRAM_HOME}=$self->{scram_top}."/".$version;
295     $ENV{TOOL_HOME}="$ENV{SCRAM_HOME}/src";
296     $self->verbose("Spawning SCRAM version $version");
297 sashby 1.16 #print "######### SCRAM version control: ";
298     #print "ARGS: ",@_,"\n\n";
299 sashby 1.12 my $rv=system("scram", @_)/256;
300     exit $rv;
301     }
302     else
303     { # if not then simply warn
304     print "******* Warning : scram version inconsistent ********\n";
305     print "This version: $thisversion; Required version: $version\n";
306     print "*****************************************************\n";
307     print "\n";
308     }
309     }
310     }
311     else
312     {
313     $self->error("Undefined value for version requested");
314     $rv=1;
315     }
316     return $rv;
317     }
318 williamc 1.8
319 williamc 1.2 sub globalcache {
320     my $self=shift;
321     if ( @_ ) {
322     $self->{cachedir}=shift;
323     }
324     if ( ! defined $self->{globalcache} ) {
325     $self->{globalcache}=URL::URLcache->new($self->{cachedir});
326     }
327     return $self->{globalcache};
328     }
329    
330    
331     sub scramprojectdb {
332     my $self=shift;
333     if ( @_ ) {
334     $self->{scramprojectsdbdir}=shift;
335     }
336     if ( ! defined $self->{scramprojectsdb} ) {
337     require Scram::ScramProjectDB;
338     $self->{scramprojectsdb}=Scram::ScramProjectDB->new(
339     $self->{scramprojectsdbdir} );
340     $self->{scramprojectsdb}->verbosity($self->verbosity());
341     }
342     return $self->{scramprojectsdb};
343     }
344 williamc 1.8
345     sub getversion {
346     my $self=shift;
347    
348     my $thisversion;
349     ($thisversion=$ENV{SCRAM_HOME})=~s/(.*)\///;
350     my $scram_top=$1;
351     my $scram_version=$thisversion;
352     # deal with links
353     my $version=readlink $ENV{SCRAM_HOME};
354     if ( defined $version) {
355     $scram_version=$version;
356     }
357     return $scram_version;
358     }
359 williamc 1.2
360     sub areatoolbox {
361     my $self=shift;
362     my $area=shift;
363    
364     my $name=$area->location();
365     if ( ! defined $self->{toolboxes}{$name} ) {
366     # -- create a new toolbox object
367     require BuildSystem::ToolBox;
368 williamc 1.8 $self->{toolboxes}{$name}=BuildSystem::ToolBox->new($area,
369     $self->arch());
370 williamc 1.2 $self->{toolboxes}{$name}->verbosity($self->verbosity());
371     }
372     return $self->{toolboxes}{$name};
373     }
374    
375     sub arearequirements {
376     my $self=shift;
377     my $area=shift;
378    
379     my $name=$area->location();
380     if ( ! defined $self->{requirements}{$name} ) {
381     # -- create a new toolbox object
382     require BuildSystem::Requirements;
383     my $doc=$area->requirementsdoc();
384     my $cache=$area->cache();
385     my $db=$area->objectstore();
386     require ActiveDoc::ActiveStore;
387     my $astore=ActiveDoc::ActiveStore->new($db,$cache);
388     $self->{requirements}{$name}=
389     BuildSystem::Requirements->new($astore,"file:".$doc,
390     $ENV{SCRAM_ARCH});
391     $self->{requirements}{$name}->verbosity($self->verbosity());
392     $self->verbose("Requirements Doc (".$self->{requirements}{$name}.
393     ") for area :\n $name\n initiated from $doc");
394     }
395     else {
396     $self->verbose("Requirements Doc (".$self->{requirements}{$name}.")");
397     }
398     return $self->{requirements}{$name};
399     }
400    
401     sub arch {
402     my $self=shift;
403    
404     @_?$self->{arch}=shift
405     :$self->{arch};
406 williamc 1.6 }
407    
408     sub scramobjectinterface {
409 williamc 1.10 my $self=shift;
410     my $class=shift;
411 williamc 1.6
412 williamc 1.10 my $file;
413     ($file=$class."\.pm")=~s/::/\//g;
414     $file=$ENV{TOOL_HOME}."/".$file;
415 williamc 1.6
416 williamc 1.10 if ( ! -f $file ) {
417     $self->error("Unable to find $class in ".$ENV{TOOL_HOME});
418     }
419     print "--------------------- $class ------------------\n";
420     my $fh=FileHandle->new();
421 williamc 1.6 $fh->open("<$file");
422     while ( <$fh> ) {
423     if ( $_=~/#\s*Interface/g ) {
424     $intregion=1;
425     next;
426     }
427     if ( $intregion ) { # if we are in the interface documentation
428     if ( ( $_!~/^#/ ) || ( $_=~/^#\s?-{40}/ ) ) { #moving out of Int doc
429     $intregion=0;
430     next;
431     }
432     print $_;
433     if ( $_=~/^#\s*(.*)\((.*)\)?:(.*)/ ) {
434     $interface=$1;
435     $args=$2;
436     $rest=$3;
437     next if ($interface eq "");
438     push @interfaces,$interface;
439     $interfaceargs{$interface}=$args;
440     }
441     }
442     }
443     print "\n";
444 williamc 1.10 undef $fh;
445 williamc 1.2 }
446    
447     # -------------- Support Routines ------------------------------
448    
449    
450     sub _allprojectinitsearcher {
451     if ( ! defined $self->{projsearcher} ) {
452     my $search=_projsearcher();
453     foreach $proj ( $self->scramprojectdb()->list() ) {
454     $search->addproject($$proj[0],$$proj[1]);
455     }
456     }
457 williamc 1.10 return $self->{projsearcher};
458 williamc 1.2 }
459    
460     sub _projsearcher {
461     if ( ! defined $self->{projsearcher} ) {
462     require Scram::ProjectSearcher;
463     $self->{projsearcher}=Scram::ProjectSearcher->new(
464     $self->scramprojectdb());
465     }
466     return $self->{projsearcher};
467     }
468    
469    
470     sub _lookupareaindb {
471     my $self=shift;
472    
473     my $area=undef;
474     # -- Look up the area in the databse
475     my @areas=$self->scramprojectdb()->getarea(@_);
476     if ( $#areas > 0 ) { #ambigous
477     # could ask user - for now just error
478     $self->error("Ambigous request - please be more specific");
479     }
480     elsif ( $#areas != 0 ) { #not found
481     $self->error("The project requested has not been found");
482     }
483     else {
484     $area=$areas[0];
485     }
486     return $area;
487     }