linux/Kbuild
<<
>>
Prefs
   1#
   2# Kbuild for top-level directory of the kernel
   3# This file takes care of the following:
   4# 1) Generate bounds.h
   5# 2) Generate timeconst.h
   6# 3) Generate asm-offsets.h (may need bounds.h and timeconst.h)
   7# 4) Check for missing system calls
   8# 5) Generate constants.py (may need bounds.h)
   9
  10# Default sed regexp - multiline due to syntax constraints
  11define sed-y
  12        "/^->/{s:->#\(.*\):/* \1 */:; \
  13        s:^->\([^ ]*\) [\$$#]*\([-0-9]*\) \(.*\):#define \1 \2 /* \3 */:; \
  14        s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
  15        s:->::; p;}"
  16endef
  17
  18# Use filechk to avoid rebuilds when a header changes, but the resulting file
  19# does not
  20define filechk_offsets
  21        (set -e; \
  22         echo "#ifndef $2"; \
  23         echo "#define $2"; \
  24         echo "/*"; \
  25         echo " * DO NOT MODIFY."; \
  26         echo " *"; \
  27         echo " * This file was generated by Kbuild"; \
  28         echo " */"; \
  29         echo ""; \
  30         sed -ne $(sed-y); \
  31         echo ""; \
  32         echo "#endif" )
  33endef
  34
  35#####
  36# 1) Generate bounds.h
  37
  38bounds-file := include/generated/bounds.h
  39
  40always  := $(bounds-file)
  41targets := kernel/bounds.s
  42
  43# We use internal kbuild rules to avoid the "is up to date" message from make
  44kernel/bounds.s: kernel/bounds.c FORCE
  45        $(Q)mkdir -p $(dir $@)
  46        $(call if_changed_dep,cc_s_c)
  47
  48$(obj)/$(bounds-file): kernel/bounds.s FORCE
  49        $(call filechk,offsets,__LINUX_BOUNDS_H__)
  50
  51#####
  52# 2) Generate timeconst.h
  53
  54timeconst-file := include/generated/timeconst.h
  55
  56targets += $(timeconst-file)
  57
  58quiet_cmd_gentimeconst = GEN     $@
  59define cmd_gentimeconst
  60        (echo $(CONFIG_HZ) | bc -q $< ) > $@
  61endef
  62define filechk_gentimeconst
  63        (echo $(CONFIG_HZ) | bc -q $< )
  64endef
  65
  66$(obj)/$(timeconst-file): kernel/time/timeconst.bc FORCE
  67        $(call filechk,gentimeconst)
  68
  69#####
  70# 3) Generate asm-offsets.h
  71#
  72
  73offsets-file := include/generated/asm-offsets.h
  74
  75always  += $(offsets-file)
  76targets += arch/$(SRCARCH)/kernel/asm-offsets.s
  77
  78# We use internal kbuild rules to avoid the "is up to date" message from make
  79arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c \
  80                                      $(obj)/$(timeconst-file) $(obj)/$(bounds-file) FORCE
  81        $(Q)mkdir -p $(dir $@)
  82        $(call if_changed_dep,cc_s_c)
  83
  84$(obj)/$(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s FORCE
  85        $(call filechk,offsets,__ASM_OFFSETS_H__)
  86
  87#####
  88# 4) Check for missing system calls
  89#
  90
  91always += missing-syscalls
  92targets += missing-syscalls
  93
  94quiet_cmd_syscalls = CALL    $<
  95      cmd_syscalls = $(CONFIG_SHELL) $< $(CC) $(c_flags) $(missing_syscalls_flags)
  96
  97missing-syscalls: scripts/checksyscalls.sh $(offsets-file) FORCE
  98        $(call cmd,syscalls)
  99
 100#####
 101# 5) Generate constants for Python GDB integration
 102#
 103
 104extra-$(CONFIG_GDB_SCRIPTS) += build_constants_py
 105
 106build_constants_py: $(obj)/$(timeconst-file) $(obj)/$(bounds-file)
 107        @$(MAKE) $(build)=scripts/gdb/linux $@
 108
 109# Keep these three files during make clean
 110no-clean-files := $(bounds-file) $(offsets-file) $(timeconst-file)
 111