1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-07-10 11:20:28 +02:00

[build] Overhaul <errno.h>, <signal.h> 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.
This commit is contained in:
Thien-Thi Nguyen 2010-07-22 13:59:12 +02:00
parent 12427934de
commit 648da03259
8 changed files with 53 additions and 72 deletions

View file

@ -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 <errno.h> or <signal.h>, 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

View file

@ -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"
}

View file

@ -1,9 +0,0 @@
/* this file is processed by gcc with special options to extract
a list of errno codes. */
#include <errno.h>
/*
Local Variables:
c-file-style: "gnu"
End:
*/

View file

@ -1,9 +0,0 @@
/* this file is processed by gcc with special options to extract
a list of signal numbers. */
#include <signal.h>
/*
Local Variables:
c-file-style: "gnu"
End:
*/

View file

@ -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"
}

View file

@ -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"
}