1require 'mkmf'
2
3def have_all(*args)
4  old_libs = $libs.dup
5  old_defs = $defs.dup
6  result = []
7  begin
8    args.each {|arg|
9      r = arg.call(*result)
10      if !r
11        return nil
12      end
13      result << r
14    }
15    result
16  ensure
17    if result.length != args.length
18      $libs = old_libs
19      $defs = old_defs
20    end
21  end
22end
23
24dir_config('curses')
25dir_config('ncurses')
26dir_config('termcap')
27
28have_library("mytinfo", "tgetent") if /bow/ =~ RUBY_PLATFORM
29have_library("tinfo", "tgetent") or have_library("termcap", "tgetent")
30
31header_library = nil
32[
33  ["ncurses.h", ["ncursesw", "ncurses"]],
34  ["ncurses/curses.h", ["ncurses"]],
35  ["curses_colr/curses.h", ["cur_colr"]],
36  ["curses.h", ["curses", "pdcurses"]],
37  # ["xcurses.h", ["XCurses"]], # XCurses (PDCurses for X11)
38].each {|hdr, libs|
39  header_library = have_all(
40    lambda { have_header(hdr) && hdr },
41    lambda {|h| libs.find {|lib| have_library(lib, "initscr", h) } })
42  if header_library
43    break;
44  end
45}
46
47if header_library
48  header, library = header_library
49  puts "header: #{header}"
50  puts "library: #{library}"
51
52  curses = [header]
53  if header == 'curses_colr/curses.h'
54    curses.unshift("varargs.h")
55  end
56
57  for f in %w(beep bkgd bkgdset curs_set deleteln doupdate flash
58              getbkgd getnstr init isendwin keyname keypad resizeterm
59              scrl set setscrreg ungetch
60              wattroff wattron wattrset wbkgd wbkgdset wdeleteln wgetnstr
61              wresize wscrl wsetscrreg
62              def_prog_mode reset_prog_mode timeout wtimeout nodelay
63              init_color wcolor_set use_default_colors newpad)
64    have_func(f) || (have_macro(f, curses) && $defs.push(format("-DHAVE_%s", f.upcase)))
65  end
66  flag = "-D_XOPEN_SOURCE_EXTENDED"
67  if try_static_assert("sizeof(char*)>sizeof(int)",
68                       %w[stdio.h stdlib.h]+curses,
69                       flag)
70    $defs << flag
71  end
72  have_var("ESCDELAY", curses)
73  have_var("TABSIZE", curses)
74  have_var("COLORS", curses)
75  have_var("COLOR_PAIRS", curses)
76
77  # SVR4 curses has a (undocumented) variable char *curses_version.
78  # ncurses and PDcurses has a function char *curses_version().
79  # Note that the original BSD curses doesn't provide version information.
80
81  prolog = cpp_include(curses)
82  if checking_for(checking_message('function curses_version', curses)) {
83      try_run(<<-"End")
84        #{prolog}
85        int main(int argc, char *argv[])
86        {
87            curses_version();
88            return EXIT_SUCCESS;
89        }
90      End
91    }
92    $defs << '-DHAVE_FUNC_CURSES_VERSION'
93  end
94
95  if checking_for(checking_message('variable curses_version', curses)) {
96      try_run(<<-"End")
97        #{prolog}
98        extern char *curses_version;
99        int main(int argc, char *argv[])
100        {
101            int i = 0;
102            for (i = 0; i < 100; i++) {
103                if (curses_version[i] == 0)
104                    return 0 < i ? EXIT_SUCCESS : EXIT_FAILURE;
105                if (curses_version[i] & 0x80)
106                    return EXIT_FAILURE;
107            }
108            return EXIT_FAILURE;
109        }
110      End
111    }
112    $defs << '-DHAVE_VAR_CURSES_VERSION'
113  end
114
115  create_makefile("curses")
116end
117