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

