(file) Return to SetConfig_EnvVar CVS log (file) (dir) Up to [Pegasus] / pegasus

  1 konrad.r 1.1 #!/usr/bin/perl
  2 marek    1.4 #//%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 marek    1.4 #// 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 

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2