0
0
mirror of https://github.com/sqlite/sqlite.git synced 2024-11-21 19:29:09 +01:00

Bring the automated readline detection up to parity with the legacy configure script.

FossilOrigin-Name: 2ddeb7a8f55735cc7f2cf95cbbb0b20c563ced87db1429816fcfb0ee89e751f0
This commit is contained in:
stephan 2024-10-27 04:27:47 +00:00
parent 66fee051a6
commit ac1f151796
4 changed files with 170 additions and 64 deletions

109
auto.def
View File

@ -17,12 +17,11 @@
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]} {

View 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]
undefine lib_readline
return 1
# 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}"
}
# 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 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
}
}
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
}

View File

@ -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.

View File

@ -1 +1 @@
8f6897b92c6a059f1c658ccce5bdc9ff3d29b41eec8298c6d46c7aeabace1d89
2ddeb7a8f55735cc7f2cf95cbbb0b20c563ced87db1429816fcfb0ee89e751f0