diff options
-rw-r--r-- | backup.c | 25 | ||||
-rw-r--r-- | command-list.c | 72 | ||||
-rw-r--r-- | conflicting-kernel-modules.c | 1 | ||||
-rw-r--r-- | files.c | 149 | ||||
-rw-r--r-- | files.h | 2 | ||||
-rw-r--r-- | install-from-cwd.c | 78 | ||||
-rw-r--r-- | manifest.c | 4 | ||||
-rw-r--r-- | misc.c | 82 | ||||
-rw-r--r-- | misc.h | 1 | ||||
-rw-r--r-- | nvidia-installer.c | 15 | ||||
-rw-r--r-- | nvidia-installer.h | 8 | ||||
-rw-r--r-- | option_table.h | 27 | ||||
-rw-r--r-- | version.mk | 2 |
13 files changed, 279 insertions, 187 deletions
@@ -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", @@ -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; +} + @@ -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); @@ -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) }, }; /* @@ -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 */ @@ -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 }, }; @@ -1 +1 @@ -NVIDIA_VERSION = 358.16 +NVIDIA_VERSION = 361.16 |