ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/BuildSetup.pm
Revision: 1.24
Committed: Tue May 14 10:21:19 2002 UTC (22 years, 11 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: SFATEST, V0_19_4, V0_19_4_pre3, V0_19_4_pre2
Branch point for: V0_19_4_B
Changes since 1.23: +14 -6 lines
Log Message:
*** empty log message ***

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 sashby 1.24
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 sashby 1.24
70 sashby 1.14 # -- print out tool/ version info
71     my ($tool,$toolobj,$f,$val,$version);
72 sashby 1.24
73 sashby 1.14 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 sashby 1.24
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 sashby 1.24 if ( $f eq 'LIBDIR' || $f eq 'INCLUDE' )
99     {
100     # Remove duplications:
101     print $fout "\t".$f." := \$(filter-out ".$val.",\$(".$f."))","\n";
102     print $fout "\t".$f." += ".$val."\n";
103     }
104     else
105     {
106     print $fout "\t".$f." += ".$val."\n";
107     }
108 sashby 1.14 }
109     }
110     # -- include any makefiles associated with the tool
111     if ( -f $self->{toolbox}->toolmakefile($tool,$version) )
112     {
113     print $fout "-include ".
114     $self->{toolbox}->toolmakefile($tool,$version)."\n";
115     }
116     print $fout "endif\n";
117 williamc 1.2 }
118 sashby 1.14 }
119     # some addittional processing of specific vars
120     print $fout 'INCLUDEPATH+=$(addprefix -I,$(INCLUDE))'."\n";
121     print $fout 'LDFLAGS+=$(addprefix -L,$(LIBDIR))'."\n";
122     print $fout 'CPPFLAGS+=$(addprefix -D,$(CPPDEFINES))'."\n";
123     print $fout 'lib+=$(extralib)'."\n";
124 sashby 1.23 # Hack to parse the lib list and remove duplicates:
125     print $fout 'ORDEREDLIB=$(shell $(SCRAMPERL) $(TOOL_HOME)/ProcessLibs $(lib))',"\n";
126     print $fout 'LDLIBS+=$(addprefix -l,$(ORDEREDLIB))'."\n";
127 sashby 1.14 print $fout 'LDLIBS+=$(addprefix -l,$(REQUIRES))'."\n";
128     print $fout 'LD_LIBRARY_PATH:=$(subst $(space),:,$(LD_LIBRARY_PATH))'."\n";
129 sashby 1.23
130 sashby 1.14 undef $fout;
131     }
132     }
133 williamc 1.2
134 sashby 1.15 sub BuildSetup
135     {
136     ###############################################################
137     # BuildSetup #
138     ###############################################################
139     # modified : Fri Aug 10 16:57:03 2001 / SFA #
140     # params : #
141     # : #
142     # : #
143     # : #
144     # function : Build targets. #
145     # : #
146     # : #
147     ###############################################################
148     my $self=shift;
149     my $THISDIR=shift;
150     my @Targets=@_;
151     my $DefaultBuildFile="";
152     my $Class="";
153    
154     # -- Create working directory
155     chdir $ENV{LOCALTOP};
156     AddDir::adddir($ENV{INTwork}."/".$THISDIR);
157    
158     my ($Class, $ClassDir, $bf)=$self->getclass($THISDIR);
159     $self->verbose("Class = $Class");
160     $self->verbose("ClassDir = $ClassDir");
161 williamc 1.13
162 sashby 1.15 if ( $bf->ignore() )
163     {
164     print "Nothing to be done - empty group\n";
165     exit;
166     }
167     shift;
168     $self->_generateexternals($ENV{LOCALTOP}."/".$ENV{INTwork}."/clientmakefile");
169    
170     # set up the workdir variable
171     $ENV{workdir}=$ENV{INTwork}."/".$ClassDir;
172     my $fullworkdir=$ENV{LOCALTOP}."/".$ENV{workdir};
173    
174     # set up projdeps variable
175     my $projectfile=$ENV{projconfigdir}."/External_Dependencies";
176     if ( -e $ENV{LOCALTOP}."/".$projectfile )
177     {
178 williamc 1.13 $ENV{projdeps}=$ENV{LOCALTOP}."/".$projectfile;
179 sashby 1.15 }
180     elsif ( -e $ENV{RELEASETOP}."/".$projectfile )
181     {
182 williamc 1.13 $ENV{projectfile}=$ENV{RELEASETOP}."/".$projectfile;
183 sashby 1.15 }
184     if ( $DefaultBuildFile eq "" )
185     {
186 williamc 1.13 # Map Relevant makefile classmakefile directory
187     my $classmakefile=$ENV{projconfigdir}."/".$Class."_makefile.mk";
188 sashby 1.15 if ( -e $ENV{LOCALTOP}."/".$classmakefile )
189     {
190     $ENV{classmakefile}=$ENV{LOCALTOP}."/".$classmakefile;
191     }
192     elsif ( -e $ENV{RELEASETOP}."/".$classmakefile )
193     {
194 williamc 1.13 $ENV{classmakefile}=$ENV{RELEASETOP}."/".$classmakefile;
195 sashby 1.15 }
196     else
197     {
198     print "\nUnable to locate $classmakefile\n";
199     print " Not in $ENV{LOCALTOP}\n";
200     print " Not in $ENV{RELEASETOP}\n";
201     exit 1;
202     }
203 williamc 1.13 $DefaultBuildFile=$ENV{classmakefile}; # TODO - only for override
204 sashby 1.15 }
205    
206     $ENV{ClassDir}=$ClassDir;
207     $ENV{Class}=$Class;
208     $ENV{DefaultBuildFile}=$DefaultBuildFile;
209    
210     chdir $fullworkdir || die "Unable to enter working directory $!";
211    
212     # Set up some other useful variables fo the Build
213     # list of directories available
214     opendir IDR, "$ENV{LOCALTOP}/$THISDIR";
215     @allfiles= grep !/^\.\.?$/, readdir IDR;
216     foreach $file ( @allfiles )
217     {
218     if ( -d "$ENV{LOCALTOP}/$THISDIR/$file" )
219     { # only add if its a directory
220     $ENV{SCRAM_AVAILDIRS}=$ENV{SCRAM_AVAILDIRS}." ".$file;
221     }
222     else
223     {
224     $ENV{SCRAM_AVAILFILES}=$ENV{SCRAM_AVAILFILES}." ".$file;
225     }
226     }
227     $targetnumber=$#Targets;
228    
229     foreach $word ( @Targets )
230     {
231     if ( $word=~/.*=.*/ )
232     { # if we have an assignment it cant be a target
233 williamc 1.13 $targetnumber--;
234 sashby 1.15 }
235     elsif ( $word=~/^-/ )
236     {
237 williamc 1.13 $targetnumber--;
238 sashby 1.15 }
239     else
240     {
241     $ENV{"MAKETARGET_".$word}=$word;
242     }
243 williamc 1.13 }
244 sashby 1.15
245     # If not specified default to the class name target
246     if ( $targetnumber == -1 )
247     {
248     push @Targets,$Class;
249 williamc 1.13 }
250 williamc 1.2
251 sashby 1.15 $ENV{DefaultMakefile}="$ENV{TOOL_HOME}/basics.mk";
252 williamc 1.2
253 sashby 1.15 $SCRAM_GROUPSDIR=$ENV{LOCALTOP}."/".$ENV{projconfigdir}."/groups.mk";
254     if ( -f $SCRAM_GROUPSDIR )
255     {
256 williamc 1.2 $ENV{SCRAM_GROUPSDIR}=$SCRAM_GROUPSDIR;
257 sashby 1.15 }
258    
259     # Do a datestamp check so that make will build files that have changed
260     # rather than just those which are older than their dependencies
261     # The main build here
262 sashby 1.20
263 sashby 1.15 $rv=system("gmake","--no-print-directory","-r","-k","-f","$ENV{DefaultMakefile}","-I$ENV{TOOL_HOME}",datestamp_config);
264    
265 sashby 1.21 # Be verbose:
266     $self->verbose(">> Going to use ".$ENV{DefaultMakefile}." as the default makefile");
267    
268 sashby 1.18 my $gmakejobsflag = "-j";
269 sashby 1.16 # Temporarily hard-code ncpu as 1:
270 sashby 1.19 my $ncpu = 1;
271 sashby 1.22
272 sashby 1.15 $rv=system("gmake","--no-print-directory","$gmakejobsflag","$ncpu","-r","-k","-f","$ENV{DefaultMakefile}","-I$ENV{TOOL_HOME}",datestamp, @Targets);
273 sashby 1.16
274 sashby 1.15 return $rv/256; # return the exit status of gmake
275     }
276 williamc 1.8
277 williamc 1.13 sub getclass {
278 williamc 1.2 my $self=shift;
279     my $dirname = shift;
280     my $Class="DEFAULT";
281     my $ClassDir="";
282 williamc 1.13
283     @DIRA=split /\//, $dirname;
284 williamc 1.12
285 williamc 1.13 $thispath=".";
286     # bootstrap from project buildfile if it exists
287     my $bf=BuildSystem::BuildFile->new($self->{toolbox});
288     $bf->CheckBuildFile($ENV{projconfigdir});
289 williamc 1.2
290 williamc 1.13 my @ClassPaths=split /:/, $bf->BlockClassPath();
291     foreach $BClassPath ( @ClassPaths ) {
292     next if ( $BClassPath eq "");
293     push @LoBCA, [ split /\//, $BClassPath ];
294     }
295 williamc 1.2 for ( $i=0; $i<=$#DIRA; $i++ ) {
296 williamc 1.12 $thispath=$thispath."/".$DIRA[$i];
297 williamc 1.13 if ( ($ClassName=$bf->CheckBuildFile($thispath)) ne "" ) {
298     $Class=$ClassName;
299 williamc 1.2 $ClassDir=$thispath;
300     }
301 williamc 1.13 # TODO --- Must test against position of last new BlockCaseA
302     # Need to reset array LoBCA to the New BlockPath
303     # - merge and replace options
304     #
305     else {
306     foreach $BlockClassA ( @LoBCA ) {
307     if ( $$BlockClassA[0]=~/^$DIRA[$i]\+/ ) {
308     $$BlockClassA[0]=~s/^$DIRA[$i]//;
309     }
310     if ( $$BlockClassA[0]=~/^\+/ ) {
311     ($Class=$$BlockClassA[0])=~s/^\+//;
312 williamc 1.2 $ClassDir=$thispath;
313 williamc 1.13 shift @$BlockClassA;
314     }
315     else {
316     @$BlockClassA=();
317     }
318     }
319 williamc 1.12 }
320 williamc 1.5 }
321 williamc 1.13 $ClassDir=~s/^\.\///;
322     return ( $Class, $ClassDir, $bf);
323 williamc 1.2 }