From e41fa155de6f78df93b71b77956764abe439322a Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 19 Nov 2008 08:24:47 +0100 Subject: 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. * 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. --- Makefile.am | 4 +- bootstrap | 1 + configure.ac | 9 +++- etc/prefix-gnulib-mk | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/Makefile.am | 45 ---------------- lib/local.mk | 61 +++++++++++++++++++++ src/local.mk | 2 +- 7 files changed, 223 insertions(+), 49 deletions(-) create mode 100755 etc/prefix-gnulib-mk delete mode 100644 lib/Makefile.am create mode 100644 lib/local.mk 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/Makefile.am deleted file mode 100644 index 4ec82d94..00000000 --- a/lib/Makefile.am +++ /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 . - -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 index 00000000..f2529d29 --- /dev/null +++ b/lib/local.mk @@ -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 . + +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 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) -- cgit v1.2.1