From f9dae8de174f27b44d6268a345d7cd03eb023561 Mon Sep 17 00:00:00 2001
From: Wolfgang Walther <walther@technowledgy.de>
Date: Fri, 29 Mar 2024 19:38:59 +0100
Subject: [PATCH v3 4/4] Support falling back to non-preferred readline
 implementation with meson

To build with -Dreadline=enabled one can use either readline or libedit. The
-Dlibedit_preferred flag is supposed to control the order of names to lookup.
This works fine when either both libraries are present or -Dreadline is set to
auto. However, explicitly enabling readline with only libedit present, but not
setting libedit_preferred, or alternatively enabling readline with only readline
present, but setting libedit_preferred, too, are both broken. This is because
cc.find_library will throw an error for a not found dependency as soon as the
first required dependency is checked, thus it's impossible to fallback to the
alternative.

Here we only check the second of the two dependencies for requiredness, thus
we only fail when none of the two can be found.
---
 meson.build | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/meson.build b/meson.build
index 3e628659843..3e899432485 100644
--- a/meson.build
+++ b/meson.build
@@ -1080,15 +1080,26 @@ endif
 
 if not get_option('readline').disabled()
   libedit_preferred = get_option('libedit_preferred')
-  # Set the order of readline dependencies
-  check_readline_deps = libedit_preferred ? \
-    ['libedit', 'readline'] : ['readline', 'libedit']
+  # Set the order of readline dependencies.
+  # cc.find_library breaks and throws on the first dependency which
+  # is marked as required=true and can't be found. Thus, we only mark
+  # the last dependency to look up as required, to not throw too early.
+  check_readline_deps = [
+    {
+      'name': libedit_preferred ? 'libedit' : 'readline',
+      'required': false
+    },
+    {
+      'name': libedit_preferred ? 'readline' : 'libedit',
+      'required': get_option('readline')
+    }
+  ]
 
   foreach readline_dep : check_readline_deps
-    readline = dependency(readline_dep, required: false)
+    readline = dependency(readline_dep['name'], required: false)
     if not readline.found()
-      readline = cc.find_library(readline_dep,
-        required: get_option('readline'),
+      readline = cc.find_library(readline_dep['name'],
+        required: readline_dep['required'],
         dirs: test_lib_d)
     endif
     if readline.found()
-- 
2.44.0

