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