ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/BuildSetup.pm
Revision: 1.15
Committed: Wed Aug 22 12:40:13 2001 UTC (23 years, 8 months ago) by sashby
Content type: text/plain
Branch: MAIN
Changes since 1.14: +141 -88 lines
Log Message:
Committing some minor changes. Disable bold feature for piping.

File Contents

# User Rev Content
1 williamc 1.2 #
2     #
3     # Interface
4     # ---------
5 williamc 1.13 # new(toolbox) : A new BuildSetup
6     # BuildSetup(directory,targets) : prepare the ground for a build and build
7 williamc 1.12 # getclass(directory) : return (Class, ClassDir, BuildFileobject)
8     # associated with directory
9 williamc 1.13 #
10 williamc 1.2
11     package BuildSystem::BuildSetup;
12     require 5.004;
13     use Utilities::Verbose;
14     use Utilities::SCRAMUtils;
15     use BuildSystem::BuildFile;
16     use Utilities::AddDir;
17     @ISA=qw(Utilities::Verbose);
18    
19     sub new {
20     my $class=shift;
21     my $self={};
22     bless $self,$class;
23 williamc 1.13 $self->{toolbox}=shift;
24 williamc 1.2 return $self;
25     }
26    
27 sashby 1.14 sub _generateexternals
28     ###############################################################
29     # _generateexternals #
30     ###############################################################
31     # modified : Thu Jul 12 12:06:50 2001 / SFA #
32     # params : #
33     # : #
34     # : #
35     # : #
36     # function : #
37     # : #
38     # : #
39     ###############################################################
40     {
41     my $self=shift;
42     my $outfile=shift;
43 williamc 1.2
44 sashby 1.14 # -- specifiy these files for dependency information
45     # NB: This file is never used!
46    
47     my $depfile=$ENV{projconfigdir}."/External_Dependencies";
48    
49     # -- get list of dependent files
50     my $datadir=$ENV{LOCALTOP}."/.SCRAM/".$ENV{SCRAM_ARCH};
51     $fdir=FileHandle->new();
52     opendir $fdir, $datadir;
53     my @depfiles=grep !/^\.\.?$/, readdir $fdir;
54     undef $fdir;
55    
56     for (my $i=0; $i<=$#depfiles; $i++ )
57     {
58     $depfiles[$i]=$datadir."/".$depfiles[$i];
59     }
60    
61     # -- do we need to rebuild?
62     if ( SCRAMUtils::dated($outfile,@depfiles) )
63     {
64     print "Configuring Local Area\n";
65     # -- open output file
66     my $fout=FileHandle->new();
67     $fout->open(">".$outfile) or die "Unable to open $outfile for output".
68     $!."\n";
69 williamc 1.2
70 sashby 1.14 # -- print out tool/ version info
71     my ($tool,$toolobj,$f,$val,$version);
72    
73     foreach $tool ( $self->{toolbox}->tools() )
74     {
75     $version=$self->{toolbox}->defaultversion($tool);
76    
77     # default versions
78     print $fout "ifdef $tool\n".$tool."_V_".$version."=true\nendif\n";
79 williamc 1.2
80 sashby 1.14 # -- set up the different version -- externals
81     foreach $version ( $self->{toolbox}->versions($tool) )
82     {
83     $toolobj=$self->{toolbox}->gettool($tool,$version);
84     @deps=$toolobj->getfeature("_externals");
85     #
86     foreach $d ( @deps )
87     {
88     $d=~tr[A-Z][a-z];
89     print $fout "ifdef ".$tool."_V_".$version."\n $d=true\nendif\n";
90     }
91     # -- tool info
92     print $fout "ifdef ".$tool."_V_".$version."\n";
93    
94     foreach $f ( $toolobj->features() )
95     {
96     foreach $val ( $toolobj->getfeature($f) )
97     {
98     print $fout "\t".$f." += ".$val."\n";
99     }
100     }
101     # -- include any makefiles associated with the tool
102     if ( -f $self->{toolbox}->toolmakefile($tool,$version) )
103     {
104     print $fout "-include ".
105     $self->{toolbox}->toolmakefile($tool,$version)."\n";
106     }
107     print $fout "endif\n";
108 williamc 1.2 }
109 sashby 1.14 }
110     # some addittional processing of specific vars
111     print $fout 'INCLUDEPATH+=$(addprefix -I,$(INCLUDE))'."\n";
112     print $fout 'LDFLAGS+=$(addprefix -L,$(LIBDIR))'."\n";
113     print $fout 'CPPFLAGS+=$(addprefix -D,$(CPPDEFINES))'."\n";
114     print $fout 'lib+=$(extralib)'."\n";
115     print $fout 'LDLIBS+=$(addprefix -l,$(lib))'."\n";
116     print $fout 'LDLIBS+=$(addprefix -l,$(REQUIRES))'."\n";
117     print $fout 'LD_LIBRARY_PATH:=$(subst $(space),:,$(LD_LIBRARY_PATH))'."\n";
118    
119     undef $fout;
120     }
121     }
122 williamc 1.2
123 sashby 1.15 sub BuildSetup
124     {
125     ###############################################################
126     # BuildSetup #
127     ###############################################################
128     # modified : Fri Aug 10 16:57:03 2001 / SFA #
129     # params : #
130     # : #
131     # : #
132     # : #
133     # function : Build targets. #
134     # : #
135     # : #
136     ###############################################################
137     my $self=shift;
138     my $THISDIR=shift;
139     my @Targets=@_;
140     my $DefaultBuildFile="";
141     my $Class="";
142    
143     # -- Create working directory
144     chdir $ENV{LOCALTOP};
145     AddDir::adddir($ENV{INTwork}."/".$THISDIR);
146    
147     my ($Class, $ClassDir, $bf)=$self->getclass($THISDIR);
148     $self->verbose("Class = $Class");
149     $self->verbose("ClassDir = $ClassDir");
150 williamc 1.13
151 sashby 1.15 if ( $bf->ignore() )
152     {
153     print "Nothing to be done - empty group\n";
154     exit;
155     }
156     shift;
157     $self->_generateexternals($ENV{LOCALTOP}."/".$ENV{INTwork}."/clientmakefile");
158    
159     # set up the workdir variable
160     $ENV{workdir}=$ENV{INTwork}."/".$ClassDir;
161     my $fullworkdir=$ENV{LOCALTOP}."/".$ENV{workdir};
162    
163     # set up projdeps variable
164     my $projectfile=$ENV{projconfigdir}."/External_Dependencies";
165     if ( -e $ENV{LOCALTOP}."/".$projectfile )
166     {
167 williamc 1.13 $ENV{projdeps}=$ENV{LOCALTOP}."/".$projectfile;
168 sashby 1.15 }
169     elsif ( -e $ENV{RELEASETOP}."/".$projectfile )
170     {
171 williamc 1.13 $ENV{projectfile}=$ENV{RELEASETOP}."/".$projectfile;
172 sashby 1.15 }
173     if ( $DefaultBuildFile eq "" )
174     {
175 williamc 1.13 # Map Relevant makefile classmakefile directory
176     my $classmakefile=$ENV{projconfigdir}."/".$Class."_makefile.mk";
177 sashby 1.15 if ( -e $ENV{LOCALTOP}."/".$classmakefile )
178     {
179     $ENV{classmakefile}=$ENV{LOCALTOP}."/".$classmakefile;
180     }
181     elsif ( -e $ENV{RELEASETOP}."/".$classmakefile )
182     {
183 williamc 1.13 $ENV{classmakefile}=$ENV{RELEASETOP}."/".$classmakefile;
184 sashby 1.15 }
185     else
186     {
187     print "\nUnable to locate $classmakefile\n";
188     print " Not in $ENV{LOCALTOP}\n";
189     print " Not in $ENV{RELEASETOP}\n";
190     exit 1;
191     }
192 williamc 1.13 $DefaultBuildFile=$ENV{classmakefile}; # TODO - only for override
193 sashby 1.15 }
194    
195     $ENV{ClassDir}=$ClassDir;
196     $ENV{Class}=$Class;
197     $ENV{DefaultBuildFile}=$DefaultBuildFile;
198    
199     chdir $fullworkdir || die "Unable to enter working directory $!";
200    
201     # Set up some other useful variables fo the Build
202     # list of directories available
203     opendir IDR, "$ENV{LOCALTOP}/$THISDIR";
204     @allfiles= grep !/^\.\.?$/, readdir IDR;
205     foreach $file ( @allfiles )
206     {
207     if ( -d "$ENV{LOCALTOP}/$THISDIR/$file" )
208     { # only add if its a directory
209     $ENV{SCRAM_AVAILDIRS}=$ENV{SCRAM_AVAILDIRS}." ".$file;
210     }
211     else
212     {
213     $ENV{SCRAM_AVAILFILES}=$ENV{SCRAM_AVAILFILES}." ".$file;
214     }
215     }
216     $targetnumber=$#Targets;
217    
218     foreach $word ( @Targets )
219     {
220     if ( $word=~/.*=.*/ )
221     { # if we have an assignment it cant be a target
222 williamc 1.13 $targetnumber--;
223 sashby 1.15 }
224     elsif ( $word=~/^-/ )
225     {
226 williamc 1.13 $targetnumber--;
227 sashby 1.15 }
228     else
229     {
230     $ENV{"MAKETARGET_".$word}=$word;
231     }
232 williamc 1.13 }
233 sashby 1.15
234     # If not specified default to the class name target
235     if ( $targetnumber == -1 )
236     {
237     push @Targets,$Class;
238 williamc 1.13 }
239 williamc 1.2
240 sashby 1.15 $ENV{DefaultMakefile}="$ENV{TOOL_HOME}/basics.mk";
241 williamc 1.2
242 sashby 1.15 $SCRAM_GROUPSDIR=$ENV{LOCALTOP}."/".$ENV{projconfigdir}."/groups.mk";
243     if ( -f $SCRAM_GROUPSDIR )
244     {
245 williamc 1.2 $ENV{SCRAM_GROUPSDIR}=$SCRAM_GROUPSDIR;
246 sashby 1.15 }
247    
248     # Do a datestamp check so that make will build files that have changed
249     # rather than just those which are older than their dependencies
250     # The main build here
251     $rv=system("gmake","--no-print-directory","-r","-k","-f","$ENV{DefaultMakefile}","-I$ENV{TOOL_HOME}",datestamp_config);
252    
253     print "\n","scram BUILDSYSTEM: V1.0 ****","\n";
254    
255     my $gmakejobsflag = "-j";
256     chomp(my $currentOS = `uname`);
257    
258     # Only use -j option if there are more then 1 cpu's.....
259     if ( $currentOS eq "Linux" )
260     {
261     chomp($ncpu=`cat /proc/cpuinfo | grep -c processor`);
262     }
263     elsif ( $currentOS eq "SunOS" )
264     # How can you tell how many CPUs you've got in a Sun box?:
265     {
266     $ncpu = 1;
267     }
268     else
269     # Who knows what the OS is. Leave as default:
270     {
271     $npcu = 1;
272     }
273    
274     # Modify: try to force make to spawn more than one job (option: -j ).
275     $rv=system("gmake","--no-print-directory","$gmakejobsflag","$ncpu","-r","-k","-f","$ENV{DefaultMakefile}","-I$ENV{TOOL_HOME}",datestamp, @Targets);
276     return $rv/256; # return the exit status of gmake
277     }
278 williamc 1.8
279 williamc 1.13 sub getclass {
280 williamc 1.2 my $self=shift;
281     my $dirname = shift;
282     my $Class="DEFAULT";
283     my $ClassDir="";
284 williamc 1.13
285     #return if $dirname eq "";
286     @DIRA=split /\//, $dirname;
287 williamc 1.12
288 williamc 1.13 $thispath=".";
289     # bootstrap from project buildfile if it exists
290     my $bf=BuildSystem::BuildFile->new($self->{toolbox});
291     $bf->CheckBuildFile($ENV{projconfigdir});
292 williamc 1.2
293 williamc 1.13 my @ClassPaths=split /:/, $bf->BlockClassPath();
294     foreach $BClassPath ( @ClassPaths ) {
295     next if ( $BClassPath eq "");
296     push @LoBCA, [ split /\//, $BClassPath ];
297     }
298 williamc 1.2 for ( $i=0; $i<=$#DIRA; $i++ ) {
299 williamc 1.12 $thispath=$thispath."/".$DIRA[$i];
300 williamc 1.13 if ( ($ClassName=$bf->CheckBuildFile($thispath)) ne "" ) {
301     $Class=$ClassName;
302 williamc 1.2 $ClassDir=$thispath;
303     }
304 williamc 1.13 # TODO --- Must test against position of last new BlockCaseA
305     # Need to reset array LoBCA to the New BlockPath
306     # - merge and replace options
307     #
308     else {
309     foreach $BlockClassA ( @LoBCA ) {
310     if ( $$BlockClassA[0]=~/^$DIRA[$i]\+/ ) {
311     $$BlockClassA[0]=~s/^$DIRA[$i]//;
312     }
313     if ( $$BlockClassA[0]=~/^\+/ ) {
314     ($Class=$$BlockClassA[0])=~s/^\+//;
315 williamc 1.2 $ClassDir=$thispath;
316 williamc 1.13 shift @$BlockClassA;
317     }
318     else {
319     @$BlockClassA=();
320     }
321     }
322 williamc 1.12 }
323 williamc 1.5 }
324 williamc 1.13 $ClassDir=~s/^\.\///;
325     return ( $Class, $ClassDir, $bf);
326 williamc 1.2 }