mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-10-31 18:58:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.4 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") {
 | |
|     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;
 | |
| }
 | 
