linux-old/Documentation/smart-config.txt
<<
>>
Prefs
   1Smart CONFIG_* Dependencies
   2Fri 2 Dec 1997
   3
   4Michael Chastain   <mec@shout.net>
   5Werner Almesberger <almesber@lrc.di.epfl.ch>
   6Martin von Loewis  <martin@mira.isdn.cs.tu-berlin.de>
   7
   8Here is the problem:
   9
  10    Suppose that drivers/net/foo.c has the following lines:
  11
  12        #include <linux/config.h>
  13
  14        ...
  15
  16        #ifdef CONFIG_FOO_AUTOFROB
  17            /* Code for auto-frobbing */
  18        #else
  19            /* Manual frobbing only */
  20        #endif
  21
  22        ...
  23
  24        #ifdef CONFIG_FOO_MODEL_TWO
  25            /* Code for model two */
  26        #endif
  27
  28    Now suppose the user (the person building kernels) reconfigures the
  29    kernel to change some unrelated setting.  This will regenerate the
  30    file include/linux/autoconf.h, which will cause include/linux/config.h
  31    to be out of date, which will cause drivers/net/foo.c to be recompiled.
  32
  33    Most kernel sources, perhaps 80% of them, have at least one CONFIG_*
  34    dependency somewhere.  So changing _any_ CONFIG_* setting requires
  35    almost _all_ of the kernel to be recompiled.
  36
  37Here is the solution:
  38
  39    We've made the dependency generator, mkdep.c, smarter.  Instead of
  40    generating this dependency:
  41
  42        drivers/net/foo.c: include/linux/config.h
  43
  44    It now generates these dependencies:
  45
  46        drivers/net/foo.c: \
  47            include/config/foo_autofrob.h \
  48            include/config/foo_model_two.h
  49
  50    So drivers/net/foo.c depends only on the CONFIG_* lines that
  51    it actually uses.
  52
  53    A new program, split-include.c, runs at the end of make config (also
  54    make oldconfig, make menuconfig, and make xconfig).  split-include
  55    reads include/linux/autoconf.h and updates the include/linux/*.h
  56    directory, writing one file per option.  It updates only the files
  57    that changed.
  58
  59    mkdep.c also generates much better warning messages for missing
  60    or unneeded <linux/config.h> lines.  In fact, you can get these
  61    messages without generating dependencies with the new top-level
  62    target 'make checkconfig'.
  63
  64Flag Dependencies
  65
  66    Martin Von Loewis contributed another feature to this patch:
  67    'flag dependencies'.  The idea is that a .o file depends on
  68    the compilation flags used to build it.  The file foo.o has
  69    its flags stored in .flags.foo.o.
  70
  71    Suppose the user changes the foo driver from resident to
  72    modular, 'make' will notice that the foo.o was not compiled
  73    with -DMODULE and will recompile foo.c.
  74
  75    All .a and .o files made from C source or with 'ld' or 'ar'
  76    have flag dependencies.  .S files do not have flag dependencies.
  77
  78Per-source-file Flags
  79
  80    Flag dependencies also work with per-source-file flags.
  81    You can specify compilation flags for individual source files
  82    like this:
  83
  84        CFLAGS_foo.o = -DSPECIAL_FOO_DEFINE
  85
  86    This helps clean up drivers/net/Makefile, drivers/scsi/Makefile,
  87    and several other Makefiles.
  88
  89Credit
  90
  91    Werner Almesberger had the original idea and wrote the first
  92    version of this patch.
  93    
  94    Michael Chastain picked it up and continued development.  He is
  95    now the principal author and maintainer.  Report bugs to him,
  96    or to all three people together.
  97
  98    Martin von Loewis wrote flag dependencies, with some modifications
  99    by Michael Chastain.
 100
 101    Thanks to all of the beta testers.
 102
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.