1 konrad.r 1.1 #!/usr/bin/perl
|
2 karl 1.3 //%2006////////////////////////////////////////////////////////////////////////
3 //
4 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
5 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
6 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
7 // IBM Corp.; EMC Corporation, The Open Group.
8 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
9 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
10 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
11 // EMC Corporation; VERITAS Software Corporation; The Open Group.
12 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
13 // EMC Corporation; Symantec Corporation; The Open Group.
14 //
15 // Permission is hereby granted, free of charge, to any person obtaining a copy
16 // of this software and associated documentation files (the "Software"), to
17 // deal in the Software without restriction, including without limitation the
18 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
19 // sell copies of the Software, and to permit persons to whom the Software is
20 // furnished to do so, subject to the following conditions:
21 //
22 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
23 karl 1.3 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
24 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
25 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
26 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
27 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31 //================================================================================
|
32 konrad.r 1.1 use strict;
33 #use warnings;
34 my $HELP_FILE = "SetConfig_EnvVar.help";
35 my $STATUS_FILE = "env_var.status";
36 my $PC_FILE = "pegasus.pc";
37
38 my %component_hash = ();
39 my %component_value=();
40 my %define_type_hash=();
41 my %depend_on_hash=();
42 my %enable_component_hash=();
43 my %short_descr_hash=();
44 my %long_descr_hash=();
45 my %argument_list=();
46
47 # Load up the info
48 &parse_help_file();
49 # Check for any arguments
50 &parse_arguments();
51 # Check the OS?
52 &determine_platform();
53 konrad.r 1.1 # Check the source path
54 &determine_source_path();
55 # Check arguments (if they have a path)
56 &check_arguments();
57 # Start asking the user the questions.
58 &ask_user();
59 # Print out all the options.
60 &write_out_status($STATUS_FILE);
61 # Create the .pc file for PKG-CONFIG
62 &write_out_pkg($PC_FILE);
63 # Write out extra info.
64 &extra_info();
65
66 sub determine_source_path()
67 {
68 my $source_dir = $ENV{PWD};
69 if (-r "$source_dir/$0")
70 {
71 $component_value{"PEGASUS_ROOT"} = $source_dir;
72 }
73
74 konrad.r 1.1 }
75 sub which () {
76
77 my $execname = shift;
78 for (map {"$_/$execname"} split(/:/, $ENV{PATH}))
79 {
80 return $_ if (-e and -x);
81 }
82 }
83 sub determine_platform() {
84
85 my $uname="";
86 my $platform = "";
87 open UNAME,"uname -ms|" or die$!;
88 $uname = <UNAME>;
89 close UNAME;
90
91 #'uname -ms' for IA-64: "HP-UX ia64"
92 #'uname -ms' for PA-RISC: "HP-UX 9000/871"
93 #'uname -ms' for Sun Solaris: "SunOS sun4u"
94 #'uname -ms' for PPC64 Linux: "Linux ppc64"
95 konrad.r 1.1 #'uname -ms' for I64 Linux: "Linux ia64"
96 #'iname -ms' for PPC Linux: "Linux ppc"
97 #'uname -ms' for AMD64 Linux: "Linux x86_64"
98
99 if ($uname =~ /SunOS/)
100 {
101 $platform = "SOLARIS_SPARC_CC";
102 if (&which("gcc") =~ /gcc/)
103 {
104 $platform = "SOLARIS_SPARC_GNU";
105 }
106 }
107 if ($uname =~ /Linux/)
108 {
109 # Default value
110 $platform = "LINUX_IX86_GNU";
111 if ($uname =~ /ppc/i)
112 {
113 $platform = "LINUX_PPC_GNU";
114 }
115
116 konrad.r 1.1 if ($uname =~ /ia64/i)
117 {
118 $platform = "LINUX_IA64_GNU";
119 }
120 }
121 if ($uname =~ /AIX/)
122 {
123 $platform ="AIX_RS_IBMCXX";
124 }
125 if ($uname =~ /HP-UX/)
126 {
127 $platform = "HPUX_ACC";
128 if ($uname =~ /ia64/i)
129 {
130 $platform = "HPUX_IA64_ACC";
131 }
132 if ($uname =~ /9000/)
133 {
134 $platform = "HPUX_PARISC_ACC";
135 }
136 }
137 konrad.r 1.1 $component_value{"PEGASUS_PLATFORM"} = $platform;
138 }
139
140 sub extra_info() {
141
142 print "\n\n";
143 print "=================================================\n";
|
144 konrad.r 1.2 print "All your build options have been saved in ",$STATUS_FILE,"\n";
145 print "If you need to modify anything, please do so now.\n";
146 print "\nNOTE:\n";
|
147 konrad.r 1.1 print "The PATH enviroment variables needs to be modified\n";
148 print "to have",$component_value{"PEGASUS_HOME"},"/bin\n";
149 print "if you wish to run the unit tests.\n";
150 print "\n";
151 print "You might also need to set this enviroment variable\n";
152 print "PEGASUS_ROOT=",$component_value{"PEGASUS_ROOT"},"\n";
|
153 konrad.r 1.2 print "\n\nLastly, to compile OpenPegasus, type make\n";
|
154 konrad.r 1.1 print "=================================================\n";
155
156 }
157 sub write_out_pkg() {
158
159 }
160 sub write_out_status() {
161
162 my $output = shift;
163 my $c="";
164 open OUTPUT, ">$output" or die $!;
165
166 foreach $c (sort keys(%component_value))
167 {
168 print OUTPUT ("# ", $short_descr_hash{$c},"\n");
|
169 konrad.r 1.2 if ($component_value{$c} eq "No")
170 {
171 print OUTPUT ("# ",$c,"=",$component_value{$c},"\n");
172 }
173 else
174 {
175 print OUTPUT ($c,"=",$component_value{$c},"\n");
176 }
|
177 konrad.r 1.1 }
178 close OUTPUT;
179
180 }
181 sub ask_user() {
182
183 my $c="";
184 my $d="";
|
185 konrad.r 1.2 my $component_that_has_depend="";
|
186 konrad.r 1.1 my $loop_question=0;
|
187 konrad.r 1.2 my $pass=0;
188 my $skip=0;
189 my $search_for_dependants=0;
190
191 foreach $pass (0..1) {
192 if ($pass == 0) {
193 print "=================================================\n";
194 print "All your build options will be saved in ",$STATUS_FILE," file.\n";
195 print "If you need to modify anything, you can do it after this program finishes..\n";
196 print "=================================================\n";
197 }
198 foreach $c (sort keys(%component_hash))
199 {
200
201 # check in the $argument_list to see if this option
202 # has been passed in. But do it only on the first
203 # pass
204 if ($pass == 0) {
205 foreach $d (sort keys(%argument_list))
206 {
207 if ($d eq $enable_component_hash{$c})
208 konrad.r 1.2 {
209 print $c," is set\n";
210 $component_value{$c}="Yes";
211 next;
212 }
213 }
214 }
215 $skip = 0;
216 # Does this build option have a dependency?
217 if (!$depend_on_hash{$c} eq "" )
218 {
219 # Yes. Has the dependency been set?
220 if ($component_value{$depend_on_hash{$c}} eq "")
|
221 konrad.r 1.1 {
|
222 konrad.r 1.2 # It has not been set. Skip this pass.
223 #print "Skip, this build option - ",$c," is dependent (",$depend_on_hash{$c},")\n";
224 $skip =1;
|
225 konrad.r 1.1 }
226 }
|
227 konrad.r 1.2 # if this is the second pass, ignore the flag options.
228 if ($pass != 0)
229 {
230 if ($define_type_hash{$c} =~ /flag/)
231 {
232 $skip =1;
233 }
234 }
235 if (($component_value{$c} eq "") && ($skip == 0)) {
236 # Ask the user.
237 print "\n--------------------\n";
238 print $long_descr_hash{$c},"\n";
239 $loop_question=1;
240 $search_for_dependants=0;
241 if ($define_type_hash{$c} =~ /boolean/)
242 {
243 do
244 {
245 print $c," [Y/n]: ";
246 $_ = <STDIN>;
247 if (/^y/i)
248 konrad.r 1.2 {
249 $component_value{$c}="Yes";
250 # There are build options that are 'disable.' Meaning that 'yes'
251 # sets all of the dependents to 'Yes' as well.
252 $loop_question=0;
253 if ($c =~ /PEGASUS_DISABLE/i)
254 {
255 $search_for_dependants=1;
256 }
257 }
258 if (/^n/i)
259 {
260 # Maybe ask the user again?
261 $loop_question=0;
262 $component_value{$c}="No";
263 # If the answer is No and it is a disable option, don't search
264 # the dependatns. Why? B/c the user might want to disable some
265 # more fine-grained options.
266 if ($c =~ /PEGASUS_DISABLE/i)
267 {
268 $search_for_dependants=0;
269 konrad.r 1.2 } else
270 {
271 $search_for_dependants=1;
272 }
273 }
274 if ($search_for_dependants==1) {
275 #print "Search for dependants of ",$c,"\n";
276 # Traverse through all the components to invalidate (set to No)
277 # the dependants.
278 foreach $component_that_has_depend (keys(%depend_on_hash))
279 {
280 # Filter out all of those build options that do not have any dependents.
281 if (!$depend_on_hash{$component_that_has_depend} eq "")
282 {
283 #print " ",$depend_on_hash{$component_that_has_depend}," ? ",$c,"\n";
284 # Does the dependant build option equal to the we are searching for?
285 if ($depend_on_hash{$component_that_has_depend} eq $c) {
286 #print "Found: ",$component_that_has_depend," depends on ",$c,"\n"; }
287 $component_value{$component_that_has_depend}="No";
288 }
289 }
290 konrad.r 1.2 }
291 }
292 if ($loop_question==1)
293 {
294 print "Please entry Y or N.\n";
295 }
|
296 konrad.r 1.1 } while ($loop_question==1);
297
|
298 konrad.r 1.2 } # if type is boolean
299
300 if ($define_type_hash{$c} =~ /flag/)
301 {
302 print $c,"[]: ";
303 $_ = <STDIN>;
304 chomp($_);
305 $component_value{$c}=$_;
306 }
307 if ($define_type_hash{$c} =~ /path/)
308 {
309 do
310 {
311 print $c, "[/usr/include/]: ";
312 $_ = <STDIN>;
313 chomp($_);
314 # Is the directory readable?
315 if (-r $_)
316 {
317 $loop_question=0;
318 $component_value{$c}=$_;
319 konrad.r 1.2 }
320 else
321 {
322 print "Path is not accessible. Please enter again.\n";
|
323 konrad.r 1.1 }
324 } while ($loop_question==1);
|
325 konrad.r 1.2
326 }
327 } # componet_value eq "";
328 }
329 }
|
330 konrad.r 1.1 }
|
331 konrad.r 1.2
|
332 konrad.r 1.1 sub check_arguments() {
|
333 konrad.r 1.2
|
334 konrad.r 1.1 my $c="";
335 foreach $c (sort keys(%argument_list))
336 {
337 if ($argument_list{$c} eq "") {
338 #print $c,"is not a PATH\n";
339 }
340 else
341 {
342 # Check the path
343 if (!(-r $argument_list{$c}))
344 {
345 print $c,"=",$argument_list{$c}," path cannot be accessed.\n"
346 }
347 }
348 }
349 }
350
351 sub print_help() {
352
353 my $c="";
354
355 konrad.r 1.1 print "Usage: ",$0," [OPTION]...\n";
356 print "\nArguments:\n";
357
358 foreach $c (sort keys(%component_hash)) {
359 print " ",$enable_component_hash{$c};
|
360 konrad.r 1.2 if ($define_type_hash{$c} =~ /path/i)
|
361 konrad.r 1.1 {
362 print "=<directory>";
363 }
|
364 konrad.r 1.2 if ($define_type_hash{$c} =~ /flag/i)
365 {
366 print "=<flag>";
367 }
|
368 konrad.r 1.1 print "\t\t";
369 print $short_descr_hash{$c},"\n"
370 }
371 }
372
373 sub parse_arguments {
374
375 my $argnum = 0;
376 my @temp = ();
377 foreach $argnum (0..$#ARGV) {
378
|
379 konrad.r 1.2 if (lc($ARGV[$argnum]) =~ /--help/i) {
|
380 konrad.r 1.1 &print_help();
381 exit (0);
382 }
383 if ($ARGV[$argnum] =~ /--/) {
384 # Two types:
385 # --<text>=<path>
386 # --text
387 # We need to extract the <text> and <path> to
388 # argument_list with <text> as key and
389 # <path> as value.
390 @temp = split(/=/, $ARGV[$argnum]);
391 $argument_list{$temp[0]}=$temp[1];
392 }
393 }
394
395 }
396 sub parse_help_file {
397
398 my $component = "";
399 my $token = "";
400 my @tokens = {};
401 konrad.r 1.1 my $state = 1;
402 open HELP_FILE, "$HELP_FILE" or die$!;
403
404 while (<HELP_FILE>) {
405 # Find component.
406 if (/[\d\w_]+[\s]?{/) {
407 s/[\s{]*//g;
408 $component_hash{$_}=$_;
409 $component=$_;
410 $depend_on_hash{$component} = "";
411 $long_descr_hash{$component} = "";
412 $state = 1;
413 }
414 if (/,/ || /}/) {
415 #remove the offending }
416 s/}//;
417 #remove any spaces in front of the string
418 s/\s//;
419 #get the tokens seperated by ,
420 @tokens=split (/,/,$_);
421 foreach $token (@tokens) {
422 konrad.r 1.1 # print "[",$state," ",$token, "]";
423
424 if ($state == 1) {
425 #<depend or (Boolean or Path)
|
426 konrad.r 1.2 #new option: flag
|
427 konrad.r 1.1 # check for boolean or Path
|
428 konrad.r 1.2 if (lc($token) =~ /boolean/ || /path/i || /flag/i){
|
429 konrad.r 1.1 #print "(",$token,")";
430 $define_type_hash{$component}=lc($token);
431 $state = 3;
432 }
433 else {
434 # check for "OPENSSL_HOME:<component>
435 if ($depend_on_hash{$component} eq ""){
436 $depend_on_hash{$component}=$token;
437 #print "(",$token,")";
438 }
439 }
440 }
441
442 elsif ($state == 3) { #--enable-<component>
443
444 if ($token =~ /--/) {
445 $enable_component_hash{$component}=$token;
446 $state =4;
447 }
448 }
449 elsif ($state == 4) {#short_desc
450 konrad.r 1.1
451 if (!($token =~ /\n/)) {
452 $short_descr_hash{$component}=$token;
453 $state=5;
454 }
455 }
456 elsif ($state == 5) {#long descr
457
458 $long_descr_hash{$component}=$long_descr_hash{$component}." ".$token;
459 }
460 } # foreach token
461
462 } #if /,/ or /}/
463 }
464 close (HELP_FILE);
465 }
|
466 konrad.r 1.2
|