Currently, nvidia-driver always installs the X.org driver, assuming this is a requirement for all functionalities provided by nvidia-driver, thus pulling in quite a bunch of X.org packages. However, it is perfectly legit to be doing CUDA (and OpenCL) work without the full X.org stack, and indeed the NVidia CUDA and OpenCL libraries do not require the X.org stack. Split the configuration so that it is posible to install the different parts independently from each others, so that CUDA can be installed all on its own. Reported-by: Al West <al.west@v-nova.com> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Cc: Al West <al.west@v-nova.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
172 lines
6.8 KiB
Makefile
172 lines
6.8 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
|
|
|
|
# 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
|
|
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
|
|
|
|
# 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))
|
|
$(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
|
|
|
|
# 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
|
|
$(NVIDIA_DRIVER_INSTALL_KERNEL_MODULE)
|
|
endef
|
|
|
|
$(eval $(generic-package))
|