Blame build-aux/prefix-gnulib-mk

Packit Service c3aa71
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
Packit Service c3aa71
  & eval 'exec perl -wS "$0" $argv:q'
Packit Service c3aa71
    if 0;
Packit Service c3aa71
Packit Service c3aa71
use strict;
Packit Service c3aa71
use IO::File;
Packit Service c3aa71
use Getopt::Long;
Packit Service c3aa71
use File::Basename; # for dirname
Packit Service c3aa71
Packit Service c3aa71
my $VERSION = '2012-01-21 17:13'; # UTC
Packit Service c3aa71
(my $ME = $0) =~ s|.*/||;
Packit Service c3aa71
Packit Service c3aa71
my $prefix;
Packit Service c3aa71
my $lib_name;
Packit Service c3aa71
Packit Service c3aa71
sub usage ($)
Packit Service c3aa71
{
Packit Service c3aa71
  my ($exit_code) = @_;
Packit Service c3aa71
  my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
Packit Service c3aa71
  if ($exit_code != 0)
Packit Service c3aa71
    {
Packit Service c3aa71
      print $STREAM "Try '$ME --help' for more information.\n";
Packit Service c3aa71
    }
Packit Service c3aa71
  else
Packit Service c3aa71
    {
Packit Service c3aa71
      print $STREAM <
Packit Service c3aa71
Usage: $ME --lib-name=NAME FILE
Packit Service c3aa71
   or: $ME [--help|--version]
Packit Service c3aa71
Rewrite a gnulib-tool-generated FILE like lib/gnulib.mk to work with
Packit Service c3aa71
automake's subdir-objects.
Packit Service c3aa71
Packit Service c3aa71
OPTIONS:
Packit Service c3aa71
Packit Service c3aa71
This option must be specified:
Packit Service c3aa71
Packit Service c3aa71
   --lib-name=NAME    library name, often "lib\$project"
Packit Service c3aa71
Packit Service c3aa71
The following are optional:
Packit Service c3aa71
Packit Service c3aa71
   --help             display this help and exit
Packit Service c3aa71
   --version          output version information and exit
Packit Service c3aa71
Packit Service c3aa71
EOF
Packit Service c3aa71
    }
Packit Service c3aa71
  exit $exit_code;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
# contents ($FILE_NAME)
Packit Service c3aa71
# ---------------------
Packit Service c3aa71
sub contents ($)
Packit Service c3aa71
{
Packit Service c3aa71
  my ($file) = @_;
Packit Service c3aa71
  local $/;                     # Turn on slurp-mode.
Packit Service c3aa71
  my $f = new IO::File "< $file" or die "$file";
Packit Service c3aa71
  my $contents = $f->getline or die "$file";
Packit Service c3aa71
  $f->close;
Packit Service c3aa71
  return $contents;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
# prefix_word ($WORD)
Packit Service c3aa71
# -------------------
Packit Service c3aa71
# Do not prefix special words such as variable dereferences.  Also,
Packit Service c3aa71
# "Makefile" is really "Makefile", since precisely there is no
Packit Service c3aa71
# lib/Makefile.
Packit Service c3aa71
sub prefix_word ($)
Packit Service c3aa71
{
Packit Service c3aa71
  local ($_) = @_;
Packit Service c3aa71
  $_ = $prefix . $_
Packit Service c3aa71
    unless (/^-/ || m{^\$\(\w+\)} || $_ eq "Makefile" || $_ eq '\\'
Packit Service c3aa71
            || $_ eq '@ALLOCA@');
Packit Service c3aa71
  return $_;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
# prefix_words ($TEXT)
Packit Service c3aa71
# --------------------
Packit Service c3aa71
sub prefix_words ($)
Packit Service c3aa71
{
Packit Service c3aa71
  local ($_) = @_;
Packit Service c3aa71
  s{(\S+)}{prefix_word($1)}gem;
Packit Service c3aa71
  return $_;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
Packit Service c3aa71
# prefix_assignment ($LHS-AND-ASSIGN-OP, $RHS)
Packit Service c3aa71
# --------------------------------------------
Packit Service c3aa71
sub prefix_assignment ($$)
Packit Service c3aa71
{
Packit Service c3aa71
  my ($lhs_and_assign_op, $rhs) = @_;
Packit Service c3aa71
  my $res;
Packit Service c3aa71
Packit Service c3aa71
  # Some variables are initialized by gnulib.mk, and we don't want
Packit Service c3aa71
  # that.  Change '=' to '+='.
Packit Service c3aa71
  if ($lhs_and_assign_op =~ /^GPERF =$/)
Packit Service c3aa71
    {
Packit Service c3aa71
      # Do not change the RHS, which specifies the GPERF program.
Packit Service c3aa71
    }
Packit Service c3aa71
  elsif ($lhs_and_assign_op =~
Packit Service c3aa71
      /^(SUBDIRS|EXTRA_DIST|BUILT_SOURCES|SUFFIXES|MOSTLYCLEANFILES
Packit Service c3aa71
         |CLEANFILES|DISTCLEANFILES|MAINTAINERCLEANFILES|AM_CFLAGS
Packit Service c3aa71
         |AM_CPPFLAGS|AM_GNU_GETTEXT)\ =/x)
Packit Service c3aa71
    {
Packit Service c3aa71
      $lhs_and_assign_op =~ s/=/+=/;
Packit Service c3aa71
    }
Packit Service c3aa71
  # We don't want to inherit gnulib's AUTOMAKE_OPTIONS, comment them.
Packit Service c3aa71
  elsif ($lhs_and_assign_op =~ /^AUTOMAKE_OPTIONS =/)
Packit Service c3aa71
    {
Packit Service c3aa71
      $lhs_and_assign_op =~ s/^/# /;
Packit Service c3aa71
    }
Packit Service c3aa71
  elsif ($lhs_and_assign_op =~ /^SUFFIXES /)
Packit Service c3aa71
    {
Packit Service c3aa71
      # Elide any SUFFIXES assignment or concatenation.
Packit Service c3aa71
      $lhs_and_assign_op =~ s/^/# /;
Packit Service c3aa71
    }
Packit Service c3aa71
  # The words are (probably) paths to files in lib/: prefix them.
Packit Service c3aa71
  else
Packit Service c3aa71
    {
Packit Service c3aa71
      $rhs = prefix_words($rhs)
Packit Service c3aa71
    }
Packit Service c3aa71
Packit Service c3aa71
  # Variables which name depend on the location: libbison_a_SOURCES =>
Packit Service c3aa71
  # lib_libbison_a_SOURCES.
Packit Service c3aa71
  $lhs_and_assign_op =~ s/($lib_name)/lib_$1/g;
Packit Service c3aa71
Packit Service c3aa71
  return $lhs_and_assign_op . $rhs;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
# prefix $CONTENTS
Packit Service c3aa71
# ----------------
Packit Service c3aa71
# $CONTENTS is a Makefile content.  Post-process it so that each file-name
Packit Service c3aa71
# is prefixed with $prefix (e.g., "lib/").
Packit Service c3aa71
#
Packit Service c3aa71
# Relies heavily on the regularity of the file generated by gnulib-tool.
Packit Service c3aa71
sub prefix ($)
Packit Service c3aa71
{
Packit Service c3aa71
  # Work on $_.
Packit Service c3aa71
  local ($_) = @_;
Packit Service c3aa71
Packit Service c3aa71
  # Prefix all the occurrence of files in rules.  If there is nothing
Packit Service c3aa71
  # after in the :, it's probably a phony target, or a suffix rule.
Packit Service c3aa71
  # Don't touch it.
Packit Service c3aa71
  s{^([-\w+/]+\.[-\w.]+ *: *\S.*)$}
Packit Service c3aa71
   {prefix_words($1)}gem;
Packit Service c3aa71
Packit Service c3aa71
  # Prefix files in variables.
Packit Service c3aa71
  s{^([\w.]+\s*\+?=)(.*)$}
Packit Service c3aa71
   {prefix_assignment($1, $2)}gem;
Packit Service c3aa71
Packit Service c3aa71
  # These three guys escape all the other regular rules.
Packit Service c3aa71
  # Require the leading white space to avoid inserting the prefix
Packit Service c3aa71
  # on a line like this:
Packit Service c3aa71
  # charset_alias = $(DESTDIR)$(libdir)/charset.alias
Packit Service c3aa71
  # With $(libdir), it would be erroneous.
Packit Service c3aa71
  s{(\s)(charset\.alias|ref-add\.sed|ref-del\.sed)}{$1$prefix$2}g;
Packit Service c3aa71
  # Unfortunately, as a result we sometimes have lib/lib.
Packit Service c3aa71
  s{($prefix){2}}{$1}g;
Packit Service c3aa71
Packit Service c3aa71
  # lib_libcoreutils_a_SOURCES += \
Packit Service c3aa71
  #   imaxtostr.c \
Packit Service c3aa71
  #   inttostr.c \
Packit Service c3aa71
  #   offtostr.c \
Packit Service c3aa71
  #   uinttostr.c \
Packit Service c3aa71
  #   umaxtostr.c
Packit Service c3aa71
  # The above are not handled since they're on continued lines, so
Packit Service c3aa71
  # deal with them manually:
Packit Service c3aa71
  s{^(\s*)((?:[ui]max|u?int|off)tostr\.c(:? \\)?)$}{$1$prefix$2}gm;
Packit Service c3aa71
Packit Service c3aa71
  # $(srcdir)/ is actually $(top_srcdir)/$prefix/.
Packit Service c3aa71
  # The trailing slash is required to avoid matching this rule:
Packit Service c3aa71
  #   test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile
Packit Service c3aa71
  s{\$\(srcdir\)/}{\$(top_srcdir)/$prefix}g;
Packit Service c3aa71
Packit Service c3aa71
  # Sometimes, t-$@ is used instead of $@-t, which, of course, does
Packit Service c3aa71
  # not work when we have a $@ with a directory in it.
Packit Service c3aa71
  s{t-\$\@}{\$\@-t}g;
Packit Service c3aa71
Packit Service c3aa71
  # Some AC_SUBST patterns remain and would better be Make macros.
Packit Service c3aa71
  s{\@(MKDIR_P)\@}{\$($1)}g;
Packit Service c3aa71
Packit Service c3aa71
  # Adjust paths in mkdir.
Packit Service c3aa71
  s{(\$\(MKDIR_P\))\s*(\w+)}{$1 $prefix$2}g;
Packit Service c3aa71
Packit Service c3aa71
  return $_;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
# process ($IN)
Packit Service c3aa71
# -------------
Packit Service c3aa71
sub process ($)
Packit Service c3aa71
{
Packit Service c3aa71
  my ($file) = @_;
Packit Service c3aa71
  my ($bak) = "$file.bak";
Packit Service c3aa71
  rename ($file, $bak) or die "$ME: rename $file $bak failed: $!\n";
Packit Service c3aa71
  my $contents = contents ($bak);
Packit Service c3aa71
  $contents = prefix ($contents);
Packit Service c3aa71
  my $out = new IO::File(">$file")
Packit Service c3aa71
    or die "$ME: $file: failed to open for writing: $!\n";
Packit Service c3aa71
  print $out $contents;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
{
Packit Service c3aa71
  GetOptions
Packit Service c3aa71
    (
Packit Service c3aa71
     'lib-name=s' => \$lib_name,
Packit Service c3aa71
     help => sub { usage 0 },
Packit Service c3aa71
     version => sub { print "$ME version $VERSION\n"; exit },
Packit Service c3aa71
    ) or usage 1;
Packit Service c3aa71
Packit Service c3aa71
  my $fail = 0;
Packit Service c3aa71
  defined $lib_name
Packit Service c3aa71
    or (warn "$ME: no library name; use --lib-name=NAME\n"), $fail = 1;
Packit Service c3aa71
Packit Service c3aa71
  # There must be exactly one argument.
Packit Service c3aa71
  @ARGV == 0
Packit Service c3aa71
    and (warn "$ME: missing FILE argument\n"), $fail = 1;
Packit Service c3aa71
  1 < @ARGV
Packit Service c3aa71
    and (warn "$ME: too many arguments:\n", join ("\n", @ARGV), "\n"),
Packit Service c3aa71
      $fail = 1;
Packit Service c3aa71
  $fail
Packit Service c3aa71
    and usage 1;
Packit Service c3aa71
Packit Service c3aa71
  my $file = $ARGV[0];
Packit Service c3aa71
  $prefix = (dirname $file) . '/';
Packit Service c3aa71
  warn "prefix=$prefix\n";
Packit Service c3aa71
Packit Service c3aa71
  process $file;
Packit Service c3aa71
}
Packit Service c3aa71
Packit Service c3aa71
### Setup "GNU" style for perl-mode and cperl-mode.
Packit Service c3aa71
## Local Variables:
Packit Service c3aa71
## perl-indent-level: 2
Packit Service c3aa71
## perl-continued-statement-offset: 2
Packit Service c3aa71
## perl-continued-brace-offset: 0
Packit Service c3aa71
## perl-brace-offset: 0
Packit Service c3aa71
## perl-brace-imaginary-offset: 0
Packit Service c3aa71
## perl-label-offset: -2
Packit Service c3aa71
## cperl-indent-level: 2
Packit Service c3aa71
## cperl-brace-offset: 0
Packit Service c3aa71
## cperl-continued-brace-offset: 0
Packit Service c3aa71
## cperl-label-offset: -2
Packit Service c3aa71
## cperl-extra-newline-before-brace: t
Packit Service c3aa71
## cperl-merge-trailing-else: nil
Packit Service c3aa71
## cperl-continued-statement-offset: 2
Packit Service c3aa71
## eval: (add-hook 'write-file-hooks 'time-stamp)
Packit Service c3aa71
## time-stamp-start: "my $VERSION = '"
Packit Service c3aa71
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
Packit Service c3aa71
## time-stamp-time-zone: "UTC"
Packit Service c3aa71
## time-stamp-end: "'; # UTC"
Packit Service c3aa71
## End: