[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 1/3] Improve genmoddep.awk
From: |
Bean |
Subject: |
Re: [PATCH 1/3] Improve genmoddep.awk |
Date: |
Wed, 1 Jul 2009 11:44:17 +0800 |
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<address@hidden> 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 += address@hidden #{mod_obj} #{mod_src} #{pre_obj}
> #{objs_str} #{undsym}
> + "CLEANFILES += address@hidden #{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)
> address@hidden: #{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
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
>
--
Bean