63abfb7210
Some heavily (and most often improperly) modified Linux kernels may export
new APIs to userland, so as to speak to custom hardware or custom kernel
facilities.
However, we currently have no easy way to use such kernels as a source
for the linux-headers package, which precludes having those userland
headers intalled for userland applications to use them.
We do have a way for the kernel to use the same version as for the
headers, but that is definitely not enough, as the linux-headers package
has a version choice that is far less versatile and capable than that of
the linux package.
Add a new option for the linux-headers package, for the user to specify
that the version (really, the sources) of the kernel be used to install
the headers from.
We do that by making linux-headers patch-depend on the linux package.
We can't have linux-header simply depend on linux, because the simple
dependency means the the dependee will be configured, built and installed
before the dependent is configured. And since linux is a target package,
it depends on the toolchain, which internally dependes on linux-headers,
which would depend on linux, and we'd get a circular dependency.
Using patch-depend will ensure that linux is extracted and patched
before linux-headers is extracted, which is really all we need.
Then, we install the headers from the linux source tree, rather than
from linux-headers' source tree (as there's nothing in there!).
Since we need to install a private set for uClibc (see cde947f
, uclibc:
prevent rebuilding after installation to staging), we explicitly set
INSTALL_HDR_PATH when calling the kernel' install-headers rule in
LINUX_HEADERS_CONFIGURE_CMDS, so that the headers are installed in
linux-headers' $(@D) instead of linux' $(@D).
Finally, as there is no way to know the kernel version in this case, we
must still prompt the user for the kernel series the headers are from
(like we do for a custom version) and check for consistency at build
time.
Note however that this still leaves users that want to built their
such-kernel outside of Buildroot out in the cold.
[Peter: drop comment as suggested by Thomas]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Karoly Kasza <kaszak@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <jacmet@uclibc.org>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
87 lines
2.7 KiB
Makefile
87 lines
2.7 KiB
Makefile
################################################################################
|
|
#
|
|
# linux-headers
|
|
#
|
|
################################################################################
|
|
|
|
# This package is used to provide Linux kernel headers for the
|
|
# internal toolchain backend.
|
|
|
|
ifeq ($(BR2_KERNEL_HEADERS_AS_KERNEL),y)
|
|
|
|
LINUX_HEADERS_VERSION = none
|
|
LINUX_HEADERS_SOURCE =
|
|
|
|
LINUX_HEADERS_LICENSE = $(LINUX_LICENSE)
|
|
LINUX_HEADERS_LICENSE_FILES = $(LINUX_LICENSE_FILES)
|
|
|
|
LINUX_HEADERS_PATCH_DEPENDENCIES = linux
|
|
LINUX_HEADERS_REAL_DIR = $(LINUX_DIR)
|
|
|
|
else # ! BR2_KERNEL_HEADERS_AS_KERNEL
|
|
|
|
LINUX_HEADERS_VERSION = $(call qstrip,$(BR2_DEFAULT_KERNEL_HEADERS))
|
|
ifeq ($(findstring x2.6.,x$(LINUX_HEADERS_VERSION)),x2.6.)
|
|
LINUX_HEADERS_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v2.6
|
|
else ifeq ($(findstring x3.,x$(LINUX_HEADERS_VERSION)),x3.)
|
|
LINUX_HEADERS_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v3.x
|
|
else ifeq ($(findstring x4.,x$(LINUX_HEADERS_VERSION)),x4.)
|
|
LINUX_HEADERS_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v4.x
|
|
endif
|
|
LINUX_HEADERS_SOURCE = linux-$(LINUX_HEADERS_VERSION).tar.xz
|
|
|
|
LINUX_HEADERS_LICENSE = GPLv2
|
|
LINUX_HEADERS_LICENSE_FILES = COPYING
|
|
|
|
LINUX_HEADERS_REAL_DIR = $(@D)
|
|
|
|
endif # ! BR2_KERNEL_HEADERS_AS_KERNEL
|
|
|
|
LINUX_HEADERS_INSTALL_STAGING = YES
|
|
|
|
# linux-headers is part of the toolchain so disable the toolchain dependency
|
|
LINUX_HEADERS_ADD_TOOLCHAIN_DEPENDENCY = NO
|
|
|
|
# For some architectures (eg. Arc, Cris, Hexagon, ia64, parisc,
|
|
# score and xtensa), the Linux buildsystem tries to call the
|
|
# cross-compiler, although it is not needed at all.
|
|
# This results in seemingly errors like:
|
|
# [...]/scripts/gcc-version.sh: line 26: arc-linux-uclibc-gcc: command not found
|
|
# Those can be safely ignored.
|
|
|
|
# This step is required to have a separate linux headers location for
|
|
# uClibc building. This way uClibc doesn't modify linux headers on installation
|
|
# of "its" headers
|
|
define LINUX_HEADERS_CONFIGURE_CMDS
|
|
(cd $(LINUX_HEADERS_REAL_DIR); \
|
|
$(TARGET_MAKE_ENV) $(MAKE) \
|
|
ARCH=$(KERNEL_ARCH) \
|
|
HOSTCC="$(HOSTCC)" \
|
|
HOSTCFLAGS="$(HOSTCFLAGS)" \
|
|
HOSTCXX="$(HOSTCXX)" \
|
|
INSTALL_HDR_PATH=$(@D)/usr \
|
|
headers_install)
|
|
endef
|
|
|
|
define LINUX_HEADERS_INSTALL_STAGING_CMDS
|
|
(cd $(LINUX_HEADERS_REAL_DIR); \
|
|
$(TARGET_MAKE_ENV) $(MAKE) \
|
|
ARCH=$(KERNEL_ARCH) \
|
|
HOSTCC="$(HOSTCC)" \
|
|
HOSTCFLAGS="$(HOSTCFLAGS)" \
|
|
HOSTCXX="$(HOSTCXX)" \
|
|
INSTALL_HDR_PATH=$(STAGING_DIR)/usr \
|
|
headers_install)
|
|
endef
|
|
|
|
ifeq ($(BR2_KERNEL_HEADERS_VERSION)$(BR2_KERNEL_HEADERS_AS_KERNEL),y)
|
|
define LINUX_HEADERS_CHECK_VERSION
|
|
$(call check_kernel_headers_version,\
|
|
$(STAGING_DIR),\
|
|
$(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)))
|
|
endef
|
|
LINUX_HEADERS_POST_INSTALL_STAGING_HOOKS += LINUX_HEADERS_CHECK_VERSION
|
|
endif
|
|
|
|
$(eval $(generic-package))
|