From 49c6431695f817845d921f74bf24e9e30ddd89a5 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Mon, 2 Jun 2025 15:54:38 +0200 Subject: [PATCH] xfree86: add per major-version driver/module subdirectories Modules are now placed into a sub-directory by major Xserver release, so we have less hassle with trying to load drivers w/ incompatible ABI. The legacy directories are still searched (after the versioned ones) for backwards compat with badly maintained proprietary drivers (Nvidia). Signed-off-by: Enrico Weigelt, metux IT consult --- hw/xfree86/dixmods/meson.build | 6 +++--- hw/xfree86/drivers/inputtest/meson.build | 2 +- hw/xfree86/drivers/modesetting/meson.build | 2 +- hw/xfree86/exa/meson.build | 2 +- hw/xfree86/fbdevhw/meson.build | 2 +- hw/xfree86/glamor_egl/meson.build | 2 +- hw/xfree86/int10/meson.build | 2 +- hw/xfree86/loader/loadmod.c | 6 ++++++ hw/xfree86/meson.build | 4 ++++ hw/xfree86/shadowfb/meson.build | 2 +- hw/xfree86/vgahw/meson.build | 2 +- meson.build | 2 +- 12 files changed, 22 insertions(+), 12 deletions(-) diff --git a/hw/xfree86/dixmods/meson.build b/hw/xfree86/dixmods/meson.build index a1afbe8b9..e51e50797 100644 --- a/hw/xfree86/dixmods/meson.build +++ b/hw/xfree86/dixmods/meson.build @@ -9,7 +9,7 @@ shared_module( link_with: e, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, ) shared_module( @@ -23,7 +23,7 @@ shared_module( link_with: e, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, ) if build_glx @@ -38,6 +38,6 @@ if build_glx link_with: e, install: true, - install_dir: join_paths(module_dir, 'extensions') + install_dir: join_paths(module_abi_dir, 'extensions') ) endif diff --git a/hw/xfree86/drivers/inputtest/meson.build b/hw/xfree86/drivers/inputtest/meson.build index fa642c89f..93c518495 100644 --- a/hw/xfree86/drivers/inputtest/meson.build +++ b/hw/xfree86/drivers/inputtest/meson.build @@ -12,7 +12,7 @@ shared_module( dependencies: [common_dep], install: true, - install_dir: join_paths(module_dir, 'input'), + install_dir: join_paths(module_abi_dir, 'input'), link_with: e, ) diff --git a/hw/xfree86/drivers/modesetting/meson.build b/hw/xfree86/drivers/modesetting/meson.build index 6f35ff773..c15249e35 100644 --- a/hw/xfree86/drivers/modesetting/meson.build +++ b/hw/xfree86/drivers/modesetting/meson.build @@ -23,7 +23,7 @@ shared_module( ], install: true, - install_dir: join_paths(module_dir, 'drivers'), + install_dir: join_paths(module_abi_dir, 'drivers'), ) # Test that we don't have any unresolved symbols from our module to Xorg. diff --git a/hw/xfree86/exa/meson.build b/hw/xfree86/exa/meson.build index 75a5d429e..8d54170a0 100644 --- a/hw/xfree86/exa/meson.build +++ b/hw/xfree86/exa/meson.build @@ -5,7 +5,7 @@ xorg_exa = shared_module('exa', link_with: [libxserver_exa, e], c_args: xorg_c_args, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, ) install_man(configure_file( diff --git a/hw/xfree86/fbdevhw/meson.build b/hw/xfree86/fbdevhw/meson.build index f3146f3c9..f17dd9496 100644 --- a/hw/xfree86/fbdevhw/meson.build +++ b/hw/xfree86/fbdevhw/meson.build @@ -10,7 +10,7 @@ shared_module('fbdevhw', dependencies: common_dep, c_args: xorg_c_args, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, link_with: e, ) diff --git a/hw/xfree86/glamor_egl/meson.build b/hw/xfree86/glamor_egl/meson.build index dd1cafcd9..34fb4b0d3 100644 --- a/hw/xfree86/glamor_egl/meson.build +++ b/hw/xfree86/glamor_egl/meson.build @@ -18,5 +18,5 @@ shared_module( link_with: [glamor, libxserver_glx], install: true, - install_dir: module_dir, + install_dir: module_abi_dir, ) diff --git a/hw/xfree86/int10/meson.build b/hw/xfree86/int10/meson.build index a309e9b53..61653d977 100644 --- a/hw/xfree86/int10/meson.build +++ b/hw/xfree86/int10/meson.build @@ -56,7 +56,7 @@ xorg_int10 = shared_module('int10', c_args: int10_c_args, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, ) install_data('xf86int10.h', install_dir: xorgsdkdir) diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c index aba524b6e..be9335dd5 100644 --- a/hw/xfree86/loader/loadmod.c +++ b/hw/xfree86/loader/loadmod.c @@ -175,6 +175,12 @@ LoaderSetPath(const char *path) /* Standard set of module subdirectories to search, in order of preference */ static const char *stdSubdirs[] = { + // first try loading from per-ABI subdir + XORG_MODULE_ABI_TAG "/", + XORG_MODULE_ABI_TAG "/input/", + XORG_MODULE_ABI_TAG "/drivers/", + XORG_MODULE_ABI_TAG "/extensions/", + // now try loading from legacy / unversioned directories "", "input/", "drivers/", diff --git a/hw/xfree86/meson.build b/hw/xfree86/meson.build index f1fa48e17..f2fc34ce2 100644 --- a/hw/xfree86/meson.build +++ b/hw/xfree86/meson.build @@ -1,3 +1,6 @@ +module_abi_tag = 'xlibre-25.0' +module_abi_dir = join_paths(module_dir, module_abi_tag) + xorg_inc = include_directories( 'common', 'ddc', @@ -16,6 +19,7 @@ xorg_inc = include_directories( xorg_c_args = [] xorg_c_args += '-DHAVE_XORG_CONFIG_H' xorg_c_args += '-DXORG_NO_SDKSYMS' +xorg_c_args += ('-DXORG_MODULE_ABI_TAG="'+module_abi_tag+'"') pciaccess_dep = [] if get_option('pciaccess') diff --git a/hw/xfree86/shadowfb/meson.build b/hw/xfree86/shadowfb/meson.build index 7ecc9bc30..138602089 100644 --- a/hw/xfree86/shadowfb/meson.build +++ b/hw/xfree86/shadowfb/meson.build @@ -4,7 +4,7 @@ shared_module('shadowfb', dependencies: common_dep, c_args: xorg_c_args, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, link_with: e, ) diff --git a/hw/xfree86/vgahw/meson.build b/hw/xfree86/vgahw/meson.build index 762a90f06..af50f15cb 100644 --- a/hw/xfree86/vgahw/meson.build +++ b/hw/xfree86/vgahw/meson.build @@ -4,7 +4,7 @@ shared_module('vgahw', dependencies: common_dep, c_args: xorg_c_args, install: true, - install_dir: module_dir, + install_dir: module_abi_dir, ) install_data('vgaHW.h', install_dir: xorgsdkdir) diff --git a/meson.build b/meson.build index f59947251..c911bb60e 100644 --- a/meson.build +++ b/meson.build @@ -834,7 +834,7 @@ if build_xorg sdkconfig.set('libdir', join_paths('${exec_prefix}', get_option('libdir'))) sdkconfig.set('includedir', join_paths('${prefix}', get_option('includedir'))) sdkconfig.set('datarootdir', join_paths('${prefix}', get_option('datadir'))) - sdkconfig.set('moduledir', join_paths('${exec_prefix}', module_dir)) + sdkconfig.set('moduledir', join_paths(join_paths('${exec_prefix}', module_dir), module_abi_tag)) sdkconfig.set('sdkdir', join_paths('${prefix}', get_option('includedir'), 'xorg')) sdkconfig.set('sysconfigdir', join_paths('${datarootdir}', 'X11/xorg.conf.d'))