OSDN Git Service

f27b78bbcc214edd12b06849843acbe42c09a354
[immortalwrt/immortalwrt.git] / include / kernel.mk
1 # SPDX-License-Identifier: GPL-2.0-only
2 #
3 # Copyright (C) 2006-2020 OpenWrt.org
4
5 ifneq ($(filter check,$(MAKECMDGOALS)),)
6 CHECK:=1
7 DUMP:=1
8 endif
9
10 ifneq ($(SOURCE_DATE_EPOCH),)
11   ifndef DUMP
12     KBUILD_BUILD_TIMESTAMP:=$(shell perl -e 'print scalar gmtime($(SOURCE_DATE_EPOCH))')
13   endif
14 endif
15
16 ifeq ($(__target_inc),)
17   ifndef CHECK
18     include $(INCLUDE_DIR)/target.mk
19   endif
20 endif
21
22 ifeq ($(DUMP),1)
23   KERNEL?=<KERNEL>
24   BOARD?=<BOARD>
25   LINUX_VERSION?=<LINUX_VERSION>
26   LINUX_VERMAGIC?=<LINUX_VERMAGIC>
27 else
28   ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
29     export GCC_HONOUR_COPTS=s
30   endif
31
32   LINUX_KMOD_SUFFIX=ko
33
34   ifneq (,$(findstring uml,$(BOARD)))
35     KERNEL_CC?=$(HOSTCC)
36     KERNEL_CROSS?=
37   else
38     KERNEL_CC?=$(TARGET_CC)
39     KERNEL_CROSS?=$(TARGET_CROSS)
40   endif
41
42   ifeq ($(TARGET_BUILD),1)
43     PATCH_DIR ?= $(CURDIR)/patches$(if $(wildcard ./patches-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER))
44     FILES_DIR ?= $(foreach dir,$(wildcard $(CURDIR)/files $(CURDIR)/files-$(KERNEL_PATCHVER)),"$(dir)")
45   endif
46   KERNEL_BUILD_DIR ?= $(BUILD_DIR)/linux-$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET))
47   LINUX_DIR ?= $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)
48   LINUX_UAPI_DIR=uapi/
49   LINUX_VERMAGIC:=$(strip $(shell cat $(LINUX_DIR)/.vermagic 2>/dev/null))
50   LINUX_VERMAGIC:=$(if $(LINUX_VERMAGIC),$(LINUX_VERMAGIC),unknown)
51
52   LINUX_UNAME_VERSION:=$(KERNEL_BASE)
53   ifneq ($(findstring -rc,$(LINUX_VERSION)),)
54     LINUX_UNAME_VERSION:=$(LINUX_UNAME_VERSION)-$(strip $(lastword $(subst -, ,$(LINUX_VERSION))))
55   endif
56
57   LINUX_KERNEL:=$(KERNEL_BUILD_DIR)/vmlinux
58
59   ifneq (,$(findstring -rc,$(LINUX_VERSION)))
60       LINUX_SOURCE:=linux-$(LINUX_VERSION).tar.gz
61   else
62       LINUX_SOURCE:=linux-$(LINUX_VERSION).tar.xz
63   endif
64
65   ifneq (,$(findstring -rc,$(LINUX_VERSION)))
66       LINUX_SITE:=https://git.kernel.org/torvalds/t
67   else ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
68       LINUX_SITE:=@KERNEL/linux/kernel/v$(word 1,$(subst ., ,$(KERNEL_BASE))).x
69   else
70       LINUX_UNAME_VERSION:=$(strip $(shell cat $(LINUX_DIR)/include/config/kernel.release 2>/dev/null))
71   endif
72
73   MODULES_SUBDIR:=lib/modules/$(LINUX_UNAME_VERSION)
74   TARGET_MODULES_DIR:=$(LINUX_TARGET_DIR)/$(MODULES_SUBDIR)
75
76   ifneq ($(TARGET_BUILD),1)
77     PKG_BUILD_DIR ?= $(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION))
78   endif
79 endif
80
81 ifneq (,$(findstring uml,$(BOARD)))
82   LINUX_KARCH=um
83 else ifneq (,$(findstring $(ARCH) , aarch64 aarch64_be ))
84   LINUX_KARCH := arm64
85 else ifneq (,$(findstring $(ARCH) , arceb ))
86   LINUX_KARCH := arc
87 else ifneq (,$(findstring $(ARCH) , armeb ))
88   LINUX_KARCH := arm
89 else ifneq (,$(findstring $(ARCH) , mipsel mips64 mips64el ))
90   LINUX_KARCH := mips
91 else ifneq (,$(findstring $(ARCH) , powerpc64 ))
92   LINUX_KARCH := powerpc
93 else ifneq (,$(findstring $(ARCH) , sh2 sh3 sh4 ))
94   LINUX_KARCH := sh
95 else ifneq (,$(findstring $(ARCH) , i386 x86_64 ))
96   LINUX_KARCH := x86
97 else
98   LINUX_KARCH := $(ARCH)
99 endif
100
101 KERNEL_MAKE = $(MAKE) $(KERNEL_MAKEOPTS)
102
103 KERNEL_MAKE_FLAGS = \
104         KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR)))" \
105         HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \
106         CROSS_COMPILE="$(KERNEL_CROSS)" \
107         ARCH="$(LINUX_KARCH)" \
108         KBUILD_HAVE_NLS=no \
109         KBUILD_BUILD_USER="$(call qstrip,$(CONFIG_KERNEL_BUILD_USER))" \
110         KBUILD_BUILD_HOST="$(call qstrip,$(CONFIG_KERNEL_BUILD_DOMAIN))" \
111         KBUILD_BUILD_TIMESTAMP="$(KBUILD_BUILD_TIMESTAMP)" \
112         KBUILD_BUILD_VERSION="0" \
113         KBUILD_HOSTLDLIBS="-L$(STAGING_DIR_HOST)/lib" \
114         CONFIG_SHELL="$(BASH)" \
115         $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
116         $(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \
117         cmd_syscalls= \
118         $(if $(__package_mk),KBUILD_EXTRA_SYMBOLS="$(wildcard $(PKG_SYMVERS_DIR)/*.symvers)")
119
120 KERNEL_NOSTDINC_FLAGS = \
121         -nostdinc $(if $(DUMP),, -isystem $(shell $(TARGET_CC) -print-file-name=include))
122
123 ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
124   KERNEL_MAKE_FLAGS += \
125         KERNELRELEASE=$(LINUX_VERSION)
126 endif
127
128 KERNEL_MAKEOPTS := -C $(LINUX_DIR) $(KERNEL_MAKE_FLAGS)
129
130 ifdef CONFIG_USE_SPARSE
131   KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse
132 endif
133
134 ifneq ($(HOST_OS),Linux)
135   KERNEL_MAKEOPTS += CONFIG_STACK_VALIDATION=
136   export SKIP_STACK_VALIDATION:=1
137 endif
138
139 PKG_EXTMOD_SUBDIRS ?= .
140
141 PKG_SYMVERS_DIR = $(KERNEL_BUILD_DIR)/symvers
142
143 define collect_module_symvers
144         for subdir in $(PKG_EXTMOD_SUBDIRS); do \
145                 realdir=$$$$(readlink -f $(PKG_BUILD_DIR)); \
146                 grep -F $(PKG_BUILD_DIR) $(PKG_BUILD_DIR)/$$$$subdir/Module.symvers >> $(PKG_BUILD_DIR)/Module.symvers.tmp; \
147                 [ "$(PKG_BUILD_DIR)" = "$$$$realdir" ] || \
148                         grep -F $$$$realdir $(PKG_BUILD_DIR)/$$$$subdir/Module.symvers >> $(PKG_BUILD_DIR)/Module.symvers.tmp; \
149         done; \
150         sort -u $(PKG_BUILD_DIR)/Module.symvers.tmp > $(PKG_BUILD_DIR)/Module.symvers; \
151         mkdir -p $(PKG_SYMVERS_DIR); \
152         mv $(PKG_BUILD_DIR)/Module.symvers $(PKG_SYMVERS_DIR)/$(PKG_NAME).symvers
153 endef
154
155 define KernelPackage/hooks
156   ifneq ($(PKG_NAME),kernel)
157     Hooks/Compile/Post += collect_module_symvers
158   endif
159   define KernelPackage/hooks
160   endef
161 endef
162
163 define KernelPackage/Defaults
164   FILES:=
165   AUTOLOAD:=
166   MODPARAMS:=
167   PKGFLAGS+=nonshared
168 endef
169
170 # 1: name
171 # 2: install prefix
172 # 3: module priority prefix
173 # 4: required for boot
174 # 5: module list
175 define ModuleAutoLoad
176   $(if $(5), \
177     mkdir -p $(2)/etc/modules.d; \
178     ($(foreach mod,$(5), \
179       echo "$(mod)$(if $(MODPARAMS.$(mod)), $(MODPARAMS.$(mod)),$(if $(MODPARAMS), $(MODPARAMS)))"; )) > $(2)/etc/modules.d/$(3)$(1); \
180     $(if $(4), \
181       mkdir -p $(2)/etc/modules-boot.d; \
182       ln -sf ../modules.d/$(3)$(1) $(2)/etc/modules-boot.d/;))
183 endef
184
185 ifeq ($(DUMP)$(TARGET_BUILD),)
186   -include $(LINUX_DIR)/.config
187 endif
188
189 define KernelPackage/depends
190   $(STAMP_BUILT): $(LINUX_DIR)/.config
191   define KernelPackage/depends
192   endef
193 endef
194
195 define KernelPackage
196   NAME:=$(1)
197   $(eval $(call Package/Default))
198   $(eval $(call KernelPackage/Defaults))
199   $(eval $(call KernelPackage/$(1)))
200   $(eval $(call KernelPackage/$(1)/$(BOARD)))
201   $(eval $(call KernelPackage/$(1)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic)))
202
203   define Package/kmod-$(1)
204     TITLE:=$(TITLE)
205     SECTION:=kernel
206     CATEGORY:=Kernel modules
207     DESCRIPTION:=$(DESCRIPTION)
208     EXTRA_DEPENDS:=kernel (=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC))
209     VERSION:=$(LINUX_VERSION)$(if $(PKG_VERSION),+$(PKG_VERSION))-$(if $(PKG_RELEASE),$(PKG_RELEASE),$(LINUX_RELEASE))
210     PKGFLAGS:=$(PKGFLAGS)
211     $(call KernelPackage/$(1))
212     $(call KernelPackage/$(1)/$(BOARD))
213     $(call KernelPackage/$(1)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic))
214   endef
215
216   ifdef KernelPackage/$(1)/conffiles
217     define Package/kmod-$(1)/conffiles
218 $(call KernelPackage/$(1)/conffiles)
219     endef
220   endif
221
222   ifdef KernelPackage/$(1)/description
223     define Package/kmod-$(1)/description
224 $(call KernelPackage/$(1)/description)
225     endef
226   endif
227
228   ifdef KernelPackage/$(1)/config
229     define Package/kmod-$(1)/config
230 $(call KernelPackage/$(1)/config)
231     endef
232   endif
233
234   $(call KernelPackage/depends)
235   $(call KernelPackage/hooks)
236
237   ifneq ($(if $(filter-out %=y %=n %=m,$(KCONFIG)),$(filter m y,$(foreach c,$(filter-out %=y %=n %=m,$(KCONFIG)),$($(c)))),.),)
238     define Package/kmod-$(1)/install
239                   @for mod in $$(call version_filter,$$(FILES)); do \
240                         if grep -q "$$$$$$$${mod##$(LINUX_DIR)/}" "$(LINUX_DIR)/modules.builtin"; then \
241                                 echo "NOTICE: module '$$$$$$$$mod' is built-in."; \
242                         elif [ -e $$$$$$$$mod ]; then \
243                                 mkdir -p $$(1)/$(MODULES_SUBDIR) ; \
244                                 $(CP) -L $$$$$$$$mod $$(1)/$(MODULES_SUBDIR)/ ; \
245                         else \
246                                 echo "ERROR: module '$$$$$$$$mod' is missing." >&2; \
247                                 exit 1; \
248                         fi; \
249                   done;
250                   $(call ModuleAutoLoad,$(1),$$(1),$(filter-out 0-,$(word 1,$(AUTOLOAD))-),$(filter-out 0,$(word 2,$(AUTOLOAD))),$(sort $(wordlist 3,99,$(AUTOLOAD))))
251                   $(call KernelPackage/$(1)/install,$$(1))
252     endef
253   $(if $(CONFIG_PACKAGE_kmod-$(1)),
254     else
255       compile: $(1)-disabled
256       $(1)-disabled:
257                 @echo "WARNING: kmod-$(1) is not available in the kernel config - generating empty package" >&2
258
259       define Package/kmod-$(1)/install
260                 true
261       endef
262   )
263   endif
264   $$(eval $$(call BuildPackage,kmod-$(1)))
265
266   $$(IPKG_kmod-$(1)): $$(wildcard $$(call version_filter,$$(FILES)))
267
268 endef
269
270 version_filter=$(if $(findstring @,$(1)),$(shell $(SCRIPT_DIR)/package-metadata.pl version_filter $(KERNEL_PATCHVER) $(1)),$(1))
271
272 # 1: priority (optional)
273 # 2: module list
274 # 3: boot flag
275 define AutoLoad
276   $(if $(1),$(1),0) $(if $(3),1,0) $(call version_filter,$(2))
277 endef
278
279 # 1: module list
280 # 2: boot flag
281 define AutoProbe
282   $(call AutoLoad,,$(1),$(2))
283 endef
284
285 version_field=$(if $(word $(1),$(2)),$(word $(1),$(2)),0)
286 kernel_version_merge=$$(( ($(call version_field,1,$(1)) << 24) + ($(call version_field,2,$(1)) << 16) + ($(call version_field,3,$(1)) << 8) + $(call version_field,4,$(1)) ))
287
288 ifdef DUMP
289   kernel_version_cmp=
290 else
291   kernel_version_cmp=$(shell [ $(call kernel_version_merge,$(call split_version,$(2))) $(1) $(call kernel_version_merge,$(call split_version,$(3))) ] && echo 1 )
292 endif
293
294 CompareKernelPatchVer=$(if $(call kernel_version_cmp,-$(2),$(1),$(3)),1,0)
295
296 kernel_patchver_gt=$(call kernel_version_cmp,-gt,$(KERNEL_PATCHVER),$(1))
297 kernel_patchver_ge=$(call kernel_version_cmp,-ge,$(KERNEL_PATCHVER),$(1))
298 kernel_patchver_eq=$(call kernel_version_cmp,-eq,$(KERNEL_PATCHVER),$(1))
299 kernel_patchver_le=$(call kernel_version_cmp,-le,$(KERNEL_PATCHVER),$(1))
300 kernel_patchver_lt=$(call kernel_version_cmp,-lt,$(KERNEL_PATCHVER),$(1))
301