727bae0245
Some packages build kernel modules without using the kernel-module infra (because they use custom build systems); they do not automatically get the kernel to support modules which is ensured when using the infra. It must be done manually for all those packages, whenever they are enabled. Note: the nvidia-driver case does not need the ifeq-block other packages use, because it is already enclosed in a more stringent ifeq-block. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Peter Korsgaard <jacmet@uclibc.org> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Noé Rubinstein <nrubinstein@aldebaran.com> Cc: Jan Viktorin <viktorin@rehivetech.com> Cc: Gustavo Zacarias <gustavo@zacarias.com.ar> Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Tested-by: Jan Viktorin <viktorin@rehivetech.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
188 lines
7.3 KiB
Makefile
188 lines
7.3 KiB
Makefile
################################################################################
|
|
#
|
|
# nvidia-driver
|
|
#
|
|
################################################################################
|
|
|
|
NVIDIA_DRIVER_VERSION = 346.35
|
|
NVIDIA_DRIVER_SUFFIX = $(if $(BR2_x86_64),_64)
|
|
NVIDIA_DRIVER_SITE = ftp://download.nvidia.com/XFree86/Linux-x86$(NVIDIA_DRIVER_SUFFIX)/$(NVIDIA_DRIVER_VERSION)
|
|
NVIDIA_DRIVER_SOURCE = NVIDIA-Linux-x86$(NVIDIA_DRIVER_SUFFIX)-$(NVIDIA_DRIVER_VERSION).run
|
|
NVIDIA_DRIVER_LICENSE = NVIDIA Software License
|
|
NVIDIA_DRIVER_LICENSE_FILES = LICENSE
|
|
NVIDIA_DRIVER_REDISTRIBUTE = NO
|
|
NVIDIA_DRIVER_INSTALL_STAGING = YES
|
|
|
|
ifeq ($(BR2_PACKAGE_NVIDIA_DRIVER_XORG),y)
|
|
|
|
# Since nvidia-driver are binary blobs, the below dependencies are not
|
|
# strictly speaking build dependencies of nvidia-driver. However, they
|
|
# are build dependencies of packages that depend on nvidia-driver, so
|
|
# they should be built prior to those packages, and the only simple
|
|
# way to do so is to make nvidia-driver depend on them.
|
|
NVIDIA_DRIVER_DEPENDENCIES = mesa3d-headers xlib_libX11 xlib_libXext
|
|
NVIDIA_DRIVER_PROVIDES = libgl libegl libgles
|
|
|
|
# We have two variables that contains a list of libraries to install:
|
|
# NVIDIA_DRIVER_LIBS
|
|
# contains the libraries whose filename end up in .so.$(VERSION); rather
|
|
# than duplicate the version string for all of them, we just store their
|
|
# basename, and append the version string below.
|
|
# NVIDIA_DRIVER_LIBS_NO_VERSION
|
|
# contains all libraries the do not use the NVidia version; since there
|
|
# is currently only one such library, we store its full name.
|
|
|
|
# Each line corresponds to a specific set of libraries
|
|
NVIDIA_DRIVER_LIBS = \
|
|
libEGL libGLESv1_CM libGLESv2 libGL \
|
|
libnvidia-glcore libnvidia-eglcore libnvidia-glsi \
|
|
tls/libnvidia-tls \
|
|
libvdpau libvdpau_nvidia \
|
|
libnvidia-ml
|
|
|
|
# Install the gl.pc file
|
|
define NVIDIA_DRIVER_INSTALL_GL_DEV
|
|
$(INSTALL) -D -m 0644 $(@D)/libGL.la $(STAGING_DIR)/usr/lib/libGL.la
|
|
$(SED) 's:__GENERATED_BY__:Buildroot:' $(STAGING_DIR)/usr/lib/libGL.la
|
|
$(SED) 's:__LIBGL_PATH__:/usr/lib:' $(STAGING_DIR)/usr/lib/libGL.la
|
|
$(SED) 's:-L[^[:space:]]\+::' $(STAGING_DIR)/usr/lib/libGL.la
|
|
$(INSTALL) -D -m 0644 package/nvidia-driver/gl.pc $(STAGING_DIR)/usr/lib/pkgconfig/gl.pc
|
|
endef
|
|
|
|
# Those libraries are 'private' libraries requiring an agreement with
|
|
# NVidia to develop code for those libs. There seems to be no restriction
|
|
# on using those libraries (e.g. if the user has such an agreement, or
|
|
# wants to run a third-party program developped under such an agreement).
|
|
ifeq ($(BR2_PACKAGE_NVIDIA_DRIVER_PRIVATE_LIBS),y)
|
|
NVIDIA_DRIVER_LIBS += libnvidia-ifr libnvidia-fbc
|
|
endif
|
|
|
|
# We refer to the destination path; the origin file has no directory component
|
|
NVIDIA_DRIVER_X_MODS = drivers/nvidia_drv.so \
|
|
extensions/libglx.so.$(NVIDIA_DRIVER_VERSION) \
|
|
libnvidia-wfb.so.$(NVIDIA_DRIVER_VERSION)
|
|
|
|
endif # X drivers
|
|
|
|
ifeq ($(BR2_PACKAGE_NVIDIA_DRIVER_CUDA),y)
|
|
NVIDIA_DRIVER_LIBS += libcuda libnvidia-compiler libnvcuvid libnvidia-encode
|
|
ifeq ($(BR2_PACKAGE_NVIDIA_DRIVER_CUDA_PROGS),y)
|
|
NVIDIA_DRIVER_PROGS = nvidia-cuda-mps-control nvidia-cuda-mps-server
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(BR2_PACKAGE_NVIDIA_DRIVER_OPENCL),y)
|
|
NVIDIA_DRIVER_LIBS_NO_VERSION += libOpenCL.so.1.0.0
|
|
NVIDIA_DRIVER_LIBS += libnvidia-opencl
|
|
endif
|
|
|
|
# The downloaded archive is in fact an auto-extract script. So, it can run
|
|
# virtually everywhere, and it is fine enough to provide useful options.
|
|
# Except it can't extract into an existing (even empty) directory.
|
|
define NVIDIA_DRIVER_EXTRACT_CMDS
|
|
$(SHELL) $(DL_DIR)/$(NVIDIA_DRIVER_SOURCE) --extract-only --target \
|
|
$(@D)/tmp-extract
|
|
mv $(@D)/tmp-extract/* $(@D)/tmp-extract/.manifest $(@D)
|
|
rm -rf $(@D)/tmp-extract
|
|
endef
|
|
|
|
# Build and install the kernel modules if needed
|
|
ifeq ($(BR2_PACKAGE_NVIDIA_DRIVER_MODULE),y)
|
|
|
|
NVIDIA_DRIVER_DEPENDENCIES += linux
|
|
|
|
# We're building a kernel module without using the kernel-module infra,
|
|
# so we need to tell we want module support in the kernel
|
|
LINUX_NEEDS_MODULES = y
|
|
|
|
# NVidia uses the legacy naming scheme for the x86 architecture, when i386
|
|
# and x86_64 were still considered two separate architectures in the Linux
|
|
# kernel.
|
|
NVIDIA_DRIVER_ARCH = $(if $(BR2_i386),i386,$(BR2_ARCH))
|
|
|
|
NVIDIA_DRIVER_MOD_DIRS = kernel
|
|
NVIDIA_DRIVER_MOD_FILES = kernel/nvidia.ko
|
|
# nvidia-uvm.ko only available for x86_64
|
|
ifeq ($(BR2_x86_64)$(BR2_PACKAGE_NVIDIA_DRIVER_CUDA),yy)
|
|
NVIDIA_DRIVER_MOD_DIRS += kernel/uvm
|
|
NVIDIA_DRIVER_MOD_FILES += kernel/uvm/nvidia-uvm.ko
|
|
endif
|
|
|
|
# We can not use '$(MAKE) -C $(@D)/$${dir}' because NVidia's uses its own
|
|
# Makefile to build a kernel module, which includes a lot of assumptions
|
|
# on where to find its own sub-Makefile fragments, and fails if make is
|
|
# not run from the directory where the module's source files are. Hence
|
|
# our little trick to cd in there first.
|
|
# That's also the reason why we do not use LINUX_MAKE_FLAGS or the other
|
|
# linux-specific variables, since NVidia's Makefile does not understand
|
|
# them.
|
|
define NVIDIA_DRIVER_BUILD_CMDS
|
|
for dir in $(NVIDIA_DRIVER_MOD_DIRS); do \
|
|
(cd $(@D)/$${dir} && \
|
|
$(MAKE) SYSSRC="$(LINUX_DIR)" SYSOUT="$(LINUX_DIR)" \
|
|
CC="$(TARGET_CC)" LD="$(TARGET_LD)" HOSTCC="$(HOSTCC)" \
|
|
ARCH=$(NVIDIA_DRIVER_ARCH) module) || exit 1; \
|
|
done
|
|
endef
|
|
|
|
# We do not use module-install because NVidia's Makefile requires root.
|
|
# Also, we do not install it in the expected location (in nvidia/ rather
|
|
# than in kernel/drivers/video/)
|
|
define NVIDIA_DRIVER_INSTALL_KERNEL_MODULE
|
|
for mod in $(NVIDIA_DRIVER_MOD_FILES); do \
|
|
$(INSTALL) -D -m 0644 $(@D)/$${mod} \
|
|
$(TARGET_DIR)/lib/modules/$(LINUX_VERSION_PROBED)/nvidia/$${mod##*/} \
|
|
|| exit 1; \
|
|
done
|
|
$(HOST_DIR)/sbin/depmod -a -b $(TARGET_DIR) $(LINUX_VERSION_PROBED)
|
|
endef
|
|
|
|
endif # BR2_PACKAGE_NVIDIA_DRIVER_MODULE == y
|
|
|
|
# Helper to install libraries
|
|
# $1: destination directory (target or staging)
|
|
#
|
|
# For all libraries that need it, we append the NVidia version string.
|
|
# Then for all libraries, we install them and create a symlink using
|
|
# their SONAME, so we can link to them at runtime; we also create the
|
|
# no-version symlink, so we can link to them at build time.
|
|
define NVIDIA_DRIVER_INSTALL_LIBS
|
|
for libpath in $(addsuffix .so.$(NVIDIA_DRIVER_VERSION),$(NVIDIA_DRIVER_LIBS)) \
|
|
$(NVIDIA_DRIVER_LIBS_NO_VERSION); \
|
|
do \
|
|
libname="$${libpath##*/}"; \
|
|
$(INSTALL) -D -m 0644 $(@D)/$${libpath} $(1)/usr/lib/$${libname}; \
|
|
libsoname="$$( $(TARGET_READELF) -d "$(@D)/$${libpath}" \
|
|
|sed -r -e '/.*\(SONAME\).*\[(.*)\]$$/!d; s//\1/;' )"; \
|
|
if [ -n "$${libsoname}" -a "$${libsoname}" != "$${libname}" ]; then \
|
|
ln -sf $${libname} $(1)/usr/lib/$${libsoname}; \
|
|
fi; \
|
|
baseso="$${libname/.so*}.so"; \
|
|
if [ -n "$${baseso}" -a "$${baseso}" != "$${libname}" ]; then \
|
|
ln -sf $${libname} $(1)/usr/lib/$${baseso}; \
|
|
fi; \
|
|
done
|
|
endef
|
|
|
|
# For staging, install libraries and development files
|
|
define NVIDIA_DRIVER_INSTALL_STAGING_CMDS
|
|
$(call NVIDIA_DRIVER_INSTALL_LIBS,$(STAGING_DIR))
|
|
$(NVIDIA_DRIVER_INSTALL_GL_DEV)
|
|
endef
|
|
|
|
# For target, install libraries and X.org modules
|
|
define NVIDIA_DRIVER_INSTALL_TARGET_CMDS
|
|
$(call NVIDIA_DRIVER_INSTALL_LIBS,$(TARGET_DIR))
|
|
for m in $(NVIDIA_DRIVER_X_MODS); do \
|
|
$(INSTALL) -D -m 0644 $(@D)/$${m##*/} \
|
|
$(TARGET_DIR)/usr/lib/xorg/modules/$${m}; \
|
|
done
|
|
for p in $(NVIDIA_DRIVER_PROGS); do \
|
|
$(INSTALL) -D -m 0755 $(@D)/$${p} \
|
|
$(TARGET_DIR)/usr/bin/$${p}; \
|
|
done
|
|
$(NVIDIA_DRIVER_INSTALL_KERNEL_MODULE)
|
|
endef
|
|
|
|
$(eval $(generic-package))
|