summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <demaille@gostai.com>2008-11-19 08:24:47 +0100
committerAkim Demaille <demaille@gostai.com>2008-11-19 08:24:47 +0100
commite41fa155de6f78df93b71b77956764abe439322a (patch)
tree85340316d499389dada6eecd902d830dc77197ba
parent1e0348079323bc0dcf023e60873c976c77ece418 (diff)
downloadbison-candidates/lib-local-mk.tar.gz
Convert lib/Makefile.am into lib/local.mk.candidates/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. * 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.
-rw-r--r--Makefile.am4
-rwxr-xr-xbootstrap1
-rw-r--r--configure.ac9
-rwxr-xr-xetc/prefix-gnulib-mk150
-rw-r--r--lib/local.mk (renamed from lib/Makefile.am)52
-rw-r--r--src/local.mk2
6 files changed, 196 insertions, 22 deletions
diff --git a/Makefile.am b/Makefile.am
index d0243d3f..e977fd54 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
diff --git a/bootstrap b/bootstrap
index dbeb0b8d..099d9abf 100755
--- a/bootstrap
+++ b/bootstrap
@@ -509,6 +509,7 @@ slurp() {
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
diff --git a/configure.ac b/configure.ac
index 83d2e69d..d70e00f8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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
index 00000000..c2de53ae
--- /dev/null
+++ b/etc/prefix-gnulib-mk
@@ -0,0 +1,150 @@
+#! /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 ($_) = @_;
+ print STDERR "WORDS: {$_}\n";
+ 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/local.mk
index 4ec82d94..f2529d29 100644
--- a/lib/Makefile.am
+++ b/lib/local.mk
@@ -1,6 +1,7 @@
# Make bison/lib.
-# Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+# 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
@@ -15,31 +16,46 @@
# 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)
+include lib/gnulib.mk
# 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
+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.
-additional_bitsets_sources = \
- bitsetv-print.h bitsetv-print.c
+lib_libbison_a_SOURCES += \
+ lib/bitsetv-print.h \
+ lib/bitsetv-print.c
# timevars, stolen from GCC.
-timevars_sources = \
- timevar.h timevar.c timevar.def
+lib_libbison_a_SOURCES += \
+ lib/timevar.h \
+ lib/timevar.c \
+ lib/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)
+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 = liby.a
-liby_a_SOURCES = main.c yyerror.c
+EXTRA_LIBRARIES = lib/liby.a
+lib_liby_a_SOURCES = lib/main.c lib/yyerror.c
diff --git a/src/local.mk b/src/local.mk
index a19d70a1..9508749d 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -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)