diff options
author | Akim Demaille <demaille@gostai.com> | 2008-11-19 08:24:47 +0100 |
---|---|---|
committer | Akim Demaille <demaille@gostai.com> | 2008-11-19 08:24:47 +0100 |
commit | e41fa155de6f78df93b71b77956764abe439322a (patch) | |
tree | 85340316d499389dada6eecd902d830dc77197ba | |
parent | 1e0348079323bc0dcf023e60873c976c77ece418 (diff) | |
download | bison-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.am | 4 | ||||
-rwxr-xr-x | bootstrap | 1 | ||||
-rw-r--r-- | configure.ac | 9 | ||||
-rwxr-xr-x | etc/prefix-gnulib-mk | 150 | ||||
-rw-r--r-- | lib/local.mk (renamed from lib/Makefile.am) | 52 | ||||
-rw-r--r-- | src/local.mk | 2 |
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 @@ -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) |