nvidia-driver.mk
7.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
################################################################################
#
# nvidia-driver
#
################################################################################
NVIDIA_DRIVER_VERSION = 358.16
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
# 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))