grub-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]