source: rtems/tools/update/ampolish @ 352288b

4.104.114.84.95
Last change on this file since 352288b was ff11b014, checked in by Joel Sherrill <joel.sherrill@…>, on 11/10/00 at 14:26:48

2000-11-10 Ralf Corsepius <corsepiu@…>

  • ampolish: Generate ACLOCAL_AMFLAGS = -I .../aclocal.
  • Property mode set to 100755
File size: 10.5 KB
Line 
1#!/usr/bin/perl
2
3package main ;
4
5use strict ;
6
7#
8# Perl script to beautify and enhance RTEMS automake Makefile.ams
9#
10# Reads from stdin and writes to stdout
11#
12# usage:
13# <path-to>/ampolish <Makefile.am >Makefile.am~
14# mv Makefile.am~ Makefile.am
15#
16
17my @vars ;
18my @conditions = ( "" ) ;
19my @buffer = ();
20my %var_ ;
21
22define_variable( "\$(AUTOMAKE_OPTIONS)", ( "foreign",  "1.4" ) );
23define_variable( "\$(VPATH)", ( "\@srcdir\@" ) );
24
25# find relative up-path to configure.in
26my $rtems_cfg = find_file(".","configure.in");
27
28# find relative up-path from configure.in to VERSION
29my $rtems_top = find_file("$rtems_cfg","VERSION");
30
31if ( "$rtems_top" eq "." ) { $rtems_top = "" ; }
32else { $rtems_top .= "/" ; } 
33
34{
35# PASS1:
36# read input file and concatenate multiple lines into single lines.
37
38  my @ibuf = () ;
39
40  while( <STDIN> )
41  { # consume header
42    last if ( /^[^#].*$/ ) ;
43    push @ibuf, "$_" ;
44  }
45
46  push @ibuf, "§header\n" ;
47
48  do
49  {
50    if ( /^(#.*)$/o )
51    { # preserve comments
52        push @ibuf, "$_" ;
53    }
54    elsif ( /^(\t.*)\\[\s]*$/o )
55      { # multilines for scripts
56        my $line = "$1§" ;
57        while( <STDIN> )
58        {
59          if ( /^(.*)\\[\s]*$/o )
60          {
61            $line .= "$1§" ;
62          }
63          else
64          {
65            $line .= "$_" ;
66            push @ibuf, $line ;
67            last ;
68          }
69        }
70      }
71    elsif ( /^(.*)\\[\s]*$/o )
72      { # multilines
73        my $line = "$1" ;
74        while( <STDIN> )
75        {
76          if ( /^(.*)\\[\s]*$/o )
77          {
78            $line .= "$1" ;
79          }
80          else
81          {
82            $line .= "$_" ;
83            $line =~ s%[\s]+% %g ;
84            push @ibuf, "$line\n" ;
85            last ;
86          }
87        }
88      }
89    else
90      {
91        push @ibuf, "$_" ;
92      }
93  } while ( <STDIN> ) ;
94  @buffer = @ibuf ;
95}
96
97{
98# PASS2:
99# fix obsolete constructs
100  my @ibuf = () ;
101
102  foreach ( @buffer )
103  {
104    if ( /^(TMP|PRE)INSTALL_FILES[\s]*=(.*)$/o )
105    { # force "+="
106      push @ibuf, "$1INSTALL_FILES +=$2\n" ;
107    }
108    elsif ( /^(VPATH|EXTRA_DIST)[\s]*\+=(.*)$/o )
109    { # force "="
110      push @ibuf, "$1 = $2\n" ;
111    }
112    elsif ( /^[\s]*ACLOCAL[\s]*=[\s]*\@ACLOCAL\@.*$/o )
113    { # remove the line
114    }
115    elsif ( /^[\s]*(ACLOCAL_AMFLAGS)[\s\t]*[\+]*=[\s]*(.*)[\s]*$/o )
116    { # remove the line
117    }
118    elsif ( /^[\s]*(AM_CFLAGS)[\s\t]*[\+]*=[\s]*\$\(CFLAGS_OS_V\)[\s]*$/o )
119    { # remove the line
120    }
121    elsif ( /^[\s]*debug-am:.*$/o )
122    { # remove the line
123    }
124    elsif ( /^[\s]*all(\-am):(.*)$/o )
125    { # replace the line
126      push @ibuf, "all-local:$2\n" ;
127    }
128    elsif ( /^[\s]*profile-am:.*$/o )
129    { # remove the line
130    }
131    elsif ( /^[\s]*include[\s\t]*\$\(RTEMS_ROOT\)\/make\/lib.cfg[\s]*$/o )
132    {
133      push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/lib.am\n" ;
134    }
135    elsif ( /^[\s]*include[\s\t]*.*compile.am[\s]*$/o )
136    {
137      # remove the line
138    }
139    elsif ( /^(.*[^\s])[\s]*$/o )
140    { # remove trailing spaces
141      push @ibuf, "$1\n" ;
142    }
143    else
144    {
145      push @ibuf, "$_" ;
146    }
147  }
148  @buffer = @ibuf ;
149}
150
151{
152  my @ibuf = () ;
153  foreach ( @buffer )
154  {
155    if ( /^#(.*)$/o )
156    {
157      push @ibuf, "#$1\n" ;
158    }
159    elsif ( /^[\s]*if[\s\t]+([a-zA-Z0-9_]+)[\s\t]*$/o )
160    {
161      push @conditions, "\@" . $1 . "_TRUE\@" ;
162      push @ibuf, "if $1\n" ;
163    }
164    elsif ( /^[\s]*else[\s\t]*$/o )
165    {
166      @conditions[$#conditions] =~ s/_TRUE\@$/_FALSE\@/;
167      push @ibuf, "else\n" ;
168    }
169    elsif ( /^[\s]*endif[\s\t]*$/o )
170    {
171      pop @conditions ;
172      push @ibuf, "endif\n" ;
173    }
174    elsif ( /^§.*$/o )
175    {
176      push @ibuf, "$_" ;
177    }
178    elsif ( /^[\s]*(VPATH)[\s\t]*([\+]*)=[\s]*(.*)[\s]*$/o )
179    {
180      my $lh = "\$($1)" ;
181      my @rh = split( /:/,"$3");
182      if ( $#conditions  > 0 )
183      {
184        print STDERR "WARNING: $1 must not be set inside of conditionals!\n"
185      }
186      define_variable( "$lh", @rh );
187
188    }
189    elsif ( /^[\s]*(AUTOMAKE_OPTIONS)[\s\t]*([\+]*)=[\s]*(.*)$/o )
190    {
191      my $lh = "\$($1)" ;
192      my @rh = &split_vars("$3");
193
194      if ( $#conditions > 0 )
195      {
196        print STDERR "WARNING: $1 must not be set inside of conditionals!\n"
197      }
198
199      define_variable( "$lh", @rh );
200    }
201    elsif ( /^[\s]*([a-zA-Z0-9_]+)[\s\t]*([\+]*)=[\s]*(.*)$/o )
202    {
203      my $lh = join ('',@conditions) . "\$($1)" ;
204      my @rh = &split_vars("$3");
205      my $seen = variable_seen( "$lh" ) ;
206
207      if ( $#conditions > 0 )
208      {
209        define_variable( "\$($1)", () );
210      }
211
212      define_variable( "$lh", @rh );
213
214      if ( not $seen )
215      {
216        push @ibuf, "§$2var_$lh\n" ;
217      }
218    }
219    elsif ( /^[\s]*include[\s\t]*\$\(top_srcdir\)[\.\/]*automake\/(.*)\.am$/o )
220    {
221      if ( "$1" eq "lib" )
222      {
223        push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/compile.am\n" ;
224        push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/$1.am\n" ;
225      }
226      elsif ( "$1" eq "local" )
227      {
228        $main::seen_local = 1 ;
229      }
230      elsif ( "$1" eq "host" )
231      {
232        $main::seen_host = 1 ;
233      }
234    }
235    elsif ( /^[\s]*include[\s\t]*\$\(RTEMS_ROOT\)\/make\/(.*)\.cfg$/o )
236    {
237      if ( "$1" eq "leaf" )
238      {
239        push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/compile.am\n" ;
240        push @ibuf, "include \$(RTEMS_ROOT)/make/$1.cfg\n" ;
241      }
242      else
243      {
244        push @ibuf, "include \$(RTEMS_ROOT)/make/$1.cfg\n" ;
245      }
246    }
247    elsif ( /^[\s]*include[\s\t]*(.*)$/o )
248    {
249      push @ibuf, "include $1\n" ;
250    }
251    elsif ( /^\t(.*)$/o )
252    {
253      push @ibuf, "\t$1\n" ;
254    }
255    elsif ( /^(.*)\:(.*)$/o )
256    {
257      push @ibuf, "$1:$2\n" ;
258    }
259    elsif ( /^[\s]*$/o )
260    {
261      push @ibuf, "\n" ;
262    }
263    else
264    {
265      die "ERROR: Don't know how to handle <$_>" ;
266    }
267  } # for
268  @buffer = @ibuf ;
269} # while
270
271die "Conditional stack corrupted" if ( $#conditions != 0 );
272
273foreach( @vars )
274{
275  purge( \@{$var_{"$_"}} );
276}
277
278# print STDERR "<tmp>\n", @buffer, "</tmp>\n" ;
279
280
281{
282  my @ibuf = () ;
283  foreach( @buffer )
284  {
285    if ( /^#.*$/o )
286    {
287      push @ibuf, "$_" ;
288    }
289    elsif( /^§header$/o )
290    {
291      my $l = $var_{"\$(AUTOMAKE_OPTIONS)"} ;
292      push @ibuf, "\nAUTOMAKE_OPTIONS = @{$l}\n" ;
293      if ( "$rtems_cfg" eq "." )
294      {
295        push @ibuf, "ACLOCAL_AMFLAGS = -I ${rtems_top}aclocal\n" ;
296      }
297      if ( defined( @{$var_{"\$(VPATH)"}} ) )
298      {
299        if ( $#{$var_{"\$(VPATH)"}} > 0 )
300        {
301          my $l = join (':',@{$var_{"\$(VPATH)"}}) ;
302          push @ibuf, "\nVPATH = $l\n" ;
303        }
304      }
305      push @ibuf, "\n" ;
306    }
307    elsif ( /^§(\+|)var_(.*)\$\((.*)\)$/o )
308    {
309      print_var(\@ibuf, "$3 $1=", $var_{"$2\$($3)"}) ;
310    }
311    elsif ( /^\t.*$/o )
312    {
313      &print_script(\@ibuf, "$_");
314    }
315    elsif ( /^[\s]*if[\s]+([a-zA-Z0-9_]+)[\s\t]*$/o )
316    {
317      push @conditions, "\@$1_TRUE\@" ;
318      push @ibuf, "if $1\n" ;
319    }
320    elsif ( /^[\s]*else[\s]*$/o )
321    {
322      @conditions[$#conditions] =~ s/_TRUE\@$/_FALSE\@/;
323      push @ibuf, "else\n" ;
324    }
325    elsif ( /^[\s]*endif[\s]*$/o )
326    {
327      pop @conditions ;
328      push @ibuf, "endif\n" ;
329    }
330    else
331    {
332      print_line(\@ibuf,$_);
333    }
334  }
335
336  if ( variable_seen("\$(SUBDIRS)") )
337  {
338    push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/subdirs.am\n" ;
339  }
340
341  if ( defined( $main::seen_host ) )
342  {
343    push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/host.am\n" ;
344  }
345  else
346  {
347    push @ibuf, "include \$(top_srcdir)/${rtems_top}automake/local.am\n" ;
348  }
349
350  @buffer = @ibuf ;
351}
352
353#print STDERR "<tmp>\n", @buffer, "</tmp>\n" ;
354
355{ ## pretty print
356  my $out = join ('',@buffer) ;
357  $out =~ s/\s\#\n(\#\n)+/\n/g ;
358  $out =~ s/\n\n\#\n\n/\n/g ;
359  $out =~ s/\n\n[\n]*/\n\n/g ;
360  print $out ;
361}
362
363exit 0;
364
365# find a relative up-path to a file $file, starting at directory $pre
366sub find_file($$)
367{
368  my $pre = $_[0] ;
369  my $file= $_[1] ;
370
371  my $top = "." ;
372  if (not "$pre") { $pre = "." ; }
373
374  for ( my $str = "$pre" . "/" . "$top" ;
375    ( -d "$str" ) ;
376    $str = "$pre" . "/" . "$top" )
377  {
378    if ( -f "${str}/${file}" ) 
379    {
380      return $top ;
381    }
382    if ( "$top" eq "." )
383    {
384      $top = ".." ;
385    }
386    else
387    {
388      $top .= "/.." ;
389    }
390  } ;
391  die "Can't find file ${file}\n" ;
392}
393
394sub variable_seen($)
395{
396  my $label = "$_[0]" ;
397  my $res = defined $var_{"$label"};
398#print STDERR "SEEN: $label ->$res<\n" ;
399  return $res ;
400}
401
402sub define_variable($$)
403{
404  my ($label,@value) = @_ ;
405
406  if ( not variable_seen("$label") )
407  {
408#print STDERR "DEFINING: $label\n" ;
409    push @vars, "$label" ;
410  }
411
412  foreach my $i ( @{value} )
413  {
414    push @{$var_{"$label"}}, $i ;
415  }
416}
417
418# Strip off duplicate entries from a list
419sub purge($)
420{
421  my $list = $_[0] ; # Reference to list !
422  my (@tmp) = () ;
423
424  foreach my $l ( @{$list} )
425  {
426    my $i = 1 ;
427    foreach my $t (@tmp)
428    {
429      if ( $t eq $l )
430      {
431        $i = 0 ;
432        last ;
433      }
434    }
435    push @tmp,$l if ($i) ;
436  }
437
438  @{$list} = @tmp ;
439}
440
441#
442# Break the right hand side of a variable assignment into separate chunks
443#
444sub split_vars($)
445{
446  my $line = $_[0] ;
447  my (@buf) = split(//,"$line") ;
448
449  my $begin = 0 ;
450  my @res = () ;
451
452  my $depth = 0 ;
453  my $state = 0 ;
454
455  my $len = $#buf + 1 ;
456  for ( my $i = 0 ; $i < $len ; $i++ )
457  {
458    my $c = @buf[$i] ;
459    if ( $state == 0 )
460    {
461      if ( "$c" ne " " )
462      { # token
463        $begin = $i ;
464        $state++ ;
465      }
466      if ( "$c" eq "\$" )
467      { # variable
468        $depth++ ;
469      }
470    }
471    elsif ( $state == 1 )
472    {
473      if ( ( "$c" eq "\)" ) or ( "$c" eq "\}" ) )
474      { # variable
475        $depth-- ;
476      }
477      elsif ( ("$c" eq " " ) and ( $depth == 0 ) )
478      {
479        push @res, substr($line,$begin,$i-$begin);
480        $state-- ;
481      }
482      elsif ( "$c" eq "\$" )
483      { # variable
484        $depth++ ;
485      }
486    }
487    else
488    {
489      die "split_vars: unknown mode\n" ;
490    }
491  }
492
493  if ( $state > 0 )
494  {
495    push @res, substr($line,$begin,$len-$begin);
496    $state = 0
497  }
498  return @res ;
499}
500
501sub print_var($$$)
502{
503  my ($ibuf,$line,$l) = @_ ; # $l .. reference to list
504
505  foreach (@{$l}) {
506    if ( ( length($line) + length($_) ) < 76 )
507    {
508          $line .= " $_";
509    }
510    else
511    {
512           push @{$ibuf}, "$line \\\n";
513           $line = "    $_" ;
514    }
515  }
516  push @{$ibuf}, "$line\n" ;
517}
518
519sub print_line($$)
520{
521  my ($ibuf,$input) = @_ ;
522  my @l = split( / /, $input );
523  my $line = shift @l ;
524
525  foreach my $i (@l) {
526    if ( ( length($line) + length($i) ) < 76 )
527    {
528          $line .= " $i";
529    }
530    else
531    {
532           push @{$ibuf}, "$line \\\n";
533           $line = "    $i" ;
534    }
535  }
536  push @{$ibuf}, "$line" ;
537}
538
539sub print_script($$)
540{
541  my ($ibuf,$input) = @_ ;
542  $input =~ s%§%\\\n%g ;
543  push @{$ibuf}, $input ;
544}
Note: See TracBrowser for help on using the repository browser.