| 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. | |
| 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. |