1#
2# Copyright (C) 2006-2015 OpenWrt.org
3#
4# This is free software, licensed under the GNU General Public License v2.
5# See /LICENSE for more information.
6#
7
8ifeq ($(__target_inc),)
9  include $(INCLUDE_DIR)/target.mk
10endif
11
12ifeq ($(DUMP),1)
13  KERNEL?=<KERNEL>
14  BOARD?=<BOARD>
15  LINUX_VERSION?=<LINUX_VERSION>
16  LINUX_VERMAGIC?=<LINUX_VERMAGIC>
17else
18  ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
19    export GCC_HONOUR_COPTS=s
20  endif
21
22  LINUX_KMOD_SUFFIX=ko
23
24  ifneq (,$(findstring uml,$(BOARD)))
25    KERNEL_CC?=$(HOSTCC)
26    KERNEL_CROSS?=
27  else
28    KERNEL_CC?=$(TARGET_CC)
29    KERNEL_CROSS?=$(TARGET_CROSS)
30  endif
31
32  ifeq ($(TARGET_BUILD),1)
33    PATCH_DIR ?= ./patches$(if $(wildcard ./patches-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER))
34    FILES_DIR ?= $(foreach dir,$(wildcard ./files ./files-$(KERNEL_PATCHVER)),"$(dir)")
35  endif
36  KERNEL_BUILD_DIR ?= $(BUILD_DIR)/linux-$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET))
37  LINUX_DIR ?= $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)
38  LINUX_UAPI_DIR=uapi/
39  LINUX_VERMAGIC:=$(strip $(shell cat $(LINUX_DIR)/.vermagic 2>/dev/null))
40  LINUX_VERMAGIC:=$(if $(LINUX_VERMAGIC),$(LINUX_VERMAGIC),unknown)
41
42  LINUX_UNAME_VERSION:=$(if $(word 3,$(subst ., ,$(KERNEL_BASE))),$(KERNEL_BASE),$(KERNEL_BASE).0)
43  ifneq ($(findstring -rc,$(LINUX_VERSION)),)
44    LINUX_UNAME_VERSION:=$(LINUX_UNAME_VERSION)-$(strip $(lastword $(subst -, ,$(LINUX_VERSION))))
45  endif
46
47  MODULES_SUBDIR:=lib/modules/$(LINUX_UNAME_VERSION)
48  TARGET_MODULES_DIR := $(LINUX_TARGET_DIR)/$(MODULES_SUBDIR)
49
50  LINUX_KERNEL:=$(KERNEL_BUILD_DIR)/vmlinux
51
52  LINUX_SOURCE:=linux-$(LINUX_VERSION).tar.xz
53  TESTING:=$(if $(findstring -rc,$(LINUX_VERSION)),/testing,)
54  ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),)
55      LINUX_SITE:=@KERNEL/linux/kernel/v$(word 1,$(subst ., ,$(KERNEL_BASE))).x$(TESTING)
56  endif
57
58  ifneq ($(TARGET_BUILD),1)
59    PKG_BUILD_DIR ?= $(KERNEL_BUILD_DIR)/$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION))
60  endif
61endif
62
63ifneq (,$(findstring uml,$(BOARD)))
64  LINUX_KARCH=um
65else ifneq (,$(findstring $(ARCH) , aarch64 aarch64_be ))
66  LINUX_KARCH := arm64
67else ifneq (,$(findstring $(ARCH) , arceb ))
68  LINUX_KARCH := arc
69else ifneq (,$(findstring $(ARCH) , armeb ))
70  LINUX_KARCH := arm
71else ifneq (,$(findstring $(ARCH) , mipsel mips64 mips64el ))
72  LINUX_KARCH := mips
73else ifneq (,$(findstring $(ARCH) , sh2 sh3 sh4 ))
74  LINUX_KARCH := sh
75else ifneq (,$(findstring $(ARCH) , i386 x86_64 ))
76  LINUX_KARCH := x86
77else
78  LINUX_KARCH := $(ARCH)
79endif
80
81define KernelPackage/Defaults
82  FILES:=
83  AUTOLOAD:=
84endef
85
86define ModuleAutoLoad
87	$(SH_FUNC) \
88	export modules=; \
89	probe_module() { \
90		mods="$$$$$$$$1"; \
91		boot="$$$$$$$$2"; \
92		shift 2; \
93		for mod in $(sort $$$$$$$$mods); do \
94			mkdir -p $(2)/etc/modules.d; \
95			echo "$$$$$$$$mod" >> $(2)/etc/modules.d/$(1); \
96		done; \
97		if [ -e $(2)/etc/modules.d/$(1) ]; then \
98			if [ "$$$$$$$$boot" = "1" ]; then \
99				mkdir -p $(2)/etc/modules-boot.d; \
100				ln -s ../modules.d/$(1) $(2)/etc/modules-boot.d/; \
101			fi; \
102			modules="$$$$$$$${modules:+$$$$$$$$modules }$$$$$$$$mods"; \
103		fi; \
104	}; \
105	add_module() { \
106		priority="$$$$$$$$1"; \
107		mods="$$$$$$$$2"; \
108		boot="$$$$$$$$3"; \
109		shift 3; \
110		for mod in $(sort $$$$$$$$mods); do \
111			mkdir -p $(2)/etc/modules.d; \
112			echo "$$$$$$$$mod" >> $(2)/etc/modules.d/$$$$$$$$priority-$(1); \
113		done; \
114		if [ -e $(2)/etc/modules.d/$$$$$$$$priority-$(1) ]; then \
115			if [ "$$$$$$$$boot" = "1" ]; then \
116				mkdir -p $(2)/etc/modules-boot.d; \
117				ln -s ../modules.d/$$$$$$$$priority-$(1) $(2)/etc/modules-boot.d/; \
118			fi; \
119			modules="$$$$$$$${modules:+$$$$$$$$modules }$$$$$$$$priority-$(1)"; \
120		fi; \
121	}; \
122	$(3) \
123	if [ -n "$$$$$$$$modules" ]; then \
124		mkdir -p $(2)/etc/modules.d; \
125		mkdir -p $(2)/CONTROL; \
126		echo "#!/bin/sh" > $(2)/CONTROL/postinst-pkg; \
127		echo "[ -z \"\$$$$$$$$IPKG_INSTROOT\" ] || exit 0" >> $(2)/CONTROL/postinst-pkg; \
128		echo ". /lib/functions.sh" >> $(2)/CONTROL/postinst-pkg; \
129		echo "insert_modules $$$$$$$$modules" >> $(2)/CONTROL/postinst-pkg; \
130		chmod 0755 $(2)/CONTROL/postinst-pkg; \
131	fi
132endef
133
134ifeq ($(DUMP)$(TARGET_BUILD),)
135  -include $(LINUX_DIR)/.config
136endif
137
138define KernelPackage/depends
139  $(STAMP_BUILT): $(LINUX_DIR)/.config
140  define KernelPackage/depends
141  endef
142endef
143
144define KernelPackage
145  NAME:=$(1)
146  $(eval $(call Package/Default))
147  $(eval $(call KernelPackage/Defaults))
148  $(eval $(call KernelPackage/$(1)))
149  $(eval $(call KernelPackage/$(1)/$(BOARD)))
150
151  define Package/kmod-$(1)
152    TITLE:=$(TITLE)
153    SECTION:=kernel
154    CATEGORY:=Kernel modules
155    DESCRIPTION:=$(DESCRIPTION)
156    EXTRA_DEPENDS:=kernel (=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC))
157    VERSION:=$(LINUX_VERSION)$(if $(PKG_VERSION),+$(PKG_VERSION))-$(if $(PKG_RELEASE),$(PKG_RELEASE),$(LINUX_RELEASE))
158    PACKAGE_SUBDIR:=$(if $(FEED),$(FEED),kernel)
159    $(call KernelPackage/$(1))
160    $(call KernelPackage/$(1)/$(BOARD))
161  endef
162
163  ifdef KernelPackage/$(1)/conffiles
164    define Package/kmod-$(1)/conffiles
165$(call KernelPackage/$(1)/conffiles)
166    endef
167  endif
168
169  ifdef KernelPackage/$(1)/description
170    define Package/kmod-$(1)/description
171$(call KernelPackage/$(1)/description)
172    endef
173  endif
174
175  ifdef KernelPackage/$(1)/config
176    define Package/kmod-$(1)/config
177$(call KernelPackage/$(1)/config)
178    endef
179  endif
180
181  $(call KernelPackage/depends)
182
183  ifneq ($(if $(filter-out %=y %=n %=m,$(KCONFIG)),$(filter m y,$(foreach c,$(filter-out %=y %=n %=m,$(KCONFIG)),$($(c)))),.),)
184    ifneq ($(strip $(FILES)),)
185      define Package/kmod-$(1)/install
186		  @for mod in $$(call version_filter,$$(FILES)); do \
187			if grep -q "$$$$$$$${mod##$(LINUX_DIR)/}" "$(LINUX_DIR)/modules.builtin"; then \
188				echo "NOTICE: module '$$$$$$$$mod' is built-in."; \
189			elif [ -e $$$$$$$$mod ]; then \
190				mkdir -p $$(1)/$(MODULES_SUBDIR) ; \
191				$(CP) -L $$$$$$$$mod $$(1)/$(MODULES_SUBDIR)/ ; \
192			else \
193				echo "ERROR: module '$$$$$$$$mod' is missing." >&2; \
194				exit 1; \
195			fi; \
196		  done;
197		  $(call ModuleAutoLoad,$(1),$$(1),$(AUTOLOAD))
198		  $(call KernelPackage/$(1)/install,$$(1))
199      endef
200    endif
201  $(if $(CONFIG_PACKAGE_kmod-$(1)),
202    else
203      compile: $(1)-disabled
204      $(1)-disabled:
205		@echo "WARNING: kmod-$(1) is not available in the kernel config - generating empty package" >&2
206
207      define Package/kmod-$(1)/install
208		true
209      endef
210  )
211  endif
212  $$(eval $$(call BuildPackage,kmod-$(1)))
213
214  $$(IPKG_kmod-$(1)): $$(wildcard $$(FILES))
215endef
216
217version_filter=$(if $(findstring @,$(1)),$(shell $(SCRIPT_DIR)/metadata.pl version_filter $(KERNEL_PATCHVER) $(1)),$(1))
218
219define AutoLoad
220  add_module "$(1)" "$(call version_filter,$(2))" "$(3)";
221endef
222
223define AutoProbe
224  probe_module "$(call version_filter,$(1))" "$(2)";
225endef
226
227version_field=$(if $(word $(1),$(2)),$(word $(1),$(2)),0)
228kernel_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)) ))
229
230ifdef DUMP
231  kernel_version_cmp=
232else
233  kernel_version_cmp=$(shell [ $(call kernel_version_merge,$(call split_version,$(2))) $(1) $(call kernel_version_merge,$(call split_version,$(3))) ] && echo 1 )
234endif
235
236CompareKernelPatchVer=$(if $(call kernel_version_cmp,-$(2),$(1),$(3)),1,0)
237
238kernel_patchver_gt=$(call kernel_version_cmp,-gt,$(KERNEL_PATCHVER),$(1))
239kernel_patchver_ge=$(call kernel_version_cmp,-ge,$(KERNEL_PATCHVER),$(1))
240kernel_patchver_eq=$(call kernel_version_cmp,-eq,$(KERNEL_PATCHVER),$(1))
241kernel_patchver_le=$(call kernel_version_cmp,-le,$(KERNEL_PATCHVER),$(1))
242kernel_patchver_lt=$(call kernel_version_cmp,-lt,$(KERNEL_PATCHVER),$(1))
243
244