summaryrefslogtreecommitdiff
path: root/etc
diff options
context:
space:
mode:
Diffstat (limited to 'etc')
-rwxr-xr-xetc/prefix-gnulib-mk149
1 files changed, 149 insertions, 0 deletions
diff --git a/etc/prefix-gnulib-mk b/etc/prefix-gnulib-mk
new file mode 100755
index 00000000..e7f88382
--- /dev/null
+++ b/etc/prefix-gnulib-mk
@@ -0,0 +1,149 @@
+#! /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_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;
+
+ # Do not use gl_LIBOBJS, but its prefixed version.
+ $rhs =~ s/gl_LIBOBJS/gl_PREFIXED_LIBOBJS/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{lib/lib/}{lib/}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;
+
+ 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 ("lib/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: