#! /usr/bin/perl -w use strict; use IO::File; my $prefix = "lib/"; # contents ($FILE_NAME) # --------------------- sub contents ($) { my ($file) = @_; local $/; # Turn on slurp-mode. my $f = new IO::File "< $file" or die "$file"; my $contents = $f->getline or die "$file"; $f->close; return $contents; } # prefix_word ($WORD) # ------------------- # Do not prefix special words such as variable dereferences. Also, # "Makefile" is really "Makefile", since precisely there is no # lib/Makefile. sub prefix_word ($) { local ($_) = @_; $_ = $prefix . $_ unless m{^\$\(\w+\)} || $_ eq "Makefile"; return $_; } # prefix_words ($TEXT) # -------------------- sub prefix_words ($) { local ($_) = @_; s{(\S+)}{prefix_word($1)}gem; return $_; } # prefix_assignment ($LHS-AND-ASSIGN-OP, $RHS) # -------------------------------------------- sub prefix_assignment ($$) { my ($lhs_and_assign_op, $rhs) = @_; my $res; # Some variables are initialized by gnulib.mk, and we don't want # that. Change '=' to '+='. if ($lhs_and_assign_op =~ /^(SUBDIRS|EXTRA_DIST|BUILT_SOURCES|SUFFIXES|MOSTLYCLEANFILES|CLEANFILES|DISTCLEANFILES|MAINTAINERCLEANFILES|AM_CFLAGS|AM_CPPFLAGS|AM_GNU_GETTEXT) =/) { $lhs_and_assign_op =~ s/=/+=/; } # We don't want to inherit gnulib's AUTOMAKE_OPTIONS, comment them. elsif ($lhs_and_assign_op =~ /^AUTOMAKE_OPTIONS =/) { $lhs_and_assign_op =~ s/^/# /; } # Don't touch suffixes. elsif ($lhs_and_assign_op =~ /^SUFFIXES /) { } # The words are (probably) paths to files in lib/: prefix them. else { $rhs = prefix_words($rhs) } # Variables which name depend on the location: libbison_a_SOURCES => # lib_libbison_a_SOURCES. $lhs_and_assign_op =~ s/(libbison)/lib_$1/g; return $lhs_and_assign_op . $rhs; } # prefix $CONTENTS # ---------------- # $CONTENTS is a Makefile content. Post-process it so that each file-name # is prefixed with $prefix (e.g., "lib/"). # # Relies heavily on the regularity of the file generated by gnulib-tool. sub prefix ($) { # Work on $_. local ($_) = @_; # Prefix all the occurrence of files in rules. If there is nothing # after in the :, it's probably a phony target, or a suffix rule. # Don't touch it. s{^([\w./]+ *: *\w.*)$} {prefix_words($1)}gem; # Prefix files in variables. s{^([\w.]+\s*\+?=)(.*)$} {prefix_assignment($1, $2)}gem; # These three guys escape all the other regular rules. s{(charset\.alias|ref-add\.sed|ref-del\.sed)}{$prefix$1}g; # Unfortunately, as a result we sometimes have lib/lib. s{($prefix){2}}{$1}g; # $(srcdir) is actually $(top_srcdir)/lib. s{\$\(srcdir\)}{\$(top_srcdir)/lib}g; # Sometimes, t-$@ is used instead of $@-t, which, of course, does # not work when we have a $@ with a directory in it. s{t-\$\@}{\$\@-t}g; # Some AC_SUBST patterns remain and would better be Make macros. s{\@(MKDIR_P)\@}{\$($1)}g; # Adjust paths in mkdir. s{(\$\(MKDIR_P\))\s*(\w+)}{$1 $prefix$2}g; return $_; } # process ($IN) # ------------- sub process ($) { my ($file) = @_; my ($bak) = "$file.bak"; rename ($file, $bak) or die; my $contents = contents ($bak); $contents = prefix ($contents); my $out = new IO::File(">$file") or die; print $out $contents; } process ("${prefix}gnulib.mk") ### Setup "GNU" style for perl-mode and cperl-mode. ## Local Variables: ## perl-indent-level: 2 ## perl-continued-statement-offset: 2 ## perl-continued-brace-offset: 0 ## perl-brace-offset: 0 ## perl-brace-imaginary-offset: 0 ## perl-label-offset: -2 ## cperl-indent-level: 2 ## cperl-brace-offset: 0 ## cperl-continued-brace-offset: 0 ## cperl-label-offset: -2 ## cperl-extra-newline-before-brace: t ## cperl-merge-trailing-else: nil ## cperl-continued-statement-offset: 2 ## End: