Linus,
 I thought I would document what I had learnt about Makefiles in
 making the initialisation of drivers/md work better.

 This patch (minus a few typos that I have since found and corrected)
 was blessed by Michael Chastain on linux-kbuild.

 Ofcourse, running "make vmlinux" doesn't convert documentation
 patches into changes in a running kernel like it does for code
 patches, so:

Linux Developers:
 Please apply this patch to your brain.  It works for me, bit if you
 get a cerebral Oops, or a live-lock (hopefully no deadlock!!), please
 send me a brain-dump and I will try to fix the problem :-)

NeilBrown




--- ./Documentation/kbuild/makefiles.txt        2000/11/29 20:44:19     1.1
+++ ./Documentation/kbuild/makefiles.txt        2000/11/29 23:27:10     1.2
@@ -32,6 +32,8 @@
      7.6  Compilation flags
      7.7  Miscellaneous variables
   8  New-style variables
+     8.1  New variables
+     8.2  Converting to old-style
   9  Compatibility with Linux Kernel 2.2
  10  Credits
 
@@ -521,6 +523,8 @@
 old-style variables.  This is because Rules.make processes only the
 old-style variables.
 
+See section 8.2 ("Converting to old-style") for examples.
+
 
 
 --- 6.4 Rules.make section
@@ -679,6 +683,25 @@
        options still control whether or not its $(O_TARGET) goes into
        vmlinux.  See the $(M_OBJS) example below.
 
+       Sometimes the ordering of all $(OX_OBJS) files before all
+       $(O_OBJS) files can be a problem, particularly if both
+       $(O_OBJS) files and $(OX_OBJS) files contain __initcall
+       declarations where order is important.   To avoid this imposed
+       ordering, the use of $(OX_OBJS) can be dropped altogether and
+       $(MIX_OBJS) used instead.
+
+       If this approach is used, then:
+        - All objects to be linked into vmlinux should be listed in
+          $(O_OBJS) in the desired order.
+        - All objects to be created as modules should be listed in
+          $(M_OBJS)
+        - All objects that export symbols should also be listed in
+          $(MIX_OBJS).
+
+       This has the same effect as maintaining the
+       exported/non-exported split, except that there is more control
+       over the ordering of object files in vmlinux.
+       
 
 
 --- 7.3 Library file goals
@@ -865,6 +888,14 @@
                        $(LD) -r -o $@ $(sb-objs)
 
 
+       As is mentioned in section 7.2 ("Object file goals"),
+       $(MIX_OBJS) can also be used simply to list all objects that
+       export any symbols.  If this approach is taken, then
+       $(O_OBJS), $(L_OBJS), $(M_OBJS) and $(MI_OBJS) should simply
+       lists all of the vmlinux object files, library object files,
+       module object files and intermediate module files
+       respectively.  Duplication between $(MI_OBJS) and $(MIX_OBJS)
+       is not a problem.
 
 --- 7.6 Compilation flags
 
@@ -993,6 +1024,8 @@
 people define most variables using "new style" but then fall back to
 "old style" for a few lines.
 
+--- 8.1 New variables
+
     obj-y obj-m obj-n obj-
 
        These variables replace $(O_OBJS), $(OX_OBJS), $(M_OBJS),
@@ -1184,6 +1217,41 @@
        This means nls should be added to (subdir-y) and $(subdir-m) if
        CONFIG_NFS = y.
 
+--- 8.2 Converting to old-style
+
+       The following example is taken from ./drivers/usb/Makefile.
+       Note that this uses MIX_OBJS to avoid the need for OX_OBJS and
+       MX_OBJS and thus to maintain the ordering of objects in $(obj-y)
+
+               # Translate to Rules.make lists.
+               multi-used      := $(filter $(list-multi), $(obj-y) $(obj-m))
+               multi-objs      := $(foreach m, $(multi-used), $($(basename 
+$(m))-objs))
+               active-objs     := $(sort $(multi-objs) $(obj-y) $(obj-m))
+
+               O_OBJS          := $(obj-y)
+               M_OBJS          := $(obj-m)
+               MIX_OBJS        := $(filter $(export-objs), $(active-objs))
+
+       An example for libraries from drivers/acorn/scsi/Makefile:
+
+               # Translate to Rules.make lists.
+
+               L_OBJS          := $(filter-out $(export-objs), $(obj-y))
+               LX_OBJS         := $(filter     $(export-objs), $(obj-y))
+               M_OBJS          := $(sort $(filter-out $(export-objs), $(obj-m)))
+               MX_OBJS         := $(sort $(filter     $(export-objs), $(obj-m)))
+
+       As ordering is not so important in libraries, this still uses
+       LX_OBJS and MX_OBJS, though (presumably) it could be changed to
+       use MIX_OBJS as follows:
+
+               active-objs     := $(sort $(obj-y) $(obj-m))
+               L_OBJS          := $(obj-y)
+               M_OBJS          := $(obj-m)
+               MIX_OBJS        := $(filter $(export-objs), $(active-objs))
+               
+
+       which is clearly shorted and arguably clearer.
 
 === 9 Compatibility with Linux Kernel 2.2
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to