mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-11-04 06:47:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
#! /usr/bin/awk -f
 | 
						|
#
 | 
						|
# Copyright (C) 2006  Free Software Foundation, Inc.
 | 
						|
#
 | 
						|
# This genmoddep.awk is free software; the author
 | 
						|
# gives unlimited permission to copy and/or distribute it,
 | 
						|
# with or without modifications, as long as this notice is preserved.
 | 
						|
#
 | 
						|
# This program is distributed in the hope that it will be useful,
 | 
						|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
 | 
						|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 | 
						|
# PARTICULAR PURPOSE.
 | 
						|
 | 
						|
# Read symbols' info from stdin.
 | 
						|
BEGIN {
 | 
						|
  error = 0
 | 
						|
}
 | 
						|
 | 
						|
{
 | 
						|
  if ($1 == "defined") {
 | 
						|
    if ($3 !~ /^\.refptr\./ && $3 in symtab) {
 | 
						|
      printf "%s in %s is duplicated in %s\n", $3, $2, symtab[$3] >"/dev/stderr";
 | 
						|
      error++;
 | 
						|
    }
 | 
						|
    symtab[$3] = $2;
 | 
						|
    modtab[$2] = "" modtab[$2]
 | 
						|
  } else if ($1 == "undefined") {
 | 
						|
    if ($3 in symtab)
 | 
						|
      modtab[$2] = modtab[$2] " " symtab[$3];
 | 
						|
    else if ($3 != "__gnu_local_gp" && $3 != "_gp_disp") {
 | 
						|
      printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr";
 | 
						|
      error++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    printf "error: %u: unrecognized input format\n", NR >"/dev/stderr";
 | 
						|
    error++;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
# Output the result.
 | 
						|
END {
 | 
						|
  if (error >= 1)
 | 
						|
    exit 1;
 | 
						|
 | 
						|
  total_depcount = 0
 | 
						|
 | 
						|
  for (mod in modtab) {
 | 
						|
    # Remove duplications.
 | 
						|
    split(modtab[mod], depmods, " ");
 | 
						|
    for (depmod in uniqmods) {
 | 
						|
      delete uniqmods[depmod];
 | 
						|
    }
 | 
						|
    for (i in depmods) {
 | 
						|
      depmod = depmods[i];
 | 
						|
      # Ignore kernel, as always loaded.
 | 
						|
      if (depmod != "kernel" && depmod != mod)
 | 
						|
	uniqmods[depmod] = 1;
 | 
						|
    }
 | 
						|
    modlist = ""
 | 
						|
    depcount[mod] = 0
 | 
						|
    for (depmod in uniqmods) {
 | 
						|
      modlist = modlist " " depmod;
 | 
						|
      inverse_dependencies[depmod] = inverse_dependencies[depmod] " " mod
 | 
						|
      depcount[mod]++
 | 
						|
      total_depcount++
 | 
						|
    }
 | 
						|
    if (mod == "all_video") {
 | 
						|
	continue;
 | 
						|
    }
 | 
						|
    printf "%s:%s\n", mod, modlist;
 | 
						|
  }
 | 
						|
 | 
						|
  # Check that we have no dependency circles
 | 
						|
  while (total_depcount != 0) {
 | 
						|
      something_done = 0
 | 
						|
      for (mod in depcount) {
 | 
						|
	  if (depcount[mod] == 0) {
 | 
						|
	      delete depcount[mod]
 | 
						|
	      split(inverse_dependencies[mod], inv_depmods, " ");
 | 
						|
	      for (ctr in inv_depmods) {
 | 
						|
		  depcount[inv_depmods[ctr]]--
 | 
						|
		  total_depcount--
 | 
						|
	      }
 | 
						|
	      delete inverse_dependencies[mod]
 | 
						|
	      something_done = 1
 | 
						|
	  }
 | 
						|
      }
 | 
						|
      if (something_done == 0) {
 | 
						|
	  for (mod in depcount) {
 | 
						|
	      circle = circle " " mod
 | 
						|
	  }
 | 
						|
	  printf "error: modules %s form a dependency circle\n", circle >"/dev/stderr";
 | 
						|
	  exit 1
 | 
						|
      }
 | 
						|
  }
 | 
						|
  modlist = ""
 | 
						|
  while (getline <"video.lst") {
 | 
						|
      modlist = modlist " " $1;
 | 
						|
  }
 | 
						|
  printf "all_video:%s\n", modlist;
 | 
						|
}
 |