[GiNaC-list] GiNaC vs readline [Was: Problems]
David Fang
fang at csl.cornell.edu
Tue Jan 30 17:41:46 CET 2007
> On Mon, Jan 29, 2007 at 11:17:34PM -0500, David Fang wrote:
> > The reason the above is happening is because your configure found
> > /usr/include/readline and /usr/lib/libreadline which (on Mac OS X) is
> > actually the BSD editline or histedit wrapper library (almost readline).
>
> Thank you very much for investigation.
>
> > A real solution requires accommodating the possibility of
> > non-numeric version string in the config.h header or re-writing the test
> > so that it is not a problem.
>
> Here is really dumb patch which does this:
>
> [PATCH] Fix libreadline version detection.
>
> Some vendor-supplied readline equivalents (e.g. one on Mac OS X)
> return non-numeric rl_library_version. Let's check for such
> an ill-formed version string. For now I assume that such a library
> is compatible with GNU readline 4.2.
Hi,
Unfortunately, the problems don't stop there:
----------->8 snip 8<-------------
f g++ -DHAVE_CONFIG_H -I. -I../../ginsh -I.. -I../../ginsh/../ginac
-I../ginac -DIN_GINAC -I/usr/local/include -I/sw/include -g -O2 -MT
ginsh_parser.o -MD -MP -MF ".deps/ginsh_parser.Tpo" -c -o ginsh_parser.o
../../ginsh/ginsh_parser.cc; \
then mv -f ".deps/ginsh_parser.Tpo" ".deps/ginsh_parser.Po"; else rm -f
".deps/ginsh_parser.Tpo"; exit 1; fi
if g++ -DHAVE_CONFIG_H -I. -I../../ginsh -I.. -I../../ginsh/../ginac
-I../ginac -DIN_GINAC -I/usr/local/include -I/sw/include -g -O2 -MT
ginsh_lexer.o -MD -MP -MF ".deps/ginsh_lexer.Tpo" -c -o ginsh_lexer.o
../../ginsh/ginsh_lexer.cc; \
then mv -f ".deps/ginsh_lexer.Tpo" ".deps/ginsh_lexer.Po"; else rm -f
".deps/ginsh_lexer.Tpo"; exit 1; fi
../../ginsh/ginsh_parser.yy: In function 'char** fcn_completion(const
char*, int, int)':
../../ginsh/ginsh_parser.yy:858: error: invalid conversion from 'const
char*' to 'char*'
../../ginsh/ginsh_parser.yy:863: error: 'rl_filename_completion_function'
was not declared in this scope
../../ginsh/ginsh_parser.yy:863: error: 'rl_completion_matches' was not
declared in this scope
../../ginsh/ginsh_parser.yy:873: error: 'rl_completion_matches' was not
declared in this scope
make: *** [ginsh_parser.o] Error 1
----------->8 snip 8<-------------
Those three rl_ symbols also happen to be renamed without their "rl_"
prefixes in the editline wrapper header/library. (I've found this problem
with old versions of GNU readline too, BTW.) The workaround I devised in
the magic-7.1 source is the following:
#if defined(READLINE_4_DOT_2_PLUS) || (RL_VERSION_MAJOR >= 5) || (RL_VERSION_MAJOR == 4 && RL_VERSION_MINOR >= 2)
#define filename_completion_function rl_filename_completion_function
#define username_completion_function rl_username_completion_function
#define completion_matches rl_completion_matches
#endif
... and reference the names without "rl_" in source. IIRC, the symbol
name broke from readline 4.1 to 4.2. For my temporary workaround, I used
the reverse-definition of the above macros, using the non-rl_ symbols.
These particular editline wrappers might logically be based on
readline-pre-4.2 symbol names. The non-reverse macros above allow better
link-ability with older readlines, or you could wrap the wrappers -- many
solutions exist, thanks to autoconf.
Assuming the completion function names are fixed, there's yet one more
problem:
editline defines the symbol
extern char *rl_basic_word_break_characters;
but the source really wants a "const char*".
../../ginsh/ginsh_parser.yy:858: error: invalid conversion from 'const
char*' to 'char*'
There appears to be an attempt to detect this in the beginning of
ginsh_parser.yy. By 'faking' the readline version to 4.1 in config.h, I
get the "const char*" declaration.
Then, ginsh compiles, links, and runs some basic commands with no
problems. (This was using my bison-2.3 regenerated parser, since it
seems that 1.875 was mistaken.)
I hope this is enough information to fix things. Depending on how the
developers want to handle the readline version fiasco (:D ?), various
patch solutions are at hand. FWIW, my projects use separate
--with-readline=[PATH] and --with-editline=[PATH] style configure options
to distinguish between the libraries. I got this idea from the ngspice
source tree.
Can you tell how much I love configuring for readline? :P
Looking forward to testing the next RC. :)
Cheers.
David Fang
Computer Systems Laboratory
Electrical & Computer Engineering
Cornell University
http://www.csl.cornell.edu/~fang/
-- (2400 baud? Netscape 3.0?? lynx??? No problem!)
More information about the GiNaC-list
mailing list