Commit 1cdf25d704f7951d02a04064c97db547d6021872

Authored by Christoph Lameter
Committed by Linus Torvalds
1 parent 308c05e35e

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

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))
  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 +}