1################################################################################
2#
3# linux-headers
4#
5################################################################################
6
7# This package is used to provide Linux kernel headers for the
8# internal toolchain backend.
9
10# Set variables depending on whether we are using headers from a kernel
11# build or a standalone header package.
12ifeq ($(BR2_KERNEL_HEADERS_AS_KERNEL),y)
13LINUX_HEADERS_CUSTOM_TARBALL = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_TARBALL))
14LINUX_HEADERS_CUSTOM_GIT = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_GIT))
15LINUX_HEADERS_CUSTOM_HG = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_HG))
16LINUX_HEADERS_CUSTOM_SVN = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_SVN))
17LINUX_HEADERS_VERSION = $(call qstrip,$(BR2_LINUX_KERNEL_VERSION))
18LINUX_HEADERS_CUSTOM_TARBALL_LOCATION = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION))
19LINUX_HEADERS_REPO_URL = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL))
20LINUX_HEADERS_CIP = $(BR2_LINUX_KERNEL_LATEST_CIP_VERSION)$(BR2_LINUX_KERNEL_LATEST_CIP_RT_VERSION)
21ifneq ($(LINUX_HEADERS_OVERRIDE_SRCDIR),)
22$(error LINUX_HEADERS_OVERRIDE_SRCDIR must not be set when BR2_KERNEL_HEADERS_AS_KERNEL=y)
23endif
24LINUX_HEADERS_OVERRIDE_SRCDIR = $(LINUX_OVERRIDE_SRCDIR)
25else # ! BR2_KERNEL_HEADERS_AS_KERNEL
26LINUX_HEADERS_CUSTOM_TARBALL = $(call qstrip,$(BR2_KERNEL_HEADERS_CUSTOM_TARBALL))
27LINUX_HEADERS_CUSTOM_GIT = $(call qstrip,$(BR2_KERNEL_HEADERS_CUSTOM_GIT))
28LINUX_HEADERS_CUSTOM_HG =
29LINUX_HEADERS_CUSTOM_SVN =
30LINUX_HEADERS_VERSION = $(call qstrip,$(BR2_DEFAULT_KERNEL_HEADERS))
31LINUX_HEADERS_CUSTOM_TARBALL_LOCATION = $(call qstrip,$(BR2_KERNEL_HEADERS_CUSTOM_TARBALL_LOCATION))
32LINUX_HEADERS_REPO_URL = $(call qstrip,$(BR2_KERNEL_HEADERS_CUSTOM_REPO_URL))
33LINUX_HEADERS_CIP =
34endif # BR2_KERNEL_HEADERS_AS_KERNEL
35
36ifeq ($(BR2_KERNEL_HEADERS_VERSION)$(BR_BUILDING),yy)
37ifeq ($(LINUX_HEADERS_VERSION),)
38$(error No kernel headers version set, check your BR2_DEFAULT_KERNEL_VERSION setting)
39endif
40endif
41
42# Compute LINUX_HEADERS_SOURCE and LINUX_HEADERS_SITE from the configuration
43ifeq ($(LINUX_HEADERS_CUSTOM_TARBALL),y)
44ifeq ($(BR_BUILDING),y)
45ifeq ($(LINUX_HEADERS_CUSTOM_TARBALL_LOCATION),)
46$(error No kernel headers tarball location set, check your BR2_KERNEL_HEADERS_CUSTOM_TARBALL_LOCATION setting)
47endif
48endif
49LINUX_HEADERS_SOURCE = $(notdir $(LINUX_HEADERS_CUSTOM_TARBALL_LOCATION))
50LINUX_HEADERS_SITE = $(patsubst %/,%,$(dir $(LINUX_HEADERS_CUSTOM_TARBALL_LOCATION)))
51else ifeq ($(LINUX_HEADERS_CUSTOM_GIT),y)
52LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION)$(BR_FMT_VERSION_git).tar.gz
53LINUX_HEADERS_SITE = $(LINUX_HEADERS_REPO_URL)
54LINUX_HEADERS_SITE_METHOD = git
55else ifeq ($(LINUX_HEADERS_CUSTOM_HG),y)
56LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION).tar.gz
57LINUX_HEADERS_SITE = $(LINUX_HEADERS_REPO_URL)
58LINUX_HEADERS_SITE_METHOD = hg
59else ifeq ($(LINUX_HEADERS_CUSTOM_SVN),y)
60LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION)$(BR_FMT_VERSION_svn).tar.gz
61LINUX_HEADERS_SITE = $(LINUX_HEADERS_REPO_URL)
62LINUX_HEADERS_SITE_METHOD = svn
63else ifeq ($(LINUX_HEADERS_CIP),y)
64LINUX_HEADERS_SOURCE = linux-cip-$(LINUX_HEADERS_VERSION).tar.gz
65LINUX_HEADERS_SITE = https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip.git/snapshot
66else ifneq ($(findstring -rc,$(LINUX_HEADERS_VERSION)),)
67# Since 4.12-rc1, -rc kernels are generated from cgit. This also works for
68# older -rc kernels.
69LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION).tar.gz
70LINUX_HEADERS_SITE = https://git.kernel.org/torvalds/t
71else
72LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION).tar.xz
73ifeq ($(findstring x2.6.,x$(LINUX_HEADERS_VERSION)),x2.6.)
74LINUX_HEADERS_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v2.6
75else
76LINUX_HEADERS_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v$(firstword $(subst ., ,$(LINUX_HEADERS_VERSION))).x
77endif # x2.6
78endif # LINUX_HEADERS_CUSTOM_TARBALL
79
80# Apply any necessary patches if we are using the headers from a kernel
81# build.
82ifeq ($(BR2_KERNEL_HEADERS_AS_KERNEL),y)
83LINUX_HEADERS_PATCHES = $(call qstrip,$(BR2_LINUX_KERNEL_PATCH)) \
84	$(wildcard $(addsuffix /linux,$(call qstrip,$(BR2_GLOBAL_PATCH_DIR))))
85
86# We rely on the generic package infrastructure to download and apply
87# remote patches (downloaded from ftp, http or https). For local
88# patches, we can't rely on that infrastructure, because there might
89# be directories in the patch list (unlike for other packages).
90LINUX_HEADERS_PATCH = $(filter ftp://% http://% https://%,$(LINUX_HEADERS_PATCHES))
91
92define LINUX_HEADERS_APPLY_LOCAL_PATCHES
93	for p in $(filter-out ftp://% http://% https://%,$(LINUX_HEADERS_PATCHES)) ; do \
94		if test -d $$p ; then \
95			$(APPLY_PATCHES) $(@D) $$p \*.patch || exit 1 ; \
96		else \
97			$(APPLY_PATCHES) $(@D) `dirname $$p` `basename $$p` || exit 1; \
98		fi \
99	done
100endef
101
102LINUX_HEADERS_POST_PATCH_HOOKS += LINUX_HEADERS_APPLY_LOCAL_PATCHES
103endif # BR2_KERNEL_HEADERS_AS_KERNEL
104
105# Skip hash checking for custom kernel headers.
106ifeq ($(BR2_KERNEL_HEADERS_VERSION)$(BR2_KERNEL_HEADERS_CUSTOM_TARBALL)$(BR2_KERNEL_HEADERS_CUSTOM_GIT),y)
107BR_NO_CHECK_HASH_FOR += $(LINUX_HEADERS_SOURCE)
108endif
109
110# linux-headers really is the same as the linux package
111LINUX_HEADERS_DL_SUBDIR = linux
112
113LINUX_HEADERS_LICENSE = GPL-2.0
114ifeq ($(BR2_KERNEL_HEADERS_LATEST),y)
115LINUX_HEADERS_LICENSE_FILES = \
116	COPYING \
117	LICENSES/preferred/GPL-2.0 \
118	LICENSES/exceptions/Linux-syscall-note
119endif
120LINUX_HEADERS_CPE_ID_VENDOR = linux
121LINUX_HEADERS_CPE_ID_PRODUCT = linux_kernel
122
123LINUX_HEADERS_INSTALL_STAGING = YES
124
125# linux-headers is part of the toolchain so disable the toolchain dependency
126LINUX_HEADERS_ADD_TOOLCHAIN_DEPENDENCY = NO
127
128LINUX_HEADERS_DEPENDENCIES = $(BR2_MAKE_HOST_DEPENDENCY)
129
130# For some architectures (eg. Arc, Cris, Hexagon, ia64, parisc,
131# score and xtensa), the Linux buildsystem tries to call the
132# cross-compiler, although it is not needed at all.
133# This results in seemingly errors like:
134#   [...]/scripts/gcc-version.sh: line 26: arc-linux-uclibc-gcc: command not found
135# Those can be safely ignored.
136
137# This step is required to have a separate linux headers location for
138# uClibc building. This way uClibc doesn't modify linux headers on installation
139# of "its" headers
140define LINUX_HEADERS_CONFIGURE_CMDS
141	(cd $(@D); \
142		$(TARGET_MAKE_ENV) $(BR2_MAKE) \
143			ARCH=$(KERNEL_ARCH) \
144			HOSTCC="$(HOSTCC)" \
145			HOSTCFLAGS="$(HOSTCFLAGS)" \
146			HOSTCXX="$(HOSTCXX)" \
147			INSTALL_HDR_PATH=$(@D)/usr \
148			headers_install)
149endef
150
151define LINUX_HEADERS_INSTALL_STAGING_CMDS
152	(cd $(@D); \
153		$(TARGET_MAKE_ENV) $(BR2_MAKE) \
154			ARCH=$(KERNEL_ARCH) \
155			HOSTCC="$(HOSTCC)" \
156			HOSTCFLAGS="$(HOSTCFLAGS)" \
157			HOSTCXX="$(HOSTCXX)" \
158			INSTALL_HDR_PATH=$(STAGING_DIR)/usr \
159			headers_install)
160endef
161
162ifeq ($(BR2_KERNEL_HEADERS_VERSION)$(BR2_KERNEL_HEADERS_AS_KERNEL)$(BR2_KERNEL_HEADERS_CUSTOM_TARBALL)$(BR2_KERNEL_HEADERS_CUSTOM_GIT),y)
163# In this case, we must always do a 'loose' test, because they are all
164# custom versions which may be later than what we know right now.
165define LINUX_HEADERS_CHECK_VERSION
166	$(call check_kernel_headers_version,\
167		$(BUILD_DIR),\
168		$(STAGING_DIR),\
169		$(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)),\
170		loose)
171endef
172LINUX_HEADERS_POST_INSTALL_STAGING_HOOKS += LINUX_HEADERS_CHECK_VERSION
173endif
174
175$(eval $(generic-package))
176