From e32a50a02590a1a48c5e4152cdb2bba9fd976fc6 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 29 Oct 2024 08:01:56 +0000 Subject: [PATCH] Teach configure --editline to report itself to shell.c as either HAVE_EDITLINE or HAVE_READLINE, depending on which headers are available (editline/readline.h or readline/readline.h, both of which work and some systems only have the latter), but then link against libedit regardless of which one shell.c thinks it is using. FossilOrigin-Name: 85077b20e69ed269f8840bb900e823981bebd82063853fbf178b1af44a6951ba --- auto.def | 123 +++++++++++++++++++++++--------------------------- main.mk | 17 ++++--- manifest | 14 +++--- manifest.uuid | 2 +- 4 files changed, 75 insertions(+), 81 deletions(-) diff --git a/auto.def b/auto.def index 0f914a4138..c3d895aa22 100644 --- a/auto.def +++ b/auto.def @@ -741,7 +741,10 @@ proc sqlite-check-line-editing {} { define HAVE_EDITLINE 0 define LDFLAGS_READLINE "" define CFLAGS_READLINE "" + set libsForReadline {readline edit} ; # -l names to check for readline() set check [opt-val with-linenoise] + set editLibName "readline" ; # "readline" or "editline" + set editLibDef "HAVE_READLINE" ; # "HAVE_READLINE" or "HAVE_EDITLINE" if {"" ne $check} { # Use linenoise... set dirLn $check @@ -758,33 +761,18 @@ proc sqlite-check-line-editing {} { sqlite-add-shell-opt -DHAVE_LINENOISE=1 return "linenoise" } elseif {[opt-bool editline]} { - # --enable-editline. The problem is finding a system which has it - # available to test on. The man pages for it on OpenBSD do not - # match how shell.c uses it. OpenBSD has a lib named libedit but - # no headers to go with it. The legacy configure script looked for - # readline() in libedit (and libedit.a indeed has the - # readline/history functions used by shell.c) but shell.c expects - # to find when HAVE_EDITLINE=1, and that - # file is nowhere to be found. + # libedit mimics of libreadline and on some systems does not + # have its own header installed (instead, that of libreadline is used). + # We treat --editline as, for purposes of this tree, readline except + # that we'll link against libedit if it's available (and fail if + # it's not). We will use either API's header file # - # However, a workaround which works on the available systems is: - # - # --with-readline-ldflags=-ledit - # - # And then let it detect readline.h. We "could" re-map - # --enable-editline to do exactly that but it seems likely to - # break on systems for which which HAVE_EDITLINE=1 previously - # worked. - proj-indented-notice -error { - ERROR: the --enable-editline flag is not supported due to - non-availability of systems which have it in a form which the - sqlite3 CLI shell expects to see. On some systems this can be - worked around by passing --with-readline-ldflags=-ledit instead - of --enable-editline, which will attempt to use the readline.h - supplied by libreadline but link against -ledit. On systems - tested so far, that works. - } - return "none" + # shell.c historically expects HAVE_EDITLINE to be set for + # libedit, but it then expects to see , which + # some system's don't actually have, despite having libedit. Thus + # we trick shell.c into using editline by posing as readline. + set libsForReadline {edit} + set editLibName editline } elseif {![opt-bool readline]} { msg-result "Readline support explicitly disabled with --disable-readline" return "none" @@ -798,8 +786,8 @@ proc sqlite-check-line-editing {} { proj-opt-set with-readline-cflags auto } else { set v [file dirname $v] - if {[string match */*line $v]} { - # Special case: if the path includes .../*line/readline.h", set + if {[string match */readline $v]} { + # Special case: if the path includes .../readline/readline.h, set # the -I to one dir up from that because our sources include # or . Reminder: if # auto.def is being run by jimsh0 then [file normalize] will not @@ -814,16 +802,28 @@ proc sqlite-check-line-editing {} { set rlInc [opt-val with-readline-cflags auto] if {"auto" eq $rlInc} { set rlInc "" - if {!$::cross_compiling} { + if {$::cross_compiling} { # ^^^ this check is derived from the legacy configure script + proj-warn "Skipping check for readline.h because we're cross-compiling." + } else { + set dirs "[get-define prefix] /usr /usr/local /usr/local/readline /usr/contrib /mingw" + set subdirs "include/$editLibName" + if {"readline" ne $editLibName} { + lappend subdirs include/readline + # ^^^ editline, on some systems, does not have its own header, + # and uses libreadline's header. + } + lappend subdirs include + # ^^^ The dirs and subdirs lists are, except for the inclusion + # of $prefix and editline, from the legacy configure script set rlInc [proj-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 + -dirs $dirs -subdirs $subdirs] if {"" ne $rlInc} { - if {[string match */*line $rlInc]} { - # See notes above for --with-readline-header - set rlInc [file dirname $rlInc] + if {[string match */readline $rlInc]} { + set rlInc [file dirname $rlInc]; # shell #include's + } elseif {[string match */editline $rlInc]} { + set editLibDef HAVE_EDITLINE + set rlInc [file dirname $rlInc]; # shell #include's } set rlInc "-I${rlInc}" } @@ -837,14 +837,14 @@ proc sqlite-check-line-editing {} { if {"" eq $rlLib || "auto" eq $rlLib} { set rlLib "" set libTerm "" - if {[proj-check-function-in-lib tgetent {readline ncurses curses termcap}]} { + if {[proj-check-function-in-lib tgetent "$editLibName 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} { + if {$editLibName eq $libTerm} { set rlLib $libTerm - } elseif {[proj-check-function-in-lib readline readline $libTerm]} { + } elseif {[proj-check-function-in-lib readline $libsForReadline $libTerm]} { set rlLib [get-define lib_readline] lappend rlLib $libTerm undefine lib_readline @@ -853,54 +853,43 @@ proc sqlite-check-line-editing {} { } if {"" ne $rlLib} { + if {"editline" eq $editLibName && "HAVE_READLINE" eq $editLibDef} { + proj-indented-notice { + NOTE: this is libedit but using , + so will be compiled using -DHAVE_READLINE=1 but linked with + libedit. + } + } set rlLib [join $rlLib] set rlInc [join $rlInc] define LDFLAGS_READLINE $rlLib define CFLAGS_READLINE $rlInc - define HAVE_READLINE 1 - sqlite-add-shell-opt -DHAVE_READLINE=1 - msg-result "Using readline flags: $rlInc $rlLib" - + define $editLibDef 1 + sqlite-add-shell-opt -D${editLibDef}=1 + msg-result "Using $editLibName flags: $rlInc $rlLib" # Now check whether rl_completion_matches() has a signature we can use. # cctest is producing unexpected test output when using: # -includes {stdio.h readline/readline.h} # so we have to use -source instead and write the whole test app inline - if {[cctest \ - -cflags $rlInc -libs $rlLib -nooutput 1 -source { + if {![cctest \ + -cflags "$rlInc -D${editLibDef}" -libs $rlLib -nooutput 1 -source { #include + #ifdef HAVE_EDITLINE + #include + #else #include + #endif static char * rcg(const char *z, int i){return 0;} int main(void) { char ** x = rl_completion_matches("one", rcg); return 0; } }]} { - } else { - user-notice "WARNING: readline completion disabled due to rl_completion_matches() signature mismatch" + user-notice "WARNING: readline-style completion disabled due to rl_completion_matches() signature mismatch" show-notices sqlite-add-shell-opt -DSQLITE_OMIT_READLINE_COMPLETION } - - # Now check whether rl_completion_matches() has a signature we can use. - # cctest is producing unexpected test output when using: - # -includes {stdio.h readline/readline.h} - # so we have to use -source instead and write the whole test app inline - if {[cctest \ - -cflags $rlInc -libs $rlLib -nooutput 1 -source { - #include - #include - static char * rcg(const char *z, int i){return 0;} - int main(void) { - char ** x = rl_completion_matches("one", rcg); - return 0; - } - }]} { - user-notice "Readline completion enabled" - } else { - user-notice "WARNING: readline completion disabled due to rl_completion_matches() signature mismatch" - sqlite-add-shell-opt -DSQLITE_OMIT_READLINE_COMPLETION - } - return "readline" + return $editLibName } return "none" diff --git a/main.mk b/main.mk index 409f9ac8f1..626b297d48 100644 --- a/main.mk +++ b/main.mk @@ -322,12 +322,17 @@ T.link = $(T.cc.sqlite) $(T.link.extras) T.link.shared = $(T.link) $(LDFLAGS.shobj) # -# LDFLAGS.libsqlite3 should be used with any target which either -# results in building libsqlite3.so, compiles sqlite3.c directly, or -# links in either of $(LIBOBJSO) or $(LIBOBJS1). Note that these -# flags are for the target build platform, not necessarily localhost. -# i.e. it should be used with $(T.cc.sqlite) or $(T.link) but not -# $(B.cc). +# LDFLAGS.libsqlite3 should be used with any deliverable for which any +# of the following apply: +# +# - Results in building libsqlite3.so +# - Compiles sqlite3.c in to an application +# - Links with libsqlite3.a +# - Links in either of $(LIBOBJSO) or $(LIBOBJS1) +# +# Note that these flags are for the target build platform, not +# necessarily localhost. i.e. it should be used with $(T.cc.sqlite) +# or $(T.link) but not $(B.cc). # LDFLAGS.libsqlite3 = \ $(LDFLAGS.rpath) $(LDFLAGS.pthread) \ diff --git a/manifest b/manifest index 40810f458f..5e66a9acec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sLDFLAGS_LIBZ\sfrom\ssqlite3.pc.in\s(pkg-config)\sbecause\sit's\snot\sneeded\sby\sthe\slibrary,\sonly\sthe\sshell.\sRe-enable\sthe\snotice\sabout\s--disable-static\sonly\sbeing\spartially\strue. -D 2024-10-29T04:21:11.440 +C Teach\sconfigure\s--editline\sto\sreport\sitself\sto\sshell.c\sas\seither\sHAVE_EDITLINE\sor\sHAVE_READLINE,\sdepending\son\swhich\sheaders\sare\savailable\s(editline/readline.h\sor\sreadline/readline.h,\sboth\sof\swhich\swork\sand\ssome\ssystems\sonly\shave\sthe\slatter),\sbut\sthen\slink\sagainst\slibedit\sregardless\sof\swhich\sone\sshell.c\sthinks\sit\sis\susing. +D 2024-10-29T08:01:56.226 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 7f3da911883d21c53462b9a79259c9551d971a8cdc9bbbd11a7e79efaa7b758b +F auto.def 446169b97de3492b54e2282f22cd0364a5579ec620617273c3b6e371650700ff F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac @@ -697,7 +697,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 35c8565133e6afc4219654a8339cf617f8d9f40b3e9b6a598a2e9782b8a4eee5 +F main.mk 46f98320780c72a025bed1a5f8af3355fb2186691617f2b8d41221f9aa564494 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2198,8 +2198,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9a259026ae2dce5d60b80bd7d662a6e73734e51056f4a4226c3fa5ac636b5e3a -R faa87ee569d92cfc3e69ecb8ae88e292 +P e03c564aff6e3ac558f17670bfdd5fc129a8d33ec50975af843973152483e3fa +R d3a68de2e78347c35dd06cc7c4f435ff U stephan -Z 1c510488e46aaa36e3e65a77adda5034 +Z 03d95568b8712aa0747a4210f93cda01 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4c7174f142..0869312b92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e03c564aff6e3ac558f17670bfdd5fc129a8d33ec50975af843973152483e3fa +85077b20e69ed269f8840bb900e823981bebd82063853fbf178b1af44a6951ba