Hi, Perhaps you could also take a look at my previous patch
[PATCH] Use symbol database to maintain module dependence It add a program grub-symdb to maintain symbol database and therefore eliminate def- and unf- files, it also allows incremental build. On Wed, Jul 1, 2009 at 8:35 AM, Pavel Roskin<pro...@gnu.org> wrote: > Avoid pipeline in its invocation. It's hard to get the result of a > pipeline reliably. Eliminate the need in "und-*" files by caching and > postprocessing undefined symbols. > > ChangeLog: > > * Makefile.in: Invoke genmoddep.awk without any pipelines. > Eliminate UNDSYMFILES. > * genmk.rb: Write undefined symbols to the same files as defined > symbols. > * genmoddep.awk: Process only files from the command line, > recognize defined symbols by the number of records. Save > undefined symbols in a table, process them later. Output to the > file specified by the MODDEP environment variable. Report all > undefined symbols. > --- > > Makefile.in | 6 ++---- > genmk.rb | 17 ++++++----------- > genmoddep.awk | 39 ++++++++++++++++++++++++--------------- > 3 files changed, 32 insertions(+), 30 deletions(-) > > diff --git a/Makefile.in b/Makefile.in > index f82566a..e6be9c4 100644 > --- a/Makefile.in > +++ b/Makefile.in > @@ -148,10 +148,8 @@ include $(srcdir)/conf/$(target_cpu)-$(platform).mk > > CLEANFILES += $(pkglib_DATA) $(pkgdata_DATA) > pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst parttool.lst > handler.lst > -moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep.awk > - cat $(DEFSYMFILES) /dev/null \ > - | $(AWK) -f $(srcdir)/genmoddep.awk $(UNDSYMFILES) > $@ \ > - || (rm -f $@; exit 1) > +moddep.lst: $(DEFSYMFILES) genmoddep.awk > + MODDEP=$@ $(AWK) -f $(srcdir)/genmoddep.awk $(DEFSYMFILES) > > command.lst: $(COMMANDFILES) > cat $^ /dev/null | sort > $@ > diff --git a/genmk.rb b/genmk.rb > index e3866c1..2883362 100644 > --- a/genmk.rb > +++ b/genmk.rb > @@ -110,17 +110,15 @@ class PModule > mod_src = 'mod-' + @name.suffix('c') > mod_obj = mod_src.suffix('o') > defsym = 'def-' + @name.suffix('lst') > - undsym = 'und-' + @name.suffix('lst') > mod_name = File.basename(@name, '.mod') > symbolic_name = mod_name.sub(/\.[^\.]*$/, '') > > - "CLEANFILES += #...@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} > #{undsym} > + "CLEANFILES += #...@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} > ifneq ($(#{prefix}_EXPORTS),no) > CLEANFILES += #{defsym} > DEFSYMFILES += #{defsym} > endif > MOSTLYCLEANFILES += #{deps_str} > -UNDSYMFILES += #{undsym} > > ifneq ($(TARGET_APPLE_CC),1) > �...@name}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF) > @@ -148,19 +146,16 @@ endif > sh $(srcdir)/genmodsrc.sh '#{mod_name}' $< > $@ || (rm -f $@; exit 1) > > ifneq ($(#{prefix}_EXPORTS),no) > -ifneq ($(TARGET_APPLE_CC),1) > #{defsym}: #{pre_obj} > - $(NM) -g --defined-only -P -p $< | sed 's/^\\([^ ]*\\).*/\\1 > #{mod_name}/' > $@ > + echo '#{mod_name}' > $@ > + $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ > +ifneq ($(TARGET_APPLE_CC),1) > + $(NM) -g --defined-only -P -p $< | sed 's/^\\([^ ]*\\).*/\\1 > #{mod_name}/' >> $@ > else > -#{defsym}: #{pre_obj} > - $(NM) -g -P -p $< | grep -E '^[a-zA-Z0-9_]* [TDS]' | sed 's/^\\([^ > ]*\\).*/\\1 #{mod_name}/' > $@ > + $(NM) -g -P -p $< | grep -E '^[a-zA-Z0-9_]* [TDS]' | sed 's/^\\([^ > ]*\\).*/\\1 #{mod_name}/' >> $@ > endif > endif > > -#{undsym}: #{pre_obj} > - echo '#{mod_name}' > $@ > - $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ > - > " + objs.collect_with_index do |obj, i| > src = sources[i] > fake_obj = File.basename(src).suffix('o') > diff --git a/genmoddep.awk b/genmoddep.awk > index f7f085e..db8e07e 100644 > --- a/genmoddep.awk > +++ b/genmoddep.awk > @@ -11,11 +11,14 @@ > # even the implied warranty of MERCHANTABILITY or FITNESS FOR A > # PARTICULAR PURPOSE. > > -# Read defined symbols from stdin. > -BEGIN { > - while (getline <"/dev/stdin") { > - symtab[$1] = $2 > - } > +# This program processes lists of defined and undefined symbols given on > +# the command line. The output filename is determined by the MODDEP > +# environment variable. > + > +# Each defined symbol is followed by the module name. > +NF == 2 { > + symtab[$1] = $2 > + next > } > > # The first line contains a module name. > @@ -25,19 +28,25 @@ FNR == 1 { > }; > > # The rest is undefined symbols. > -{ > - if ($1 in symtab) { > - modtab[module] = modtab[module] " " symtab[$1]; > - } > - else { > - printf "%s in %s is not defined\n", $1, module >"/dev/stderr"; > - error++; > - exit; > - } > +NF == 1 { > + undtab[$1] = undtab[$1] " " module > } > > # Output the result. > END { > + for (sym in undtab) { > + if (sym in symtab) { > + split(undtab[sym], mods, " "); > + for (i in mods) { > + modtab[mods[i]] = modtab[mods[i]] " " symtab[sym]; > + } > + } > + else { > + printf "Symbol \"%s\" is not defined in modules:%s\n", sym, > undtab[sym] >"/dev/stderr"; > + error = 1; > + } > + } > + > if (error == 1) > exit 1; > > @@ -57,6 +66,6 @@ END { > for (depmod in uniqmods) { > modlist = modlist " " depmod; > } > - printf "%s:%s\n", mod, modlist; > + printf "%s:%s\n", mod, modlist >ENVIRON["MODDEP"]; > } > } > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel > -- Bean _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel