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

# Content
1 #
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 # scramobjectinterface(Class) : print out the interface of a scram class
22 # webget(area,url) : get the url into the cache of the specified area
23 # getversion() : return the current scram version
24 # spawnversion(version,@args) : spawn the scram version with the given args
25 # classverbose(classstring,setting) : Set the class verbosity level
26 # toolruntime(ConfigArea): Get a runtime object withthe settings from
27 # the specified toolbox
28
29 package Scram::ScramFunctions;
30 use URL::URLcache;
31 use Utilities::Verbose;
32 use Utilities::IndexedFileStore;
33
34 require 5.004;
35
36 @ISA=qw(Utilities::Verbose);
37
38 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
51 sub classverbose {
52 my $self=shift;
53 my $class=shift;
54 my $val=shift;
55
56 $ENV{"VERBOSE_".$class}=$val;
57 }
58
59 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 $area->toolboxversion($req->{configversion});
81
82 if ( defined $req ) {
83 $req->download($self->areatoolbox($area));
84 }
85
86 return $area;
87 }
88
89 sub setuptoolsinarea
90 {
91 my $self=shift;
92 my $area=shift;
93
94 # -- 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
125 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
161 use Utilities::AddDir;
162
163 if ( @_ )
164 {
165 $areaname=shift;
166 }
167
168 # Get location from SCRAMDB:
169 my $relarea=$self->_lookupareaindb($name,$version);
170
171 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
180 # Copy the admin dir (and with it, the ToolCache):
181 $relarea->copywithskip($area->location(),'ProjectCache.db');
182
183 # 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 # 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
194 # Make sourcecode dir:
195 if ( ! -d $area->location()."/".$area->sourcedir() )
196 {
197 AddDir::adddir($area->location()."/".$area->sourcedir());
198 }
199
200 # Copy RequirementsDoc:
201 if ( ! -f $area->requirementsdoc() )
202 {
203 use File::Copy;
204 copy( $relarea->requirementsdoc() , $area->requirementsdoc());
205 }
206
207 return $area;
208 }
209
210 sub toolruntime {
211 my $self=shift;
212 my $area=shift;
213 my $ld_lib_path="";
214 my $bin_path="";
215
216 my $name=$area->location();
217
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 }
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 }
328
329 sub addareatoDB {
330 my $self=shift;
331 my $flag=shift;
332 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 $self->scramprojectdb()->addarea($flag,$tagname,$version,$area);
345 }
346
347
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 my $flag=shift;
364 my $projname=shift;
365 my $version=shift;
366
367 # -- Remove from the DB:
368 $self->scramprojectdb()->removearea($flag,$projname,$version);
369 }
370
371
372 sub spawnversion
373 {
374 ###############################################################
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 my $self=shift;
388 my $version=shift;
389 my $rv=0;
390
391 my $thisversion=$self->getversion();
392
393 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 $ENV{SCRAM_TOOL_HOME}="$ENV{SCRAM_HOME}/src";
402 $self->verbose("Spawning SCRAM version $version");
403 my $rv=system($ENV{SCRAM_HOME}."/src/main/scram.pl", @_)/256;
404 exit $rv;
405 }
406 else
407 {
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 }
417 }
418 }
419 else
420 {
421 $self->error("Undefined value for version requested");
422 $rv=1;
423 }
424 return $rv;
425 }
426
427 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
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
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 $self->{toolboxes}{$name}=BuildSystem::ToolBox->new($area,
477 $self->arch());
478 $self->{toolboxes}{$name}->verbosity($self->verbosity());
479 }
480 return $self->{toolboxes}{$name};
481 }
482
483 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 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 }
531
532 sub scramobjectinterface {
533 my $self=shift;
534 my $class=shift;
535
536 my $file;
537 ($file=$class."\.pm")=~s/::/\//g;
538 $file=$ENV{SCRAM_TOOL_HOME}."/".$file;
539
540 if ( ! -f $file ) {
541 $self->error("Unable to find $class in ".$ENV{SCRAM_TOOL_HOME});
542 }
543 print "--------------------- $class ------------------\n";
544 my $fh=FileHandle->new();
545 $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 undef $fh;
569 }
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 return $self->{projsearcher};
582 }
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 }