From 648da032599d696c34c9ff2bf9cd1de27987b7a3 Mon Sep 17 00:00:00 2001 From: Thien-Thi Nguyen Date: Thu, 22 Jul 2010 13:59:12 +0200 Subject: [PATCH] [build] Overhaul , cpp symbol extraction/checking. * libguile/Makefile.am (BUILT_SOURCES): Delete cpp_err_symbols.c, cpp_sig_symbols.c; add cpp-E.c, cpp-SIG.c. (EXTRA_DIST): Delete cpp_signal.c, cpp_errno.c, cpp_err_symbols.in, cpp_err_symbols.c, cpp_sig_symbols.c, cpp_sig_symbols.in, cpp_cnvt.awk; add cpp-E.syms, cpp-E.c, cpp-SIG.syms, cpp-SIG.c. (error.x, posix.x): Update prereq list. (cpp_err_symbols.c, cpp_sig_symbols.c): Delete targets. (check_signals, check_errnos): Likewise. (.syms.c): New pattern rule. (chknew-E, chknew-SIG): New targets. (MOSTLYCLEANFILES): Delete cpp_err_symbols_here, cpp_err_symbols_diff, cpp_err_symbols_new, cpp_sig_symbols_here, cpp_sig_symbols_diff, cpp_sig_symbols_new. * libguile/cpp-E.syms: Rename from libguile/cpp_err_symbols.in. * libguile/cpp-SIG.syms: Rename from libguile/cpp_sig_symbols.in. * libguile/error.c (scm_init_error): #include "libguile/cpp-E.c". * libguile/posix.c (scm_init_posix): #include "libguile/cpp-SIG.c". * libguile/cpp_cnvt.awk: Delete file. * libguile/cpp_errno.c: Delete file. * libguile/cpp_signal.c: Delete file. --- libguile/Makefile.am | 96 ++++++++++--------- libguile/{cpp_err_symbols.in => cpp-E.syms} | 0 libguile/{cpp_sig_symbols.in => cpp-SIG.syms} | 0 libguile/cpp_cnvt.awk | 7 -- libguile/cpp_errno.c | 9 -- libguile/cpp_signal.c | 9 -- libguile/error.c | 2 +- libguile/posix.c | 2 +- 8 files changed, 53 insertions(+), 72 deletions(-) rename libguile/{cpp_err_symbols.in => cpp-E.syms} (100%) rename libguile/{cpp_sig_symbols.in => cpp-SIG.syms} (100%) delete mode 100644 libguile/cpp_cnvt.awk delete mode 100644 libguile/cpp_errno.c delete mode 100644 libguile/cpp_signal.c diff --git a/libguile/Makefile.am b/libguile/Makefile.am index 5eea8dc71..6a334731d 100644 --- a/libguile/Makefile.am +++ b/libguile/Makefile.am @@ -415,7 +415,7 @@ DOT_I_FILES = vm-i-system.i vm-i-scheme.i vm-i-loader.i .c.i: $(AM_V_GEN)$(GREP) '^VM_DEFINE' $< > $@ -BUILT_SOURCES = cpp_err_symbols.c cpp_sig_symbols.c libpath.h \ +BUILT_SOURCES = cpp-E.c cpp-SIG.c libpath.h \ version.h scmconfig.h \ $(DOT_I_FILES) $(DOT_X_FILES) $(EXTRA_DOT_X_FILES) @@ -596,9 +596,8 @@ bin_SCRIPTS = guile-snarf noinst_SCRIPTS = guile-doc-snarf guile-snarf-docs guile-func-name-check EXTRA_DIST = ChangeLog-scm ChangeLog-threads \ - ChangeLog-1996-1999 ChangeLog-2000 ChangeLog-2008 cpp_signal.c \ - cpp_errno.c cpp_err_symbols.in cpp_err_symbols.c \ - cpp_sig_symbols.c cpp_sig_symbols.in cpp_cnvt.awk \ + ChangeLog-1996-1999 ChangeLog-2000 ChangeLog-2008 \ + cpp-E.syms cpp-E.c cpp-SIG.syms cpp-SIG.c \ c-tokenize.lex version.h.in \ scmconfig.h.top libgettext.h unidata_to_charset.pl libguile.map # $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) \ @@ -674,8 +673,8 @@ $(DOT_X_FILES) $(EXTRA_DOT_X_FILES): scmconfig.h snarf.h guile-snarf.in $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES): scmconfig.h snarf.h guile-snarf-docs.in guile_filter_doc_snarfage$(EXEEXT) -error.x: cpp_err_symbols.c -posix.x: cpp_sig_symbols.c +error.x: cpp-E.c +posix.x: cpp-SIG.c load.x: libpath.h alldotdocfiles = $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) @@ -710,50 +709,57 @@ schemelib_DATA = guile-procedures.txt ## Add -MG to make the .x magic work with auto-dep code. MKDEP = gcc -M -MG $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) -cpp_err_symbols.c: cpp_err_symbols.in cpp_cnvt.awk - $(AWK) -f $(srcdir)/cpp_cnvt.awk < $(srcdir)/cpp_err_symbols.in > \ - cpp_err_symbols.tmp - mv cpp_err_symbols.tmp cpp_err_symbols.c + +# This page is for maintenance of the lists of CPP symbols that are eventually +# included in error.c (‘errno’ values: E*) and posix.c (signal names: SIG*), +# in the funcs scm_init_{error,posix}, respectively. +# +# The lists (files cpp-{E,SIG}.syms) are not included verbatim, but processed +# (via pattern rule ‘.syms.c’ below) so that each CPP symbol is transformed to +# fragment of #ifdef'd C code that defines a Scheme variable of the same name. +# The resulting files, cpp-{E,SIG}.c, are the ones #include:d. +# +# To maintain the (source) lists of symbols, we use a GCC-specific feature +# to list all symbols #define:d when expanding <{errno,signal}.h>, grep +# the output for {E,SIG}*, massage the result into a usable form, and +# construct a union of the current and new symbols. This is written to +# files cpp-{E,SIG}.syms.NEW for review. If things look ok, you can then +# "mv foo.NEW foo" and commit. Generating the foo.NEW files and showing +# an informative message is the job of targets chknew-{E,SIG}. -cpp_sig_symbols.c: cpp_sig_symbols.in cpp_cnvt.awk - $(AWK) -f $(srcdir)/cpp_cnvt.awk < $(srcdir)/cpp_sig_symbols.in > \ - cpp_sig_symbols.tmp - mv cpp_sig_symbols.tmp cpp_sig_symbols.c +# For each line in foo.syms, transform: +# SYMBOL +# to: +# #ifdef SYMBOL +# scm_c_define ("SYMBOL", scm_from_int (SYMBOL)); +# #endif +# writing output to foo.c. +.syms.c: + sed 's/.*/#ifdef &\nscm_c_define ("&", scm_from_int (&));\n#endif/' \ + $< > $@T + mv $@T $@ -## Create a new version of the cpp_sig_symbols.in file, including all SIGXXX -## macros defined on this platform. -check_signals: - gcc -undef -dM -E $(srcdir)/cpp_signal.c | $(EGREP) ' SIG[A-Z]+' \ - | cut -f2 -d' ' | sort > cpp_sig_symbols_here - diff -u $(srcdir)/cpp_sig_symbols.in cpp_sig_symbols_here \ - | $(EGREP) '^\+S' \ - | cut -c2- > cpp_sig_symbols_diff - if test -s cpp_sig_symbols_diff ; then \ - cat $(srcdir)/cpp_sig_symbols.in cpp_sig_symbols_diff \ - | sort > cpp_sig_symbols_new ;\ - echo "cpp_sig_symbols_new has the following additions:" ;\ - cat cpp_sig_symbols_diff ;\ - else echo "No new symbols found."; \ - fi +# Write $(srcdir)/cpp-{E,SIG}.syms.NEW if there are any not-yet-seen +# ("new" to us) E* or SIG* symbols in or , respectively. +chknew-E chknew-SIG: + @bit=`echo $@ | sed s/^chknew-//` ; \ + old="$(srcdir)/cpp-$$bit.syms" ; \ + echo "#include <$${bit}.h>" \ + | sed 's/E/errno/;s/SIG/signal/' \ + | gcc -undef -dM -E - \ + | sed 's/^#define //;/^'$$bit'[A-Z][A-Z]*/!d;s/ .*//' \ + | sort | diff -u $$old - | sed '1,2d;/^+/!d;s/^.//' \ + > TMP ; \ + if [ -s TMP ] ; then new="$$old.NEW" ; \ + cat $$old TMP | sort > $$new ; \ + echo "$$new: `sed -n '$$=' TMP` new symbol(s)." ; \ + sed 's/^/ /' TMP ; \ + else echo "No new symbols found." ; \ + fi ; rm TMP -## Likewise for cpp_err_symbols.in. -check_errnos: - gcc -undef -dM -E $(srcdir)/cpp_errno.c | $(EGREP) ' E.+' \ - | cut -f2 -d' ' | sort > cpp_err_symbols_here - diff -u $(srcdir)/cpp_err_symbols.in cpp_err_symbols_here \ - | $(EGREP) '^\+E' \ - | cut -c2- > cpp_err_symbols_diff - if test -s cpp_err_symbols_diff ; then \ - cat $(srcdir)/cpp_err_symbols.in cpp_err_symbols_diff \ - | sort > cpp_err_symbols_new ;\ - echo "cpp_err_symbols_new has the following additions:" ;\ - cat cpp_err_symbols_diff ;\ - else echo "No new symbols found."; \ - fi + MOSTLYCLEANFILES = \ - cpp_err_symbols_here cpp_err_symbols_diff cpp_err_symbols_new \ - cpp_sig_symbols_here cpp_sig_symbols_diff cpp_sig_symbols_new \ version.h version.h.tmp \ scmconfig.h scmconfig.h.tmp diff --git a/libguile/cpp_err_symbols.in b/libguile/cpp-E.syms similarity index 100% rename from libguile/cpp_err_symbols.in rename to libguile/cpp-E.syms diff --git a/libguile/cpp_sig_symbols.in b/libguile/cpp-SIG.syms similarity index 100% rename from libguile/cpp_sig_symbols.in rename to libguile/cpp-SIG.syms diff --git a/libguile/cpp_cnvt.awk b/libguile/cpp_cnvt.awk deleted file mode 100644 index 1e6c09436..000000000 --- a/libguile/cpp_cnvt.awk +++ /dev/null @@ -1,7 +0,0 @@ -# Converts a list of symbols into C expressions which define the symbols -# in Guile. -{ -print "#ifdef " $0; -print "scm_c_define (\""$0"\", scm_from_int ("$0"));"; -print "#endif" -} diff --git a/libguile/cpp_errno.c b/libguile/cpp_errno.c deleted file mode 100644 index 32556a36c..000000000 --- a/libguile/cpp_errno.c +++ /dev/null @@ -1,9 +0,0 @@ -/* this file is processed by gcc with special options to extract - a list of errno codes. */ -#include - -/* - Local Variables: - c-file-style: "gnu" - End: -*/ diff --git a/libguile/cpp_signal.c b/libguile/cpp_signal.c deleted file mode 100644 index e740ba564..000000000 --- a/libguile/cpp_signal.c +++ /dev/null @@ -1,9 +0,0 @@ -/* this file is processed by gcc with special options to extract - a list of signal numbers. */ -#include - -/* - Local Variables: - c-file-style: "gnu" - End: -*/ diff --git a/libguile/error.c b/libguile/error.c index bcbcd9cd1..a582c8601 100644 --- a/libguile/error.c +++ b/libguile/error.c @@ -285,7 +285,7 @@ scm_misc_error (const char *subr, const char *message, SCM args) void scm_init_error () { -#include "libguile/cpp_err_symbols.c" +#include "libguile/cpp-E.c" #include "libguile/error.x" } diff --git a/libguile/posix.c b/libguile/posix.c index 627647824..a28cfa3a0 100644 --- a/libguile/posix.c +++ b/libguile/posix.c @@ -2195,7 +2195,7 @@ scm_init_posix () scm_c_define ("LOCK_NB", scm_from_int (LOCK_NB)); #endif -#include "libguile/cpp_sig_symbols.c" +#include "libguile/cpp-SIG.c" #include "libguile/posix.x" }