summaryrefslogtreecommitdiffstats
path: root/tools/update/acpolish
diff options
context:
space:
mode:
Diffstat (limited to 'tools/update/acpolish')
-rwxr-xr-xtools/update/acpolish567
1 files changed, 502 insertions, 65 deletions
diff --git a/tools/update/acpolish b/tools/update/acpolish
index d348bf9ae6..6c3fc7a4b9 100755
--- a/tools/update/acpolish
+++ b/tools/update/acpolish
@@ -1,5 +1,11 @@
#!/usr/bin/perl
+# use strict 'subs' ;
+# use strict 'vars' ;
+# use strict 'refs' ;
+
+# use strict ;
+
#
# Perl script to beautify and enhance RTEMS autoconf Makefile.ins
#
@@ -9,20 +15,74 @@
# acpolish <Makefile.in >Makefile.in~
# mv Makefile.in~ Makefile.in
#
-# ATTENTION: This file contains embedded tabs
+# Note: This tool is not indented to be exported from the source-tree
+#
if ( -f "Makefile.am" )
{
- # Refuse to work on autoconfiscated Makefile.ins;
+ # Refuse to work on Makefile.ins generated from automake;
# redirecting STDOUT to Makefile.in will trash the Makefile.in ;-
- die "acpolish must not be run in autoconfiscated directories" ;
+ die "acpolish must not be run in automake directories" ;
}
-
+my $experimental = 0 ; # enable experimental/unsafe features
+my $verbose = 0 ;
my $build_pgms_seen = "" ;
+my $make_exe_seen = 0 ;
+my $install_seen = 0 ;
my $top_builddir = "";
my $subdir = "";
+my @installdirs = () ;
+
+my @pieces = () ;
+my @files = () ;
+my @variants = () ;
+my @vars = () ;
+
+sub print_macro($$)
+{
+ my $line = $_[0] ;
+ my $input = $_[1] ;
+ $input =~ s/\\\\/ /g;
+ my @l = split(' ',$input);
+
+ foreach (@l) {
+ if ( ( length($line) + length($_) ) < 76 )
+ {
+ $line .= " $_";
+ }
+ else
+ {
+ print "$line \\\n";
+ $line = " $_" ;
+ }
+ }
+ print "$line\n" ;
+}
+
+# Strip off duplicate entries from a list
+sub purge($)
+{
+ my $list = $_[0] ; # Reference to list !
+ my (@tmp) = () ;
+
+ foreach my $l ( @{$list} )
+ {
+ my $i = 1 ;
+ foreach my $t (@tmp)
+ {
+ if ( $t eq $l )
+ {
+ $i = 0 ;
+ last ;
+ }
+ }
+ push @tmp,$l if ($i) ;
+ }
+
+ @{$list} = @tmp ;
+}
sub find_root
{
@@ -58,100 +118,477 @@ sub find_root
find_root();
-my $nl_seen = 0 ;
+my @buffer = () ;
-while( <> )
-{
- if ( /^[ ]*$/o )
- {
- $nl_seen = $nl_seen+1;
+sub subst_line
+{
+# substitute obsolete variables
+ if ( /^([^\s]*)[\s]+$/o )
+ { # strip trailing spaces
+ $_ = "$1\n";
}
-
- if ( /^(.*)\$\(RTEMS_BSP\)(.*)$/o )
+ if ( /^(.*)MKLIB(.*)$/o )
{
- $_ = "$1\$\{RTEMS_BSP\}$2\n" ;
+ s/MKLIB/RANLIB/g ;
}
-
- if ( /^(.*)\$\(PROJECT_ROOT\)\/\$\{RTEMS_BSP\}\/lib\/include(.*)$/o )
+ if ( /^(.*)\$\(INSTINCFLAGS\)(.*)$/o )
{
- $_ = "$1\$\(PROJECT_INCLUDE\)$2\n" ;
+ s/\$\(INSTINCFLAGS\)/-m 644/g ;
}
-
- if ( /^(.*)\$\{PROJECT_RELEASE\}(.*)$/o )
+ if ( /^(.*)ASM(_FILES|_PIECES|_O_FILES)(.*)$/o )
{
- $_ = "$1\$\{PROJECT_RELEASE\}$2\n" ;
+ s/ASM_FILES/S_FILES/g ;
+ s/ASM_PIECES/S_PIECES/g ;
+ s/ASM_O_FILES/S_O_FILES/g ;
+ print STDERR "ASM: $_" if ( $verbose > 0) ;
}
-
- if ( /^[ ]*srcdir[ ]*=.*$/o )
- {
- print "\@SET_MAKE\@\n" ;
- print "$_" ;
- print "top_srcdir = \@top_srcdir\@\n" ;
- print "top_builddir = $top_builddir\n" ;
- print "subdir = $subdir\n" if "$subdir" ;
- print "\nINSTALL = \@INSTALL\@\n\n";
- print "RTEMS_ROOT = \$(top_srcdir)/\@RTEMS_TOPdir\@\n" ;
- print "PROJECT_ROOT = \@PROJECT_ROOT\@\n\n" ;
- $nl_seen=1;
+ if ( /^(.*)MP_PIECES(.*)$/o )
+ { # HACK: this is not always correct
+ s/MP_PIECES/MP_C_PIECES/g ;
+ print STDERR "MP_PIECES: $_" if ( $verbose > 0 );
}
- elsif ( /^[ ]*top_srcdir[ ]*=.*$/o )
+ if ( /^(.*)\$\(RTEMS_BSP\)(.*)$/o )
{
- # remove the line
+ s/\$\(RTEMS_BSP\)/\@RTEMS_BSP\@/g ;
}
- elsif ( /^[ ]*top_builddir[ ]*=.*$/o )
+ if ( /^(.*)\$\(RTEMS_ROOT\)\/mkinstalldirs(.*)$/o )
{
- # remove the line
+ $_ = "$1\$\(mkinstalldirs\)$2\n" ;
}
- elsif ( /^[ ]*Makefile:.*/o )
- { # consume the block
- while( <> ) { last if /^[ ]*$/o ; }
+ if ( /^(.*)\$\{(.*)_FILES\}(.*)$/o )
+ {
+ $_ = "$1\$\($2_FILES\)$3\n" ;
}
- elsif ( /^[ ]*%:[ ]\$\(srcdir\)\/%\.in.*$/o )
- { # consume the block
- while( <> ) { last if /^[ ]*$/o ; }
+ if ( /^(.*)\$\{(.*)_PIECES\}(.*)$/o )
+ {
+ $_ = "$1\$\($2_PIECES\)$3\n" ;
}
- elsif ( /^[ ]*RTEMS_ROOT[ ]*=.*$/o )
+ if ( /^(.*)\$\(PROJECT_ROOT\)\/\@RTEMS_BSP\@\/lib\/include(.*)$/o )
{
- # remove the line
+ $_ = "$1\$\(PROJECT_INCLUDE\)$2\n" ;
}
- elsif ( /^[ ]*PROJECT_ROOT[ ]*=.*$/o )
+ if ( /^(.*)\$\{PROJECT_RELEASE\}(.*)$/o )
{
- # remove the line
+ $_ = "$1\$\(PROJECT_RELEASE\)$2\n" ;
}
- elsif ( /^[ ]*INSTALL[ ]*=[ ]*\@INSTALL\@.*$/o )
+ if ( /^(.*\$\(INSTALL_[A-Z]+\))[\s]+-m[\s]+([54])([0-9][0-9].*)$/o )
{
- # remove the line
+ my $v = $2 + 2 ;
+ $_ = "$1 -m $v$3\n" ;
}
- elsif ( /^[ ]*subdir[ ]*=.*$/o )
+ if ( /^H_FILES[\s]*=[\s]*\$\(wildcard[\s]+\$\(srcdir\)\/\*\.h\)[\s]*$/o )
{
- # remove the line
+ my $files =`ls *.h 2>/dev/null`;
+ print STDERR "WARNING: Replacing \"\(wildcard... in $_\n" ;
+ $line = "H_FILES =";
+ @l = split(' ',$files) ;
+ foreach(@l) { $line .= " \$\(srcdir\)/$_"; }
+ $line .= "\n" ;
+ $_ = "$line" ;
}
- elsif ( /^[ ]*\@SET_MAKE\@.*$/o )
+ if ( /^.*\$\(make\-exe\).*$/o )
{
- # remove the line
+ $make_exe_seen = 1 ;
}
- elsif ( /^include[ ]*.*rtems\.cfg.*$/o )
+ if ( /^.*\$\(INSTALL_(DATA|SCRIPT|PROGRAM)\)(.*)$/o )
{
- # remove the line
+ $install_seen = 1 ;
}
- elsif ( /^[ ]*BUILD_PGMS.*=.*$/o )
+}
+
+{
+# 1st PASS:
+# * Read input file
+# * concatenate multiple lines
+# * Remove obsolete variables
+
+ my @ibuf = () ;
+ my $line = "" ;
+
+ while ( <> )
{
- $build_pgms_seen = "true" ;
- print "$_" ;
- $nl_seen=0;
+ &subst_line ;
+ if ( /^(#.*)$/o )
+ { # preserve comments
+ $line = "$_" ;
+ push @ibuf, $line ;
+ $line = "" ;
+ }
+ elsif ( /^.*\\$/o )
+ { # multilines
+ chop ;
+ $line .= "$_\\" ;
+ }
+ else
+ {
+ $line .= "$_" ;
+ push @ibuf, $line ;
+ $line = "" ;
+ }
}
- elsif ( /^[ ]*$/o )
+ @buffer = @ibuf;
+}
+
+{
+# 2nd PASS:
+# * remove automatically generated lines
+# * process some selected make rules
+ my $line = "" ;
+ my @tbuf = () ;
+ foreach (@buffer)
{
- print "$_" if $nl_seen < 2 ;
+ if ( /^[\t](.*)$/o )
+ { # make rule production
+ my $line = $1 ;
+ tr/\\/ / ;
+ my @l = split(/;/,$_);
+ foreach (@l)
+ { # try to get installation directories
+ if ( /^.*\$\(mkinstalldirs\).*\s\$\(INSTALLDIRS\)$/o )
+ {
+ }
+ elsif ( /^.*\$\(mkinstalldirs\).*\s([^\s]+)$/o )
+ {
+ push @installdirs, "$1" ;
+ }
+ elsif ( /^.*\$\(INSTALL_CHANGE\).*\s([^\s]+)$/o )
+ {
+ push @installdirs, "$1" ;
+ }
+ }
+ push @tbuf, "3$line"
+ }
+ elsif ( /^[\s]*\#.*$/o )
+ { # comment
+ push @tbuf, "$_" ;
+ }
+ elsif ( /^[\s]*([A-Z_]*)_FILES[\s]*\=[\s]*(.*)$/o )
+ { # *_FILES = ... Macros
+ if ( /^[\s]*([A-Z_]*_|)(CC|C|EQ|H|I|O|S|X)_FILES[\s]*\=[\s]*(.*)$/o )
+ {
+# print STDERR "FILES: <$1>--<$2>--<$3>\n" ;
+ my $f = "$1$2_FILES" ;
+ ${"var_$f"}="$3" ;
+ if ( ( $experimental > 0 )
+ and ( ( "$2" eq "C" ) or ( "$2" eq "CC" ) or ( "$2" eq "S" )
+ or ( "$2" eq "I" ) or ( "$2" eq "H" ) ) )
+ {
+ my $p = "$1$2_PIECES" ;
+ if ( not defined ${"var_$p"} )
+ {
+ print STDERR "ADDING $p\n" ;
+ ${"var_$p"} = "" ;
+ push @tbuf, "4$p\n" ;
+ push @pieces, "$p" ;
+ }
+ }
+ # place a marker
+ push @tbuf, "4$f\n" ;
+ push @files, "$f" ;
+ }
+ else
+ { # found a bug
+ print STDERR "UNKNOWN _FILES: $_\n" ;
+ my $f = "$1_FILES" ;
+ ${"var_$f"}="$2" ;
+ # place a marker
+ push @tbuf, "4$f\n" ;
+ push @files, "$f" ;
+ }
+ }
+ elsif ( /^[\s]*([A-Z_]*)_PIECES[\s]*\=[\s]*(.*)$/o )
+ { # *_PIECES = ... Macros
+ if ( /^[\s]*([A-Z][A-Z0-9_]*_|)(CC|C|EQ|H|I|O|S|X|REL)_PIECES[\s]*\=[\s]*(.*)$/o )
+ {
+ my $p = "$1$2_PIECES" ;
+
+ if ( not defined ${"var_$p"} )
+ {
+ ${"var_$p"} = "$3" ;
+ push @tbuf, "4$p\n" ;
+ push @pieces, "$p" ;
+ }
+ else
+ {
+ ${"var_$p"} .= " $3" ;
+ }
+ }
+ elsif ( /^[\s]*(BSP|CPU|GENERIC)_PIECES[\s]*\=[\s]*(.*)$/o )
+ { # Explicit exceptions from the *_PIECES naming conventions
+ # They should better be replaced in future
+ my $p = "$1_PIECES" ;
+ ${"var_$p"}="$2" ;
+ # place a marker
+ push @tbuf, "4$p\n" ;
+ push @pieces, "$p" ;
+ }
+ else
+ { # found a bug
+ print STDERR "UNKNOWN _PIECES: $_\n" ;
+ my $p = "$1_PIECES" ;
+ ${"var_$p"}="$2" ;
+ # place a marker
+ push @tbuf, "4$p\n" ;
+ push @pieces, "$p" ;
+ }
+ }
+ elsif ( /^[\s]*([A-Z_]+)_PIECES_([^\s]+)_V[\s]*\=[\s]*(.*)$/o )
+ { # *_PIECES_.._V = ... Macros
+ if ( /^[\s]*([A-Z][A-Z0-9_]*_|)(CC|C|EQ|H|I|O|S|X|REL)_PIECES_([^\s]+)_V[\s]*\=[\s]*(.*)$/o )
+ {
+ my @l = split(/_/,$3);
+ my $v = "$1$2-$#l" ;
+ if ( not defined @{"variants_$v"} ) { push @variants, "$v" ; }
+
+ my $p = "$1$2_PIECES_$3_V" ;
+ push @{"variants_${v}"}, "$p" ;
+
+ ${"var_$p"}="$4" ;
+ # place a marker
+ push @tbuf, "4$p\n" ;
+ push @pieces, "$p" ;
+ }
+ else
+ { # found a bug
+ print STDERR "UNKNOWN _PIECES: $_\n" ;
+ my $p = "$1_PIECES" ;
+ ${"var_$p"}="$2" ;
+ # place a marker
+ push @tbuf, "4$p\n" ;
+ push @pieces, "$p" ;
+ }
+ }
+ elsif ( /^[\s]*([^\s+=]+)[\s]*\=[\s]*(.*)$/o )
+ { # makefile variable
+ if ( ( "$1" eq "subdir" )
+ or ( "$1" eq "top_srcdir" )
+ or ( "$1" eq "top_builddir" )
+ or ( "$1" eq "RTEMS_ROOT" )
+ or ( "$1" eq "PROJECT_ROOT" )
+ or ( "$1" eq "INSTALL" )
+ or ( "$1" eq "PACKHEX" )
+ or ( "$1" eq "INSTALL_CHANGE" )
+ or ( "$1" eq "mkinstalldirs" )
+ )
+ {
+ print STDERR "REMOVE: $1\n" if $verbose ;
+ }
+ elsif ( "$1" eq "srcdir" )
+ { # place marker
+ push @tbuf, "0\n";
+ }
+ elsif ( "$1" eq "INSTALLDIRS" )
+ { # process the block
+ my $input = $2 ;
+ $input =~ s/\\\\/ /g ;
+ my @l = split(' ',$input);
+ foreach (@l)
+ {
+ if ( /[\s]*([^\s]+)[\s]*$/o )
+ {
+ push @installdirs, "$1" ;
+ }
+ }
+ }
+ else
+ {
+# print STDERR "MACRO: <$1> = <$2>\n";
+ my $p = "$1" ;
+ ${"var_$p"}="$2" ;
+ # place a marker
+ push @tbuf, "4$p\n" ;
+ push @vars, "$p" ;
+ }
+ }
+ elsif ( /^[\s]*([^\s+=]+)[\s]*\+\=[\s]*(.*)$/o )
+ { # makefile variable addition
+# print STDERR "MACRO: <$1> += <$2>\n";
+ my $p = "$1" ;
+ ${"var_$p+"}="$2" ;
+ # place a marker
+ push @tbuf, "5$p\n" ;
+ push @vars, "$p+" ;
+ }
+ elsif ( /^[\s]*(\@[^\s]+\@)$/o )
+ { # autoconf variable
+ if ( "$1" eq "\@SET_MAKE\@" )
+ {
+ }
+ else
+ {
+ push @tbuf, "$1\n" ;
+ }
+ }
+ elsif ( /^[\s]*include[\s]+(.*)$/o )
+ { # include line
+ push @tbuf, "$_" ;
+ if ( /^include[\s\t]*.*(directory|leaf|lib)\.cfg.*$/o )
+ {
+ push @tbuf, "1\n" ;
+ push @tbuf, "PACKHEX = \@PACKHEX\@\n" if ( $make_exe_seen == 1 ) ;
+ push @tbuf, "2\n" ;
+ }
+ }
+ elsif ( /^[\s]*(ifeq|ifneq|else|endif)[\s]+(.*)$/o )
+ { # gmake conditionals
+ # Most of them are removed, but we still have some :-
+ push @tbuf, "$1 $2\n" ;
+ }
+ elsif ( /^[\s]*([^:]+)[\s]*(:[:]*)[\s]*(.*)$/o )
+ {
+ if ( "$2" eq "::" )
+ {
+ # Warn about "::"-rules
+ # Will be silently removed below.
+ print STDERR "WARNING: Removing \"::\" in RULE $_\n" ;
+ }
+
+ if ( ( "$1" eq "Makefile" )
+ or ( "$1" eq "\$\(INSTALLDIRS\)" ) )
+ { # delete entry
+ shift @buffer ;
+ }
+ elsif ( ( "$1" eq "all" )
+ or ( "$1" eq "preinstall" ) )
+ {
+ # Note the dependencies
+ # Not yet exploited, but could be useful for dependency
+ # tracking in future
+ if ( defined ${"var_$1"} )
+ { ${"var_$1"} .= " $3" ; }
+ else
+ { ${"var_$1"} = "$3" ; }
+ push @tbuf, "$1: $3\n" ;
+ }
+ else
+ { # make rule
+ push @tbuf, "$1: $3\n" ;
+ }
+ }
+ elsif ( /^[\s]*$/o )
+ { # empty line
+ push @tbuf, "\n" ;
+ }
+ else
+ {
+ die "PASS 2: Unhandled $_" ;
+ }
}
- else
+ @buffer = @tbuf ;
+ purge \@installdirs ;
+ purge \@pieces ;
+}
+
+# A fragment to debug conditionals
+#foreach( @variants )
+#{
+# my $v = $_ ;
+# print STDERR "VARIANT: $v\n";
+# foreach (@{"variants_${v}"})
+# {
+# print STDERR "* $_\n;" ;
+# }
+#}
+
+# sanity check on *_FILES macros
+# too fragile for the time being,
+# therefore disabled by default
+if ( $experimental > 1 )
+{
+ foreach( @files )
{
- print "$_" ;
- $nl_seen = 0;
+ my $file = "$_" ;
+ my $line = ${"var_$_"} ;
+ $line =~ tr /\\/ /;
+ my @l = split(' ',$line);
+ my @o = () ;
+ foreach (@l)
+ {
+ if ( /^([^\.]+)\.([a-z]+)$/o )
+ {
+ print STDERR "$file: *.$2 in $_\n" ;
+ }
+ elsif ( /^\$\(.*\)$/o )
+ {
+ print STDERR "$file: REF: $_\n" ;
+ }
+ else
+ {
+ print STDERR "$file: UNHANDLED: $_\n" ;
+ }
+ }
}
-} # while
+}
+
+# print STDERR "PASS 2: @buffer" ;
-print "\n" if $nl_seen < 1 ;
+{
+# PASS 3:
+# * output to new Makefile
+# * prettyprint newlines
+
+ my $nl_seen = 0 ;
+ foreach ( @buffer )
+ {
+ if ( /^$/o )
+ {
+ $nl_seen++ ;
+ print "\n" if ( $nl_seen < 2 );
+ }
+ elsif ( /^\0$/o )
+ {
+ print "\@SET_MAKE\@\n" ;
+ print "srcdir = \@srcdir\@\n" ;
+ print "top_srcdir = \@top_srcdir\@\n" ;
+ print "top_builddir = $top_builddir\n" ;
+ print "subdir = $subdir\n" if "$subdir" ;
+ print "\nRTEMS_ROOT = \@RTEMS_ROOT\@\n" ;
+ print "PROJECT_ROOT = \@PROJECT_ROOT\@\n\n" ;
+ $nl_seen = 1 ;
+ }
+ elsif ( /^\1$/o )
+ {
+ print "\n" ;
+ print "INSTALL = \@INSTALL\@\n" if ( $install_seen > 0 );
+ print "INSTALL_CHANGE = \@INSTALL_CHANGE\@\n" ;
+ $nl_seen = 0 ;
+ }
+ elsif ( /^\2$/o )
+ { # Handle installdirs related items
+ if ( $#installdirs >= 0 )
+ {
+ print "mkinstalldirs = \$(SHELL) \$(top_srcdir)/\@RTEMS_TOPdir\@/mkinstalldirs\n\n" ;
+ my $line = join( ' ',@installdirs );
+ print_macro "INSTALLDIRS =", $line ;
+ print "\n\$(INSTALLDIRS):\n\t\@\$(mkinstalldirs) \$(INSTALLDIRS)\n\n" ;
+ $nl_seen = 1 ;
+ }
+ }
+ elsif ( /^\3(.*)$/o )
+ { # pretty print a shell script fragment/make production
+ my @l = split(/\\\\/,$1);
+ if ( $#l >= 0 ) { my $i = shift @l ; print "\t$i"; }
+ foreach( @l ) { print "\\\n$_"; }
+ print "\n" ;
+ $nl_seen = 0 ;
+ }
+ elsif ( /^\4(.*)$/o )
+ { # pretty print a make variable
+ print_macro "$1 =", ${"var_$1"} ;
+ $nl_seen = 0 ;
+ }
+ elsif ( /^\5(.*)$/o )
+ { # pretty print an addition to a make variable
+ print_macro "$1 +=", ${"var_$1+"} ;
+ $nl_seen = 0 ;
+ }
+ else
+ {
+ $nl_seen = 0 ;
+ print "$_" ;
+ }
+ }
+}
# Add rules for config.status generated files
if ( "$build_pgms_seen" )
@@ -164,7 +601,7 @@ print "\$@ CONFIG_HEADERS= \$(SHELL) ./config.status\n";
}
else
{
-print "Makefile: \$(srcdir)/Makefile.in \$(top_builddir)/config.status\n" ;
+print "Makefile: \@MAINTAINER_MODE_TRUE\@ \$(srcdir)/Makefile.in \$(top_builddir)/config.status\n" ;
print " cd \$(top_builddir) \\\n" ;
print " && CONFIG_FILES=" ;
print "\$(subdir)/" if ( "$subdir" );