From 87e185aa2d2cfe18df7e89ddfd05b2dd262fe791 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 15 May 2017 19:54:42 -0700 Subject: protsym: don't refer to symbols excluded by config. The protsym.c generated file refers to symbol variables without regard for whether they actually exist. Some symbol variables are defined in source files whose object files are only linked in conditionally. * genprotsym.txr: Update the logic to scan the Makefile to determine which files are conditionally included, based on what makefile flag, which is related to a preprocessor symbol. Thus, with some hashes, for each symbolic variable we subsequently scan, we know whether it came from a file that is associated with a preprocessor symbol. We group the emitted material accordingly, placing the conditionally existent symbols into #if...#endif blocks. --- genprotsym.txr | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/genprotsym.txr b/genprotsym.txr index 7d9f8c2a..b343ce04 100644 --- a/genprotsym.txr +++ b/genprotsym.txr @@ -1,6 +1,24 @@ -@(next (open-files (glob "*.c"))) -@(collect :vars (sym)) -val @(coll)@{sym /[A-Za-z0-9_]+_[sk]/}@/[,;]/@(end) +@(bind prepro-sym @(hash :equal-based)) +@(bind file-of @(hash :equal-based)) +@(next "Makefile") +@(repeat) +@ (cases) +OBJS-$(have_@sym) += @file.o +@ (bind ppsym @(upcase-str `HAVE_@sym`)) +@ (or) +OBJS-$(@sym) += @file.o +@ (bind ppsym @(upcase-str `CONFIG_@sym`)) +@ (end) +@ (do (set [prepro-sym `@file.c`] ppsym)) +@(end) +@(next :list (glob "*.c")) +@(collect) +@file +@ (next file) +@ (collect :vars ((sym nil))) +val @(coll)@{sym /[A-Za-z0-9_]+_[sk]/}@/[,;]/@(do (set [file-of sym] file))@(end) +@ (end) +@ (flatten sym) @(end) @(next "lib.c") @(collect) @@ -9,7 +27,9 @@ val @(coll)@{sym /[A-Za-z0-9_]+_[sk]/}@/[,;]/@(end) @(end) @(flatten sym) -@(bind gsym @(tuples 5 (sort sym))) +@(bind pp-groups @[group-by [chain file-of prepro-sym] sym]) +@(bind gsym @[mapcar (opip sort (tuples 5)) (hash-values pp-groups)]) +@(bind gpp @(hash-keys pp-groups)) @(output "protsym.c") /* This file is generated by genprotsym.txr */ @@ -19,13 +39,21 @@ val @(coll)@{sym /[A-Za-z0-9_]+_[sk]/}@/[,;]/@(end) #include "config.h" #include "lib.h" -@ (repeat) +@ (repeat :vars (gpp)) +@ (if gpp `#if @gpp`) +@ (repeat) extern val @(rep)@gsym, @(last)@gsym;@(end) +@ (end) +@ (if gpp "#endif") @ (end) val *protected_sym[] = { -@ (repeat) +@ (repeat :vars (gpp)) +@ (if gpp `#if @gpp`) +@ (repeat) @(rep)&@gsym, @(last)&@gsym,@(end) +@ (end) +@ (if gpp "#endif") @ (end) convert(val *, 0) }; -- cgit v1.2.3