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