summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2016-01-05 13:10:04 -0800
committerAaron Plattner <aplattner@nvidia.com>2016-01-05 13:10:04 -0800
commit9ac4f60ba75767e2983117e82f5ec13df8a03226 (patch)
tree854857a375d02a94191d0c3ae4a4cf3f2cae9a89
parentef15f6bbb960abf20b3f2329b5074a35fc72f129 (diff)
361.16361.16
-rw-r--r--backup.c25
-rw-r--r--command-list.c72
-rw-r--r--conflicting-kernel-modules.c1
-rw-r--r--files.c149
-rw-r--r--files.h2
-rw-r--r--install-from-cwd.c78
-rw-r--r--manifest.c4
-rw-r--r--misc.c82
-rw-r--r--misc.h1
-rw-r--r--nvidia-installer.c15
-rw-r--r--nvidia-installer.h8
-rw-r--r--option_table.h27
-rw-r--r--version.mk2
13 files changed, 279 insertions, 187 deletions
diff --git a/backup.c b/backup.c
index 39e58c3..8599124 100644
--- a/backup.c
+++ b/backup.c
@@ -832,6 +832,31 @@ static int do_uninstall(Options *op, const char *version)
}
}
+ if (op->uninstall) {
+ /* Update modules.dep and the ldconfig(8) cache to remove entries for
+ * any DSOs and kernel modules that we just uninstalled. */
+
+ char *cmd;
+ int status;
+
+ ui_log(op, "Running depmod and ldconfig:");
+
+ cmd = nvstrcat(op->utils[DEPMOD], " -a ", op->kernel_name, NULL);
+ status = run_command(op, cmd, NULL, FALSE, 0, FALSE);
+ nvfree(cmd);
+
+ status |= run_command(op, op->utils[LDCONFIG], NULL, FALSE, 0, FALSE);
+
+ if (status == 0) {
+ ui_log(op, "done.");
+ } else {
+ ui_log(op, "error!");
+ ui_warn(op, "An error occurred while running depmod or ldconfig "
+ "after uninstallation: your system may have stale state "
+ "involving recently uninstalled files.");
+ }
+ }
+
run_distro_hook(op, "post-uninstall");
free_backup_info(b);
diff --git a/command-list.c b/command-list.c
index 7dc5933..ec22f7b 100644
--- a/command-list.c
+++ b/command-list.c
@@ -61,6 +61,9 @@ static void add_file_to_list(const char*, const char*, FileList*);
static void append_to_rpm_file_list(Options *op, Command *c);
+static ConflictingFileInfo *build_conflicting_file_list(Options *op, Package *p);
+static void get_conflicting_file_info(const char *file, ConflictingFileInfo *cfi);
+
/*
* find_conflicting_files() optionally takes an array of NoRecursionDirectory
* entries to indicate which directories should not be recursively searched.
@@ -243,6 +246,7 @@ CommandList *build_command_list(Options *op, Package *p)
if (!op->kernel_module_only) {
char **paths;
int numpaths, i;
+ ConflictingFileInfo *conflicting_files;
/*
* stop recursing into any "nvidia-cg-toolkit"
@@ -266,11 +270,13 @@ CommandList *build_command_list(Options *op, Package *p)
ui_status_begin(op, "Searching for conflicting files:", "Searching");
+ conflicting_files = build_conflicting_file_list(op, p);
for (i = 0; i < numpaths; i++) {
ui_status_update(op, (i + 1.0f) / numpaths, "Searching: %s", paths[i]);
- find_conflicting_files(op, paths[i], p->conflicting_files, l,
+ find_conflicting_files(op, paths[i], conflicting_files, l,
skipdirs);
}
+ nvfree(conflicting_files);
ui_status_end(op, "done.");
}
@@ -416,7 +422,7 @@ CommandList *build_command_list(Options *op, Package *p)
*/
if (!op->no_kernel_module) {
- tmp = nvstrcat(op->utils[DEPMOD], " -aq ", op->kernel_name, NULL);
+ tmp = nvstrcat(op->utils[DEPMOD], " -a ", op->kernel_name, NULL);
add_command(c, RUN_CMD, tmp);
nvfree(tmp);
}
@@ -858,6 +864,68 @@ static void find_conflicting_files(Options *op,
} /* find_conflicting_files() */
+void get_conflicting_file_info(const char *file, ConflictingFileInfo *cfi)
+{
+ char *c;
+
+ cfi->name = file;
+
+ /*
+ * match the names of DSOs with "libfoo.so*" by stopping any comparisons
+ * after ".so".
+ */
+
+ c = strstr(file, ".so.");
+ if (c) {
+ cfi->len = (c - file) + 3;
+ } else {
+ cfi->len = strlen(file);
+ }
+
+ /*
+ * XXX avoid conflicting with libglx.so if it doesn't include the string
+ * "glxModuleData" to avoid removing the wrong libglx.so (bug 489316)
+ */
+
+ if (strncmp(file, "libglx.so", cfi->len) == 0) {
+ cfi->requiredString = "glxModuleData";
+ } else {
+ cfi->requiredString = NULL;
+ }
+}
+
+ConflictingFileInfo *build_conflicting_file_list(Options *op, Package *p)
+{
+ ConflictingFileInfo *cfList = NULL;
+ int index = 0;
+ int i;
+
+ // Allocate enough space for the whole file list, plus two extra files and
+ // a NULL at the end.
+ cfList = nvalloc((p->num_entries + 3) * sizeof(ConflictingFileInfo));
+
+ for (i = 0; i < p->num_entries; i++) {
+ PackageEntry *entry = &p->entries[i];
+ if (entry->caps.is_shared_lib && !entry->caps.is_wrapper) {
+ get_conflicting_file_info(entry->name, &cfList[index++]);
+ }
+ }
+
+ /* XXX always conflict with these files if OpenGL files will be installed
+ * libglamoregl.so: prevent X from loading libGL and libglx simultaneously
+ * (bug 1299091)
+ * libGLwrapper.so: this library has an SONAME of libGL.so.1 (bug 74761) */
+ if (!op->no_opengl_files) {
+ get_conflicting_file_info("libglamoregl.so", &cfList[index++]);
+ get_conflicting_file_info("libGLwrapper.so", &cfList[index++]);
+ }
+
+ /* terminate the conflicting files list */
+ cfList[index].name = NULL;
+
+ return cfList;
+}
+
/*
diff --git a/conflicting-kernel-modules.c b/conflicting-kernel-modules.c
index 74c33eb..4d9e890 100644
--- a/conflicting-kernel-modules.c
+++ b/conflicting-kernel-modules.c
@@ -28,6 +28,7 @@
const char * const conflicting_kernel_modules[] = {
"nvidia-uvm",
+ "nvidia-drm",
"nvidia-modeset",
"nvidia",
"nvidia0", "nvidia1", "nvidia2", "nvidia3",
diff --git a/files.c b/files.c
index 5dcc970..d5f975d 100644
--- a/files.c
+++ b/files.c
@@ -35,6 +35,7 @@
#include <libgen.h>
#include <utime.h>
#include <time.h>
+#include <sys/wait.h>
#include "nvidia-installer.h"
#include "user-interface.h"
@@ -627,6 +628,8 @@ int set_destinations(Options *op, Package *p)
case FILE_TYPE_OPENGL_LIB:
case FILE_TYPE_OPENGL_SYMLINK:
+ case FILE_TYPE_GLVND_LIB:
+ case FILE_TYPE_GLVND_SYMLINK:
if (p->entries[i].compat_arch == FILE_COMPAT_ARCH_COMPAT32) {
prefix = op->compat32_prefix;
dir = op->compat32_libdir;
@@ -639,8 +642,6 @@ int set_destinations(Options *op, Package *p)
case FILE_TYPE_VDPAU_LIB:
case FILE_TYPE_VDPAU_SYMLINK:
- case FILE_TYPE_VDPAU_WRAPPER_LIB:
- case FILE_TYPE_VDPAU_WRAPPER_SYMLINK:
if (p->entries[i].compat_arch == FILE_COMPAT_ARCH_COMPAT32) {
prefix = op->compat32_prefix;
dir = op->compat32_libdir;
@@ -874,8 +875,6 @@ int set_destinations(Options *op, Package *p)
#endif /* NV_X86_64 */
}
- check_libGLX_indirect_links(op, p);
-
return TRUE;
} /* set_destinations() */
@@ -3144,3 +3143,145 @@ void add_libgl_abi_symlink(Options *op, Package *p)
nvfree(opengl_path);
nvfree(opengl32_path);
}
+
+typedef enum {
+ LIBGLVND_CHECK_RESULT_INSTALLED = 0,
+ LIBGLVND_CHECK_RESULT_NOT_INSTALLED = 1,
+ LIBGLVND_CHECK_RESULT_PARTIAL = 2,
+ LIBGLVND_CHECK_RESULT_ERROR = 3,
+} LibglvndInstallCheckResult;
+
+/*
+ * run_libglvnd_script() - Finds and runs the libglvnd install checker script.
+ *
+ * This runs a helper script which determines whether the libglvnd libraries
+ * are installed, missing, or partially installed.
+ *
+ * If the helper script is not included in the package, then it will just
+ * return LIBGLVND_CHECK_RESULT_NOT_INSTALLED.
+ */
+static LibglvndInstallCheckResult run_libglvnd_script(Options *op, Package *p)
+{
+ const char *scriptPath = "./libglvnd_install_checker/check-libglvnd-install.sh";
+ char *cmdline = NULL;
+ int status;
+ LibglvndInstallCheckResult result = LIBGLVND_CHECK_RESULT_ERROR;
+
+ log_printf(op, NULL, "Looking for install checker script at %s", scriptPath);
+ if (access(scriptPath, R_OK) != 0) {
+ // We don't have the install check script, so assume that it's not
+ // installed.
+ log_printf(op, NULL, "No libglvnd install checker script, assuming not installed.");
+ result = LIBGLVND_CHECK_RESULT_NOT_INSTALLED;
+ goto done;
+ }
+
+ cmdline = nvasprintf("/bin/sh %s", scriptPath);
+ status = run_command(op, cmdline, NULL, TRUE, 0, FALSE);
+ if (WIFEXITED(status)) {
+ result = WEXITSTATUS(status);
+ } else {
+ result = LIBGLVND_CHECK_RESULT_ERROR;
+ }
+
+done:
+ nvfree(cmdline);
+ return result;
+}
+
+/*
+ * check_libglvnd_files() - Checks whether or not the installer should install
+ * the libglvnd libraries.
+ *
+ * If the libglvnd libraries are already installed, then we'll leave them
+ * alone. If they're not already installed, then we'll install our own copies.
+ *
+ * Note that we only check for the native libraries, and use that result for
+ * both the native and 32-bit compatibility libraries. The reason for that is
+ * that the conflicting file list can't distinguish between 32-bit and 64-bit
+ * files that have the same filename, so it won't correctly handle installing
+ * one but not the other.
+ */
+int check_libglvnd_files(Options *op, Package *p)
+{
+ int shouldInstall = op->install_libglvnd_libraries;
+ int foundAnyFiles = FALSE;
+ int i;
+
+ // Start by checking for any libGLX_indirect.so.0 links.
+ check_libGLX_indirect_links(op, p);
+
+ // Then, check to see if there are any libglvnd files in the package.
+ for (i = 0; i < p->num_entries; i++) {
+ if (p->entries[i].type == FILE_TYPE_GLVND_LIB ||
+ p->entries[i].type == FILE_TYPE_GLVND_SYMLINK) {
+ foundAnyFiles = TRUE;
+ break;
+ }
+ }
+ if (!foundAnyFiles) {
+ return TRUE;
+ }
+
+ if (shouldInstall == NV_OPTIONAL_BOOL_DEFAULT) {
+ // Try to figure out whether libglvnd is already installed. We'll defer
+ // to a separate program to do that.
+
+ LibglvndInstallCheckResult result = run_libglvnd_script(op, p);
+ if (result == LIBGLVND_CHECK_RESULT_INSTALLED) {
+ // The libraries are already installed, so leave them alone.
+ shouldInstall = NV_OPTIONAL_BOOL_FALSE;
+ } else if (result == LIBGLVND_CHECK_RESULT_NOT_INSTALLED) {
+ // The libraries are not installed, so install our own copies.
+ shouldInstall = NV_OPTIONAL_BOOL_TRUE;
+ } else if (result == LIBGLVND_CHECK_RESULT_PARTIAL) {
+ // The libraries are partially installed. Ask the user what to do.
+ static int partialAction = -1;
+ if (partialAction < 0) {
+ static const char *ANSWERS[] = {
+ "Don't install libglvnd files",
+ "Install and overwrite existing files",
+ "Abort installation."
+ };
+
+ partialAction = ui_multiple_choice(op, ANSWERS, 3, 2,
+ "An incomplete installation of libglvnd was found. "
+ "Do you want to install a full copy of libglvnd? "
+ "This will overwrite any existing libglvnd libraries.");
+ }
+ if (partialAction == 0) {
+ // Don't install
+ shouldInstall = NV_OPTIONAL_BOOL_FALSE;
+ } else if (partialAction == 1) {
+ // Install and overwrite
+ shouldInstall = NV_OPTIONAL_BOOL_TRUE;
+ } else {
+ // Abort.
+ return FALSE;
+ }
+ } else {
+ // Some error occurred.
+ return FALSE;
+ }
+ }
+
+ // Sanity check: We should have set shouldInstall to true or false by now.
+ if (shouldInstall != NV_OPTIONAL_BOOL_FALSE && shouldInstall != NV_OPTIONAL_BOOL_TRUE) {
+ ui_error(op, "Internal error: Could not determine whether to install libglvnd");
+ return FALSE;
+ }
+
+ if (shouldInstall != NV_OPTIONAL_BOOL_TRUE) {
+ log_printf(op, NULL, "Will not install libglvnd libraries.");
+ for (i = 0; i < p->num_entries; i++) {
+ if (p->entries[i].type == FILE_TYPE_GLVND_LIB ||
+ p->entries[i].type == FILE_TYPE_GLVND_SYMLINK) {
+ invalidate_package_entry(&(p->entries[i]));
+ }
+ }
+ } else {
+ log_printf(op, NULL, "Will install libglvnd libraries.");
+ }
+ return TRUE;
+}
+
diff --git a/files.h b/files.h
index 03672b1..f8f535d 100644
--- a/files.h
+++ b/files.h
@@ -71,4 +71,6 @@ void invalidate_package_entry(PackageEntry *entry);
int is_subdirectory(const char *dir, const char *subdir, int *is_subdir);
void add_libgl_abi_symlink(Options *op, Package *p);
+int check_libglvnd_files(Options *op, Package *p);
+
#endif /* __NVIDIA_INSTALLER_FILES_H__ */
diff --git a/install-from-cwd.c b/install-from-cwd.c
index 18d7df1..c7f4942 100644
--- a/install-from-cwd.c
+++ b/install-from-cwd.c
@@ -275,13 +275,9 @@ int install_from_cwd(Options *op)
if (!run_existing_uninstaller(op)) goto failed;
}
- /*
- * Determine whether the VDPAU wrapper should be installed: this must be
- * done after uninstallation of the previous driver, to avoid detecting a
- * leftover wrapper, and before building the command list.
- */
-
- should_install_vdpau_wrapper(op, p);
+ if (!check_libglvnd_files(op, p)) {
+ goto failed;
+ }
/* build a list of operations to execute to do the install */
@@ -595,49 +591,6 @@ int add_this_kernel(Options *op)
-static void add_conflicting_file(Package *p, int *index, const char *file)
-{
- char *c;
-
- p->conflicting_files = nvrealloc(p->conflicting_files,
- sizeof(ConflictingFileInfo) * (*index+1));
- memset(&p->conflicting_files[*index], 0, sizeof(ConflictingFileInfo));
-
- p->conflicting_files[*index].name = file;
-
- if (file == NULL) {
- /* Adding a terminator to the list. Pretend that the name is
- * actually an empty string to avoid crashing later. */
- file = "";
- }
-
- /*
- * match the names of DSOs with "libfoo.so*" by stopping any comparisons
- * after ".so".
- */
-
- c = strstr(file, ".so.");
- if (c) {
- p->conflicting_files[*index].len = (c - file) + 3;
- } else {
- p->conflicting_files[*index].len = strlen(file);
- }
-
- /*
- * XXX avoid conflicting with libglx.so if it doesn't include the string
- * "glxModuleData" to avoid removing the wrong libglx.so (bug 489316)
- */
-
- if (strncmp(file, "libglx.so", p->conflicting_files[*index].len) == 0) {
- p->conflicting_files[*index].requiredString = "glxModuleData";
- } else {
- p->conflicting_files[*index].requiredString = NULL;
- }
-
- (*index)++;
-}
-
-
/*
* Returns TRUE if the given module has a separate interface, FALSE otherwise.
*/
@@ -773,10 +726,9 @@ static Package *parse_manifest (Options *op)
Package *p;
char *manifest = MAP_FAILED, *ptr;
int opengl_files_packaged = FALSE;
- int num_conflicting_files = 0;
-
+
p = (Package *) nvalloc(sizeof (Package));
-
+
/* open the manifest file */
if ((fd = open(".manifest", O_RDONLY)) == -1) {
@@ -1037,14 +989,6 @@ static Package *parse_manifest (Options *op)
entry.compat_arch,
entry.mode);
-
- /* Conflict with any non-wrapper shared libs. Don't conflict with
- * OpenGL files if we won't be installing any. */
- if (entry.caps.is_shared_lib && !entry.caps.is_wrapper &&
- (!entry.caps.is_opengl || !op->no_opengl_files)) {
- add_conflicting_file(p, &num_conflicting_files, entry.name);
- }
-
entry_success = TRUE;
entry_done:
@@ -1065,18 +1009,6 @@ static Package *parse_manifest (Options *op)
op->no_opengl_files = TRUE;
}
- /* XXX always conflict with these files if OpenGL files will be installed
- * libglamoregl.so: prevent X from loading libGL and libglx simultaneously
- * (bug 1299091)
- * libGLwrapper.so: this library has an SONAME of libGL.so.1 (bug 74761) */
- if (!op->no_opengl_files) {
- add_conflicting_file(p, &num_conflicting_files, "libglamoregl.so");
- add_conflicting_file(p, &num_conflicting_files, "libGLwrapper.so");
- }
-
- /* terminate the conflicting files list */
- add_conflicting_file(p, &num_conflicting_files, NULL);
-
munmap(manifest, len);
if (fd != -1) close(fd);
diff --git a/manifest.c b/manifest.c
index ab9e82c..5a754f2 100644
--- a/manifest.c
+++ b/manifest.c
@@ -103,9 +103,7 @@ static const struct {
{ ENTRY(GLX_MODULE_SYMLINK, F, F, F, T, T, F, T, F, F, F) },
{ ENTRY(XMODULE_NEWSYM, F, F, F, T, T, F, F, F, F, F) },
{ ENTRY(VDPAU_LIB, T, F, T, T, F, T, F, F, F, F) },
- { ENTRY(VDPAU_WRAPPER_LIB, T, F, T, T, F, T, F, F, T, F) },
{ ENTRY(VDPAU_SYMLINK, T, F, F, T, T, F, F, F, F, F) },
- { ENTRY(VDPAU_WRAPPER_SYMLINK, T, F, F, T, T, F, F, F, T, F) },
{ ENTRY(NVCUVID_LIB, T, F, T, F, F, T, F, F, F, F) },
{ ENTRY(NVCUVID_LIB_SYMLINK, T, F, F, F, T, F, F, F, F, F) },
{ ENTRY(ENCODEAPI_LIB, T, F, T, F, F, T, F, F, F, F) },
@@ -119,6 +117,8 @@ static const struct {
{ ENTRY(NVIFR_LIB_SYMLINK, T, F, F, F, T, F, F, F, F, F) },
{ ENTRY(XORG_OUTPUTCLASS_CONFIG,F, F, T, F, F, F, F, F, F, F) },
{ ENTRY(DKMS_CONF ,F, F, T, F, F, F, F, T, F, T) },
+ { ENTRY(GLVND_LIB, T, F, T, F, F, T, T, F, F, F) },
+ { ENTRY(GLVND_SYMLINK, T, F, F, F, T, F, T, F, F, F) },
};
/*
diff --git a/misc.c b/misc.c
index 83c5d7d..39b1945 100644
--- a/misc.c
+++ b/misc.c
@@ -36,7 +36,6 @@
#include <dirent.h>
#include <libgen.h>
#include <pciaccess.h>
-#include <dlfcn.h>
#include <elf.h>
#include <link.h>
@@ -1160,87 +1159,6 @@ void should_install_compat32_files(Options *op, Package *p)
/*
- * detect_library() - attempt to dlopen(3) a DSO, to detect its availability.
- */
-static int detect_library(const char *library)
-{
- void *handle = dlopen(library, RTLD_NOW);
-
- if (handle) {
- dlclose(handle);
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/*
- * should_install_vdpau_wrapper() - ask the user if he/she wishes to
- * install the VDPAU wrapper library.
- */
-
-void should_install_vdpau_wrapper(Options *op, Package *p)
-{
- int i, vdpau_packaged = FALSE;
-
- /*
- * If the user did not specifically request installation or non-installation
- * of the VDPAU wrapper, default to installing only if the wrapper was not
- * detected.
- */
- if (op->install_vdpau_wrapper == NV_OPTIONAL_BOOL_DEFAULT) {
- if (detect_library("libvdpau.so.1")) {
- op->install_vdpau_wrapper = NV_OPTIONAL_BOOL_FALSE;
- } else {
- op->install_vdpau_wrapper = NV_OPTIONAL_BOOL_TRUE;
- }
- }
-
- /* give expert users an opportunity to override the default behavior and/or
- * change their minds about any explicit command line setting */
- if (op->expert) {
- if (ui_yes_no(op, op->install_vdpau_wrapper,
- "Install the libvdpau wrapper library?")) {
- op->install_vdpau_wrapper = NV_OPTIONAL_BOOL_TRUE;
- } else {
- op->install_vdpau_wrapper = NV_OPTIONAL_BOOL_FALSE;
- }
- }
-
- for (i = 0; i < p->num_entries; i++) {
- if (p->entries[i].type == FILE_TYPE_VDPAU_WRAPPER_LIB ||
- p->entries[i].type == FILE_TYPE_VDPAU_WRAPPER_SYMLINK) {
- vdpau_packaged = TRUE;
-
- if (op->install_vdpau_wrapper != NV_OPTIONAL_BOOL_TRUE) {
- invalidate_package_entry(&(p->entries[i]));
- }
- }
- }
-
- if (!vdpau_packaged) {
- return;
- }
-
- if (op->install_vdpau_wrapper == NV_OPTIONAL_BOOL_TRUE) {
- ui_message(op, "nvidia-installer will install the libvdpau and "
- "libvdpau_trace libraries that were included with this "
- "installer package. These libraries are available "
- "separately through the libvdpau project and will be "
- "removed from the NVIDIA Linux driver installer package "
- "in the future, so it is recommended that VDPAU users "
- "install libvdpau separately, e.g. by using packages "
- "available from their distributions, or by building "
- "from the sources available at:\n\n"
- "http://people.freedesktop.org/~aplattner/vdpau");
- } else {
- ui_log(op, "Skipping installation of the libvdpau wrapper library.");
- }
-}
-
-
-/*
* should_install_uvm() - ask the user if he/she wishes to install UVM
*/
diff --git a/misc.h b/misc.h
index 5eecb6d..6f1ae43 100644
--- a/misc.h
+++ b/misc.h
@@ -70,7 +70,6 @@ int continue_after_error(Options *op, const char *fmt, ...) NV_ATTRIBUTE_PRINTF(
int do_install(Options *op, Package *p, CommandList *c);
void should_install_opengl_headers(Options *op, Package *p);
void should_install_compat32_files(Options *op, Package *p);
-void should_install_vdpau_wrapper(Options *op, Package *p);
void should_install_uvm(Options *op, Package *p);
void check_installed_files_from_package(Options *op, Package *p);
int check_installed_file(Options*, const char*, const mode_t, const uint32,
diff --git a/nvidia-installer.c b/nvidia-installer.c
index 92176a9..c5ec2fe 100644
--- a/nvidia-installer.c
+++ b/nvidia-installer.c
@@ -143,11 +143,11 @@ static Options *load_default_options(void)
op->run_distro_scripts = TRUE;
op->no_kernel_module_source = FALSE;
op->dkms = FALSE;
- op->install_vdpau_wrapper = NV_OPTIONAL_BOOL_DEFAULT;
op->check_for_alternate_installs = TRUE;
op->install_uvm = TRUE;
op->install_compat32_libs = NV_OPTIONAL_BOOL_DEFAULT;
op->install_libglx_indirect = NV_OPTIONAL_BOOL_DEFAULT;
+ op->install_libglvnd_libraries = NV_OPTIONAL_BOOL_DEFAULT;
return op;
@@ -427,8 +427,13 @@ static void parse_commandline(int argc, char *argv[], Options *op)
op->module_signing_x509_hash = strval;
break;
case INSTALL_VDPAU_WRAPPER_OPTION:
- op->install_vdpau_wrapper = boolval ? NV_OPTIONAL_BOOL_TRUE :
- NV_OPTIONAL_BOOL_FALSE;
+ if (boolval) {
+ nv_error_msg("This driver package does not contain a "
+ "pre-compiled copy of libvdpau. Please see the "
+ "README for instructions on how to install "
+ "libvdpau.");
+ goto fail;
+ }
break;
case NO_UVM_OPTION:
op->install_uvm = FALSE;
@@ -442,6 +447,10 @@ static void parse_commandline(int argc, char *argv[], Options *op)
case NO_LIBGLX_INDIRECT:
op->install_libglx_indirect = NV_OPTIONAL_BOOL_FALSE;
break;
+ case INSTALL_LIBGLVND_OPTION:
+ op->install_libglvnd_libraries = boolval ? NV_OPTIONAL_BOOL_TRUE :
+ NV_OPTIONAL_BOOL_FALSE;
+ break;
default:
goto fail;
}
diff --git a/nvidia-installer.h b/nvidia-installer.h
index 0252174..e402199 100644
--- a/nvidia-installer.h
+++ b/nvidia-installer.h
@@ -157,8 +157,8 @@ typedef struct __options {
int concurrency_level;
int load_error_ignored;
int install_libglx_indirect;
+ int install_libglvnd_libraries;
- NVOptionalBool install_vdpau_wrapper;
NVOptionalBool install_compat32_libs;
char *opengl_prefix;
@@ -261,9 +261,7 @@ typedef enum {
FILE_TYPE_OPENCL_LIB_SYMLINK,
FILE_TYPE_OPENCL_WRAPPER_SYMLINK,
FILE_TYPE_VDPAU_LIB,
- FILE_TYPE_VDPAU_WRAPPER_LIB,
FILE_TYPE_VDPAU_SYMLINK,
- FILE_TYPE_VDPAU_WRAPPER_SYMLINK,
FILE_TYPE_UTILITY_BIN_SYMLINK,
FILE_TYPE_CUDA_ICD,
FILE_TYPE_NVCUVID_LIB,
@@ -282,6 +280,8 @@ typedef enum {
FILE_TYPE_NVIFR_LIB_SYMLINK,
FILE_TYPE_XORG_OUTPUTCLASS_CONFIG,
FILE_TYPE_DKMS_CONF,
+ FILE_TYPE_GLVND_LIB,
+ FILE_TYPE_GLVND_SYMLINK,
FILE_TYPE_MAX
} PackageEntryFileType;
@@ -415,8 +415,6 @@ typedef struct __package {
PackageEntry *entries; /* array of filename/checksum/bytesize entries */
int num_entries;
- ConflictingFileInfo *conflicting_files;
-
KernelModuleInfo *kernel_modules;
int num_kernel_modules;
char *excluded_kernel_modules;
diff --git a/option_table.h b/option_table.h
index 6096697..1df3080 100644
--- a/option_table.h
+++ b/option_table.h
@@ -99,6 +99,7 @@ enum {
X_SYSCONFIG_PATH_OPTION,
FORCE_LIBGLX_INDIRECT,
NO_LIBGLX_INDIRECT,
+ INSTALL_LIBGLVND_OPTION,
};
static const NVGetoptOption __options[] = {
@@ -577,10 +578,9 @@ static const NVGetoptOption __options[] = {
"infrastructure to automatically build a new kernel module when "
"changing kernels. During installation, if DKMS is detected, "
"nvidia-installer will ask the user if they wish to register the "
- "module with DKMS; the default response is 'no'. Use this option to "
- "make the default response 'yes'. This is useful with the "
- "'--no-questions' or '--silent' options, which assume the default "
- "values for all questions." },
+ "module with DKMS; the default response is 'no'. This option will "
+ "bypass the detection of DKMS, and cause the installer to attempt a "
+ "DKMS-based installation regardless of whether DKMS is present."},
{ "module-signing-secret-key", MODULE_SIGNING_SECRET_KEY_OPTION,
NVGETOPT_STRING_ARGUMENT, NULL,
@@ -623,16 +623,6 @@ static const NVGetoptOption __options[] = {
"name must be one of the message digest algorithms recognized by "
"the x509(1) command." },
- { "install-vdpau-wrapper", INSTALL_VDPAU_WRAPPER_OPTION,
- NVGETOPT_IS_BOOLEAN, NULL,
- "The NVIDIA driver package includes a VDPAU wrapper library for "
- "convenience. By default, the wrapper library provided with the "
- "driver package will not be installed if an existing wrapper "
- "library is detected. Setting the '--install-vdpau-wrapper' option "
- "will force the wrapper library to be installed; setting the "
- "'--no-install-vdpau-wrapper' option will force the wrapper library to "
- "be excluded from the installation." },
-
{ "no-check-for-alternate-installs", NO_CHECK_FOR_ALTERNATE_INSTALLS_OPTION,
0, NULL,
"Maintainers of alternate driver installation methods can report the "
@@ -660,6 +650,14 @@ static const NVGetoptOption __options[] = {
{ "no-libglx-indirect", NO_LIBGLX_INDIRECT, 0, NULL,
"Do not install a libGLX_indirect.so.0 symlink." },
+ { "install-libglvnd", INSTALL_LIBGLVND_OPTION, NVGETOPT_IS_BOOLEAN, NULL,
+ "If the package includes a libglvnd-based OpenGL library, then it will "
+ "try to determine whether the libglvnd libraries are already available, "
+ "and will install them if they're not. Use --install-libglvnd to always "
+ "install the libglvnd libraries, overwriting any that already exist. "
+ "Use --no-install-libglvnd to exclude the libglvnd libraries, even if "
+ "they appear to be missing." },
+
/* Orphaned options: These options were in the long_options table in
* nvidia-installer.c but not in the help. */
{ "debug", 'd', 0, NULL,NULL },
@@ -675,6 +673,7 @@ static const NVGetoptOption __options[] = {
* nvidia-installer will allow the user to set them anyway, for
* backwards-compatibility purposes. */
{ "no-runlevel-check", NO_RUNLEVEL_CHECK_OPTION, 0, NULL, NULL },
+ { "install-vdpau-wrapper", INSTALL_VDPAU_WRAPPER_OPTION, NVGETOPT_IS_BOOLEAN, NULL, NULL },
{ NULL, 0, 0, NULL, NULL },
};
diff --git a/version.mk b/version.mk
index 31b967a..ee47231 100644
--- a/version.mk
+++ b/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 358.16
+NVIDIA_VERSION = 361.16