ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Scram/ScramFunctions.pm
Revision: 1.24
Committed: Wed Feb 2 18:57:02 2005 UTC (20 years, 3 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V1_0_1
Changes since 1.23: +7 -3 lines
Log Message:
Copy the URL cache to developer areas.

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 sashby 1.22 use Utilities::IndexedFileStore;
33    
34 williamc 1.2 require 5.004;
35    
36     @ISA=qw(Utilities::Verbose);
37    
38 sashby 1.11 sub new
39     {
40     my $class=shift;
41     $self={};
42     bless $self, $class;
43     # -- default settings
44     $self->{cachedir}=$ENV{HOME}."/.scramrc/globalcache";
45     $self->{scramprojectsdbdir}=$ENV{SCRAM_LOOKUPDB};
46     ($self->{scram_top})=( $ENV{SCRAM_HOME}=~/(.*)\//) ;
47    
48     return $self;
49     }
50 williamc 1.2
51 williamc 1.10 sub classverbose {
52     my $self=shift;
53     my $class=shift;
54     my $val=shift;
55    
56     $ENV{"VERBOSE_".$class}=$val;
57     }
58    
59 williamc 1.2 sub project {
60     my $self=shift;
61     my $url=shift;
62     my $installarea=shift;
63    
64     my $areaname="";
65     if ( @_ ) {
66     $areaname=shift;
67     }
68     require Configuration::BootStrapProject;
69     my $bs=Configuration::BootStrapProject->
70     new($self->globalcache(),$installarea);
71     $self->verbose("BootStrapping $url");
72     my $area=$bs->boot($url,$areaname);
73     if ( ! defined $area ) {
74     $self->error("Unable to create project area");
75     }
76     $area->archname($self->arch());
77    
78     # -- download all tool description files
79     my $req=$self->arearequirements($area);
80 sashby 1.22 $area->toolboxversion($req->{configversion});
81    
82 williamc 1.2 if ( defined $req ) {
83     $req->download($self->areatoolbox($area));
84     }
85    
86     return $area;
87     }
88    
89 sashby 1.18 sub setuptoolsinarea
90     {
91     my $self=shift;
92     my $area=shift;
93 sashby 1.19
94 sashby 1.18 # -- initialise
95     print "Initialising setup procedure......","\n";
96     $self->_allprojectinitsearcher();
97    
98     # -- create a new toolbox object
99     my $toolbox=$self->areatoolbox($area);
100     $toolbox->searcher($self->_allprojectinitsearcher());
101    
102     if ( @_ )
103     {
104     # -- specific tool specified
105     if ( my $rv=$toolbox->toolsetup(@_) )
106     {
107     if ( $rv eq 1 )
108     {
109     print "Unknown tool $toolname @ARGV\n";
110     exit 1;
111     }
112     }
113     }
114     else
115     {
116     # -- setup all tools specified in the requirements doc
117     print "Going to set up all tools....","\n\n";
118     my $reqs=$self->arearequirements($area);
119     $self->verbose("Setup ToolBox from Requirements doc ($reqs)");
120     # reqs is a BuildSystem::Requirements object:
121     $reqs->setup($toolbox);
122     }
123     }
124 williamc 1.2
125 sashby 1.22 sub updatetoolsinarea
126     {
127     my $self=shift;
128     my $area=shift;
129    
130    
131     my $toolbox=$self->areatoolbox($area);
132    
133     print "Going to refresh the setup of tools....","\n\n";
134     my $currenttag = $area->toolboxversion();
135    
136     # Get rid of the current cache:
137     my $cachename = $area->cache()->location();
138     system("mv","$cachename","$cachename".".$currenttag");
139     # Create a new one:
140     $area->_newcache();
141     my $reqs=$self->arearequirements($area);
142     $reqs->download();
143     $reqs->setup($toolbox);
144     print "Previous configuration tag : ",$currenttag,"\n";
145     $area->toolboxversion($reqs->{configversion});
146     print "Current configuration tag : ",$area->toolboxversion(),"\n\n";
147     $area->save();
148     }
149    
150     sub satellite
151     {
152     #
153     # Modified to suit new structure
154     #
155     my $self=shift;
156     my $name=shift;
157     my $version=shift;
158     my $installarea=shift; # Where to install (-dir option in project cmd);
159     my $areaname=undef; # Name of the area (comes from -name option in project cmd);
160 sashby 1.24
161     use Utilities::AddDir;
162    
163 sashby 1.22 if ( @_ )
164     {
165     $areaname=shift;
166     }
167    
168     # Get location from SCRAMDB:
169     my $relarea=$self->_lookupareaindb($name,$version);
170 williamc 1.2
171 sashby 1.22 if ( ! defined $relarea )
172     {
173     $self->error("Unable to Find Project $name $version");
174     }
175    
176     # Create a satellite area:
177     my $area=$relarea->satellite($installarea,$areaname);
178     $area->archname($self->arch());
179 williamc 1.2
180 sashby 1.23 # Copy the admin dir (and with it, the ToolCache):
181     $relarea->copywithskip($area->location(),'ProjectCache.db');
182 williamc 1.4
183 sashby 1.24 # Also, we need to copy .SCRAM/cache from the release area. This eliminates the need
184     # to download tools again from CVS:
185     $relarea->copyurlcache($area->location());
186    
187 sashby 1.22 # Copy configuration directory contents:
188     if ( ! -d $area->location()."/".$area->configurationdir() )
189     {
190     AddDir::copydir($relarea->location()."/".$relarea->configurationdir(),
191     $area->location()."/".$area->configurationdir() );
192     }
193 williamc 1.2
194 sashby 1.22 # Make sourcecode dir:
195     if ( ! -d $area->location()."/".$area->sourcedir() )
196     {
197     AddDir::adddir($area->location()."/".$area->sourcedir());
198     }
199 williamc 1.2
200 sashby 1.22 # Copy RequirementsDoc:
201     if ( ! -f $area->requirementsdoc() )
202     {
203     use File::Copy;
204     copy( $relarea->requirementsdoc() , $area->requirementsdoc());
205     }
206 williamc 1.2
207 sashby 1.22 return $area;
208     }
209 williamc 1.7
210 williamc 1.10 sub toolruntime {
211 williamc 1.7 my $self=shift;
212     my $area=shift;
213 sashby 1.22 my $ld_lib_path="";
214     my $bin_path="";
215 williamc 1.7
216 williamc 1.10 my $name=$area->location();
217 sashby 1.22
218     if ( ! defined $self->{toolruntime}{$name} )
219     {
220     require Runtime;
221     my $toolbox=$self->areatoolbox($area);
222     $self->{toolruntime}{$name}=Runtime->new();
223    
224     # Test for SCRAM_ARCH/lib order:
225     if ( -d $area->location()."/".$self->arch())
226     {
227     $ld_lib_path = $area->location()."/".$self->arch()."/lib"
228     unless ( ! -d $area->location()."/".$self->arch()."/lib");
229     $bin_path = $area->location()."/".$self->arch()."/bin"
230     unless ( ! -d $area->location()."/".$self->arch()."/bin");
231     }
232     # Other way around:
233     elsif ( -d $area->location()."/lib/".$self->arch())
234     {
235     $ld_lib_path = $area->location()."/lib/".$self->arch()
236     unless ( ! -d $area->location()."/lib/".$self->arch());
237     $bin_path = $area->location()."/bin/".$self->arch()
238     unless ( ! -d $area->location()."/bin/".$self->arch());
239     }
240     else
241     # Assume no arch so just use lib and bin:
242     {
243     $ld_lib_path = $area->location()."/lib";
244     $bin_path = $area->location()."/bin";
245     }
246    
247     # -- Now set the scram area specific runtimes accordingly:
248     $self->{toolruntime}{$name}->addvar("LD_LIBRARY_PATH",$ld_lib_path,"path");
249     $self->{toolruntime}{$name}->addvar("PATH",$bin_path,"path");
250    
251     # Check for a linked area:
252     if ( defined $area->linkarea() )
253     {
254     my $relarea=$area->linkarea();
255     # Now do the checks for the release area:
256     if ( -d $relarea->location()."/".$self->arch())
257     {
258     $ld_lib_path = $relarea->location()."/".$self->arch()."/lib"
259     unless ( ! -d $relarea->location()."/".$self->arch()."/lib");
260     $bin_path = $relarea->location()."/".$self->arch()."/bin"
261     unless ( ! -d $relarea->location()."/".$self->arch()."/bin");
262     }
263     # Other way around:
264     elsif ( -d $relarea->location()."/lib/".$self->arch())
265     {
266     $ld_lib_path = $relarea->location()."/lib/".$self->arch()
267     unless ( ! -d $relarea->location()."/lib/".$self->arch());
268     $bin_path = $relarea->location()."/bin/".$self->arch()
269     unless ( ! -d $relarea->location()."/bin/".$self->arch());
270     }
271     else
272     # Assume no arch so just use lib and bin:
273     {
274     $ld_lib_path = $relarea->location()."/lib";
275     $bin_path = $relarea->location()."/bin";
276     }
277     # Add the release paths:
278     $self->{toolruntime}{$name}->addvar("LD_LIBRARY_PATH",$ld_lib_path,"path");
279     $self->{toolruntime}{$name}->addvar("PATH",$bin_path,"path");
280     }
281    
282     # -- get the runtime environment from all the tools
283     my $tool;
284     foreach $toolname ( $toolbox->tools() )
285     {
286     $tool=$toolbox->gettool($toolname);
287     if ( defined $tool )
288     {
289     # -- get runtime paths
290     foreach $f ( $tool->listtype("runtime_path"))
291     {
292     foreach $val ( $tool->getfeature($f) )
293     {
294     $self->{toolruntime}{$name}->addvar($f,$val,"path");
295     }
296     }
297     # -- get runtime vars
298     foreach $f ( $tool->listtype("runtime"))
299     {
300     foreach $val ( $tool->getfeature($f) )
301     {
302     $self->{toolruntime}{$name}->addvar($f,$val);
303     }
304     }
305     }
306     }
307    
308     # -- Get the project level environment
309     my $runtimefile=$area->location()."/".$area->configurationdir()."/Runtime";
310    
311     if ( -f $runtimefile )
312     {
313     $self->{toolruntime}{$name}->file($runtimefile);
314     }
315     }
316     return $self->{toolruntime}{$name};
317 williamc 1.10 }
318    
319     sub webget {
320     my $self=shift;
321     my $area=shift;
322     my $url=shift;
323    
324     require URL::URLhandler;
325     my $handler=URL::URLhandler->new($area->cache());
326     return ($handler->download($url));
327 williamc 1.2 }
328    
329     sub addareatoDB {
330     my $self=shift;
331 sashby 1.22 my $flag=shift;
332 williamc 1.2 my $area=shift;
333     my $tagname=shift;
334     my $version=shift;
335    
336     # -- create defaults if necessary
337     if ( (! defined $version) || ( $version eq "") ) {
338     $version=$area->version();
339     }
340     if ( (! defined $tagname) || ( $tagname eq "") ) {
341     $tagname=$area->name();
342     }
343     # -- Add to the DB
344 sashby 1.22 $self->scramprojectdb()->addarea($flag,$tagname,$version,$area);
345 williamc 1.2 }
346    
347 sashby 1.13
348     sub removeareafromDB
349     {
350     ###############################################################
351     # removearefromDB() #
352     ###############################################################
353     # modified : Thu Jun 14 10:46:22 2001 / SFA #
354     # params : projectname, projectversion #
355     # : #
356     # : #
357     # : #
358     # function : Remove project <projectname> from DB file. #
359     # : #
360     # : #
361     ###############################################################
362     my $self=shift;
363 sashby 1.22 my $flag=shift;
364 sashby 1.13 my $projname=shift;
365     my $version=shift;
366    
367     # -- Remove from the DB:
368 sashby 1.22 $self->scramprojectdb()->removearea($flag,$projname,$version);
369 sashby 1.13 }
370    
371    
372 sashby 1.12 sub spawnversion
373     {
374 sashby 1.15 ###############################################################
375     # spawnversion #
376     ###############################################################
377     # modified : Fri Aug 10 15:42:08 2001 / SFA #
378     # params : #
379     # : #
380     # : #
381     # : #
382     # function : Check for version of scram to run, and run it. #
383     # : #
384     # : #
385     ###############################################################
386    
387 sashby 1.12 my $self=shift;
388     my $version=shift;
389     my $rv=0;
390    
391     my $thisversion=$self->getversion();
392 williamc 1.8
393 sashby 1.12 if ( defined $version )
394     {
395     if ( $version ne $thisversion )
396     {
397     # first try to use the correct version
398     if ( -d $self->{scram_top}."/".$version )
399     {
400     $ENV{SCRAM_HOME}=$self->{scram_top}."/".$version;
401 sashby 1.22 $ENV{SCRAM_TOOL_HOME}="$ENV{SCRAM_HOME}/src";
402 sashby 1.12 $self->verbose("Spawning SCRAM version $version");
403 sashby 1.22 my $rv=system($ENV{SCRAM_HOME}."/src/main/scram.pl", @_)/256;
404 sashby 1.12 exit $rv;
405     }
406     else
407 sashby 1.21 {
408     # if not then simply warn. Send output to STDERR:
409     if ( -t STDERR )
410     {
411     print STDERR "******* Warning : scram version inconsistent ********\n";
412     print STDERR "This version: $thisversion; Required version: $version\n";
413     print STDERR "*****************************************************\n";
414     print STDERR "\n";
415     }
416 sashby 1.12 }
417     }
418     }
419     else
420     {
421     $self->error("Undefined value for version requested");
422     $rv=1;
423     }
424     return $rv;
425     }
426 williamc 1.8
427 williamc 1.2 sub globalcache {
428     my $self=shift;
429     if ( @_ ) {
430     $self->{cachedir}=shift;
431     }
432     if ( ! defined $self->{globalcache} ) {
433     $self->{globalcache}=URL::URLcache->new($self->{cachedir});
434     }
435     return $self->{globalcache};
436     }
437    
438    
439     sub scramprojectdb {
440     my $self=shift;
441     if ( @_ ) {
442     $self->{scramprojectsdbdir}=shift;
443     }
444     if ( ! defined $self->{scramprojectsdb} ) {
445     require Scram::ScramProjectDB;
446     $self->{scramprojectsdb}=Scram::ScramProjectDB->new(
447     $self->{scramprojectsdbdir} );
448     $self->{scramprojectsdb}->verbosity($self->verbosity());
449     }
450     return $self->{scramprojectsdb};
451     }
452 williamc 1.8
453     sub getversion {
454     my $self=shift;
455    
456     my $thisversion;
457     ($thisversion=$ENV{SCRAM_HOME})=~s/(.*)\///;
458     my $scram_top=$1;
459     my $scram_version=$thisversion;
460     # deal with links
461     my $version=readlink $ENV{SCRAM_HOME};
462     if ( defined $version) {
463     $scram_version=$version;
464     }
465     return $scram_version;
466     }
467 williamc 1.2
468     sub areatoolbox {
469     my $self=shift;
470     my $area=shift;
471    
472     my $name=$area->location();
473     if ( ! defined $self->{toolboxes}{$name} ) {
474     # -- create a new toolbox object
475     require BuildSystem::ToolBox;
476 williamc 1.8 $self->{toolboxes}{$name}=BuildSystem::ToolBox->new($area,
477     $self->arch());
478 williamc 1.2 $self->{toolboxes}{$name}->verbosity($self->verbosity());
479     }
480     return $self->{toolboxes}{$name};
481     }
482    
483 sashby 1.22 sub areatoolmanager
484     {
485     my $self=shift;
486     my $area=shift;
487    
488     my $name=$area->location();
489    
490     if ( ! defined $self->{toolmanagers}{$name} )
491     {
492     use BuildSystem::ToolManager;
493     $self->{toolmanagers}{$name}=ToolManager->new($area,$self->arch());
494     }
495    
496     return $self->{toolmanagers}{$name};
497     }
498    
499 williamc 1.2 sub arearequirements {
500     my $self=shift;
501     my $area=shift;
502    
503     my $name=$area->location();
504     if ( ! defined $self->{requirements}{$name} ) {
505     # -- create a new toolbox object
506     require BuildSystem::Requirements;
507     my $doc=$area->requirementsdoc();
508     my $cache=$area->cache();
509     my $db=$area->objectstore();
510     require ActiveDoc::ActiveStore;
511     my $astore=ActiveDoc::ActiveStore->new($db,$cache);
512     $self->{requirements}{$name}=
513     BuildSystem::Requirements->new($astore,"file:".$doc,
514     $ENV{SCRAM_ARCH});
515     $self->{requirements}{$name}->verbosity($self->verbosity());
516     $self->verbose("Requirements Doc (".$self->{requirements}{$name}.
517     ") for area :\n $name\n initiated from $doc");
518     }
519     else {
520     $self->verbose("Requirements Doc (".$self->{requirements}{$name}.")");
521     }
522     return $self->{requirements}{$name};
523     }
524    
525     sub arch {
526     my $self=shift;
527    
528     @_?$self->{arch}=shift
529     :$self->{arch};
530 williamc 1.6 }
531    
532     sub scramobjectinterface {
533 williamc 1.10 my $self=shift;
534     my $class=shift;
535 williamc 1.6
536 williamc 1.10 my $file;
537     ($file=$class."\.pm")=~s/::/\//g;
538 sashby 1.22 $file=$ENV{SCRAM_TOOL_HOME}."/".$file;
539 williamc 1.6
540 williamc 1.10 if ( ! -f $file ) {
541 sashby 1.22 $self->error("Unable to find $class in ".$ENV{SCRAM_TOOL_HOME});
542 williamc 1.10 }
543     print "--------------------- $class ------------------\n";
544     my $fh=FileHandle->new();
545 williamc 1.6 $fh->open("<$file");
546     while ( <$fh> ) {
547     if ( $_=~/#\s*Interface/g ) {
548     $intregion=1;
549     next;
550     }
551     if ( $intregion ) { # if we are in the interface documentation
552     if ( ( $_!~/^#/ ) || ( $_=~/^#\s?-{40}/ ) ) { #moving out of Int doc
553     $intregion=0;
554     next;
555     }
556     print $_;
557     if ( $_=~/^#\s*(.*)\((.*)\)?:(.*)/ ) {
558     $interface=$1;
559     $args=$2;
560     $rest=$3;
561     next if ($interface eq "");
562     push @interfaces,$interface;
563     $interfaceargs{$interface}=$args;
564     }
565     }
566     }
567     print "\n";
568 williamc 1.10 undef $fh;
569 williamc 1.2 }
570    
571     # -------------- Support Routines ------------------------------
572    
573    
574     sub _allprojectinitsearcher {
575     if ( ! defined $self->{projsearcher} ) {
576     my $search=_projsearcher();
577     foreach $proj ( $self->scramprojectdb()->list() ) {
578     $search->addproject($$proj[0],$$proj[1]);
579     }
580     }
581 williamc 1.10 return $self->{projsearcher};
582 williamc 1.2 }
583    
584     sub _projsearcher {
585     if ( ! defined $self->{projsearcher} ) {
586     require Scram::ProjectSearcher;
587     $self->{projsearcher}=Scram::ProjectSearcher->new(
588     $self->scramprojectdb());
589     }
590     return $self->{projsearcher};
591     }
592    
593    
594     sub _lookupareaindb {
595     my $self=shift;
596    
597     my $area=undef;
598     # -- Look up the area in the databse
599     my @areas=$self->scramprojectdb()->getarea(@_);
600     if ( $#areas > 0 ) { #ambigous
601     # could ask user - for now just error
602     $self->error("Ambigous request - please be more specific");
603     }
604     elsif ( $#areas != 0 ) { #not found
605     $self->error("The project requested has not been found");
606     }
607     else {
608     $area=$areas[0];
609     }
610     return $area;
611     }