From 414e48faf73d99ea0242b13f3c22e64fb5adff64 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 21 Sep 2011 00:51:17 -0400 Subject: [PATCH] Rewrite Gnulib symbols to be in libcdecl's namespace. The gnulib symbols are not properly prefixed for libcdecl internal symbols (e.g. cdecl__blah). This *will* cause problems when statically linking against both libcdecl and another library that uses the same gnulib modules. Unfortunately, there's no simple way to determine what symbols need prefixing without compiling all the gnulib objects. The results can't be distributed either, because they depend on the configuration. So, limited to simple tools and portable make rules, we hack together a "new" config.h at build time that defines object-like macros to rewrite the symbols, carefully ensuring that header dependencies are correct. --- scripts/fix-gnulib.pl | 17 +++++++-- snippet/glconfig.mk | 82 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 snippet/glconfig.mk diff --git a/scripts/fix-gnulib.pl b/scripts/fix-gnulib.pl index 17163c7..b8185fa 100755 --- a/scripts/fix-gnulib.pl +++ b/scripts/fix-gnulib.pl @@ -174,9 +174,21 @@ if (defined $m4output) { open(M4OUT, '>', $m4output) or die "$m4output: $!\n"; - print M4OUT "dnl This file was generated by fix-gnulib.pl\n"; - print M4OUT "AC_DEFUN([$m4macro], [dnl\n"; + print M4OUT < $(@D)/.syms/$(*F).sym +$(gnulib_symfiles): $(gnulib_core_headers) + +clean-local: clean-glconfig +clean-glconfig: + @for sym in $(libgnu_la_SOURCES) $(EXTRA_libgnu_la_SOURCES); do \ + symdir=`expr "$$sym" : '\(.*/\)'`.syms; \ + if test -d "$$symdir"; then \ + echo "rm -rf $$symdir"; rm -rf "$$symdir"; \ + fi; \ + done +.PHONY: clean-glconfig + +# The config header requires compilation of all gnulib object files via the +# .glsym rule above. However, it cannot depend on those build products +# directly because those compilations will include this header if it exists, +# which is (by definition) out of date when this rule gets triggered. +# +# Thus, we delete the header, then perform a recursive make call to regenerate +# the header, which can in turn parallelize the required compilation. +# +# Also delete the phony symbol files so the build doesn't fail badly if they +# got created somehow (for instance by make -t). +$(GLCONFIG): $(top_builddir)/config.h $(gnulib_core_headers) + -$(AM_V_at) rm -f $(gnulib_symfiles) $@.tmp $@ + $(AM_V_at) $(MAKE) $(AM_MAKEFLAGS) glconfig-gen + $(AM_V_GEN) cat $(top_builddir)/config.h >> $@.tmp + $(AM_V_at) mv -f $@.tmp $@ +CLEANFILES += $(GLCONFIG) + +# The glconfig-gen target is intended only for use in recursive make +# invocations. +glconfig-gen: $(gnulib_symfiles) + $(AM_V_at) depfiles=; symfiles=; \ + for sym in $(gnulib_symfiles); do \ + symdir=`expr "$$sym" : '\(.*/\)'`; \ + symfile=`expr "$$sym" : '.*/\(.*\)' || printf '%s\n' "$$sym"`; \ + symbase=$$symdir.syms/`expr "$$symfile" : '\(.*\)\..*'`; \ + test -f "$$symbase.deps" && \ + depfiles="$$depfiles $$symbase.deps"; \ + symfiles="$$symfiles $$symbase.sym"; \ + done; \ + $(GLCAT) $$depfiles > @GLSRC@/$(DEPDIR)/glconfig.Ph && \ + $(GLCAT) $$symfiles | sed 's/.*/#define & $(GLSYM_PREFIX)&/' \ + > $(GLCONFIG).tmp +.PHONY: glconfig-gen + +@AMDEP_TRUE@@am__include@ @am__quote@@GLSRC@/$(DEPDIR)/glconfig.Ph@am__quote@ -- 2.43.0