1require "mkmf"
2
3readline = Struct.new(:headers, :extra_check).new(["stdio.h"])
4
5def readline.have_header(header)
6  if super(header, &extra_check)
7    headers.push(header)
8    return true
9  else
10    return false
11  end
12end
13
14def readline.have_var(var)
15  return super(var, headers)
16end
17
18def readline.have_func(func)
19  return super(func, headers)
20end
21
22def readline.have_type(type)
23  return super(type, headers)
24end
25
26dir_config('curses')
27dir_config('ncurses')
28dir_config('termcap')
29dir_config("readline")
30enable_libedit = enable_config("libedit")
31
32have_library("user32", nil) if /cygwin/ === RUBY_PLATFORM
33have_library("ncurses", "tgetnum") ||
34  have_library("termcap", "tgetnum") ||
35  have_library("curses", "tgetnum")
36
37case enable_libedit
38when true
39  # --enable-libedit
40  unless (readline.have_header("editline/readline.h") ||
41          readline.have_header("readline/readline.h")) &&
42          have_library("edit", "readline")
43    raise "libedit not found"
44  end
45when false
46  # --disable-libedit
47  unless ((readline.have_header("readline/readline.h") &&
48           readline.have_header("readline/history.h")) &&
49           have_library("readline", "readline"))
50    raise "readline not found"
51  end
52else
53  # does not specify
54  unless ((readline.have_header("readline/readline.h") &&
55           readline.have_header("readline/history.h")) &&
56           (have_library("readline", "readline") ||
57            have_library("edit", "readline"))) ||
58            (readline.have_header("editline/readline.h") &&
59             have_library("edit", "readline"))
60    raise "readline nor libedit not found"
61  end
62end
63
64readline.have_func("rl_getc")
65readline.have_func("rl_getc_function")
66readline.have_func("rl_filename_completion_function")
67readline.have_func("rl_username_completion_function")
68readline.have_func("rl_completion_matches")
69readline.have_func("rl_refresh_line")
70readline.have_var("rl_deprep_term_function")
71readline.have_var("rl_completion_append_character")
72readline.have_var("rl_basic_word_break_characters")
73readline.have_var("rl_completer_word_break_characters")
74readline.have_var("rl_basic_quote_characters")
75readline.have_var("rl_completer_quote_characters")
76readline.have_var("rl_filename_quote_characters")
77readline.have_var("rl_attempted_completion_over")
78readline.have_var("rl_library_version")
79readline.have_var("rl_editing_mode")
80readline.have_var("rl_line_buffer")
81readline.have_var("rl_point")
82# workaround for native windows.
83/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && readline.have_var("rl_event_hook")
84/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && readline.have_var("rl_catch_sigwinch")
85/mswin|bccwin|mingw/ !~ RUBY_PLATFORM && readline.have_var("rl_catch_signals")
86readline.have_var("rl_pre_input_hook")
87readline.have_var("rl_special_prefixes")
88readline.have_func("rl_cleanup_after_signal")
89readline.have_func("rl_free_line_state")
90readline.have_func("rl_clear_signals")
91readline.have_func("rl_set_screen_size")
92readline.have_func("rl_get_screen_size")
93readline.have_func("rl_vi_editing_mode")
94readline.have_func("rl_emacs_editing_mode")
95readline.have_func("replace_history_entry")
96readline.have_func("remove_history")
97readline.have_func("clear_history")
98readline.have_func("rl_redisplay")
99readline.have_func("rl_insert_text")
100unless readline.have_type("rl_hook_func_t*")
101  $defs << "-Drl_hook_func_t=Function"
102end
103
104create_makefile("readline")
105