URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [rtos/] [rtems/] [tools/] [update/] [acpolish] - Rev 173
Compare with Previous | Blame | View Log
#!/usr/bin/perluse strict ;sub print_macro($$);## Perl script to beautify and enhance RTEMS autoconf Makefile.ins## Reads from stdin and writes to stdout## usage:# acpolish <Makefile.in >Makefile.in~# mv Makefile.in~ Makefile.in## Note: This tool is not indented to be exported from the source-tree#if ( -f "Makefile.am" ){# 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 automake directories" ;}my $experimental = 0 ; # enable experimental/unsafe featuresmy $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 = () ;# Strip off duplicate entries from a listsub 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{$top_builddir = "." ;$subdir="";my $pwd = `pwd`; chomp $pwd;$pwd .= "/" ;my $len ;if ( -f "configure.in" ) { return $top_builddir ; }my $i = rindex($pwd,'/');$len = $i;$pwd = substr($pwd,0,$len);$i = rindex($pwd,'/');$subdir = substr($pwd,$i+1,$len - 1);$top_builddir = ".." ;while( -d "$top_builddir" ){if ( -f "${top_builddir}/configure.in" ){return $top_builddir ;}$len=$i;$pwd = substr($pwd,0,$len);$i = rindex($pwd,'/');$subdir = substr($pwd,$i+1,$len - 1) . "/$subdir";$top_builddir .= "/.." ;} ;die "Can't find configure.in\n" ;}find_root();my @buffer = () ;sub subst_line{# substitute obsolete variablesif ( /^([^\s]*)[\s]+$/o ){ # strip trailing spaces$_ = "$1\n";}if ( /^(.*)MKLIB(.*)$/o ){s/MKLIB/RANLIB/g ;}if ( /^(.*)\$\(INSTINCFLAGS\)(.*)$/o ){s/\$\(INSTINCFLAGS\)/-m 644/g ;}if ( /^(.*)ASM(_FILES|_PIECES|_O_FILES)(.*)$/o ){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 ( /^(.*)MP_PIECES(.*)$/o ){ # HACK: this is not always corrects/MP_PIECES/MP_C_PIECES/g ;print STDERR "MP_PIECES: $_" if ( $verbose > 0 );}if ( /^(.*)\$\(RTEMS_BSP\)(.*)$/o ){s/\$\(RTEMS_BSP\)/\@RTEMS_BSP\@/g ;}if ( /^(.*)\$\(RTEMS_ROOT\)\/mkinstalldirs(.*)$/o ){$_ = "$1\$\(mkinstalldirs\)$2\n" ;}if ( /^(.*)\$\{(.*)_FILES\}(.*)$/o ){$_ = "$1\$\($2_FILES\)$3\n" ;}if ( /^(.*)\$\{(.*)_PIECES\}(.*)$/o ){$_ = "$1\$\($2_PIECES\)$3\n" ;}if ( /^(.*)\$\(PROJECT_ROOT\)\/\@RTEMS_BSP\@\/lib\/include(.*)$/o ){$_ = "$1\$\(PROJECT_INCLUDE\)$2\n" ;}if ( /^(.*)\$\{PROJECT_RELEASE\}(.*)$/o ){$_ = "$1\$\(PROJECT_RELEASE\)$2\n" ;}if ( /^(.*\$\(INSTALL_[A-Z]+\))[\s]+-m[\s]+([54])([0-9][0-9].*)$/o ){my $v = $2 + 2 ;$_ = "$1 -m $v$3\n" ;}if ( /^H_FILES[\s]*=[\s]*\$\(wildcard[\s]+\$\(srcdir\)\/\*\.h\)[\s]*$/o ){my $files =`ls *.h 2>/dev/null`;print STDERR "WARNING: Replacing \"\(wildcard... in $_\n" ;my $line = "H_FILES =";my @l = split(' ',$files) ;foreach(@l) { $line .= " \$\(srcdir\)/$_"; }$line .= "\n" ;$_ = "$line" ;}if ( /^(.*)RTEMS_HAS_([A-Z]+)(.*)$/o ){print STDERR "WARNING: Replacing RTEMS_HAS_$2 with HAS_$2\n" ;$_ = "$1HAS_$2$3\n" ;}if ( /^[\s]*\$[({]PGM[)}]:[\s]*(.*)\$([({]SRCS[)}])(.*)$/o ){$_ = "\$(PGM):$1$3\n" ;}if ( /^.*\$\(make\-exe\).*$/o ){$make_exe_seen = 1 ;}if ( /^.*\$\(INSTALL_(DATA|SCRIPT|PROGRAM)\)(.*)$/o ){$install_seen = 1 ;}}{# 1st PASS:# * Read input file# * concatenate multiple lines# * Remove obsolete variablesmy @ibuf = () ;my $line = "" ;while ( <STDIN> ){&subst_line ;if ( /^(#.*)$/o ){ # preserve comments$line = "$_" ;push @ibuf, $line ;$line = "" ;}elsif ( /^.*\\$/o ){ # multilineschop ;$line .= "$_\\" ;}else{$line .= "$_" ;push @ibuf, $line ;$line = "" ;}}@buffer = @ibuf;}{# 2nd PASS:# * remove automatically generated lines# * process some selected make rulesmy $line = "" ;my @tbuf = () ;foreach (@buffer){if ( /^[\t](.*)$/o ){ # make rule productionmy $line = $1 ;tr/\\/ / ;my @l = split(/;/,$_);foreach (@l){ # try to get installation directoriesif ( /^.*\$\(mkinstalldirs\).*\s\$\(INSTALLDIRS\)$/o ){}elsif ( /^.*\$\(mkinstalldirs\).*\s([^\s]+)$/o ){push @installdirs, "$1" ;}elsif ( /^.*\$\(INSTALL_CHANGE\).*\s([^\s]+)(\/[^\.\s]+\.[^\s\/]+)$/o ){# print STDERR "WARNING - DIR1: $1 <$2> " ;push @installdirs, "$1" ;}elsif ( /^.*\$\(INSTALL_CHANGE\).*\s([^\s]+)$/o ){# print STDERR "DIR2 $1\n" ;push @installdirs, "$1" ;}}}elsif ( /^[\s]*\#.*$/o ){ # commentpush @tbuf, "$_" ;}elsif ( /^[\s]*([A-Z_]*)_FILES[\s]*\=[\s]*(.*)$/o ){ # *_FILES = ... Macrosif ( /^[\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 @pieces, "$p" ;}}# place a markerpush @files, "$f" ;}else{ # found a bugprint STDERR "UNKNOWN _FILES: $_\n" ;my $f = "$1_FILES" ;${"var_$f"}="$2" ;# place a markerpush @files, "$f" ;}}elsif ( /^[\s]*([A-Z_]*)_PIECES[\s]*\=[\s]*(.*)$/o ){ # *_PIECES = ... Macrosif ( /^[\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 @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 futuremy $p = "$1_PIECES" ;${"var_$p"}="$2" ;# place a markerpush @pieces, "$p" ;}else{ # found a bugprint STDERR "UNKNOWN _PIECES: $_\n" ;my $p = "$1_PIECES" ;${"var_$p"}="$2" ;# place a markerpush @pieces, "$p" ;}}elsif ( /^[\s]*([A-Z_]+)_PIECES_([^\s]+)_V[\s]*\=[\s]*(.*)$/o ){ # *_PIECES_.._V = ... Macrosif ( /^[\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 markerpush @pieces, "$p" ;}else{ # found a bugprint STDERR "UNKNOWN _PIECES: $_\n" ;my $p = "$1_PIECES" ;${"var_$p"}="$2" ;# place a markerpush @pieces, "$p" ;}}elsif ( /^[\s]*([^\s+=]+)[\s]*\=[\s]*(.*)$/o ){ # makefile variablesif ( ( "$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" )or ( "$1" eq "ACLOCAL" )or ( "$1" eq "AUTOCONF" )or ( "$1" eq "ACLOCAL_M4" )or ( "$1" eq "ACLOCAL_AMFLAGS" )){print STDERR "REMOVE: $1\n" if $verbose ;}elsif ( "$1" eq "srcdir" ){ # place marker}elsif ( "$1" eq "INSTALLDIRS" ){ # process the blockmy $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 markerpush @vars, "$p" ;}}elsif ( /^[\s]*([^\s+=]+)[\s]*\+\=[\s]*(.*)$/o ){ # makefile variable addition# print STDERR "MACRO: <$1> += <$2>\n";my $p = "$1" ;if ( not defined ${"var_$p+"} ){# place a markerpush @vars, "$p+" ;}else{print STDERR "WARNING += $_" ;}${"var_$p+"} .=" $2" ;}elsif ( /^[\s]*(\@[^\s]+\@)$/o ){ # autoconf variableif ( "$1" eq "\@SET_MAKE\@" ){}else{push @tbuf, "$1\n" ;}}elsif ( /^[\s]*include[\s]+(.*)$/o ){ # include linepush @tbuf, "$_" ;if ( /^include[\s\t]*.*(directory|leaf|lib)\.cfg.*$/o ){push @tbuf, "PACKHEX = \@PACKHEX\@\n" if ( $make_exe_seen == 1 ) ;}}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 ( /^\@.*_(TRUE|FALSE)\@.*$/o ){ # automake conditionals# HACK: Don't know how to handle them, so let's pass them throughpush @tbuf, "$_" ;}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\)" )or ( "$1" eq "\$\(ACLOCAL_M4\)" )or ( "$1" eq "config\.status" )or ( "$1" eq "\$\(srcdir\)/configure" )){ # delete entryshift @buffer ;}elsif ( ( "$1" eq "all" )or ( "$1" eq "preinstall" ) ){# Note the dependencies# Not yet exploited, but could be useful for dependency# tracking in futureif ( defined ${"var_$1"} ){ ${"var_$1"} .= " $3" ; }else{ ${"var_$1"} = "$3" ; }push @tbuf, "$1: $3\n" ;}else{ # make rulepush @tbuf, "$1: $3\n" ;}}elsif ( /^[\s]*$/o ){ # empty linepush @tbuf, "\n" ;}else{die "PASS 2: Unhandled $_" ;}}@buffer = @tbuf ;@tbuf = @installdirs ;@installdirs = () ;foreach ( @tbuf ){if ( /^([^\s]+)(\/[^\.\s]+\.[^\s\/]+)$/o ){print STDERR "WARNING - stripping of file: $1 <$2> " if ( $verbose > 1 );push @installdirs, "$1" ;}else{push @installdirs, "$_" ;}}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 defaultif ( $experimental > 1 ){foreach( @files ){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" ;}}}}# print STDERR "PASS 2: @buffer" ;{# PASS 3:# * output to new Makefile# * prettyprint newlinesmy $nl_seen = 0 ;foreach ( @buffer ){if ( /^$/o ){$nl_seen++ ;print "\n" if ( $nl_seen < 2 );}{print "\@SET_MAKE\@\n" ;print "srcdir = \@srcdir\@\n" ;print "top_srcdir = \@top_srcdir\@\n" ;print "top_builddir = $top_builddir\n" ;if ( "$subdir" ){print "subdir = $subdir\n";}else{print "\nACLOCAL = aclocal\n" ;print "AUTOCONF = autoconf\n" ;print "ACLOCAL_M4 = \$(top_srcdir)/aclocal.m4\n" ;print "ACLOCAL_AMFLAGS = -I \@RTEMS_TOPdir\@/aclocal\n" ;}print "\nRTEMS_ROOT = \@RTEMS_ROOT\@\n" ;print "PROJECT_ROOT = \@PROJECT_ROOT\@\n\n" ;$nl_seen = 1 ;}{print "\n" ;print "INSTALL = \@INSTALL\@\n" if ( $install_seen > 0 );print "INSTALL_CHANGE = \@INSTALL_CHANGE\@\n" ;$nl_seen = 0 ;}{ # Handle installdirs related itemsif ( $#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 ;}}{ # pretty print a shell script fragment/make productionmy @l = split(/\\\\/,$1);if ( $#l >= 0 ) { my $i = shift @l ; print "\t$i"; }foreach( @l ) { print "\\\n$_"; }print "\n" ;$nl_seen = 0 ;}{ # pretty print a make variable&print_macro( "$1 =", ${"var_$1"} );$nl_seen = 0 ;}{ # 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 filesif ( "$build_pgms_seen" ){print "%: \$(srcdir)/%.in \$(top_builddir)/config.status\n" ;print " cd \$(top_builddir) \\\n" ;print " && CONFIG_FILES=" ;print "\$(subdir)/" if ( "$subdir" );print "\$@ CONFIG_HEADERS= \$(SHELL) ./config.status\n";}else{print "Makefile: \$(srcdir)/Makefile.in \$(top_builddir)/config.status\n" ;print "\tcd \$(top_builddir) \\\n" ;print "\t && CONFIG_FILES=" ;print "\$(subdir)/" if ( "$subdir" );print "\$@ CONFIG_HEADERS= \$(SHELL) ./config.status\n";}if ( ! "$subdir" ){print "\n\$(ACLOCAL_M4): \@MAINTAINER_MODE_TRUE\@ configure.in\n" ;print "\tcd \$(srcdir) && \$(ACLOCAL) \$(ACLOCAL_AMFLAGS)\n" ;print "\nconfig.status: \$(srcdir)/configure \$(CONFIG_STATUS_DEPENDENCIES)\n" ;print "\t\$(SHELL) ./config.status --recheck\n" ;print "\$(srcdir)/configure: \@MAINTAINER_MODE_TRUE\@\$(srcdir)/configure.in";print " \$(ACLOCAL_M4)\n" ;print "\tcd \$(srcdir) && \$(AUTOCONF)\n"}exit 0 ;sub print_macro($$){my ($line,$input) = @_ ;$input =~ s/\\\\/ /g;my @l = split(' ',$input);foreach (@l) {if ( ( length($line) + length($_) ) < 76 ){$line .= " $_";}else{print "$line \\\n";$line = " $_" ;}}print "$line\n" ;}
