| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Smart CONFIG_* Dependencies | 
 | 2 | 1 August 1999 | 
 | 3 |  | 
 | 4 | Michael Chastain   <mec@shout.net> | 
 | 5 | Werner Almesberger <almesber@lrc.di.epfl.ch> | 
 | 6 | Martin von Loewis  <martin@mira.isdn.cs.tu-berlin.de> | 
 | 7 |  | 
 | 8 | Here 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 |  | 
 | 37 | Here 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 beginning of | 
 | 54 |     compilation (make bzImage or make zImage).  split-include reads | 
 | 55 |     include/linux/autoconf.h and updates the include/config/ tree, | 
 | 56 |     writing one file per option.  It updates only the files for options | 
 | 57 |     that have changed. | 
 | 58 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | Flag Dependencies | 
 | 60 |  | 
 | 61 |     Martin Von Loewis contributed another feature to this patch: | 
 | 62 |     'flag dependencies'.  The idea is that a .o file depends on | 
 | 63 |     the compilation flags used to build it.  The file foo.o has | 
 | 64 |     its flags stored in .flags.foo.o. | 
 | 65 |  | 
 | 66 |     Suppose the user changes the foo driver from resident to modular. | 
 | 67 |     'make' will notice that the current foo.o was not compiled with | 
 | 68 |     -DMODULE and will recompile foo.c. | 
 | 69 |  | 
 | 70 |     All .o files made from C source have flag dependencies.  So do .o | 
 | 71 |     files made with ld, and .a files made with ar.  However, .o files | 
 | 72 |     made from assembly source do not have flag dependencies (nobody | 
 | 73 |     needs this yet, but it would be good to fix). | 
 | 74 |  | 
 | 75 | Per-source-file Flags | 
 | 76 |  | 
 | 77 |     Flag dependencies also work with per-source-file flags. | 
 | 78 |     You can specify compilation flags for individual source files | 
 | 79 |     like this: | 
 | 80 |  | 
 | 81 | 	CFLAGS_foo.o = -DSPECIAL_FOO_DEFINE | 
 | 82 |  | 
 | 83 |     This helps clean up drivers/net/Makefile, drivers/scsi/Makefile, | 
 | 84 |     and several other Makefiles. | 
 | 85 |  | 
 | 86 | Credit | 
 | 87 |  | 
 | 88 |     Werner Almesberger had the original idea and wrote the first | 
 | 89 |     version of this patch. | 
 | 90 |      | 
 | 91 |     Michael Chastain picked it up and continued development.  He is | 
 | 92 |     now the principal author and maintainer.  Please report any bugs | 
 | 93 |     to him. | 
 | 94 |  | 
 | 95 |     Martin von Loewis wrote flag dependencies, with some modifications | 
 | 96 |     by Michael Chastain. | 
 | 97 |  | 
 | 98 |     Thanks to all of the beta testers. |