]> git.saurik.com Git - bison.git/commitdiff
Convert lib/Makefile.am into lib/local.mk.
authorAkim Demaille <demaille@gostai.com>
Wed, 19 Nov 2008 07:24:47 +0000 (08:24 +0100)
committerAkim Demaille <demaille@gostai.com>
Wed, 26 Nov 2008 10:09:19 +0000 (11:09 +0100)
The real problem is rather gnulib.mk, which itself is extracted from a
Makefile.am that gnulib expects to the "recursive".  The tool
prefix-gnulib-mk converts such a gnulib.mk to be non-recursive.  Also,
some AC_SUBST variables need to be adjusted.

* etc/prefix-gnulib-mk: New.
* bootstrap (slurp): Use it to convert further gnulib.mk.
* lib/Makefile.am: Rename as...
* lib/local.mk: this.
Adjust to be prefixed.
* Makefile.am, configure.ac: Adjust.
* src/local.mk (AM_CPPFLAGS): Extend it, don't define it.

ChangeLog
Makefile.am
bootstrap
configure.ac
etc/prefix-gnulib-mk [new file with mode: 0755]
lib/Makefile.am [deleted file]
lib/local.mk [new file with mode: 0644]
src/local.mk

index 8aad420556ca47a7056c7473ea44386693fc9dd6..11eb7089b6e82cfddae36949e0f12fd27c21989d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2008-11-26  Akim Demaille  <demaille@gostai.com>
+
+       Convert lib/Makefile.am into lib/local.mk.
+       The real problem is rather gnulib.mk, which itself is extracted
+       from a Makefile.am that gnulib expects to the "recursive".  The
+       tool prefix-gnulib-mk converts such a gnulib.mk to be
+       non-recursive.  Also, some AC_SUBST variables need to be adjusted.
+
+       * etc/prefix-gnulib-mk: New.
+       * bootstrap (slurp): Use it to convert further gnulib.mk.
+       No longer try to avoid re-creation of lib/gnulib.mk as the changes
+       are deeper.
+       * lib/Makefile.am: Rename as...
+       * lib/local.mk: this.
+       Adjust to be prefixed.
+       * Makefile.am, configure.ac: Adjust.
+       * src/local.mk (AM_CPPFLAGS): Extend it, don't define it.
+
 2008-11-26  Akim Demaille  <demaille@gostai.com>
 
        s/_FLAGS/FLAGS/.
@@ -64,7 +82,7 @@
        Get rid of (yy)rhs and (yy)prhs.
        These tables are no longer needed in the parsers, and they don't seem to
        be useful.  They are not documented either.
-       
+
        * src/output.c (prepare_rules): Get rid of rhs and prhs.
        Adjust the computation of (yy)r2.
 
@@ -77,7 +95,7 @@
 
        Get rid of lalr1-split.cc.
        It was no longer maintainer.
-       
+
        * data/lalr1-split.cc: Remove.
        * etc/bench.pl.in (bench_fusion_parser): Remove.
        Adjust.
 
        Prefer TESTSUITE_FLAGS.
        TESTSUITEFLAGS is barely readable.
-       
+
        * tests/local.mk (TESTSUITE_FLAGS): Default to $(TESTSUITEFLAGS)
        for backward compatibility.
        Use the former instead of the latter.
        is available from the state stack.  This has two be benefits: two tables
        less in the parser (making it smaller), and a more consistent use of the
        three stacks which will help to fuse them.
-       
+
        * data/yacc.c (yyprhs, yyrhs): Remove.
        (YY_REDUCE_PRINT): Pass yyssp to yy_reduce_print.
        (yy_reduce_print): Take yyssp as argument.
        b4_tables_map.
        The point is to factor the generation of the tables across skeletons.
        This is language dependant.
-       
+
        * data/c.m4 (b4_comment_): New.
        Should be usable to define how to generate tables independently of
        the language.
        (Option Cross Key): Implement FIXME: listing directives also.
        * build-aux/cross-options.pl:  Read from <STDIN> rather than <>.
        (Short Option): Special case -d.  Put arguments inside @option.
-       (Bison Directive): Add column, automatically extracted from 
+       (Bison Directive): Add column, automatically extracted from
        src/scan-gram.l (actual name passed as the first argument)
        with special case for %define.
        * doc/local.mk (doc/cross-options.texi): Pass src/scan-gram.l
index d0243d3f24e5de87af6e0e192f2c03d022d8f83d..e977fd547f149122475ff69b6aedd2c7054e93e0 100644 (file)
@@ -17,7 +17,7 @@
 
 ACLOCAL_AMFLAGS = -I m4
 
-SUBDIRS = po runtime-po lib .
+SUBDIRS = po runtime-po .
 if BISON_CXX_WORKS
 SUBDIRS += examples/calc++
 endif
@@ -31,6 +31,7 @@ EXTRA_DIST = .prev-version .version \
   OChangeLog PACKAGING
 
 # Initialization before completion by local.mk's.
+AM_CPPFLAGS =
 BUILT_SOURCES =
 DISTCLEANFILES =
 MOSTLYCLEANFILES =
@@ -40,6 +41,7 @@ include djgpp/local.mk
 include doc/local.mk
 include etc/local.mk
 include examples/local.mk
+include lib/local.mk
 include src/local.mk
 include tests/local.mk
 
index dbeb0b8dbc02623d3637cff368198ae65fcc0eb1..0c136f62cf98166c4745218ff1428ad5594c87b1 100755 (executable)
--- a/bootstrap
+++ b/bootstrap
@@ -505,11 +505,10 @@ slurp() {
       if test $file = Makefile.am; then
        copied=$copied${sep}$gnulib_mk; sep=$nl
        remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
-       sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/$gnulib_mk || {
-         echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
-         rm -f $dir/$gnulib_mk &&
-         sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
-       }
+       echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..."
+       rm -f $dir/$gnulib_mk
+       sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
+        etc/prefix-gnulib-mk $dir/$gnulib_mk
       elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
           version_controlled_file $dir $file; then
        echo "$0: $dir/$file overrides $1/$dir/$file"
index 83d2e69d5970cd6e6a83a1060fa0009d2b0c7586..d70e00f890dc12bb0e01655f60950bcbf2a3f142 100644 (file)
@@ -80,7 +80,7 @@ AC_ARG_ENABLE([yacc],
 case $enable_yacc in
 yes)
   YACC_SCRIPT=src/yacc
-  YACC_LIBRARY=liby.a;;
+  YACC_LIBRARY=lib/liby.a;;
 *)
   YACC_SCRIPT=
   YACC_LIBRARY=;;
@@ -148,9 +148,14 @@ AC_SUBST([O0CXXFLAGS], [`echo $CXXFLAGS | sed 's/-O[[0-9]] *//'`])
 gt_JAVACOMP([1.3], [1.4])
 gt_JAVAEXEC
 
+AC_SUBST([gl_PREFIXED_LIBOBJS],
+         [$(echo "$gl_LIBOBJS" | sed -e 's, , lib/,g')])
+for ac_var in ERRNO_H GETOPT_H INTTYPES_H STDBOOL_H STDINT_H WCHAR_H WCTYPE_H
+do
+  eval "$ac_var=lib/\$$ac_var"
+done
 AC_CONFIG_FILES([Makefile
                 po/Makefile.in
                 examples/calc++/Makefile
-                lib/Makefile
                 doc/yacc.1])
 AC_OUTPUT
diff --git a/etc/prefix-gnulib-mk b/etc/prefix-gnulib-mk
new file mode 100755 (executable)
index 0000000..e7f8838
--- /dev/null
@@ -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:
diff --git a/lib/Makefile.am b/lib/Makefile.am
deleted file mode 100644 (file)
index 4ec82d9..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-# Make bison/lib.
-
-# Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-include gnulib.mk
-
-AM_CFLAGS = $(WARN_CFLAGS)
-
-# Implementation of bitsets.
-bitsets_sources = \
-  abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c       \
-  bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c     \
-  lbitset.h libiberty.h vbitset.c vbitset.h
-
-# Additional bitset operations.
-additional_bitsets_sources = \
-  bitsetv-print.h bitsetv-print.c
-
-# timevars, stolen from GCC.
-timevars_sources = \
-  timevar.h timevar.c timevar.def
-
-# Non-gnulib sources in Bison's internal library.
-libbison_a_SOURCES += \
-  get-errno.h get-errno.c \
-  subpipe.h subpipe.c \
-  $(bitsets_sources) $(additional_bitsets_sources) $(timevars_sources)
-
-# The Yacc compatibility library.
-lib_LIBRARIES = $(YACC_LIBRARY)
-EXTRA_LIBRARIES = liby.a
-liby_a_SOURCES = main.c yyerror.c
diff --git a/lib/local.mk b/lib/local.mk
new file mode 100644 (file)
index 0000000..7b12dcc
--- /dev/null
@@ -0,0 +1,61 @@
+# Make bison/lib.
+
+# Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008 Free Software
+# Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+include lib/gnulib.mk
+
+# Implementation of bitsets.
+lib_libbison_a_SOURCES +=                       \
+  lib/abitset.c                                 \
+  lib/abitset.h                                 \
+  lib/bbitset.h                                 \
+  lib/bitset.c                                  \
+  lib/bitset.h                                  \
+  lib/bitset_stats.c                            \
+  lib/bitset_stats.h                            \
+  lib/bitsetv.c                                 \
+  lib/bitsetv.h                                 \
+  lib/ebitset.c                                 \
+  lib/ebitset.h                                 \
+  lib/lbitset.c                                 \
+  lib/lbitset.h                                 \
+  lib/libiberty.h                               \
+  lib/vbitset.c                                 \
+  lib/vbitset.h
+
+# Additional bitset operations.
+lib_libbison_a_SOURCES +=                       \
+  lib/bitsetv-print.h                           \
+  lib/bitsetv-print.c
+
+# timevars, stolen from GCC.
+lib_libbison_a_SOURCES +=                       \
+  lib/timevar.h                                 \
+  lib/timevar.c                                 \
+  lib/timevar.def
+
+# Non-gnulib sources in Bison's internal library.
+lib_libbison_a_SOURCES +=                       \
+  lib/get-errno.h                               \
+  lib/get-errno.c                               \
+  lib/subpipe.h                                 \
+  lib/subpipe.c
+
+# The Yacc compatibility library.
+lib_LIBRARIES = $(YACC_LIBRARY)
+EXTRA_LIBRARIES = lib/liby.a
+lib_liby_a_SOURCES = lib/main.c lib/yyerror.c
index a19d70a199220b754c9fea16dea66316a2b188a2..9508749d73ed7cf76092566548df2dd68899711b 100644 (file)
@@ -16,7 +16,7 @@
 
 AUTOMAKE_OPTIONS = subdir-objects
 
-AM_CPPFLAGS = -I$(top_srcdir)/lib
+AM_CPPFLAGS += -I$(top_srcdir)/lib
 # Find builddir/src/scan-code.c etc.
 AM_CPPFLAGS += -I$(top_builddir)