grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Generating init and fini functions


From: Marco Gerards
Subject: Generating init and fini functions
Date: Wed, 09 Nov 2005 00:18:09 +0100
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

Hi,

At the moment I am working on things that irritate me while I am
working on GRUB.  One thing is writing a duplicate _init and _fini
function (duplicate because it already is added in GRUB_MOD_INIT).
And another thing that irritates me is that I have to add a init line
to grub-emu.

Here is a patch that solves that.  First I removed all the init and
fini functions and let GRUB_MOD_INIT and GRUB_MOD_FINI generate these
functions.  I have added a script that creates a header file with all
the function prototypes for these generated functions.  And finally I
have added a script that can generate a C file with the functions
`grub_init_all' and `grub_fini_all'.

Example:

grub_emu_SOURCES = commands/ls.c fs/ext2.c

When you pass grub_emu_SOURCES to the script, it will generate:

void
grub_init_all (void)
{
  grub_ls_init ();
  grub_ext2_init ();
}

void
grub_fini_all (void)
{
  grub_ls_fini ();
  grub_ext2_fini ();
}

So the routines generated depend on the files you add to the
_SOURCES.  In grub-emu.c I removed all the calls to the init functions
and added grub_init_all.  The same can be done for grub-fsprobe, etc.
In that way it will be less work to add a new module and a lot
easier.  And important for me: less to forget. :-)

Please have a close look at my shellscripts.  As you can see I never
use shellscripting. :-)

If I don't hear any comments, I'll commit this patch on Saturday or
so.  It should be an easy patch to proofread since most stuff is just
removing things that are not relevant anymore.

Thanks,
Marco

2005-11-09  Marco Gerards  <address@hidden>

        * geninit.sh: New file.

        * geninitheader.sh: Likewise.

        * commands/boot.c (grub_boot_init, grub_boot_fini): Removed.
        * commands/cat.c (grub_cat_init, grub_cat_fini): Likewise.
        * commands/cmp.c (grub_cmp_init, grub_cmp_fini): Likewise.
        * commands/configfile.c (grub_configfile_init)
        (grub_configfile_fini): Likewise.
        * commands/default.c (grub_default_init, grub_default_fini):
        Likewise.
        * commands/help.c (grub_help_init, grub_help_fini): Likewise.
        * commands/ls.c (grub_ls_init, grub_ls_fini): Likewise.
        * commands/search.c (grub_search_init, grub_search_fini): Likewise.
        * commands/terminal.c (grub_terminal_init, grub_terminal_fini):
        Likewise.
        * commands/test.c (grub_test_init, grub_test_fini): Likewise.
        * commands/timeout.c (grub_timeout_init, grub_timeout_fini):
        Likewise.
        * commands/i386/pc/halt.c (grub_halt_init, grub_halt_fini): Likewise.
        * commands/i386/pc/reboot.c (grub_reboot_init, grub_reboot_fini):
        Likewise.
        * disk/loopback.c (grub_loop_init, grub_loop_fini): Likewise.
        * fs/affs.c (grub_affs_init, grub_affs_fini): Likewise.
        * fs/ext2.c (grub_ext2_init, grub_ext2_fini): Likewise.
        * fs/fat.c (grub_fat_init, grub_fat_fini): Likewise.
        * fs/hfs.c (grub_hfs_init, grub_hfs_fini): Likewise.
        * fs/iso9660.c (grub_iso9660_init, grub_iso9660_fini): Likewise.
        * fs/jfs.c (grub_jfs_init, grub_jfs_fini): Likewise.
        * fs/minix.c (grub_minix_init, grub_minix_fini): Likewise.
        * fs/sfs.c (grub_sfs_init, grub_sfs_fini): Likewise.
        * fs/ufs.c (grub_ufs_init, grub_ufs_fini): Likewise.
        * fs/xfs.c (grub_xfs_init, grub_xfs_fini): Likewise.
        * normal/main.c (grub_normal_init, grub_normal_fini): Likewise.
        * partmap/amiga.c (grub_amiga_partition_map_init)
        (grub_amiga_partition_map_fini): Likewise.
        * partmap/apple.c (grub_apple_partition_map_init)
        (grub_apple_partition_map_fini): Likewise.
        * partmap/pc.c (grub_pc_partition_map_init)
        (grub_pc_partition_map_fini): Likewise.
        * partmap/sun.c (grub_sun_partition_map_init,
        grub_sun_partition_map_fini): Likewise.
        * term/terminfo.c (grub_terminal_init, grub_terminal_fini):
        Likewise.

        * util/grub-emu.c: Include <grub_modules_init.h>.
        (main): Don't initialize and de-initialize any modules directly,
        use `grub_init_all' and `grub_fini_all' instead.

        * term/i386/pc/vesafb.c (grub_vesafb_init): Renamed to
        `grub_vesafb_mod_init'.
        (grub_vesafb_fini): Renamed to `grub_vesafb_mod_fini'.  Updated
        all users.
        * term/i386/pc/vga.c (grub_vga_init): Renamed to
        `grub_vga_mod_init'.  Updated all users.
        (grub_vga_fini): Renamed to `grub_vga_mod_fini'.
        
        * conf/i386-pc.rmk (grub_emu_SOURCES): Add `grub_emu_init.c'.
        (grub_modules_init.lst, grub_modules_init.h, grub_emu_init.c): New
        rules.

        * include/grub/dl.h (GRUB_MOD_INIT): Add argument `name'.
        Generate a function to initialize the module in utilities.
        Updated all callers.
        (GRUB_MOD_FINI): Add argument `name'.  Generate a function to
        initialize the module in utilities.  Updated all callers.




Index: geninit.sh
===================================================================
RCS file: geninit.sh
diff -N geninit.sh
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ geninit.sh  8 Nov 2005 22:35:59 -0000
@@ -0,0 +1,70 @@
+#! /bin/sh
+#
+# Copyright (C) 2002, 2005  Free Software Foundation, Inc.
+#
+# This gensymlist.sh 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.
+
+cat <<EOF
+/* This file is automatically generated by gensymlist.sh. DO NOT EDIT! */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2002  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub_modules_init.h>
+
+EOF
+
+cat <<EOF
+void
+grub_init_all (void)
+{
+EOF
+(
+  cat grub_modules_init.lst
+  for i in $*; do
+    echo $i':'
+  done
+) | sort -r | uniq -d -W1 -t':' | sed -n '/GRUB_MOD_INIT 
*([a-zA-Z0-9_]*)/{s/.*GRUB_MOD_INIT *(\([a-zA-Z0-9_]*\)).*/  grub_\1_init 
();/;p;}'
+
+cat <<EOF
+}
+EOF
+
+cat <<EOF
+void
+grub_fini_all (void)
+{
+EOF
+
+(
+  cat grub_modules_init.lst
+  for i in $*; do
+    echo $i':'
+  done
+) | sort -r | uniq -d -W1 -t':' | sed -n '/GRUB_MOD_INIT 
*([a-zA-Z0-9_]*)/{s/.*GRUB_MOD_INIT *(\([a-zA-Z0-9_]*\)).*/  grub_\1_fini 
();/;p;}'
+
+cat <<EOF
+}
+EOF
Index: geninitheader.sh
===================================================================
RCS file: geninitheader.sh
diff -N geninitheader.sh
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ geninitheader.sh    8 Nov 2005 22:35:59 -0000
@@ -0,0 +1,43 @@
+#! /bin/sh
+#
+# Copyright (C) 2005  Free Software Foundation, Inc.
+#
+# This gensymlist.sh 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.
+
+cat <<EOF
+/* This file is automatically generated by gensymlist.sh. DO NOT EDIT! */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2002  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+EOF
+
+cat <<EOF
+void grub_init_all (void);
+void grub_fini_all (void);
+EOF
+
+cat grub_modules_init.lst | grep -v '^#' | sed -n '/GRUB_MOD_INIT 
*([a-zA-Z0-9_]*)/{s/.*GRUB_MOD_INIT *(\([a-zA-Z0-9_]*\)).*/void grub_\1_init 
(void);/;p;}'
+cat grub_modules_init.lst | grep -v '^#' | sed -n '/GRUB_MOD_INIT 
*([a-zA-Z0-9_]*)/{s/.*GRUB_MOD_INIT *(\([a-zA-Z0-9_]*\)).*/void grub_\1_fini 
(void);/;p;}'
Index: commands/boot.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/boot.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 boot.c
--- commands/boot.c     17 Jul 2005 20:26:07 -0000      1.5
+++ commands/boot.c     8 Nov 2005 22:35:59 -0000
@@ -38,29 +38,14 @@ grub_cmd_boot (struct grub_arg_list *sta
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_boot_init (void)
-{
-  grub_register_command ("boot", grub_cmd_boot, GRUB_COMMAND_FLAG_BOTH,
-                        "boot", "Boot an operating system.", 0);
-}
-
-void
-grub_boot_fini (void)
-{
-  grub_unregister_command ("boot");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(boot)
 {
   (void) mod;                  /* To stop warning. */
   grub_register_command ("boot", grub_cmd_boot, GRUB_COMMAND_FLAG_BOTH,
                         "boot", "Boot an operating system.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(boot)
 {
   grub_unregister_command ("boot");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/cat.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/cat.c,v
retrieving revision 1.4
diff -u -p -u -p -r1.4 cat.c
--- commands/cat.c      22 Aug 2005 17:28:59 -0000      1.4
+++ commands/cat.c      8 Nov 2005 22:35:59 -0000
@@ -70,29 +70,14 @@ grub_cmd_cat (struct grub_arg_list *stat
 }
 
 
-#ifdef GRUB_UTIL
-void
-grub_cat_init (void)
-{
-  grub_register_command ("cat", grub_cmd_cat, GRUB_COMMAND_FLAG_BOTH,
-                        "cat FILE", "Show the contents of a file.", 0);
-}
-
-void
-grub_cat_fini (void)
-{
-  grub_unregister_command ("cat");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(cat)
 {
   (void) mod;                  /* To stop warning. */
   grub_register_command ("cat", grub_cmd_cat, GRUB_COMMAND_FLAG_BOTH,
                         "cat FILE", "Show the contents of a file.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(cat)
 {
   grub_unregister_command ("cat");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/cmp.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/cmp.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 cmp.c
--- commands/cmp.c      22 Aug 2005 17:28:59 -0000      1.5
+++ commands/cmp.c      8 Nov 2005 22:35:59 -0000
@@ -102,29 +102,14 @@ cleanup:
 }
 
 
-#ifdef GRUB_UTIL
-void
-grub_cmp_init (void)
-{
-  grub_register_command ("cmp", grub_cmd_cmp, GRUB_COMMAND_FLAG_BOTH,
-                        "cmp FILE1 FILE2", "Compare two files.", 0);
-}
-
-void
-grub_cmp_fini (void)
-{
-  grub_unregister_command ("cmp");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(cmp)
 {
   (void) mod;                  /* To stop warning. */
   grub_register_command ("cmp", grub_cmd_cmp, GRUB_COMMAND_FLAG_BOTH,
                         "cmp FILE1 FILE2", "Compare two files.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(cmp)
 {
   grub_unregister_command ("cmp");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/configfile.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/configfile.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 configfile.c
--- commands/configfile.c       17 Jul 2005 20:26:07 -0000      1.2
+++ commands/configfile.c       8 Nov 2005 22:35:59 -0000
@@ -39,22 +39,7 @@ grub_cmd_configfile (struct grub_arg_lis
 }
 
 
-#ifdef GRUB_UTIL
-void
-grub_configfile_init (void)
-{
-  grub_register_command ("configfile", grub_cmd_configfile,
-                        GRUB_COMMAND_FLAG_BOTH, "configfile FILE",
-                        "Load another config file.", 0);
-}
-
-void
-grub_configfile_fini (void)
-{
-  grub_unregister_command ("configfile");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(configfile)
 {
   (void) mod;                   /* To stop warning. */
   grub_register_command ("configfile", grub_cmd_configfile,
@@ -62,8 +47,7 @@ GRUB_MOD_INIT
                         "Load another config file.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(configfile)
 {
   grub_unregister_command ("configfile");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/default.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/default.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 default.c
--- commands/default.c  27 Feb 2005 21:19:05 -0000      1.1
+++ commands/default.c  8 Nov 2005 22:35:59 -0000
@@ -44,29 +44,14 @@ grub_cmd_default (struct grub_arg_list *
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_default_init (void)
-{
-  grub_register_command ("default", grub_cmd_default, GRUB_COMMAND_FLAG_MENU,
-                        "default ENTRY", "Set the default entry", 0);
-}
-
-void
-grub_default_fini (void)
-{
-  grub_unregister_command ("default");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(default)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("default", grub_cmd_default, GRUB_COMMAND_FLAG_MENU,
                         "default ENTRY", "Set the default entry", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(default)
 {
   grub_unregister_command ("default");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/help.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/help.c,v
retrieving revision 1.4
diff -u -p -u -p -r1.4 help.c
--- commands/help.c     17 Jul 2005 20:26:07 -0000      1.4
+++ commands/help.c     8 Nov 2005 22:35:59 -0000
@@ -94,29 +94,14 @@ grub_cmd_help (struct grub_arg_list *sta
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_help_init (void)
-{
-  grub_register_command ("help", grub_cmd_help, GRUB_COMMAND_FLAG_CMDLINE,
-                        "help [PATTERN ...]", "Show a help message.", 0);
-}
-
-void
-grub_help_fini (void)
-{
-  grub_unregister_command ("help");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(help)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("help", grub_cmd_help, GRUB_COMMAND_FLAG_CMDLINE,
                         "help [PATTERN ...]", "Show a help message.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(help)
 {
   grub_unregister_command ("help");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/ls.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/ls.c,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 ls.c
--- commands/ls.c       28 Oct 2005 03:14:32 -0000      1.12
+++ commands/ls.c       8 Nov 2005 22:35:59 -0000
@@ -228,22 +228,7 @@ grub_cmd_ls (struct grub_arg_list *state
   return 0;
 }
 
-#ifdef GRUB_UTIL
-void
-grub_ls_init (void)
-{
-  grub_register_command ("ls", grub_cmd_ls, GRUB_COMMAND_FLAG_BOTH,
-                        "ls [-l|-h|-a] [FILE]",
-                        "List devices and files.", options);
-}
-
-void
-grub_ls_fini (void)
-{
-  grub_unregister_command ("ls");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(ls)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("ls", grub_cmd_ls, GRUB_COMMAND_FLAG_BOTH,
@@ -251,8 +236,7 @@ GRUB_MOD_INIT
                         "List devices and files.", options);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(ls)
 {
   grub_unregister_command ("ls");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/search.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/search.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 search.c
--- commands/search.c   20 Aug 2005 07:49:01 -0000      1.1
+++ commands/search.c   8 Nov 2005 22:35:59 -0000
@@ -148,26 +148,7 @@ grub_cmd_search (struct grub_arg_list *s
   return grub_errno;
 }
 
-#ifdef GRUB_UTIL
-void
-grub_search_init (void)
-{
-  grub_register_command ("search", grub_cmd_search, GRUB_COMMAND_FLAG_BOTH,
-                        "search [-f|-l|-s] NAME",
-                        "Search devices by a file or a filesystem label."
-                        " If --set is specified, the first device found is"
-                        " set to a variable. If no variable name is"
-                        " specified, \"root\" is used.",
-                        options);
-}
-
-void
-grub_search_fini (void)
-{
-  grub_unregister_command ("search");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(search)
 {
   (void) mod;                  /* To stop warning. */
   grub_register_command ("search", grub_cmd_search, GRUB_COMMAND_FLAG_BOTH,
@@ -179,8 +160,7 @@ GRUB_MOD_INIT
                         options);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(search)
 {
   grub_unregister_command ("search");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/terminal.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/terminal.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 terminal.c
--- commands/terminal.c 4 Apr 2004 13:46:00 -0000       1.2
+++ commands/terminal.c 8 Nov 2005 22:35:59 -0000
@@ -71,29 +71,14 @@ grub_cmd_terminal (struct grub_arg_list 
 }
 
 
-#ifdef GRUB_UTIL
-void
-grub_terminal_init (void)
-{
-  grub_register_command ("terminal", grub_cmd_terminal, GRUB_COMMAND_FLAG_BOTH,
-                        "terminal [TERM...]", "Select a terminal.", 0);
-}
-
-void
-grub_terminal_fini (void)
-{
-  grub_unregister_command ("terminal");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(terminal)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("terminal", grub_cmd_terminal, GRUB_COMMAND_FLAG_BOTH,
                         "terminal [TERM...]", "Select a terminal.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(terminal)
 {
   grub_unregister_command ("terminal");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/test.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/test.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 test.c
--- commands/test.c     6 Nov 2005 22:19:58 -0000       1.1
+++ commands/test.c     8 Nov 2005 22:35:59 -0000
@@ -55,24 +55,7 @@ grub_cmd_test (struct grub_arg_list *sta
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_test_init (void)
-{
-  grub_register_command ("[", grub_cmd_test, GRUB_COMMAND_FLAG_CMDLINE,
-                        "[ EXPRESSION ]", "Evaluate an expression", 0);
-  grub_register_command ("test", grub_cmd_test, GRUB_COMMAND_FLAG_CMDLINE,
-                        "test EXPRESSION", "Evaluate an expression", 0);
-}
-
-void
-grub_test_fini (void)
-{
-  grub_unregister_command ("[");
-  grub_unregister_command ("test");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(test)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("[", grub_cmd_test, GRUB_COMMAND_FLAG_CMDLINE,
@@ -81,9 +64,8 @@ GRUB_MOD_INIT
                         "test EXPRESSION", "Evaluate an expression", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(test)
 {
   grub_unregister_command ("[");
   grub_unregister_command ("test");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/timeout.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/timeout.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 timeout.c
--- commands/timeout.c  27 Feb 2005 21:19:05 -0000      1.1
+++ commands/timeout.c  8 Nov 2005 22:35:59 -0000
@@ -42,29 +42,14 @@ grub_cmd_timeout (struct grub_arg_list *
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_timeout_init (void)
-{
-  grub_register_command ("timeout", grub_cmd_timeout, GRUB_COMMAND_FLAG_MENU,
-                        "timeout SECS", "Set the timeout", 0);
-}
-
-void
-grub_timeout_fini (void)
-{
-  grub_unregister_command ("timeout");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(timeout)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("timeout", grub_cmd_timeout, GRUB_COMMAND_FLAG_MENU,
                         "timeout SECS", "Set the timeout", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(timeout)
 {
   grub_unregister_command ("timeout");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/i386/pc/halt.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/i386/pc/halt.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 halt.c
--- commands/i386/pc/halt.c     17 Jul 2005 20:26:07 -0000      1.2
+++ commands/i386/pc/halt.c     8 Nov 2005 22:35:59 -0000
@@ -44,22 +44,7 @@ grub_cmd_halt (struct grub_arg_list *sta
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_halt_init (void)
-{
-  grub_register_command ("halt", grub_cmd_halt, GRUB_COMMAND_FLAG_BOTH,
-                        "halt [OPTIONS...]",
-                        "Halt the system, if possible using APM", options);
-}
-
-void
-grub_halt_fini (void)
-{
-  grub_unregister_command ("halt");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(halt)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("halt", grub_cmd_halt, GRUB_COMMAND_FLAG_BOTH,
@@ -67,8 +52,7 @@ GRUB_MOD_INIT
                         "Halt the system, if possible using APM", options);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(halt)
 {
   grub_unregister_command ("halt");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/i386/pc/reboot.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/i386/pc/reboot.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 reboot.c
--- commands/i386/pc/reboot.c   17 Jul 2005 20:26:07 -0000      1.2
+++ commands/i386/pc/reboot.c   8 Nov 2005 22:35:59 -0000
@@ -35,29 +35,14 @@ grub_cmd_reboot (struct grub_arg_list *s
 
 
 
-#ifdef GRUB_UTIL
-void
-grub_reboot_init (void)
-{
-  grub_register_command ("reboot", grub_cmd_reboot, GRUB_COMMAND_FLAG_BOTH,
-                        "reboot", "Reboot the computer.", 0);
-}
-
-void
-grub_reboot_fini (void)
-{
-  grub_unregister_command ("reboot");
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(reboot)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("reboot", grub_cmd_reboot, GRUB_COMMAND_FLAG_BOTH,
                         "reboot", "Reboot the computer", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(reboot)
 {
   grub_unregister_command ("reboot");
 }
-#endif /* ! GRUB_UTIL */
Index: commands/i386/pc/vbeinfo.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/i386/pc/vbeinfo.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 vbeinfo.c
--- commands/i386/pc/vbeinfo.c  19 Aug 2005 00:32:00 -0000      1.1
+++ commands/i386/pc/vbeinfo.c  8 Nov 2005 22:35:59 -0000
@@ -146,7 +146,7 @@ grub_cmd_vbeinfo (struct grub_arg_list *
   return 0;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(vbeinfo)
 {
   (void) mod;                  /* To stop warning.  */
   grub_register_command ("vbeinfo",
@@ -157,7 +157,7 @@ GRUB_MOD_INIT
                          0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(vbeinfo)
 {
   grub_unregister_command ("vbeinfo");
 }
Index: commands/i386/pc/vbetest.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/i386/pc/vbetest.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 vbetest.c
--- commands/i386/pc/vbetest.c  19 Aug 2005 00:32:00 -0000      1.1
+++ commands/i386/pc/vbetest.c  8 Nov 2005 22:35:59 -0000
@@ -163,7 +163,7 @@ grub_cmd_vbetest (struct grub_arg_list *
   return grub_errno;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(vbetest)
 {
   (void) mod;                  /* To stop warning.  */
   grub_register_command ("vbetest",
@@ -174,7 +174,7 @@ GRUB_MOD_INIT
                          0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(vbetest)
 {
   grub_unregister_command ("vbetest");
 }
Index: conf/i386-pc.rmk
===================================================================
RCS file: /cvsroot/grub/grub2/conf/i386-pc.rmk,v
retrieving revision 1.51
diff -u -p -u -p -r1.51 i386-pc.rmk
--- conf/i386-pc.rmk    6 Nov 2005 22:19:59 -0000       1.51
+++ conf/i386-pc.rmk    8 Nov 2005 22:35:59 -0000
@@ -85,7 +85,7 @@ grub_probefs_SOURCES = util/i386/pc/grub
        fs/xfs.c fs/affs.c fs/sfs.c
 
 # For grub-emu.
-grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c       \
+grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c               
\
        commands/configfile.c commands/default.c commands/help.c        \
        commands/terminal.c commands/ls.c commands/test.c               \
        commands/search.c commands/timeout.c                            \
@@ -104,9 +104,18 @@ grub_emu_SOURCES = commands/boot.c comma
        partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c      \
        util/console.c util/grub-emu.c util/misc.c                      \
        util/i386/pc/biosdisk.c util/i386/pc/getroot.c                  \
-       util/i386/pc/misc.c
+       util/i386/pc/misc.c grub_emu_init.c
 
 grub_emu_LDFLAGS = $(LIBCURSES)
+
+grub_modules_init.lst: geninit.sh
+       (cd $(srcdir); grep -r --include="*.c" GRUB_MOD_INIT *) > $@
+
+grub_modules_init.h: $(filter-out grub_emu_init.c,$(grub_emu_SOURCES)) 
geninitheader.sh grub_modules_init.lst
+       sh $(srcdir)/geninitheader.sh > $@
+
+grub_emu_init.c: $(filter-out grub_emu_init.c,$(grub_emu_SOURCES)) geninit.sh 
grub_modules_init.lst
+       sh $(srcdir)/geninit.sh $(filter %.c,$^) > $@
 
 # For genmoddep.
 genmoddep_SOURCES = util/genmoddep.c
Index: disk/loopback.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/loopback.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 loopback.c
--- disk/loopback.c     17 Jul 2005 20:26:07 -0000      1.2
+++ disk/loopback.c     8 Nov 2005 22:35:59 -0000
@@ -240,24 +240,8 @@ static struct grub_disk_dev grub_loopbac
   };
 
 
-#ifdef GRUB_UTIL
-void
-grub_loop_init (void)
-{
-  grub_register_command ("loopback", grub_cmd_loopback, GRUB_COMMAND_FLAG_BOTH,
-                        "loopback [-d|-p] DEVICENAME FILE",
-                        "Make a device of a file.", options);
-  grub_disk_dev_register (&grub_loopback_dev);
-}
 
-void
-grub_loop_fini (void)
-{
-  grub_unregister_command ("loopback");
-  grub_disk_dev_unregister (&grub_loopback_dev);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(loop)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("loopback", grub_cmd_loopback, GRUB_COMMAND_FLAG_BOTH,
@@ -266,9 +250,9 @@ GRUB_MOD_INIT
   grub_disk_dev_register (&grub_loopback_dev);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(loop)
 {
   grub_unregister_command ("loopback");
   grub_disk_dev_unregister (&grub_loopback_dev);
 }
-#endif /* ! GRUB_UTIL */
+
Index: font/manager.c
===================================================================
RCS file: /cvsroot/grub/grub2/font/manager.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 manager.c
--- font/manager.c      17 Jul 2005 20:26:07 -0000      1.5
+++ font/manager.c      8 Nov 2005 22:35:59 -0000
@@ -232,7 +232,7 @@ font_command (struct grub_arg_list *stat
   return 0;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(fontmanager)
 {
   (void) mod; /* Stop warning.  */
   grub_register_command ("font", font_command, GRUB_COMMAND_FLAG_BOTH,
@@ -240,7 +240,7 @@ GRUB_MOD_INIT
                         "Specify one or more font files to display.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(fontmanager)
 {
   grub_unregister_command ("font");
 }
Index: fs/affs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/affs.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 affs.c
--- fs/affs.c   7 Oct 2005 19:25:46 -0000       1.1
+++ fs/affs.c   8 Nov 2005 22:35:59 -0000
@@ -553,27 +553,16 @@ static struct grub_fs grub_affs_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_affs_init (void)
-{
-  grub_fs_register (&grub_affs_fs);
-}
-
-void
-grub_affs_fini (void)
-{
-  grub_fs_unregister (&grub_affs_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(affs)
 {
   grub_fs_register (&grub_affs_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(affs)
 {
   grub_fs_unregister (&grub_affs_fs);
 }
-#endif /* ! GRUB_UTIL */
+
Index: fs/ext2.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/ext2.c,v
retrieving revision 1.11
diff -u -p -u -p -r1.11 ext2.c
--- fs/ext2.c   13 Dec 2004 17:26:17 -0000      1.11
+++ fs/ext2.c   8 Nov 2005 22:35:59 -0000
@@ -633,27 +633,15 @@ static struct grub_fs grub_ext2_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_ext2_init (void)
-{
-  grub_fs_register (&grub_ext2_fs);
-}
-
-void
-grub_ext2_fini (void)
-{
-  grub_fs_unregister (&grub_ext2_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(ext2)
 {
   grub_fs_register (&grub_ext2_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(ext2)
 {
   grub_fs_unregister (&grub_ext2_fs);
 }
-#endif /* ! GRUB_UTIL */
Index: fs/fat.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/fat.c,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 fat.c
--- fs/fat.c    31 Jul 2005 16:12:29 -0000      1.12
+++ fs/fat.c    8 Nov 2005 22:35:59 -0000
@@ -808,27 +808,16 @@ static struct grub_fs grub_fat_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_fat_init (void)
-{
-  grub_fs_register (&grub_fat_fs);
-}
-
-void
-grub_fat_fini (void)
-{
-  grub_fs_unregister (&grub_fat_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(fat)
 {
   grub_fs_register (&grub_fat_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(fat)
 {
   grub_fs_unregister (&grub_fat_fs);
 }
-#endif /* ! GRUB_UTIL */
+
Index: fs/hfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/hfs.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 hfs.c
--- fs/hfs.c    1 Nov 2004 16:14:16 -0000       1.3
+++ fs/hfs.c    8 Nov 2005 22:36:00 -0000
@@ -875,27 +875,15 @@ static struct grub_fs grub_hfs_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_hfs_init (void)
-{
-  grub_fs_register (&grub_hfs_fs);
-}
-
-void
-grub_hfs_fini (void)
-{
-  grub_fs_unregister (&grub_hfs_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(hfs)
 {
   grub_fs_register (&grub_hfs_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(hfs)
 {
   grub_fs_unregister (&grub_hfs_fs);
 }
-#endif /* ! GRUB_UTIL */
Index: fs/iso9660.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/iso9660.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 iso9660.c
--- fs/iso9660.c        1 Nov 2004 16:14:16 -0000       1.1
+++ fs/iso9660.c        8 Nov 2005 22:36:00 -0000
@@ -764,27 +764,15 @@ static struct grub_fs grub_iso9660_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_iso9660_init (void)
-{
-  grub_fs_register (&grub_iso9660_fs);
-}
-
-void
-grub_iso9660_fini (void)
-{
-  grub_fs_unregister (&grub_iso9660_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(iso9660)
 {
   grub_fs_register (&grub_iso9660_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(iso9660)
 {
   grub_fs_unregister (&grub_iso9660_fs);
 }
-#endif /* ! GRUB_UTIL */
Index: fs/jfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/jfs.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 jfs.c
--- fs/jfs.c    1 Nov 2004 16:14:16 -0000       1.2
+++ fs/jfs.c    8 Nov 2005 22:36:00 -0000
@@ -870,27 +870,15 @@ static struct grub_fs grub_jfs_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_jfs_init (void)
-{
-  grub_fs_register (&grub_jfs_fs);
-}
-
-void
-grub_jfs_fini (void)
-{
-  grub_fs_unregister (&grub_jfs_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(jfs)
 {
   grub_fs_register (&grub_jfs_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(jfs)
 {
   grub_fs_unregister (&grub_jfs_fs);
 }
-#endif /* ! GRUB_UTIL */
Index: fs/minix.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/minix.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 minix.c
--- fs/minix.c  21 Jan 2005 22:34:18 -0000      1.3
+++ fs/minix.c  8 Nov 2005 22:36:00 -0000
@@ -597,27 +597,15 @@ static struct grub_fs grub_minix_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_minix_init (void)
-{
-  grub_fs_register (&grub_minix_fs);
-}
-
-void
-grub_minix_fini (void)
-{
-  grub_fs_unregister (&grub_minix_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(minix)
 {
   grub_fs_register (&grub_minix_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(minix)
 {
   grub_fs_unregister (&grub_minix_fs);
 }
-#endif /* ! GRUB_UTIL */
Index: fs/sfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/sfs.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 sfs.c
--- fs/sfs.c    11 Oct 2005 16:42:32 -0000      1.2
+++ fs/sfs.c    8 Nov 2005 22:36:00 -0000
@@ -605,27 +605,15 @@ static struct grub_fs grub_sfs_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_sfs_init (void)
-{
-  grub_fs_register (&grub_sfs_fs);
-}
-
-void
-grub_sfs_fini (void)
-{
-  grub_fs_unregister (&grub_sfs_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(sfs)
 {
   grub_fs_register (&grub_sfs_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(sfs)
 {
   grub_fs_unregister (&grub_sfs_fs);
 }
-#endif /* ! GRUB_UTIL */
Index: fs/ufs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/ufs.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 ufs.c
--- fs/ufs.c    1 Nov 2004 16:14:16 -0000       1.2
+++ fs/ufs.c    8 Nov 2005 22:36:00 -0000
@@ -668,27 +668,16 @@ static struct grub_fs grub_ufs_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_ufs_init (void)
-{
-  grub_fs_register (&grub_ufs_fs);
-}
-
-void
-grub_ufs_fini (void)
-{
-  grub_fs_unregister (&grub_ufs_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(ufs)
 {
   grub_fs_register (&grub_ufs_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(ufs)
 {
   grub_fs_unregister (&grub_ufs_fs);
 }
-#endif /* ! GRUB_UTIL */
+
Index: fs/xfs.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/xfs.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 xfs.c
--- fs/xfs.c    15 Oct 2005 21:33:38 -0000      1.5
+++ fs/xfs.c    8 Nov 2005 22:36:00 -0000
@@ -689,27 +689,16 @@ static struct grub_fs grub_xfs_fs =
     .next = 0
   };
 
-#ifdef GRUB_UTIL
-void
-grub_xfs_init (void)
-{
-  grub_fs_register (&grub_xfs_fs);
-}
-
-void
-grub_xfs_fini (void)
-{
-  grub_fs_unregister (&grub_xfs_fs);
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(xfs)
 {
   grub_fs_register (&grub_xfs_fs);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(xfs)
 {
   grub_fs_unregister (&grub_xfs_fs);
 }
-#endif /* ! GRUB_UTIL */
+
Index: hello/hello.c
===================================================================
RCS file: /cvsroot/grub/grub2/hello/hello.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 hello.c
--- hello/hello.c       4 Apr 2004 13:46:00 -0000       1.3
+++ hello/hello.c       8 Nov 2005 22:36:00 -0000
@@ -35,14 +35,14 @@ grub_cmd_hello (struct grub_arg_list *st
   return 0;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(hello)
 {
   (void)mod;                   /* To stop warning. */
   grub_register_command ("hello", grub_cmd_hello, GRUB_COMMAND_FLAG_BOTH,
                         "hello", "Say hello", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(hello)
 {
   grub_unregister_command ("hello");
 }
Index: include/grub/dl.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/dl.h,v
retrieving revision 1.9
diff -u -p -u -p -r1.9 dl.h
--- include/grub/dl.h   14 Feb 2005 18:41:33 -0000      1.9
+++ include/grub/dl.h   8 Nov 2005 22:36:00 -0000
@@ -25,13 +25,19 @@
 #include <grub/err.h>
 #include <grub/types.h>
 
-#define GRUB_MOD_INIT  \
+#define GRUB_MOD_INIT(name)    \
 static void grub_mod_init (grub_dl_t mod) __attribute__ ((used)); \
+void grub_##name##_init (void); \
+void \
+grub_##name##_init (void) { grub_mod_init (0); } \
 static void \
 grub_mod_init (grub_dl_t mod)
 
-#define GRUB_MOD_FINI  \
+#define GRUB_MOD_FINI(name)    \
 static void grub_mod_fini (void) __attribute__ ((used)); \
+void grub_##name##_fini (void); \
+void \
+grub_##name##_fini (void) { grub_mod_fini (); } \
 static void \
 grub_mod_fini (void)
 
Index: loader/i386/pc/chainloader.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/chainloader.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 chainloader.c
--- loader/i386/pc/chainloader.c        4 Dec 2004 18:45:45 -0000       1.8
+++ loader/i386/pc/chainloader.c        8 Nov 2005 22:36:00 -0000
@@ -145,7 +145,7 @@ grub_rescue_cmd_chainloader (int argc, c
 
 static const char loader_name[] = "chainloader";
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(chainloader)
 {
   grub_rescue_register_command (loader_name,
                                grub_rescue_cmd_chainloader,
@@ -153,7 +153,7 @@ GRUB_MOD_INIT
   my_mod = mod;
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(chainloader)
 {
   grub_rescue_unregister_command (loader_name);
 }
Index: loader/i386/pc/chainloader_normal.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/chainloader_normal.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 chainloader_normal.c
--- loader/i386/pc/chainloader_normal.c 17 Jul 2005 20:26:07 -0000      1.2
+++ loader/i386/pc/chainloader_normal.c 8 Nov 2005 22:36:00 -0000
@@ -42,7 +42,7 @@ chainloader_command (struct grub_arg_lis
   return grub_errno;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(chainloader_normal)
 {
   (void) mod; /* To stop warning.  */
   grub_register_command ("chainloader", chainloader_command,
@@ -51,7 +51,7 @@ GRUB_MOD_INIT
                         "Prepare to boot another boot loader.", options);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(chainloader_normal)
 {
   grub_unregister_command ("chainloader");
 }
Index: loader/i386/pc/linux.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/linux.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 linux.c
--- loader/i386/pc/linux.c      20 Aug 2005 08:25:51 -0000      1.8
+++ loader/i386/pc/linux.c      8 Nov 2005 22:36:00 -0000
@@ -368,7 +368,7 @@ grub_rescue_cmd_initrd (int argc, char *
 }
 
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(linux)
 {
   grub_rescue_register_command ("linux",
                                grub_rescue_cmd_linux,
@@ -379,7 +379,7 @@ GRUB_MOD_INIT
   my_mod = mod;
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(linux)
 {
   grub_rescue_unregister_command ("linux");
   grub_rescue_unregister_command ("initrd");
Index: loader/i386/pc/linux_normal.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/linux_normal.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 linux_normal.c
--- loader/i386/pc/linux_normal.c       17 Jul 2005 20:26:07 -0000      1.2
+++ loader/i386/pc/linux_normal.c       8 Nov 2005 22:36:00 -0000
@@ -40,7 +40,7 @@ grub_normal_initrd_command (struct grub_
   return grub_errno;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(linux_normal)
 {
   (void) mod; /* To stop warning.  */
   grub_register_command ("linux", grub_normal_linux_command,
@@ -54,7 +54,7 @@ GRUB_MOD_INIT
                         "Load an initrd.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(linux_normal)
 {
   grub_unregister_command ("linux");
   grub_unregister_command ("initrd");
Index: loader/i386/pc/multiboot.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/multiboot.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 multiboot.c
--- loader/i386/pc/multiboot.c  22 Aug 2005 17:28:59 -0000      1.8
+++ loader/i386/pc/multiboot.c  8 Nov 2005 22:36:00 -0000
@@ -435,7 +435,7 @@ grub_rescue_cmd_module  (int argc, char 
 }
 
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(multiboot)
 {
   grub_rescue_register_command ("multiboot", grub_rescue_cmd_multiboot,
                                "load a multiboot kernel");
@@ -444,7 +444,7 @@ GRUB_MOD_INIT
   my_mod = mod;
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(multiboot)
 {
   grub_rescue_unregister_command ("multiboot");
   grub_rescue_unregister_command ("module");
Index: loader/i386/pc/multiboot_normal.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/multiboot_normal.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 multiboot_normal.c
--- loader/i386/pc/multiboot_normal.c   17 Jul 2005 20:26:07 -0000      1.3
+++ loader/i386/pc/multiboot_normal.c   8 Nov 2005 22:36:00 -0000
@@ -40,7 +40,7 @@ grub_normal_cmd_module (struct grub_arg_
   return grub_errno;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(multiboot_normal)
 {
   (void) mod; /* To stop warning.  */
   grub_register_command ("multiboot", grub_normal_cmd_multiboot,
@@ -54,7 +54,7 @@ GRUB_MOD_INIT
                         "Load a Multiboot module.", 0);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(multiboot_normal)
 {
   grub_unregister_command ("multiboot");
   grub_unregister_command ("module");
Index: normal/main.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/main.c,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 main.c
--- normal/main.c       14 Aug 2005 19:36:55 -0000      1.12
+++ normal/main.c       8 Nov 2005 22:36:00 -0000
@@ -519,33 +519,11 @@ grub_rescue_cmd_normal (int argc, char *
     grub_enter_normal_mode (argv[0]);
 }
 
-#ifdef GRUB_UTIL
-void
-grub_normal_init (void)
-{
-  grub_set_history (GRUB_DEFAULT_HISTORY_SIZE);
-
-  /* Register a command "normal" for the rescue mode.  */
-  grub_rescue_register_command ("normal", grub_rescue_cmd_normal,
-                               "enter normal mode");
-
-  /* This registers some built-in commands.  */
-  grub_command_init ();
-  
-}
-
-void
-grub_normal_fini (void)
-{
-  grub_set_history (0);
-  grub_rescue_unregister_command ("normal");
-
-}
-#else /* ! GRUB_UTIL */
-GRUB_MOD_INIT
+GRUB_MOD_INIT(normal)
 {
   /* Normal mode shouldn't be unloaded.  */
-  grub_dl_ref (mod);
+  if (mod)
+    grub_dl_ref (mod);
 
   grub_set_history (GRUB_DEFAULT_HISTORY_SIZE);
 
@@ -557,9 +535,9 @@ GRUB_MOD_INIT
   grub_command_init ();
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(normal)
 {
   grub_set_history (0);
   grub_rescue_unregister_command ("normal");
 }
-#endif /* ! GRUB_UTIL */
+
Index: partmap/amiga.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/amiga.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 amiga.c
--- partmap/amiga.c     18 Aug 2005 03:14:39 -0000      1.3
+++ partmap/amiga.c     8 Nov 2005 22:36:00 -0000
@@ -211,27 +211,15 @@ static struct grub_partition_map grub_am
     .get_name = amiga_partition_map_get_name
   };
 
-#ifdef GRUB_UTIL
-void
-grub_amiga_partition_map_init (void)
-{
-  grub_partition_map_register (&grub_amiga_partition_map);
-}
-
-void
-grub_amiga_partition_map_fini (void)
-{
-  grub_partition_map_unregister (&grub_amiga_partition_map);
-}
-#else
-GRUB_MOD_INIT
+GRUB_MOD_INIT(amiga_partition_map)
 {
   grub_partition_map_register (&grub_amiga_partition_map);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(amiga_partition_map)
 {
   grub_partition_map_unregister (&grub_amiga_partition_map);
 }
-#endif
Index: partmap/apple.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/apple.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 apple.c
--- partmap/apple.c     18 Aug 2005 03:14:39 -0000      1.5
+++ partmap/apple.c     8 Nov 2005 22:36:00 -0000
@@ -220,27 +220,16 @@ static struct grub_partition_map grub_ap
     .get_name = apple_partition_map_get_name
   };
 
-#ifdef GRUB_UTIL
-void
-grub_apple_partition_map_init (void)
-{
-  grub_partition_map_register (&grub_apple_partition_map);
-}
-
-void
-grub_apple_partition_map_fini (void)
-{
-  grub_partition_map_unregister (&grub_apple_partition_map);
-}
-#else
-GRUB_MOD_INIT
+GRUB_MOD_INIT(apple_partition_map)
 {
   grub_partition_map_register (&grub_apple_partition_map);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(apple_partition_map)
 {
   grub_partition_map_unregister (&grub_apple_partition_map);
 }
-#endif
+
Index: partmap/pc.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/pc.c,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 pc.c
--- partmap/pc.c        20 Aug 2005 07:49:02 -0000      1.5
+++ partmap/pc.c        8 Nov 2005 22:36:00 -0000
@@ -296,27 +296,15 @@ static struct grub_partition_map grub_pc
     .get_name = pc_partition_map_get_name
   };
 
-#ifdef GRUB_UTIL
-void
-grub_pc_partition_map_init (void)
-{
-  grub_partition_map_register (&grub_pc_partition_map);
-}
-
-void
-grub_pc_partition_map_fini (void)
-{
-  grub_partition_map_unregister (&grub_pc_partition_map);
-}
-#else
-GRUB_MOD_INIT
+GRUB_MOD_INIT(pc_partition_map)
 {
   grub_partition_map_register (&grub_pc_partition_map);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(pc_partition_map)
 {
   grub_partition_map_unregister (&grub_pc_partition_map);
 }
-#endif
Index: partmap/sun.c
===================================================================
RCS file: /cvsroot/grub/grub2/partmap/sun.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 sun.c
--- partmap/sun.c       18 Aug 2005 03:14:39 -0000      1.2
+++ partmap/sun.c       8 Nov 2005 22:36:00 -0000
@@ -192,27 +192,16 @@ static struct grub_partition_map grub_su
     .get_name = sun_partition_map_get_name
   };
 
-#ifdef GRUB_UTIL
-void
-grub_sun_partition_map_init (void)
-{
-  grub_partition_map_register (&grub_sun_partition_map);
-}
-
-void
-grub_sun_partition_map_fini (void)
-{
-  grub_partition_map_unregister (&grub_sun_partition_map);
-}
-#else
-GRUB_MOD_INIT
+GRUB_MOD_INIT(sun_partition_map)
 {
   grub_partition_map_register (&grub_sun_partition_map);
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(sun_partition_map)
 {
   grub_partition_map_unregister (&grub_sun_partition_map);
 }
-#endif
+
Index: term/terminfo.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/terminfo.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 terminfo.c
--- term/terminfo.c     3 Sep 2005 16:54:27 -0000       1.1
+++ term/terminfo.c     8 Nov 2005 22:36:00 -0000
@@ -174,7 +174,7 @@ grub_cmd_terminfo (struct grub_arg_list 
     return grub_terminfo_set_current (args[0]);
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(terminfo)
 {
   (void) mod;                  /* To stop warning. */
   grub_register_command ("terminfo", grub_cmd_terminfo, GRUB_COMMAND_FLAG_BOTH,
@@ -182,7 +182,7 @@ GRUB_MOD_INIT
   grub_terminfo_set_current ("vt100");
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(terminfo)
 {
   grub_unregister_command ("terminfo");
 }
Index: term/i386/pc/serial.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/i386/pc/serial.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 serial.c
--- term/i386/pc/serial.c       3 Sep 2005 16:54:27 -0000       1.1
+++ term/i386/pc/serial.c       8 Nov 2005 22:36:00 -0000
@@ -616,7 +616,7 @@ grub_cmd_serial (struct grub_arg_list *s
   return hwiniterr;
 }
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(serial)
 {
   (void) mod;                  /* To stop warning. */
   grub_register_command ("serial", grub_cmd_serial, GRUB_COMMAND_FLAG_BOTH,
@@ -629,7 +629,7 @@ GRUB_MOD_INIT
   serial_settings.stop_bits = UART_1_STOP_BIT;
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(serial)
 {
   grub_unregister_command ("serial");
   if (registered == 1)         /* Unregister terminal only if registered. */
Index: term/i386/pc/vesafb.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/i386/pc/vesafb.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 vesafb.c
--- term/i386/pc/vesafb.c       20 Aug 2005 05:26:51 -0000      1.3
+++ term/i386/pc/vesafb.c       8 Nov 2005 22:36:01 -0000
@@ -142,7 +142,7 @@ grub_virtual_screen_setup (grub_uint32_t
 }
 
 static grub_err_t
-grub_vesafb_init (void)
+grub_vesafb_mod_init (void)
 {
   grub_uint32_t use_mode = GRUB_VBE_DEFAULT_VIDEO_MODE;
   struct grub_vbe_info_block controller_info;
@@ -200,7 +200,7 @@ grub_vesafb_init (void)
 }
 
 static grub_err_t
-grub_vesafb_fini (void)
+grub_vesafb_mod_fini (void)
 {
   grub_virtual_screen_free ();
 
@@ -589,8 +589,8 @@ grub_vesafb_setcursor (int on)
 static struct grub_term grub_vesafb_term =
   {
     .name = "vesafb",
-    .init = grub_vesafb_init,
-    .fini = grub_vesafb_fini,
+    .init = grub_vesafb_mod_init,
+    .fini = grub_vesafb_mod_fini,
     .putchar = grub_vesafb_putchar,
     .getcharwidth = grub_vesafb_getcharwidth,
     .checkkey = grub_console_checkkey,
@@ -606,13 +606,13 @@ static struct grub_term grub_vesafb_term
     .next = 0
   };
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(vesafb)
 {
   my_mod = mod;
   grub_term_register (&grub_vesafb_term);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(vesafb)
 {
   grub_term_unregister (&grub_vesafb_term);
 }
Index: term/i386/pc/vga.c
===================================================================
RCS file: /cvsroot/grub/grub2/term/i386/pc/vga.c,v
retrieving revision 1.9
diff -u -p -u -p -r1.9 vga.c
--- term/i386/pc/vga.c  20 Aug 2005 05:26:51 -0000      1.9
+++ term/i386/pc/vga.c  8 Nov 2005 22:36:02 -0000
@@ -173,7 +173,7 @@ set_start_address (unsigned int start)
 }
 
 static grub_err_t
-grub_vga_init (void)
+grub_vga_mod_init (void)
 {
   vga_font = grub_vga_get_font ();
   text_mode = grub_vga_set_mode (0x10);
@@ -188,7 +188,7 @@ grub_vga_init (void)
 }
 
 static grub_err_t
-grub_vga_fini (void)
+grub_vga_mod_fini (void)
 {
   set_map_mask (saved_map_mask);
   grub_vga_set_mode (text_mode);
@@ -578,8 +578,8 @@ grub_vga_setcursor (int on)
 static struct grub_term grub_vga_term =
   {
     .name = "vga",
-    .init = grub_vga_init,
-    .fini = grub_vga_fini,
+    .init = grub_vga_mod_init,
+    .fini = grub_vga_mod_fini,
     .putchar = grub_vga_putchar,
     .getcharwidth = grub_vga_getcharwidth,
     .checkkey = grub_console_checkkey,
@@ -595,13 +595,15 @@ static struct grub_term grub_vga_term =
     .next = 0
   };
 
-GRUB_MOD_INIT
+GRUB_MOD_INIT(vga)
 {
+#ifndef GRUB_UTIL
   my_mod = mod;
+#endif
   grub_term_register (&grub_vga_term);
 }
 
-GRUB_MOD_FINI
+GRUB_MOD_FINI(vga)
 {
   grub_term_unregister (&grub_vga_term);
 }
Index: util/grub-emu.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/grub-emu.c,v
retrieving revision 1.27
diff -u -p -u -p -r1.27 grub-emu.c
--- util/grub-emu.c     6 Nov 2005 22:19:59 -0000       1.27
+++ util/grub-emu.c     8 Nov 2005 22:36:02 -0000
@@ -39,6 +39,8 @@
 #include <grub/env.h>
 #include <grub/partition.h>
 
+#include <grub_modules_init.h>
+
 #ifdef __NetBSD__
 /* NetBSD uses /boot for its boot block.  */
 # define DEFAULT_DIRECTORY     "/grub"
@@ -189,38 +191,9 @@ main (int argc, char *argv[])
   
   /* XXX: This is a bit unportable.  */
   grub_util_biosdisk_init (args.dev_map);
-  grub_pc_partition_map_init ();
-  grub_amiga_partition_map_init ();
-  grub_apple_partition_map_init ();
-  grub_sun_partition_map_init ();
-
-  /* Initialize the default modules.  */
-  grub_iso9660_init ();
-  grub_xfs_init ();
-  grub_fat_init ();
-  grub_ext2_init ();
-  grub_ufs_init ();
-  grub_minix_init ();
-  grub_hfs_init ();
-  grub_jfs_init ();
-  grub_xfs_init ();
-  grub_sfs_init ();
-  grub_affs_init ();
-  grub_ls_init ();
-  grub_boot_init ();
-  grub_cmp_init ();
-  grub_cat_init ();
-  grub_terminal_init ();
-  grub_loop_init ();
-  grub_help_init ();
-  grub_halt_init ();
-  grub_reboot_init ();
-  grub_default_init ();
-  grub_timeout_init ();
-  grub_configfile_init ();
-  grub_search_init ();
-  grub_test_init ();
-  
+
+  grub_init_all ();
+
   /* XXX: Should normal mode be started by default?  */
   grub_normal_init ();
 
@@ -228,35 +201,7 @@ main (int argc, char *argv[])
   if (setjmp (main_env) == 0)
     grub_main ();
 
-  grub_test_fini ();
-  grub_search_fini ();
-  grub_configfile_fini ();
-  grub_timeout_fini ();
-  grub_default_fini ();
-  grub_reboot_fini ();
-  grub_halt_fini ();
-  grub_help_fini ();
-  grub_loop_fini ();
-  grub_util_biosdisk_fini ();
-  grub_normal_fini ();
-  grub_affs_fini ();
-  grub_sfs_fini ();
-  grub_xfs_fini ();
-  grub_ufs_fini ();
-  grub_ext2_fini ();
-  grub_minix_fini ();
-  grub_hfs_fini ();
-  grub_jfs_fini ();
-  grub_fat_fini ();
-  grub_xfs_fini ();
-  grub_boot_fini ();
-  grub_cmp_fini ();
-  grub_cat_fini ();
-  grub_terminal_fini ();
-  grub_amiga_partition_map_fini ();
-  grub_pc_partition_map_fini ();
-  grub_apple_partition_map_fini ();
-  grub_sun_partition_map_fini ();
+  grub_fini_all ();
 
   grub_machine_fini ();
   





reply via email to

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