|  | Smart CONFIG_* Dependencies | 
|  | 1 August 1999 | 
|  |  | 
|  | Michael Chastain   <mec@shout.net> | 
|  | Werner Almesberger <almesber@lrc.di.epfl.ch> | 
|  | Martin von Loewis  <martin@mira.isdn.cs.tu-berlin.de> | 
|  |  | 
|  | Here is the problem: | 
|  |  | 
|  | Suppose that drivers/net/foo.c has the following lines: | 
|  |  | 
|  | #include <linux/config.h> | 
|  |  | 
|  | ... | 
|  |  | 
|  | #ifdef CONFIG_FOO_AUTOFROB | 
|  | /* Code for auto-frobbing */ | 
|  | #else | 
|  | /* Manual frobbing only */ | 
|  | #endif | 
|  |  | 
|  | ... | 
|  |  | 
|  | #ifdef CONFIG_FOO_MODEL_TWO | 
|  | /* Code for model two */ | 
|  | #endif | 
|  |  | 
|  | Now suppose the user (the person building kernels) reconfigures the | 
|  | kernel to change some unrelated setting.  This will regenerate the | 
|  | file include/linux/autoconf.h, which will cause include/linux/config.h | 
|  | to be out of date, which will cause drivers/net/foo.c to be recompiled. | 
|  |  | 
|  | Most kernel sources, perhaps 80% of them, have at least one CONFIG_* | 
|  | dependency somewhere.  So changing _any_ CONFIG_* setting requires | 
|  | almost _all_ of the kernel to be recompiled. | 
|  |  | 
|  | Here is the solution: | 
|  |  | 
|  | We've made the dependency generator, mkdep.c, smarter.  Instead of | 
|  | generating this dependency: | 
|  |  | 
|  | drivers/net/foo.c: include/linux/config.h | 
|  |  | 
|  | It now generates these dependencies: | 
|  |  | 
|  | drivers/net/foo.c: \ | 
|  | include/config/foo/autofrob.h \ | 
|  | include/config/foo/model/two.h | 
|  |  | 
|  | So drivers/net/foo.c depends only on the CONFIG_* lines that | 
|  | it actually uses. | 
|  |  | 
|  | A new program, split-include.c, runs at the beginning of | 
|  | compilation (make bzImage or make zImage).  split-include reads | 
|  | include/linux/autoconf.h and updates the include/config/ tree, | 
|  | writing one file per option.  It updates only the files for options | 
|  | that have changed. | 
|  |  | 
|  | mkdep.c no longer generates warning messages for missing or unneeded | 
|  | <linux/config.h> lines.  The new top-level target 'make checkconfig' | 
|  | checks for these problems. | 
|  |  | 
|  | Flag Dependencies | 
|  |  | 
|  | Martin Von Loewis contributed another feature to this patch: | 
|  | 'flag dependencies'.  The idea is that a .o file depends on | 
|  | the compilation flags used to build it.  The file foo.o has | 
|  | its flags stored in .flags.foo.o. | 
|  |  | 
|  | Suppose the user changes the foo driver from resident to modular. | 
|  | 'make' will notice that the current foo.o was not compiled with | 
|  | -DMODULE and will recompile foo.c. | 
|  |  | 
|  | All .o files made from C source have flag dependencies.  So do .o | 
|  | files made with ld, and .a files made with ar.  However, .o files | 
|  | made from assembly source do not have flag dependencies (nobody | 
|  | needs this yet, but it would be good to fix). | 
|  |  | 
|  | Per-source-file Flags | 
|  |  | 
|  | Flag dependencies also work with per-source-file flags. | 
|  | You can specify compilation flags for individual source files | 
|  | like this: | 
|  |  | 
|  | CFLAGS_foo.o = -DSPECIAL_FOO_DEFINE | 
|  |  | 
|  | This helps clean up drivers/net/Makefile, drivers/scsi/Makefile, | 
|  | and several other Makefiles. | 
|  |  | 
|  | Credit | 
|  |  | 
|  | Werner Almesberger had the original idea and wrote the first | 
|  | version of this patch. | 
|  |  | 
|  | Michael Chastain picked it up and continued development.  He is | 
|  | now the principal author and maintainer.  Please report any bugs | 
|  | to him. | 
|  |  | 
|  | Martin von Loewis wrote flag dependencies, with some modifications | 
|  | by Michael Chastain. | 
|  |  | 
|  | Thanks to all of the beta testers. |