]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | Smart CONFIG_* Dependencies |
2 | 1 August 1999 | |
3 | ||
4 | Michael Chastain <[email protected]> | |
5 | Werner Almesberger <[email protected]> | |
6 | Martin von Loewis <[email protected]> | |
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 | ||
1da177e4 LT |
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. |