]> git.draconx.ca Git - cdecl99.git/blobdiff - glconfig.mk
Rewrite Gnulib symbols to be in libcdecl's namespace.
[cdecl99.git] / glconfig.mk
diff --git a/glconfig.mk b/glconfig.mk
new file mode 100644 (file)
index 0000000..0673817
--- /dev/null
@@ -0,0 +1,82 @@
+# Copyright © 2011 Nick Bowler
+#
+# Automake fragment to generate a Gnulib config header to rewrite exported
+# symbols.  This fragment relies on the Gnulib makefile enhancements done by
+# fix-gnulib.pl.  Furthermore, the following additional changes may be
+# required:
+#
+#   * Add AUTOMAKE_OPTIONS = nostdinc to Makefile.am (or equivalent).
+#   * Ensure that -I$(top_builddir)/@GLSRC@ and -I$(top_builddir) are
+#     listed in AM_CPPFLAGS (in that order).
+#   * Pass the desired symbol prefix to DX_FIX_GNULIB in configure.ac.
+#
+# License WTFPL2: Do What The Fuck You Want To Public License, version 2.
+# This is free software: you are free to do what the fuck you want to.
+# There is NO WARRANTY, to the extent permitted by law.
+
+GLCONFIG = @GLSRC@/config.h
+GLCAT    = cat /dev/null
+
+GLSYM_V   = $(GLSYM_V_$(V))
+GLSYM_V_  = $(GLSYM_V_$(AM_DEFAULT_VERBOSITY))
+GLSYM_V_0 = @echo "  GLSYM " $<;
+
+gnulib_symfiles = $(gnulib_lt_objects:.lo=.glsym)
+gnulib_src_headers += $(GLCONFIG)
+
+# This suffix rule triggers symbol generation only on demand.  Dependencies are
+# not tracked directly, so it must remain phony and thus not create the target.
+.c.glsym:
+       $(GLSYM_V) $(MKDIR_P) $(@D)/.syms
+       $(AM_V_at) depfile=$(@D)/.syms/$(*F).deps \
+               source=$< object=$(GLCONFIG) $(CCDEPMODE) \
+               $(depcomp) $(COMPILE) -c -o $(@D)/.syms/$(*F).o $<
+       $(AM_V_at) $(SHELL) $(top_builddir)/exported.sh \
+               $(@D)/.syms/$(*F).o > $(@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@