FreeCalypso > hg > tcs211-c139
comparison g23m/nds_generatemakefile.pl @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 #!perl -w | |
2 #------------------------------------------------------------------------------- | |
3 # Project : Nice Delivery System | |
4 # Module : nds_generate_makefile | |
5 #------------------------------------------------------------------------------- | |
6 # Copyright: 2003 Texas Instruments Deutschland GmbH | |
7 # 2004 Texas Instruments France SA | |
8 # All rights reserved. | |
9 # | |
10 # This file is confidential and a trade secret of Texas | |
11 # Instruments. | |
12 # The receipt of or possession of this file does not convey | |
13 # any rights to reproduce or disclose its contents or to | |
14 # manufacture, use, or sell anything it may describe, in | |
15 # whole, or in part, without the specific written consent of | |
16 # Texas Instruments Framce SA. | |
17 #------------------------------------------------------------------------------- | |
18 # Authors : jr Joachim Richter | |
19 # mo Martin Osieka | |
20 # ib Isabelle Biffi | |
21 #------------------------------------------------------------------------------- | |
22 # Versions: 2.0 ib | |
23 #------------------------------------------------------------------------------- | |
24 | |
25 | |
26 use strict; | |
27 use File::Copy; | |
28 use File::Find; | |
29 use File::Spec; | |
30 use Cwd; | |
31 use Getopt::Long qw(:config pass_through); | |
32 | |
33 | |
34 #------------------------------------------------------------------------------- | |
35 # Variables | |
36 #------------------------------------------------------------------------------- | |
37 | |
38 my $command; | |
39 | |
40 # makefile file name | |
41 my $makeFile; | |
42 | |
43 # do not only store the drive in $current_drive, but rather store the path | |
44 # to the current dir (necessary to work directly on V:\<view>\...) | |
45 my $current_drive = cwd; | |
46 $current_drive =~ s|[\\/][^\\/]+$||; | |
47 | |
48 # specifies whether output is being redirected (logged to a file) or not | |
49 my $outerr_redirected; | |
50 | |
51 # command line options | |
52 my $o_file; | |
53 my $o_logfile = "report.txt"; | |
54 my $o_shell = 0; | |
55 my $o_help = 0; | |
56 # my $o_dlvcfg = "dlv_cfg0"; | |
57 my $o_dlvcfg = ""; | |
58 my $dlv_cfg_path = "system\\busyb\\deliverydefs\\"; | |
59 my $dlv_cfg; | |
60 | |
61 # make pass-through options | |
62 my $make_opt; | |
63 | |
64 | |
65 #------------------------------------------------------------------------------- | |
66 # Main Program | |
67 #------------------------------------------------------------------------------- | |
68 | |
69 # parse command line, passing through all unknown options to make | |
70 parse_command_line(); | |
71 | |
72 # logging is enabled by default (unless $o_shell is set, done by option "-s") | |
73 if (!$o_shell) | |
74 { | |
75 # attempt to redirect STDOUT+STDERR | |
76 $outerr_redirected = redirect_output(); | |
77 } | |
78 else | |
79 { | |
80 # do not redirect output, it is being sent to shell | |
81 $outerr_redirected = 0; | |
82 } | |
83 | |
84 # ib | |
85 my $build_message = "\nStarting generate makefile for configuration " . $o_file . ". | |
86 REDIRECT_PLACEHOLDER | |
87 \n"; | |
88 | |
89 if ($outerr_redirected) | |
90 { | |
91 $build_message =~ s/REDIRECT_PLACEHOLDER/output is being logged to $o_logfile,/; | |
92 print CONSOLE_OUT $build_message; | |
93 } | |
94 else | |
95 { | |
96 $build_message =~ s/REDIRECT_PLACEHOLDER/output is not being logged!/; | |
97 print $build_message; | |
98 } | |
99 step__check_environment (1); | |
100 &step__update_busyb_makefile (2, "system/unbusy_g23m.ini"); | |
101 | |
102 # restore redirected STDOUT+STDERR, if necessary | |
103 restore_redirection() | |
104 if $outerr_redirected; | |
105 | |
106 | |
107 exit 0; | |
108 | |
109 | |
110 #------------------------------------------------------------------------------- | |
111 # SUBROUTINES | |
112 #------------------------------------------------------------------------------- | |
113 | |
114 | |
115 #------------------------------------------------------------------------------- | |
116 # parses the command line, sets global $o_* variables to all specified options, | |
117 # checks which options/parameters are passed through to make or ABC | |
118 #------------------------------------------------------------------------------- | |
119 sub parse_command_line | |
120 { | |
121 GetOptions ( | |
122 "file=s"=>\$o_file, | |
123 "log=s"=>\$o_logfile, | |
124 "shell"=>\$o_shell, | |
125 "dlv=s"=>\$o_dlvcfg, | |
126 "help|?" =>\$o_help); | |
127 | |
128 if ($o_help) | |
129 { | |
130 usage(); | |
131 exit 0; | |
132 } | |
133 | |
134 # determine make/BuSyB pass-through options from @ARGV | |
135 $make_opt = ""; | |
136 foreach (@ARGV) | |
137 { | |
138 # make/BuSyB pass-through option: all else | |
139 $make_opt .= " " . $_; | |
140 } | |
141 | |
142 # sanity checks: | |
143 # due to enabled 'pass_through' and 'permute' of GetOptions(), | |
144 # some busyb.pl options may end up in other option parameters instead | |
145 # e.g. if options which require a parameter are specified w/o any parameter: | |
146 # "... -m", or "... -m -l", ... | |
147 foreach ($o_file, $o_logfile) | |
148 { | |
149 # check all options which should take a parameter | |
150 # if they actually contain another option and no parameter | |
151 if (defined($_) and /^-/) | |
152 { | |
153 print "\nERROR: Option missing mandatory parameter!\n\n"; | |
154 usage(); | |
155 exit 1; | |
156 } | |
157 } | |
158 foreach ("-f", "-l") | |
159 { | |
160 # check if the pass-through options to make contain on of the busyb.pl | |
161 # options | |
162 if ($make_opt =~ /$_/i) | |
163 { | |
164 print "\nERROR: Option missing mandatory parameter!\n\n"; | |
165 usage(); | |
166 exit 1; | |
167 } | |
168 } | |
169 | |
170 if (!$o_file) | |
171 { | |
172 print "\nERROR: No input/configuration file specified with \"-f file\"!\n\n"; | |
173 usage(); | |
174 exit 1; | |
175 } | |
176 die "\nERROR: Input/configuration file \"" . $o_file . "\" not found, aborting" | |
177 unless -e $o_file; | |
178 # replace backslash with slash in filename | |
179 $o_file =~ s:\\:/:g; | |
180 | |
181 | |
182 if ($o_dlvcfg) | |
183 { | |
184 $dlv_cfg=$dlv_cfg_path.$o_dlvcfg.".xml"; | |
185 die "\nERROR: delivery configuration file \"" . $dlv_cfg . "\" not found, aborting" | |
186 unless -e $dlv_cfg; | |
187 # replace backslash with slash in filename | |
188 $dlv_cfg =~ s:\\:/:g; | |
189 } | |
190 } | |
191 | |
192 | |
193 | |
194 | |
195 | |
196 | |
197 | |
198 | |
199 #------------------------------------------------------------------------------- | |
200 # print short usage notes | |
201 #------------------------------------------------------------------------------- | |
202 sub usage | |
203 { | |
204 print "\nUSAGE: | |
205 perl xxx.pl -f XML-File [OPTIONS] | |
206 | |
207 Generate makefile for building Chipset software | |
208 Logging all output to report.txt by default. | |
209 | |
210 OPTIONS: | |
211 -l LOGFILE log to LOGFILE (default is report.txt) | |
212 -S output to current shell, no logging to report.txt | |
213 -dlv DLVCFG delivery configuration, dlv_cfg0 by default | |
214 | |
215 EXAMPLES: | |
216 perl busyb.pl -f system\\busyb\\productdefs\\sample.xml | |
217 perl busyb.pl -f system\\busyb\\productdefs\\sample.xml -dlv dlvcfg2 | |
218 "; | |
219 } | |
220 | |
221 | |
222 #------------------------------------------------------------------------------- | |
223 # print current step to STDOUT (usually redirected to report.txt) and | |
224 # additionally to CONSOLE_OUT | |
225 #------------------------------------------------------------------------------- | |
226 sub print_status | |
227 { | |
228 print "\n----------------------------------------------------------------"; | |
229 print "\n$_[0]\n"; | |
230 print "----------------------------------------------------------------\n\n"; | |
231 | |
232 print CONSOLE_OUT "$_[0]\n" | |
233 if $outerr_redirected; | |
234 } | |
235 | |
236 | |
237 | |
238 #------------------------------------------------------------------------------- | |
239 # Check/Initialize some necessary env. variables: | |
240 # - %PATH must contain gpf/bin, gpf/tools/bin, chipsetsw/system (in that order) | |
241 # - %PATH* variables must only contain slashes (no backslashes, semicolons) | |
242 #------------------------------------------------------------------------------- | |
243 sub init_environment | |
244 { | |
245 my $current_drive_winformat = $current_drive; | |
246 $current_drive_winformat =~ s:/:\\:g; | |
247 | |
248 # check if all necessary paths are in %PATH, add them if not (this removes | |
249 # the dependency on initvars.bat) | |
250 if (!($ENV{'PATH'} =~ m:[\\/]chipsetsw[\\/]system:)) | |
251 { | |
252 # add \chipsetsw\system to %PATH (should be third) | |
253 $ENV{'PATH'} = "$current_drive_winformat\\chipsetsw\\system;" . $ENV{'PATH'}; | |
254 print "%PATH : \"$current_drive_winformat\\chipsetsw\\system\" + %PATH\n"; | |
255 } | |
256 | |
257 if (!($ENV{'PATH'} =~ m:[\\/]gpf[\\/]tools[\\/]bin:)) | |
258 { | |
259 # add \gpf\tools\bin to %PATH (should be second) | |
260 $ENV{'PATH'} = "$current_drive_winformat\\gpf\\tools\\bin;" . $ENV{'PATH'}; | |
261 print "%PATH : \"$current_drive_winformat\\gpf\\tools\\bin\" + %PATH\n"; | |
262 } | |
263 | |
264 if (!($ENV{'PATH'} =~ m:[\\/]gpf[\\/]bin:)) | |
265 { | |
266 # add \gpf\bin to %PATH (should be first) | |
267 $ENV{'PATH'} = "$current_drive_winformat\\gpf\\bin;" . $ENV{'PATH'}; | |
268 print "%PATH : \"$current_drive_winformat\\gpf\\bin\" + %PATH\n"; | |
269 } | |
270 | |
271 # check correct setting of environment variables for TI compiler and linker | |
272 # PATH_CC_1_22e=C:\tools\TMS4701x_1.22e\NT | |
273 die "\nERROR: environment variable %PATH_CC_1_22e must be set!\n" | |
274 unless exists($ENV{'PATH_CC_1_22e'}); | |
275 $ENV{'PATH_CC_1_22e'} =~ s|\\|/|g; | |
276 $ENV{'PATH_CC_1_22e'} =~ s|;.*||; | |
277 print "%PATH_CC_1_22e : \"" . $ENV{'PATH_CC_1_22e'} . "\"\n"; | |
278 | |
279 | |
280 # PATH_LNK_1_9902=C:\tools\vislink_1.9902 | |
281 die "\nERROR: environment variable %PATH_LNK_1_9902 must be set!\n" | |
282 unless exists($ENV{'PATH_LNK_1_9902'}); | |
283 $ENV{'PATH_LNK_1_9902'} =~ s|\\|/|g; | |
284 $ENV{'PATH_LNK_1_9902'} =~ s|;.*||; | |
285 print "%PATH_LNK_1_9902 : \"" . $ENV{'PATH_LNK_1_9902'} . "\"\n"; | |
286 | |
287 | |
288 } # init_environment | |
289 | |
290 | |
291 #------------------------------------------------------------------------------- | |
292 # Check for gnumake availability, returns gnumake depending or die | |
293 #------------------------------------------------------------------------------- | |
294 sub check_gnumake_available | |
295 { | |
296 my ($rc) = int (system("gnumake -ver > NUL 2>&1") / 256); | |
297 if(!$rc == 0){ | |
298 die "\nERROR: No make gnumake tool found, aborting"; | |
299 } | |
300 } | |
301 | |
302 #------------------------------------------------------------------------------- | |
303 # Check if Java is installed (in the path), return version string of Java. | |
304 #------------------------------------------------------------------------------- | |
305 sub determine_java_version | |
306 { | |
307 my $java_ver = `java -version 2>&1`; | |
308 if ($? == 0) | |
309 { | |
310 # only keep the first line of java version string and remove "java", if present | |
311 $java_ver =~ s/\n.*$//s; | |
312 $java_ver =~ s/\s*java\s*//; | |
313 print "Java : " . $java_ver . "\n"; | |
314 } | |
315 else | |
316 { | |
317 die "\nERROR: Java not found (not installed or not in the path), aborting"; | |
318 } | |
319 } | |
320 | |
321 | |
322 sub step__check_environment | |
323 { | |
324 print_status ($_[0] . ". Checking environment"); | |
325 | |
326 # create the makefile filename | |
327 # param = system\productdefs\sample.xml | |
328 # o_file = system/productdefs/sample.xml | |
329 # print_status ($_[0] . " 1 " .$makeFile); | |
330 # print_status ($_[0] . " 2 " .$o_file); | |
331 # print_status ($_[2] . " 3 " .$o_dlvcfg); | |
332 | |
333 $makeFile = (File::Spec->splitpath($o_file))[2]; | |
334 $makeFile =~ s/(\.xml)$//; | |
335 if ($o_dlvcfg) | |
336 { | |
337 $makeFile =$makeFile."_".$o_dlvcfg; | |
338 } | |
339 $makeFile =$makeFile.".mak"; | |
340 | |
341 # initialize necessary env. variables (%PATH, %C_DIR) | |
342 init_environment(); | |
343 check_gnumake_available(); | |
344 determine_java_version(); | |
345 | |
346 } | |
347 | |
348 | |
349 #------------------------------------------------------------------------------- | |
350 # update BuSyB makefile, if necessary; takes an additional second parameter | |
351 # to specify the BuSyB .ini file | |
352 #------------------------------------------------------------------------------- | |
353 sub step__update_busyb_makefile | |
354 { | |
355 | |
356 my $temp_xml = "dlv_mak.xml"; | |
357 open( MSL_FD,">$temp_xml") | |
358 or die "ERROR: Can't open file \"$temp_xml\" ($!), aborting"; | |
359 | |
360 print MSL_FD "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; | |
361 print MSL_FD "<configDef name=\"dlv_mak\" description=\"\" reference=\"\">\n"; | |
362 print MSL_FD "<property include=\"$o_file\"/>\n"; | |
363 | |
364 if ($o_dlvcfg) | |
365 { | |
366 print MSL_FD "<property include=\"$dlv_cfg\"/>\n"; | |
367 } | |
368 print MSL_FD "</configDef>\n"; | |
369 | |
370 close( MSL_FD) | |
371 or die "ERROR: Can't close file \"$temp_xml\" ($!), aborting"; | |
372 | |
373 use constant UBB_MAKETOOL => "gnumake "; | |
374 use constant UBB_UPDATE_MAKE => "-f system/nds_update_makefile.mak "; | |
375 | |
376 print_status ($_[0] . ". Generate BuSyB makefile ($makeFile)"); | |
377 # $command = UBB_MAKETOOL.UBB_UPDATE_MAKE." MFILE=$makeFile XMLFILE=$o_file"; | |
378 $command = UBB_MAKETOOL.UBB_UPDATE_MAKE." MFILE=$makeFile XMLFILE=$temp_xml"; | |
379 print "$command\n\n"; | |
380 | |
381 system($command) == 0 | |
382 or die "ERROR: Can't create makefile \"$makeFile\" ($!), aborting"; | |
383 print "\n"; | |
384 | |
385 $command = "rm $temp_xml"; | |
386 print "$command\n\n"; | |
387 system($command) == 0 | |
388 or die "ERROR: Can't remove temporary file \"$temp_xml\" ($!), aborting"; | |
389 | |
390 } | |
391 | |
392 | |
393 #------------------------------------------------------------------------------- | |
394 # redirect STDOUT+STDERR to $o_logfile, return 1 if redirection successful or | |
395 # 0 if redirection failed | |
396 #------------------------------------------------------------------------------- | |
397 sub redirect_output | |
398 { | |
399 my $redirected = 1; | |
400 | |
401 open (CONSOLE_OUT, ">&STDOUT"); | |
402 open (CONSOLE_ERR, ">&STDERR"); | |
403 | |
404 open (STDOUT, '>', $o_logfile) | |
405 or $redirected = 0; | |
406 open (STDERR, ">&STDOUT") | |
407 or $redirected = 0; | |
408 | |
409 if ($redirected) | |
410 { | |
411 # make output unbuffered | |
412 select (STDERR); $| = 1; | |
413 select (STDOUT); $| = 1; | |
414 | |
415 # install signal handler function for die() | |
416 $SIG{__DIE__} = \&die_handler | |
417 or print CONSOLE_ERR "WARNING: Could not install die() signal handler, | |
418 console output may be corrupted when exiting with an error!\n"; | |
419 } | |
420 else | |
421 { | |
422 # redirection failed: use old STDOUT+STDERR | |
423 restore_redirection(); | |
424 print "WARNING: Could not redirect STDOUT+STDERR to " . $o_logfile . ", not logging output!\n"; | |
425 } | |
426 return $redirected; | |
427 } | |
428 | |
429 | |
430 #------------------------------------------------------------------------------- | |
431 # close logging to $o_logfile and restore old STDOUT+STDERR | |
432 # (pointing to console) | |
433 #------------------------------------------------------------------------------- | |
434 sub restore_redirection | |
435 { | |
436 # restore redirected STDOUT+STDERR | |
437 close (STDOUT); | |
438 close (STDERR); | |
439 open (STDOUT, ">&CONSOLE_OUT"); | |
440 open (STDERR, ">&CONSOLE_ERR"); | |
441 } | |
442 | |
443 | |
444 #------------------------------------------------------------------------------- | |
445 # print die() error message, to also log it to $o_logfile and then restore | |
446 # the STDOUT+STDERR redirection | |
447 #------------------------------------------------------------------------------- | |
448 sub die_handler | |
449 { | |
450 print STDERR $_[0]; | |
451 restore_redirection(); | |
452 } |