Commit 1cdf25d704f7951d02a04064c97db547d6021872
Committed by
Linus Torvalds
1 parent
308c05e35e
Exists in
master
and in
39 other branches
kbuild: create a way to create preprocessor constants from C expressions
The use of enums create constants that are not available to the preprocessor when building the kernel (f.e. MAX_NR_ZONES). Arch code already has a way to export constants calculated to the preprocessor through the asm-offsets.c file. Generate something similar for the core kernel through kbuild. Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Christoph Lameter <clameter@sgi.com> Cc: Andy Whitcroft <apw@shadowen.org> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Rik van Riel <riel@redhat.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 67 additions and 8 deletions Side-by-side Diff
Kbuild
1 | 1 | # |
2 | 2 | # Kbuild for top-level directory of the kernel |
3 | 3 | # This file takes care of the following: |
4 | -# 1) Generate asm-offsets.h | |
5 | -# 2) Check for missing system calls | |
4 | +# 1) Generate bounds.h | |
5 | +# 2) Generate asm-offsets.h (may need bounds.h) | |
6 | +# 3) Check for missing system calls | |
6 | 7 | |
7 | 8 | ##### |
8 | -# 1) Generate asm-offsets.h | |
9 | +# 1) Generate bounds.h | |
10 | + | |
11 | +bounds-file := include/linux/bounds.h | |
12 | + | |
13 | +always := $(bounds-file) | |
14 | +targets := $(bounds-file) kernel/bounds.s | |
15 | + | |
16 | +quiet_cmd_bounds = GEN $@ | |
17 | +define cmd_bounds | |
18 | + (set -e; \ | |
19 | + echo "#ifndef __LINUX_BOUNDS_H__"; \ | |
20 | + echo "#define __LINUX_BOUNDS_H__"; \ | |
21 | + echo "/*"; \ | |
22 | + echo " * DO NOT MODIFY."; \ | |
23 | + echo " *"; \ | |
24 | + echo " * This file was generated by Kbuild"; \ | |
25 | + echo " *"; \ | |
26 | + echo " */"; \ | |
27 | + echo ""; \ | |
28 | + sed -ne $(sed-y) $<; \ | |
29 | + echo ""; \ | |
30 | + echo "#endif" ) > $@ | |
31 | +endef | |
32 | + | |
33 | +# We use internal kbuild rules to avoid the "is up to date" message from make | |
34 | +kernel/bounds.s: kernel/bounds.c FORCE | |
35 | + $(Q)mkdir -p $(dir $@) | |
36 | + $(call if_changed_dep,cc_s_c) | |
37 | + | |
38 | +$(obj)/$(bounds-file): kernel/bounds.s Kbuild | |
39 | + $(Q)mkdir -p $(dir $@) | |
40 | + $(call cmd,bounds) | |
41 | + | |
42 | +##### | |
43 | +# 2) Generate asm-offsets.h | |
9 | 44 | # |
10 | 45 | |
11 | 46 | offsets-file := include/asm-$(SRCARCH)/asm-offsets.h |
12 | 47 | |
13 | -always := $(offsets-file) | |
14 | -targets := $(offsets-file) | |
48 | +always += $(offsets-file) | |
49 | +targets += $(offsets-file) | |
15 | 50 | targets += arch/$(SRCARCH)/kernel/asm-offsets.s |
16 | -clean-files := $(addprefix $(objtree)/,$(targets)) | |
17 | 51 | |
52 | + | |
18 | 53 | # Default sed regexp - multiline due to syntax constraints |
19 | 54 | define sed-y |
20 | 55 | "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}" |
... | ... | @@ -40,7 +75,8 @@ |
40 | 75 | endef |
41 | 76 | |
42 | 77 | # We use internal kbuild rules to avoid the "is up to date" message from make |
43 | -arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c FORCE | |
78 | +arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c \ | |
79 | + $(obj)/$(bounds-file) FORCE | |
44 | 80 | $(Q)mkdir -p $(dir $@) |
45 | 81 | $(call if_changed_dep,cc_s_c) |
46 | 82 | |
... | ... | @@ -49,7 +85,7 @@ |
49 | 85 | $(call cmd,offsets) |
50 | 86 | |
51 | 87 | ##### |
52 | -# 2) Check for missing system calls | |
88 | +# 3) Check for missing system calls | |
53 | 89 | # |
54 | 90 | |
55 | 91 | quiet_cmd_syscalls = CALL $< |
... | ... | @@ -58,4 +94,7 @@ |
58 | 94 | PHONY += missing-syscalls |
59 | 95 | missing-syscalls: scripts/checksyscalls.sh FORCE |
60 | 96 | $(call cmd,syscalls) |
97 | + | |
98 | +# Delete all targets during make clean | |
99 | +clean-files := $(addprefix $(objtree)/,$(targets)) |
kernel/bounds.c
1 | +/* | |
2 | + * Generate definitions needed by the preprocessor. | |
3 | + * This code generates raw asm output which is post-processed | |
4 | + * to extract and format the required data. | |
5 | + */ | |
6 | + | |
7 | +#define __GENERATING_BOUNDS_H | |
8 | +/* Include headers that define the enum constants of interest */ | |
9 | + | |
10 | +#define DEFINE(sym, val) \ | |
11 | + asm volatile("\n->" #sym " %0 " #val : : "i" (val)) | |
12 | + | |
13 | +#define BLANK() asm volatile("\n->" : : ) | |
14 | + | |
15 | +void foo(void) | |
16 | +{ | |
17 | + /* The enum constants to put into include/linux/bounds.h */ | |
18 | + /* End of constants */ | |
19 | +} |