]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Bring the automated readline detection up to parity with the legacy configure script.
authorstephan <stephan@noemail.net>
Sun, 27 Oct 2024 04:27:47 +0000 (04:27 +0000)
committerstephan <stephan@noemail.net>
Sun, 27 Oct 2024 04:27:47 +0000 (04:27 +0000)
FossilOrigin-Name: 2ddeb7a8f55735cc7f2cf95cbbb0b20c563ced87db1429816fcfb0ee89e751f0

auto.def
autosetup/hwaci-common.tcl
manifest
manifest.uuid

index 7e3ff26f832d8d17340cf968dff165c42c4b456e..2430200f2d3501abfa7512537ab99522d5dfb1a2 100644 (file)
--- a/auto.def
+++ b/auto.def
 use cc cc-db cc-shared cc-lib hwaci-common pkg-config
 
 # Are we cross-compiling?
-set cross_compiling 0
-if {[get-define host] ne [get-define build]} {
-  set cross_compiling 1
-} elseif {1
-          && "nope" eq [get-env CC_FOR_BUILD "nope"]
-          && [get-define CC] ne [get-define CC_FOR_BUILD]} {
+set cross_compiling [hwaci-is-cross-compiling]
+if {0
+    && !$cross_compiling
+    && "nope" eq [get-env CC_FOR_BUILD "nope"]
+    && [get-define CC] ne [get-define CC_FOR_BUILD]} {
   # Arguable/debatable...
   #
   # When _not_ cross-compiling and CC_FOR_BUILD is _not_ explcitely
@@ -170,7 +169,7 @@ set flags {
   with-readline-inc:CFLAGS
                        => {Readline CFLAGS, e.g. -I/path/to/includes}
   with-readline-header:PATH
-                       => {Full path to readline.h, from which --with-readline-inc will be derived.}
+                       => {Full path to readline.h, from which --with-readline-inc will be derived}
   with-linenoise:DIR   => {Source directory for linenoise.c and linenoise.h}
   amalgamation=1       => {Disable the amalgamation and instead build all files separately}
   load-extension=1     => {Disable loading of external extensions}
@@ -748,7 +747,7 @@ if {1} {
 }
 
 ########################################################################
-# hwaci-check-line-editing jumps through proverbial hoops to try to
+# sqlite-check-line-editing jumps through proverbial hoops to try to
 # find a working line-editing library, setting:
 #
 #   - HAVE_READLINE to 0 or 1
@@ -764,7 +763,7 @@ if {1} {
 #
 # Returns a string describing which line-editing approach to use, or
 # "none" if no option is available.
-proc hwaci-check-line-editing {} {
+proc sqlite-check-line-editing {} {
   define HAVE_READLINE 0
   define HAVE_LINENOISE 0
   define HAVE_EDITLINE 0
@@ -776,11 +775,9 @@ proc hwaci-check-line-editing {} {
     set dirLn $check
     if {![file isdir $dirLn]} {
       hwaci-fatal "--with-linenoise value is not a directory"
-    }
-    if {![file exists $dirLn/linenoise.c] } {
+    } elseif {![file exists $dirLn/linenoise.c] } {
       hwaci-fatal "Cannot find linenoise.c in $dirLn"
-    }
-    if {![file exists $dirLn/linenoise.h] } {
+    } elseif {![file exists $dirLn/linenoise.h] } {
       hwaci-fatal "Cannot find linenoise.h in $dirLn"
     }
     user-notice "Using linenoise from $dirLn"
@@ -789,23 +786,21 @@ proc hwaci-check-line-editing {} {
     add-shell-opt -DHAVE_LINENOISE=1
     return "linenoise"
   } elseif {[opt-bool editline]} {
-    # Use editline...
+    # TODO: reimplement --enable-editline
     user-notice "WARNING: the --enable-editline flag is not yet supported"
     return "none"
   } elseif {![opt-bool readline]} {
-    user-notice "Readline support explicitly disabled with --disable-readline."
+    user-notice "Readline support explicitly disabled with --disable-readline"
     return "none"
   }
-  set check [opt-val with-readline-lib][opt-val with-readline-inc]
-  if {"" ne $check} {
-    # If any one of --with-readline-(lib|inc|header) are provided,
-    # those trump any automated searching.
-    set fL [join [opt-val with-readline-lib]]
-    set v [opt-val with-readline-header]
-    if {"" eq $v} {
-      set fC [join [opt-val with-readline-inc]]
+
+  # Transform with-readline-header=X to with-readline-inc=-I...
+  set v [opt-val with-readline-header]
+  hwaci-opt-set with-readline-header ""
+  if {"" ne $v} {
+    if {"auto" eq $v} {
+      hwaci-opt-set with-readline-inc auto
     } else {
-      # Derive CFLAGS from header file name
       set v [file dirname $v]
       if {[string match */*line $v]} {
         # Special case: if the path includes .../*line/readline.h", set
@@ -815,26 +810,66 @@ proc hwaci-check-line-editing {} {
         # work!
         set v [file dirname $v]
       }
-      set fC "-I$v"
+      hwaci-opt-set with-readline-inc "-I$v"
     }
-    define LDFLAGS_READLINE $fL
-    define CFLAGS_READLINE $fC
+  }
+
+  # Look for readline.h
+  set rlInc [opt-val with-readline-inc auto]
+  if {"auto" eq $rlInc} {
+    set rlInc ""
+    if {!$::cross_compiling} {
+      # ^^^ this check is derived from the legacy configure script
+      set rlInc [hwaci-search-for-header-dir readline.h \
+                 -dirs {/usr /usr/local /usr/local/readline /usr/contrib /mingw} \
+                 -subdirs {include/readline include}]
+      # ^^^ The -dirs and -subdirs lists are from the legacy configure script
+      if {"" ne $rlInc} {
+        if {[string match */*line $rlInc]} {
+          # See notes above for --with-readline-header
+          set rlInc [file dirname $rlInc]
+        }
+        set rlInc "-I${rlInc}"
+      }
+    }
+  }
+
+  # If readline.h was found/specified, look for libreadline...
+  set rlLib ""
+  if {"" ne $rlInc} {
+    set rlLib [opt-val with-readline-lib]
+    if {"" eq $rlLib || "auto" eq $rlLib} {
+      set rlLib ""
+      set libTerm ""
+      if {[hwaci-check-function-in-lib tgetent {readline ncurses curses termcap}]} {
+        # ^^^ that libs list comes from the legacy configure script ^^^
+        set libTerm [get-define lib_tgetent]
+        undefine lib_tgetent
+      }
+      if {"readline" eq $libTerm} {
+        set rlLib $libTerm
+      } elseif {[hwaci-check-function-in-lib readline readline $libTerm]} {
+        set rlLib [get-define lib_readline]
+        lappend rlLib $libTerm
+        undefine lib_readline
+      }
+    }
+  }
+
+  if {"" ne $rlLib} {
+    set rlLib [join $rlLib]
+    set rlInc [join $rlInc]
+    define LDFLAGS_READLINE $rlLib
+    define CFLAGS_READLINE $rlInc
     define HAVE_READLINE 1
     add-shell-opt -DHAVE_READLINE=1
-    user-notice "Using client-provided readline flags: $fC $fL"
+    user-notice "Using readline flags: $rlInc $rlLib"
     return "readline"
   }
 
-  # Try the project-agnostic readline detector:
-  set v [hwaci-check-readline]
-  add-shell-opt -DHAVE_READLINE=$v
-  if {$v} { return "readline" }
-  # TODO: reimplement:
-  #  --enable-editline
   return "none"
-}; # hwaci-check-line-editing
-msg-checking "Line-editing support for the sqlite3 shell: "
-msg-result [hwaci-check-line-editing]
+}; # sqlite-check-line-editing
+msg-result "Line-editing support for the sqlite3 shell: [sqlite-check-line-editing]"
 
 hwaci-if-opt-truthy load-extension {
   if {[hwaci-check-function-in-lib dlopen dl]} {
index df8d57ad2f694bb653c84dae9933443b494fcc8b..d77e7a9c46ec90603a5304b3c004de912043a965 100644 (file)
@@ -56,6 +56,12 @@ proc hwaci-fatal {msg} {
   user-error "ERROR: $msg"
 }
 
+########################################################################
+# Returns 1 if cross-compiling, else 0.
+proc hwaci-is-cross-compiling {} {
+  return [expr {[get-define host] ne [get-define build]}]
+}
+
 ########################################################################
 # hwaci-lshift_ shifts $count elements from the list named $listVar
 # and returns them as a new list. On empty input, returns "".
@@ -88,6 +94,37 @@ proc hwaci-check-function-in-lib {function libs {otherlibs {}}} {
   return $found
 }
 
+########################################################################
+# Searches for $header in a combination of dirs and subdirs, specified
+# by the -dirs {LIST} and -subdirs {LIST} flags (each of which have
+# sane defaults). Returns either the first matching dir or an empty
+# string.  The return value does not contain the filename part.
+proc hwaci-search-for-header-dir {header args} {
+  set subdirs {include}
+  set dirs {/usr /usr/local /mingw}
+# Debatable:
+#  if {![hwaci-is-cross-compiling]} {
+#    lappend dirs [get-define prefix]
+#  }
+  while {[llength $args]} {
+    switch -exact -- [lindex $args 0] {
+      -dirs     { set args [lassign $args - dirs] }
+      -subdirs  { set args [lassign $args - subdirs] }
+      default   {
+        hwaci-fatal "Unhandled argument: $args"
+      }
+    }
+  }
+  foreach dir $dirs {
+    foreach sub $subdirs {
+      if {[file exists $dir/$sub/$header]} {
+        return "$dir/$sub"
+      }
+    }
+  }
+  return ""
+}
+
 ########################################################################
 # If $v is true, [puts $msg] is called, else puts is not called.
 #proc hwaci-maybe-verbose {v msg} {
@@ -706,15 +743,14 @@ proc hwaci-check-rpath {} {
 }
 
 ########################################################################
-# Check for libreadline functionality.  Linking in readline varies
+# Check for availability of libreadline.  Linking in readline varies
 # wildly by platform and this check does not cover all known options.
 # This detection is known to fail under the following conditions:
 #
 # - (pkg-config readline) info is either unavailable for libreadline or
 #   simply misbehaves.
 #
-# - Compile-and-link-with-default-path tests fail. This will fail for
-#   platforms which store readline under, e.g., /usr/local.
+# - Either of readline.h or libreadline are in an exotic place.
 #
 # Defines the following vars:
 #
@@ -722,6 +758,13 @@ proc hwaci-check-rpath {} {
 # - LDFLAGS_READLINE: "" or linker flags
 # - CFLAGS_READLINE: "" or c-flags
 #
+# Quirks:
+#
+# - If readline.h is found in a directory name matching *line then the
+#   resulting -I... flag points one directory _up_ from that, under
+#   the assumption that client-side code will #include
+#   <readline/readline.h>.
+#
 # Returns the value of HAVE_READLINE.
 proc hwaci-check-readline {} {
   define HAVE_READLINE 0
@@ -756,24 +799,52 @@ proc hwaci-check-readline {} {
   # want termcap, it wants -lcurses, but we don't get that info from
   # pkg-config either.
 
-  set h "readline/readline.h"
-  if {[cc-check-includes $h]} {
-    if {[hwaci-check-function-in-lib readline readline]} {
-      msg-result "Enabling libreadline."
-      define HAVE_READLINE 1
-      define LDFLAGS_READLINE [get-define lib_readline]
+  # Look for readline.h
+  set rlInc ""
+  if {![hwaci-is-cross-compiling]} {
+    # ^^^ this check is derived from SQLite's legacy configure script
+    set rlInc [hwaci-search-for-header-dir readline.h \
+                 -subdirs {include/readline include}]
+    if {"" ne $rlInc} {
+      if {[string match */*line $rlInc]} {
+        # Special case: if the path includes .../*line/readline.h", set
+        # the -I to one dir up from that because our sources include
+        # <readline/readline.h> or <editline/readline.h>. Reminder: if
+        # auto.def is being run by jimsh0 then [file normalize] will not
+        # work!
+        set rlInc [file dirname $v]
+      }
+      set rlInc "-I${rlInc}"
+    }
+  }
+
+  # If readline.h was found/specified, look for libreadline...
+  set rlLib ""
+  if {"" ne $rlInc} {
+    set libTerm ""
+    if {[hwaci-check-function-in-lib tgetent {readline ncurses curses termcap}]} {
+      # ^^^ check extracted from an ancient autotools configure script.
+      set libTerm [get-define lib_tgetent]
+      undefine lib_tgetent
+    }
+    if {"readline" eq $libTerm} {
+      set rlLib $libTerm
+    } elseif {[hwaci-check-function-in-lib readline readline $libTerm]} {
+      set rlLib [get-define lib_readline]
+      lappend rlLib $libTerm
       undefine lib_readline
-      return 1
     }
-    # else TODO: look in various places and [define CFLAGS_READLINE
-    # -I...]
-  }
-  # Numerous TODOs:
-  # - Requires linking with [n]curses or similar on some platforms.
-  # - Headers are in a weird place on some BSD systems.
-  # - Add --with-readline=DIR
-  # - Add --with-readline-lib=lib ==> pass lib file via LDFLAGS_READLINE
-  # - Add --with-readline-inc=dir ==> pass -Idir via CFLAGS_READLINE
+  }
+
+  if {"" ne $rlLib} {
+    set rlLib [join $rlLib]
+    define LDFLAGS_READLINE $rlLib
+    define CFLAGS_READLINE $rlInc
+    define HAVE_READLINE 1
+    msg-result "Using readline with flags: $rlInc $rlLib"
+    return 1
+  }
+
   msg-result "libreadline not found."
   return 0
 }
index f1d605b04cb5a3a4b6bfdd14ff6e7a5263ee646e..3ac69bcff865cb266400faef43b6c27a65370165 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Rename\s--with-readline-ldflags/cflags\sto\s--with-readline-lib/inc\sbecause\sit\sturns\sout\sthat\sldflags/cflags\shave\s(when\spassed\san\sexplicit\svalue)\sthe\ssame\ssemantics\sthe\slegacy\slib/inc\sflags.\sStill\sto-fix\sis\sthat\sthe\sno-flag-given\sreadline\ssearch\sbehavior\sdiffers,\sand\sis\smuch\smore\slimited,\sfrom\sthe\slegacy\sconfigure\sbehavior.
-D 2024-10-27T02:27:07.440
+C Bring\sthe\sautomated\sreadline\sdetection\sup\sto\sparity\swith\sthe\slegacy\sconfigure\sscript.
+D 2024-10-27T04:27:47.182
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md b6e6c1baf38e4339bd3f1e0e5e5bfd0a9a93d133360691b2785c2d4b2f2dcec2
@@ -13,7 +13,7 @@ F art/icon-80x90.gif 65509ce3e5f86a9cd64fe7fca2d23954199f31fe44c1e09e208c80fb83d
 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2
-F auto.def 7846fe16d52eb941504bf7335a876c5a3c6e35f9eef2330e3137cf65b8cac3c2
+F auto.def aba9d4d29eb7fd5a5bda791d338bf5a32e205d1164af8c9d579bb1b4083ad25d
 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903
 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347
 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac
@@ -47,7 +47,7 @@ F autosetup/cc-lib.tcl 493c5935b5dd3bf9bd4eca89b07c8b1b1a9356d61783035144e21795f
 F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1de1e5460d78
 F autosetup/cc.tcl 7e2fe943ae9d45cf39e9f5b05b6230df8e719415edea5af06c30eb68680bde14
 F autosetup/default.auto 5cdf016de2140e50f1db190a02039dc42fb390af1dda4cc4853e3042a9ef0e82
-F autosetup/hwaci-common.tcl dd33af5ee7279956a58254accfb8f86e84d64b153afd69efb8c5dd8937845649
+F autosetup/hwaci-common.tcl a4276230b1c510b2a283fcaa59424a3ba77eafc441e7761286f55e3b2d155064
 F autosetup/jimsh0.c 27ea5f221359ef6c58780fc6c185aadbf8d3bee9a021331a3e5de0eba0dc6de6
 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba
 F autosetup/system.tcl 3a39d6e0b3bfba526fd39afe07c1d0d325e5a31925013a1ba7c671e1128e31bb
@@ -2237,8 +2237,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c8c70353bbdcee20487766f5f03f1638a1c35022bb5f1249141b86d561f1b613
-R aee97201b742768a8a881df4101db095
+P 8f6897b92c6a059f1c658ccce5bdc9ff3d29b41eec8298c6d46c7aeabace1d89
+R f0582379bec537e3414c67bad5681477
 U stephan
-Z c7373ae669f742e7f6e85074f4e952ce
+Z cffd0ba4388e6bcce9ac7e976789ab0c
 # Remove this line to create a well-formed Fossil manifest.
index 155d7ae947531408356e8b5d6c8790492dc64a98..7ad8783093c701d5f408a78598f0d90757106fb3 100644 (file)
@@ -1 +1 @@
-8f6897b92c6a059f1c658ccce5bdc9ff3d29b41eec8298c6d46c7aeabace1d89
+2ddeb7a8f55735cc7f2cf95cbbb0b20c563ced87db1429816fcfb0ee89e751f0