https://bugs.gentoo.org/946178 https://code.videolan.org/videolan/vlc/-/issues/28374 https://code.videolan.org/videolan/vlc/-/merge_requests/6454 https://code.videolan.org/videolan/vlc/-/merge_requests/6496 From 056d7349a559cb63b456505bb11c08a4910452aa Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Sun, 1 Dec 2024 06:25:29 +0100 Subject: [PATCH] Makefile.am: enforce pkglib dependency order for install During installation, no dependencies existed between the targets being installed and the targets being relinked against the installed version, which made the following race condition: ../doltlibtool --mode=install /usr/bin/install -c libvlc_pipewire.la libvlc_pulse.la libvlc_vdpau.la libvlc_xcb_events.la '/builds/videolan/vlc/vlc-4.0.0-dev/_inst/lib/vlc' libtool: install: (cd /builds/videolan/vlc/vlc-4.0.0-dev/_build/sub/modules; /bin/bash "/builds/videolan/vlc/vlc-4.0.0-dev/_build/sub/modules/../libtool" --silent --tag CC --mode=relink gcc -g -O2 -pthread -Wall -Wextra -Wsign-compare -Wundef -Wpointer-arith -Wvolatile-register-var -Wformat -Wformat-security -Wduplicated-branches -Wduplicated-cond -Wbad-function-cast -Wwrite-strings -Wmissing-prototypes -Werror-implicit-function-declaration -Winit-self -Wlogical-op -Wshadow=local -Wmultistatement-macros -pipe -Werror=missing-field-initializers -Werror=format -Werror=incompatible-pointer-types -Werror=restrict -Werror=int-conversion -Werror=implicit-int -Werror=return-mismatch -Werror=declaration-missing-parameter-type -fvisibility=hidden -fno-math-errno -funsafe-math-optimizations -fno-rounding-math -fno-signaling-nans -fcx-limited-range -funroll-loops -fstack-protector-strong -avoid-version -module -export-symbols-regex "^vlc_entry" -shrext .so -no-undefined ../compat/libcompat.la ../src/libvlccore.la -Wl,-z,defs -o libvdpau_instance_plugin.la -rpath /builds/videolan/vlc/vlc-4.0.0-dev/_inst/lib/vlc/plugins/vdpau hw/vdpau/libvdpau_instance_plugin_la-device.lo libvlc_vdpau.la -lSM -lICE -lX11 -lanl ) libtool: install: /usr/bin/install -c .libs/libvlc_vdpau.so.0.0.0 /builds/videolan/vlc/vlc-4.0.0-dev/_inst/lib/vlc/libvlc_vdpau.so.0.0.0 /usr/bin/ld: cannot find -lvlc_vdpau: No such file or directory libtool: install: (cd /builds/videolan/vlc/vlc-4.0.0-dev/_inst/lib/vlc && { ln -s -f libvlc_vdpau.so.0.0.0 libvlc_vdpau.so.0 || { rm -f libvlc_vdpau.so.0 && ln -s libvlc_vdpau.so.0.0.0 libvlc_vdpau.so.0; }; }) collect2: error: ld returned 1 exit status libtool: install: (cd /builds/videolan/vlc/vlc-4.0.0-dev/_inst/lib/vlc && { ln -s -f libvlc_vdpau.so.0.0.0 libvlc_vdpau.so || { rm -f libvlc_vdpau.so && ln -s libvlc_vdpau.so.0.0.0 libvlc_vdpau.so; }; }) ---------------------------------------------------------------------- libtool: error: error: relink 'libvdpau_instance_plugin.la' with the above command before installing it libtool: install: /usr/bin/install -c .libs/libvlc_vdpau.lai /builds/videolan/vlc/vlc-4.0.0-dev/_inst/lib/vlc/libvlc_vdpau.la make[6]: *** [Makefile:15527: install-vdpauLTLIBRARIES] Error 1 Here, with the thread number, we have: - (1) doltlibtool installing the pkglibs (install-exec-am). - (2) in parallel, libtool relinking the vdpau instance plugin. - (1) libtool starts to be called for "relinking" (which is only installing there) with version 0.0.0. - (2) libtool tried to run the linker but it failed because libvlc_vdpau.so doesn't exist yet on the target prefix. - (1) libtool .0.0.0 links to the major version shortcut .0 for libvlc_vdpau. - (1) libtool .0.0.0 links to the unversioned shortcut for libvlc_vdpau. So the pkglibs were not installed before installing the plugins linking them and it was racy whether automake succeeded in installing vlc_vdpau before or not. This could apply to any pkglib being used from plugins. This patch ensure the pkglibs are installed before relinking the plugins for vpdau, same must be done for each other pkglib usage location. Note that install-vdpauLTLIBRARIES itself will install each target from vdpau_LTLIBRARIES serially in the order they are defined, so there would be no race inside the same LTLIBRARIES variables, but the different LTLIBRARIES variables are processed in parallel themselves. Fixes #28374 --- modules/Makefile.am | 1 + modules/audio_output/Makefile.am | 3 +++ modules/hw/vdpau/Makefile.am | 4 ++++ modules/video_output/Makefile.am | 3 +++ 4 files changed, 11 insertions(+) diff --git a/modules/Makefile.am b/modules/Makefile.am index d9940f95cbc8..3a41a6bbe456 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -1,3 +1,4 @@ + noinst_LTLIBRARIES = check_LTLIBRARIES = pkglib_LTLIBRARIES = diff --git a/modules/audio_output/Makefile.am b/modules/audio_output/Makefile.am index 4c7957cdd153..8d48003e20b5 100644 --- a/modules/audio_output/Makefile.am +++ b/modules/audio_output/Makefile.am @@ -1,5 +1,8 @@ aoutdir = $(pluginsdir)/audio_output aout_LTLIBRARIES = +# Install the pkglib/pkglibexec first before relinking the modules. +# This ensures libtool re-linking is not racy. +install-aoutLTLIBRARIES: install-pkglibLTLIBRARIES libvlc_android_audioformat_jni_la_SOURCES = \ audio_output/android/audioformat_jni.c \ diff --git a/modules/hw/vdpau/Makefile.am b/modules/hw/vdpau/Makefile.am index ef3601209314..f195f712310b 100644 --- a/modules/hw/vdpau/Makefile.am +++ b/modules/hw/vdpau/Makefile.am @@ -1,4 +1,8 @@ vdpaudir = $(pluginsdir)/vdpau +# Install the pkglib/pkglibexec first before relinking the modules. +# This ensures libtool re-linking is not racy. +install-vpdauLTLIBRARIES: install-pkglibLTLIBRARIES + libvlc_vdpau_la_SOURCES = hw/vdpau/vlc_vdpau.c hw/vdpau/vlc_vdpau.h libvlc_vdpau_la_CFLAGS = $(VDPAU_CFLAGS) diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am index ad959bc45ed5..bcbb892c4c93 100644 --- a/modules/video_output/Makefile.am +++ b/modules/video_output/Makefile.am @@ -1,5 +1,8 @@ voutdir = $(pluginsdir)/video_output vout_LTLIBRARIES = +# Install the pkglib/pkglibexec first before relinking the modules. +# This ensures libtool re-linking is not racy. +install-voutLTLIBRARIES: install-pkglibLTLIBRARIES EXTRA_DIST += video_output/README -- GitLab From 0b9f3f836f1c678e6d101f62545a8edaba16dcd0 Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Sun, 8 Dec 2024 22:43:37 +0100 Subject: [PATCH] Makefile.am: fix installation regression Automake doesn't generate automatic rules when a rule already exist in the file, except if it cannot detect it. Adding the `install-fooLTLIBRARIES: install-pkglibLTLIBRARIES` rule for audio outputs, video outputs and vdpau broke the installation. Adding `$(install-fooLTLIBRARIES): install-pkglibLTLIBRARIES` also makes automake unhappy because of the variable name looking suspiciously close to the target it generates, so a version without the dash is used for the variable name in the rule. With this, the install target is preserved but the dependency also exists in the output. --- modules/audio_output/Makefile.am | 3 ++- modules/hw/vdpau/Makefile.am | 3 ++- modules/video_output/Makefile.am | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/audio_output/Makefile.am b/modules/audio_output/Makefile.am index 8d48003e20b..c045a892c10 100644 --- a/modules/audio_output/Makefile.am +++ b/modules/audio_output/Makefile.am @@ -2,7 +2,8 @@ aoutdir = $(pluginsdir)/audio_output aout_LTLIBRARIES = # Install the pkglib/pkglibexec first before relinking the modules. # This ensures libtool re-linking is not racy. -install-aoutLTLIBRARIES: install-pkglibLTLIBRARIES +installaoutLTLIBRARIES = install-aoutLTLIBRARIES +$(installaoutLTLIBRARIES): install-pkglibLTLIBRARIES libvlc_android_audioformat_jni_la_SOURCES = \ audio_output/android/audioformat_jni.c \ diff --git a/modules/hw/vdpau/Makefile.am b/modules/hw/vdpau/Makefile.am index f195f712310..1abdfa21a9b 100644 --- a/modules/hw/vdpau/Makefile.am +++ b/modules/hw/vdpau/Makefile.am @@ -1,7 +1,8 @@ vdpaudir = $(pluginsdir)/vdpau # Install the pkglib/pkglibexec first before relinking the modules. # This ensures libtool re-linking is not racy. -install-vpdauLTLIBRARIES: install-pkglibLTLIBRARIES +installvpdauLTLIBRARIES = install-vdpauLTLIBRARIES +$(installvpdauLTLIBRARIES): install-pkglibLTLIBRARIES libvlc_vdpau_la_SOURCES = hw/vdpau/vlc_vdpau.c hw/vdpau/vlc_vdpau.h diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am index bcbb892c4c9..844b0dd01c8 100644 --- a/modules/video_output/Makefile.am +++ b/modules/video_output/Makefile.am @@ -2,7 +2,8 @@ voutdir = $(pluginsdir)/video_output vout_LTLIBRARIES = # Install the pkglib/pkglibexec first before relinking the modules. # This ensures libtool re-linking is not racy. -install-voutLTLIBRARIES: install-pkglibLTLIBRARIES +installvoutLTLIBRARIES = install-voutLTLIBRARIES +$(installvoutLTLIBRARIES): install-pkglibLTLIBRARIES EXTRA_DIST += video_output/README -- GitLab