# class Object

### Constants

Arc
Bitmap
BitmapImage
Button
Canvas
Checkbutton
Entry
Font

  autoload

Frame
Grid
Label
Line
Listbox
Menu
Menubutton
Message
Oval
Pack
PhotoImage

  A photo is an image whose pixels can display any color or be transparent. At present, only GIF and PPM/PGM formats are supported, but an interface exists to allow additional image file formats to be added easily.

  This class documentation is a copy from the original Tcl/Tk at www.tcl.tk/man/tcl8.5/TkCmd/photo.htm with some rewritten parts.

Place
Polygon
Radiobutton
Rectangle
Scale
Scrollbar
Selection
Spinbox
TclConfig_Info
Text
TextItem
TkAfter
TkConfig_Info
TkDialog2
TkLib_Config
TkMsgCat

  class TkMsgCatalog

TkNamedVirtualEvent
TkOption
TkResourceDB
TkRoot
TkSystemMenu
TkWarning2

  dialog for warning

TkWidget
TkcNamedTag
TktImage
TktMark
TktMarkAnchor
TktMarkCurrent
TktMarkInsert
TktNamedMark
TktNamedTag
TktTag
TktTagSel
TktWindow
TopLevel
Ttk
Variable
VirtualEvent
WindowItem
Winfo

  #<RDoc::Comment:0x00000006056040e0>

  #<RDoc::Comment:0x000000060560a8c8>

### Public Instance Methods

Mainloop() click to toggle source

    # File lib/tkclass.rb, line 46
    def Mainloop
      Tk.mainloop
    end

TkGrid(*args) click to toggle source

    # File lib/tk/autoload.rb, line 19
    def TkGrid(*args); TkGrid.configure(*args); end

TkPack(*args) click to toggle source

    # File lib/tk/autoload.rb, line 22
    def TkPack(*args); TkPack.configure(*args); end

TkPlace(*args) click to toggle source

    # File lib/tk/autoload.rb, line 25
    def TkPlace(*args); TkPlace.configure(*args); end

__method_missing_alias_for_MultiTkIp__(id, *args)
Alias for: method_missing
check_NG_path(path_list) click to toggle source

    # File ext/tk/extconf.rb, line 1000
    def check_NG_path(path_list)
      path_list.find_all{|path|
        not (TkLib_Config["tcl-NG-path"].include?(path) &&
             TkLib_Config["tk-NG-path"].include?(path))
      }
    end

check_pkg(file, verbose=false) click to toggle source

    # File lib/tkextlib/pkg_checker.rb, line 92
    def check_pkg(file, verbose=false)
      pkg_list = get_pkg_list(file)

      error_list = []
      success_list = {}

      pkg_list.each{|name, type|
        next if success_list[name]

        begin
          case type
          when :package
            ver = TkPackage.require(name)
            success_list[name] = ver
            error_list.delete_if{|n, t| n == name}

          when :library
            Tk.load_tcllibrary(name)
            success_list[name] = :library
            error_list.delete_if{|n, t| n == name}

          when :script
            Tk.load_tclscript(name)
            success_list[name] = :script
            error_list.delete_if{|n, t| n == name}

          when :require_ruby_lib
            require name

          end
        rescue => e
          if verbose
            error_list << [name, type, e.message]
          else
            error_list << [name, type]
          end
        end
      }

      success_list.dup.each{|name, ver|
        unless ver.kind_of?(String)
          begin
            ver = TkPackage.require(name)
            success_list[name] = ver
          rescue
          end
        end
      }

      [success_list, error_list]
    end

check_shlib_search_path(paths) click to toggle source

    # File ext/tk/extconf.rb, line 1007
    def check_shlib_search_path(paths)
      if !paths || paths.empty?
        path_list = []

        #if TkLib_Config["ActiveTcl"]
        #  path_list.concat Dir.glob(TkLib_Config["ActiveTcl"], File::FNM_CASEFOLD).sort.reverse
        #end
        if TkLib_Config["ActiveTcl"].kind_of?(String)  # glob path
          path_list.concat Dir.glob(TkLib_Config["ActiveTcl"], File::FNM_CASEFOLD).sort.reverse
        end

        vers = get_shlib_versions
        path_head, path_dirs = get_shlib_path_head

        path_list.concat vers.map{|ver|
          path_head.map{|head|
            if ver.empty?
              head + "/lib"
            else
              dirs = []

              if Dir.glob(head, File::FNM_CASEFOLD).find{|dir| dir == head}
                dirs << head + "/lib"
              end

              if !Dir.glob(head + "-*", File::FNM_CASEFOLD).empty?
                dirs << head + "-#{ver}/lib" if !Dir.glob(head + "-[89].*", File::FNM_CASEFOLD).empty?
                dirs << head + "-#{ver.delete('.')}/lib" if !Dir.glob(head + "-[89][0-9]*", File::FNM_CASEFOLD).empty?
              end

              if !Dir.glob(head + "[_-]*", File::FNM_CASEFOLD).empty?
                dirs << head + "_#{ver}/lib" if !Dir.glob(head + "_[89].*", File::FNM_CASEFOLD).empty?
                dirs << head + "-#{ver}/lib" if !Dir.glob(head + "-[89].*", File::FNM_CASEFOLD).empty?
                dirs << head + "_#{ver.delete('.')}/lib" if !Dir.glob(head + "_[89][0-9]*", File::FNM_CASEFOLD).empty?
                dirs << head + "-#{ver.delete('.')}/lib" if !Dir.glob(head + "-[89][0-9]*", File::FNM_CASEFOLD).empty?
              end

              dirs
            end
          }
        }.flatten!

        path_list.concat path_dirs

      else
        # paths is a string with PATH environment style
        path_list = paths.split((is_win32?)? ';': ':')
      end

      path_list = check_NG_path(path_list)
      path_list.map!{|path| path.strip}

      if !CROSS_COMPILING and (is_win32? || is_macosx?)
        # exist-dir only
        path_list.delete_if{|path| Dir.glob(File.join(path, "*.{a,so,dll,lib}")).empty?}
      end

      # keep paths for searching dynamic libs
      #$LIBPATH |= path_list
      path_list.uniq
    end

check_tcl_NG_path(path_list) click to toggle source

    # File ext/tk/extconf.rb, line 992
    def check_tcl_NG_path(path_list)
      path_list.find_all{|path| not TkLib_Config["tcl-NG-path"].include?(path) }
    end

check_tcltk_version(version) click to toggle source

    # File ext/tk/extconf.rb, line 144
    def check_tcltk_version(version)
      return [nil, nil] unless version.kind_of? String

      tclver, tkver = version.split(',')
      tclver = tclver.strip
      return [tclver, tkver.strip] if tkver

      dot = major = minor_dot = minor = plvl_dot = plvl = ext = nil
      if tclver =~ /^(\d)(\.?)(\d)(\.?)(\d*)(.*)$/
        major = $1; minor_dot = $2; minor = $3; plvl_dot = $4; plvl = $5; ext = $6
        dot = ! minor_dot.empty?
        if plvl_dot.empty? && ! plvl.empty?
          minor << plvl
        end
      elsif tclver =~ /^(\d)(\.?)(\d?)(.*)$/
        major = $1; minor_dot = $2; minor = $3; ext = $4
        dot = ! minor_dot.empty?
      else # unknown -> believe user
        return [tclver, tkver]
      end

      # check Tcl7.6 / Tk4.2 ?
      if major == "7" # Tcl7.6 ( not support Tclversion < 7.6 )
        # Tk4.2
        tkver  = "4" + ((dot)? ".": "") + ((minor.empty)? "": "2") + ext
      elsif major == "4" # Tk4.2 ( not support Tkversion < 4.2 )
        # Tcl7.6
        tkver = tclver
        tclver = "7" + ((dot)? ".": "") + ((minor.empty)? "": "6") + ext
      end

      tkver = tclver unless tkver

      [tclver, tkver]
    end

check_tk_NG_path(path_list) click to toggle source

    # File ext/tk/extconf.rb, line 996
    def check_tk_NG_path(path_list)
      path_list.find_all{|path| not TkLib_Config["tk-NG-path"].include?(path) }
    end

collect_tcltk_defs(tcl_defs_str, tk_defs_str) click to toggle source

    # File ext/tk/extconf.rb, line 351
    def collect_tcltk_defs(tcl_defs_str, tk_defs_str)
      conflicts = [
        'PACKAGE_NAME', 'PACKAGE_TARNAME', 'PACKAGE_VERSION',
        'PACKAGE_STRING', 'PACKAGE_BUGREPORT'
      ]

      begin
        # Ruby 1.9.x or later
        arch_config_h = RbConfig.expand($arch_hdrdir + "/ruby/config.h")
        if File.exist?(arch_config_h)
          keys = []
          IO.foreach(arch_config_h){|line|
            if line =~ /^#define +([^ ]+)/
                keys << $1
            end
          }
          conflicts = keys
        end
      rescue
        # ignore, use default
      end

      if tcl_defs_str
        tcl_defs = tcl_defs_str.split(/(?:\A|\s)\s*-D/).map{|s|
          s =~ /^([^=]+)(.*)$/
          [$1, $2]
        }
      else
        tcl_defs = []
      end

      if tk_defs_str
        tk_defs = tk_defs_str.split(/(?:\A|\s)\s*-D/).map{|s|
          s =~ /^([^=]+)(.*)$/
          [$1, $2]
        }
      else
        tk_defs = []
      end

      defs = tcl_defs | tk_defs

      defs.delete_if{|name,value|
        conflicts.include?(name) ||
          ( (vtcl = tcl_defs.assoc(name)) && (vtk = tk_defs.assoc(name)) &&
              vtcl != vtk )
      }

      defs.map{|ary| /\S/ =~ (s = ary.join('')) and "-D" << s.strip}.compact
    end

find_X11(*opt_paths) click to toggle source

    # File ext/tk/extconf.rb, line 1596
    def find_X11(*opt_paths)
      defaults =
        [ "/usr/X11*/lib", "/usr/lib/X11*", "/usr/local/X11*", "/usr/openwin/lib" ]
      paths = []
      opt_paths.compact.each{|path| paths.concat(Dir.glob(path.strip.chomp('/'), File::FNM_CASEFOLD))}
      defaults.compact.each{|path| paths.concat(Dir.glob(path.strip.chomp('/'), File::FNM_CASEFOLD))}
      st = find_library("X11", "XOpenDisplay", *paths)
      unless st
        puts("\n""Warning:: cannot find X11 library. tcltklib will not be compiled (tcltklib is disabled on your Ruby. That is, Ruby/Tk will not work). Please check configure options. If your Tcl/Tk don't require X11, please try --without-X11.")
      end
      st
    end

find_framework(tcl_hdr, tk_hdr) click to toggle source

    # File ext/tk/old-extconf.rb, line 15
    def find_framework(tcl_hdr, tk_hdr)
      if framework_dir = with_config("tcltk-framework")
        paths = [framework_dir]
      else
        unless tcl_hdr || tk_hdr ||
            enable_config("tcltk-framework", false) ||
            enable_config("mac-tcltk-framework", false)
          return false
        end
        paths = ["/Library/Frameworks", "/System/Library/Frameworks"]
      end

      checking_for('Tcl/Tk Framework') {
        paths.find{|dir|
          dir.strip!
          dir.chomp!('/')
          (tcl_hdr || FileTest.directory?(dir + "/Tcl.framework/") ) &&
            (tk_hdr || FileTest.directory?(dir + "/Tk.framework/") )
        }
      }
    end

find_macosx_framework() click to toggle source

    # File ext/tk/extconf.rb, line 273
    def find_macosx_framework
      use_framework = is_macosx? && TkLib_Config["ActiveTcl"]

      use_framework ||= (tcl_hdr = with_config("tcl-framework-header"))
      use_framework ||= (tk_hdr  = with_config("tk-framework-header"))
      tcl_hdr = nil unless tcl_hdr.kind_of? String
      tk_hdr  = nil unless tk_hdr.kind_of? String
      TkLib_Config["tcl-framework-header"] = tcl_hdr
      TkLib_Config["tk-framework-header"]  = tk_hdr

      use_framework ||= (tcl_dir = with_config("tcl-framework-dir"))
      tcl_dir = nil unless tcl_dir.kind_of? String
      if !tcl_dir && tcl_hdr
        # e.g. /Library/Frameworks/Tcl.framework/Headers
        #       ==> /Library/Frameworks/Tcl.framework
        tcl_dir = File.dirname(tcl_hdr.strip.chomp('/'))
      end
      TkLib_Config["tcl-framework-dir"] = tcl_dir

      use_framework ||= (tk_dir = with_config("tk-framework-dir"))
      tk_dir = nil unless tk_dir.kind_of? String
      if !tk_dir && tk_hdr
        # e.g. /Library/Frameworks/Tk.framework/Headers
        #       ==> /Library/Frameworks/Tk.framework
        tk_dir = File.dirname(tk_hdr.strip.chomp('/'))
      end
      TkLib_Config["tk-framework-dir"] = tk_dir

      if tcl_dir && !tk_dir
        tk_dir = File.join(File.dirname(tcl_dir), 'Tk.framework')
        TkLib_Config["tk-framework-dir"] = tk_dir
      elsif !tcl_dir && tk_dir
        tcl_dir = File.join(File.dirname(tk_dir), 'Tcl.framework')
        TkLib_Config["tcl-framework-dir"] = tcl_dir
      end
      if tcl_dir && tk_dir
        TkLib_Config["tcltk-framework"] = File.dirname(tcl_dir) unless TkLib_Config["tcltk-framework"]
        return [tcl_dir, tk_dir]
      end

      # framework is disabled?
      if with_config("tcltk-framework") == false ||
          enable_config("tcltk-framework") == false
       return false
      end

      use_framework ||= (framework_dir = with_config("tcltk-framework"))
      if framework_dir.kind_of? String
        TkLib_Config["tcltk-framework"] = framework_dir.strip.chomp('/')
        return [File.join(TkLib_Config["tcltk-framework"], 'Tcl.framework'),
                File.join(TkLib_Config["tcltk-framework"], 'Tk.framework')]
      end

      unless enable_config("tcltk-framework", use_framework) ||
          enable_config("mac-tcltk-framework", use_framework)
        TkLib_Config["tcltk-framework"] = false
        return false
      end

      paths = [
        #"~/Library/Frameworks",
        "/Library/Frameworks",
        "/Network/Library/Frameworks", "/System/Library/Frameworks"
      ]
      paths.reverse! unless TkLib_Config["ActiveTcl"] # system has higher priority

      paths.map{|dir| dir.strip.chomp('/')}.each{|dir|
        next unless File.exist?(File.join(dir, "Tcl.framework", "Headers"))
        next unless File.directory?(tcldir = File.join(dir, "Tcl.framework"))
        next unless File.exist?(File.join(dir, "Tk.framework", "Headers"))
        next unless File.directory?(tkdir  = File.join(dir, "Tk.framework"))
        TkLib_Config["tcltk-framework"] = dir
        return [tcldir, tkdir]
      }

      nil
    end

find_tcl(tcllib, stubs, version, *opt_paths) click to toggle source

    # File ext/tk/extconf.rb, line 1075
    def find_tcl(tcllib, stubs, version, *opt_paths)
      if TclConfig_Info['MKMF_PARAMS']
        # already checked existence of tcl library based on tclConfig.sh
        ($INCFLAGS ||= "") << " " << TclConfig_Info['MKMF_PARAMS']['INCFLAGS']
        $LIBPATH ||= []; $LIBPATH |= TclConfig_Info['MKMF_PARAMS']['LIBPATH']
        ($libs ||= "") << " " << TclConfig_Info['MKMF_PARAMS']['libs']
        return [true, nil, nil, nil]
      end
      # else, no available tclConfig.sh on the system

      print "Search Tcl library"

      if stubs
        func = "Tcl_InitStubs"
        lib = "tclstub"
      else
        func = "Tcl_FindExecutable"
        lib = "tcl"
      end

      if version && ! version.empty?
        versions = [version]
      else
        versions = TkLib_Config['search_versions']
      end

      default_paths = []

      default_paths.concat [
        RbConfig::CONFIG['libdir'],
        File.join(RbConfig::CONFIG['exec_prefix'], 'lib'),
        File.join(RbConfig::CONFIG['prefix'], 'lib'),
        "/usr/local/lib", "/usr/pkg/lib", "/usr/contrib/lib", "/usr/lib"
      ].find_all{|dir| File.directory?(dir)} unless CROSS_COMPILING

      if TkLib_Config["ActiveTcl"].kind_of?(String)  # glob path
        default_paths.concat Dir.glob(TkLib_Config["ActiveTcl"]).sort.reverse.map{|d| d << "/lib"}
      end

      if !CROSS_COMPILING and is_win32?
        default_paths.concat [
          "c:/Tcl/lib","c:/Program Files/Tcl/lib","c:/Program Files (x86)/Tcl/lib",
          "/Tcl/lib","/Program Files/Tcl/lib","/Program Files (x86)/Tcl/lib"
        ].find_all{|dir| File.directory?(dir)}.map{|dir| File.expand_path(dir)}

        # for MinGW
        ["/usr/local/lib64", "/usr/lib64", "/usr/local/lib", "/usr/lib"].each{|dir|
          default_paths << File.expand_path(dir) if File.directory? dir
        }

        default_paths |= ENV['LIBRARY_PATH'].split(';').find_all{|dir| File.directory? dir}.map{|dir| File.expand_path(dir)} if ENV['LIBRARY_PATH']
        default_paths |= ENV['PATH'].split(';').find_all{|dir| File.directory? dir}.map{|dir| File.expand_path(dir)} if ENV['PATH']
      end

      default_paths |= TkLib_Config["checked_shlib_dirs"]

      unless TkLib_Config["space-on-tk-libpath"]
        default_paths.delete_if{|path| path =~ / /}
      end

      if (paths = opt_paths.compact).empty?
        paths = check_tcl_NG_path(default_paths)
      end

      incflags = ($INCFLAGS ||= "").dup
      libpath = ($LIBPATH ||= []).dup
      libs_param = ($libs ||= "").dup
      tcllibs = nil

      exts = "(" + get_ext_list.join('|') + ")"

      paths.map{|path|
        lib_w_sufx = lib
        begin
          $LIBPATH |= [path]
          inc = [File.join(File.dirname(path),"include"), File.dirname(path)]
          inc.each{|f| $INCFLAGS << " -I" << f }

          if tcllib
            print(".")
            if have_library(tcllib, func, ["tcl.h"])
              return [true, path, tcllib, nil, *inc]
            end
          else
            sufx_list = ['', 't', 'g', 's', 'x']
            search_vers_on_path(versions, path, lib, 'tcl').find{|ver|
              dir_enum = Dir.foreach(path)
              no_dot_ver = ver.delete('.')
              libnames = ["#{lib}#{ver}", "#{lib}#{no_dot_ver}"]
              libnames << "tcl#{ver}" << "tcl#{no_dot_ver}"  if lib != "tcl"
              libnames.find{|libname|
                sufx_list.find{|sufx|
                  print(".")
                  dir_enum.map{|fname|
                    if fname =~ /^.*(#{libname}.*#{sufx})\.(#{exts}).*$/
                      [fname, $1, $2]
                    end
                  }.compact.find{|fname, lib_w_sufx, ext|
                    ext.downcase!
                    if (ext != CONFIG['DLEXT'] && ext == CONFIG['LIBEXT']) ||
                        ext == "a"
                      # static link
                      tcllibs = libs_param + " -DSTATIC_BUILD " + fname.quote
                    else
                      tcllibs = append_library($libs, lib_w_sufx)
                      tcllibs = "#{libpathflag([path])} #{tcllibs}"
                    end
                    if try_func(func, tcllibs, ["tcl.h"])
                      return [true, path, nil, tcllibs, *inc]
                    end
                  }
                }
              }
            }
            if (!version && (print(".");try_func(func, libs_param, ["tcl.h"])))
              return [true, path, lib_w_sufx, nil, *inc]
            end
          end
        ensure
          $LIBPATH = libpath.dup
          $libs = libs_param.dup
          $INCFLAGS = incflags.dup
        end
      }

      progress("\n")
      [false, nil, nil, nil]
    end

find_tcltk_header(tclver, tkver) click to toggle source

    # File ext/tk/extconf.rb, line 1380
    def find_tcltk_header(tclver, tkver)
      base_dir = []

      base_dir.concat [
        File.join(RbConfig::CONFIG['prefix'], 'include'),
        "/usr/local/include", "/usr/pkg/include", "/usr/contrib/include",
        "/usr/include"
      ].find_all{|dir| File.directory?(dir)}.map{|dir| File.expand_path(dir)}

      if !CROSS_COMPILING && is_win32?
        base_dir.concat [
          "c:/Tcl/include","c:/Program Files/Tcl/include",
          "c:/Program Files (x86)/Tcl/include",
          "/Tcl/include","/Program Files/Tcl/include",
          "/Program Files (x86)/Tcl/include"
        ].find_all{|dir| File.directory?(dir)}.map{|dir| File.expand_path(dir)}

        if ENV['CPATH']
          base_dir |= ENV['CPATH'].split(';').find_all{|dir| File.directory?(dir)}.map{|dir| File.expand_path(dir)}
        end
      end

      base_dir |= TkLib_Config["checked_shlib_dirs"]

      unless TkLib_Config["space-on-tk-libpath"]
        base_dir.delete_if{|path| path =~ / /}
      end

      # tcl.h
      if TclConfig_Info['MKMF_PARAMS']
        # already checked existence of tcl headers based on tclConfig.sh
        have_tcl_h = true
      else
        print "Search tcl.h"
        newline
        if enable_config("tcl-h-ver-check", true) &&
            tclver && tclver =~ /^\D*(\d)\.?(\d)/
          major = $1; minor = $2
        else
          major = minor = nil
        end
        progress(".")
        if major && minor
          # version check on tcl.h
          version_check = proc {|code|
            code << ("#if TCL_MAJOR_VERSION != #{major} || TCL_MINOR_VERSION != #{minor}\n" \
                     "#error VERSION does not match\n" \
                     "#endif")
          }
        else
          version_check = nil
        end
        have_tcl_h = have_header('tcl.h', &version_check)
        unless have_tcl_h
          if tclver && ! tclver.empty?
            versions = [tclver]
          else
            versions = TkLib_Config['search_versions']
          end
          paths = base_dir.dup
          (versions + [""]).each{|ver|
            paths.concat(base_dir.map{|dir|
                           [
                            dir + '/tcl' + ver,
                            dir + '/tcl' + ver + '/include',
                            dir + '/tcl' + ver.delete('.'),
                            dir + '/tcl' + ver.delete('.') + '/include'
                           ]
                         }.flatten)
          }
          paths = paths.map{|dir|
            (File.directory?(dir))? File.expand_path(dir): nil
          }.compact.uniq

          if major || minor
            version_check = proc {|code|
              code << "#if TCL_MAJOR_VERSION != #{major}\n#error MAJOR_VERSION does not match\n#endif\n" if major
              code << "#if TCL_MINOR_VERSION != #{minor}\n#error MINOR_VERSION does not match\n#endif\n" if minor
              code
            }
          else
            version_check = nil
          end
          have_tcl_h = paths.find{|path|
            progress(".")
            inc_opt = " -I#{path.quote}"
            if try_header("tcl", inc_opt, &version_check)
              ($INCFLAGS ||= "") << inc_opt
              true
            else
              false
            end
          }
        end
        progress("\n")
      end

      # tk.h
      if TkConfig_Info['MKMF_PARAMS']
        # already checked existence of tk headers based on tkConfig.sh
        have_tk_h = true
      else
        print "Search tk.h"
        newline
        if enable_config("tk-h-ver-check", true) &&
            tkver && tkver =~ /^\D*(\d)\.?(\d)/
          major = $1; minor = $2
        else
          major = minor = nil
        end
        progress(".")
        if major && minor
          # version check on tk.h
          version_check = proc {|code|
            code << ("#if TK_MAJOR_VERSION != #{major} || TK_MINOR_VERSION != #{minor}\n" \
                     "#error VERSION does not match\n" \
                     "#endif")
          }
        else
          version_check = nil
        end
        have_tk_h = have_header('tk.h')
        unless have_tk_h
          if tkver && ! tkver.empty?
            versions = [tkver]
          else
            versions = TkLib_Config['search_versions']
          end
          paths = base_dir.dup
          (versions + [""]).each{|ver|
            paths.concat(base_dir.map{|dir|
                           [
                            dir + '/tk' + ver,
                            dir + '/tk' + ver + '/include',
                            dir + '/tk' + ver.delete('.'),
                            dir + '/tk' + ver.delete('.') + '/include'
                           ]
                         }.flatten)
          }
          paths = paths.map{|dir|
            (File.directory?(dir))? File.expand_path(dir): nil
          }.compact.uniq

          if major || minor
            version_check = proc {|code|
              code << "#if TK_MAJOR_VERSION != #{major}\n#error MAJOR_VERSION does not match\n#endif\n" if major
              code << "#if TK_MINOR_VERSION != #{minor}\n#error MINOR_VERSION does not match\n#endif\n" if minor
              code
            }
          else
            version_check = nil
          end
          have_tk_h = paths.find{|path|
            progress(".")
            inc_opt = " -I#{path.quote}"
            if try_header(%w'tcl.h tk.h', inc_opt, &version_check)
              ($INCFLAGS ||= "") << inc_opt
              true
            else
              false
            end
          }
        end
        progress("\n")
      end

      puts "Can't find \"tcl.h\"." unless have_tcl_h
      puts "Can't find \"tk.h\"."  unless have_tk_h
      have_tcl_h && have_tk_h
    end

find_tcltk_library(tcllib, tklib, stubs, tclversion, tkversion, tcl_opt_paths, tk_opt_paths) click to toggle source

    # File ext/tk/extconf.rb, line 1343
    def find_tcltk_library(tcllib, tklib, stubs, tclversion, tkversion,
                           tcl_opt_paths, tk_opt_paths)
      st,path,lib,libs,*inc = find_tcl(tcllib, stubs, tclversion, *tcl_opt_paths)
      if !st && TkLib_Config['enable-shared'] == nil
        TkLib_Config['enable-shared'] = false
        st,path,lib,libs,*inc = find_tcl(tcllib, stubs, tclversion, *tcl_opt_paths)
      end
      unless st
        puts("\n""Warning:: cannot find Tcl library. tcltklib will not be compiled (tcltklib is disabled on your Ruby. That is, Ruby/Tk will not work). Please check configure options.")
        return false
      else
        ($LIBPATH ||= []; $LIBPATH |= [path]) if path
        $libs = append_library($libs, lib) if lib
        ($libs ||= "") << " " << libs if libs
        $INCFLAGS ||= ""
        inc.each{|f| $INCFLAGS << " -I" << f}
      end

      st,path,lib,libs,*inc = find_tk(tklib, stubs, tkversion, *tk_opt_paths)
      if !st && TkLib_Config['enable-shared'] == nil
        TkLib_Config['enable-shared'] = false
        st,path,lib,libs,*inc = find_tk(tklib, stubs, tkversion, *tk_opt_paths)
      end
      unless st
        puts("\n""Warning:: cannot find Tk library. tcltklib will not be compiled (tcltklib is disabled on your Ruby. That is, Ruby/Tk will not work). Please check configure options.")
        return false
      else
        ($LIBPATH ||= []; $LIBPATH |= [path]) if path
        $libs = append_library($libs, lib) if lib && !lib.empty?
        ($libs ||= "") << " " << libs if libs
        $INCFLAGS ||= ""
        inc.each{|f| $INCFLAGS << " -I" << f}
      end

      true
    end

find_tk(tklib, stubs, version, *opt_paths) click to toggle source

    # File ext/tk/extconf.rb, line 1219
    def find_tk(tklib, stubs, version, *opt_paths)
      if TkConfig_Info['MKMF_PARAMS']
        # already checked existence of tcl library based on tkConfig.sh
        ($INCFLAGS ||= "") << " " << TkConfig_Info['MKMF_PARAMS']['INCFLAGS']
        $LIBPATH ||= []; $LIBPATH |= TkConfig_Info['MKMF_PARAMS']['LIBPATH']
        ($libs ||= "") << " " << TkConfig_Info['MKMF_PARAMS']['libs']
        return [true, nil, nil, nil]
      end
      # else, no available tkConfig.sh on the system

      print "Search Tk library"

      if stubs
        func = "Tk_InitStubs"
        lib = "tkstub"
      else
        func = "Tk_Init"
        lib = "tk"
      end

      if version && ! version.empty?
        versions = [version]
      else
        versions = TkLib_Config['search_versions']
      end

      default_paths = []

      default_paths.concat [
        RbConfig::CONFIG['libdir'],
        File.join(RbConfig::CONFIG['exec_prefix'], 'lib'),
        File.join(RbConfig::CONFIG['prefix'], 'lib'),
        "/usr/local/lib", "/usr/pkg/lib", "/usr/contrib/lib", "/usr/lib"
      ].find_all{|dir| File.directory?(dir)} unless CROSS_COMPILING

      if !CROSS_COMPILING and is_win32?
        default_paths.concat [
          "c:/Tcl/lib","c:/Program Files/Tcl/lib","c:/Program Files (x86)/Tcl/lib",
          "/Tcl/lib","/Program Files/Tcl/lib","/Program Files (x86)/Tcl/lib"
        ].find_all{|dir| File.directory?(dir)}

        # for MinGW
        ["/usr/local/lib64", "/usr/lib64", "/usr/local/lib", "/usr/lib"].each{|dir|
          default_paths << File.expand_path(dir) if File.directory? dir
        }

        default_paths |= ENV['LIBRARY_PATH'].split(';').find_all{|dir| File.directory? dir}.map{|dir| File.expand_path(dir)} if ENV['LIBRARY_PATH']
        default_paths |= ENV['PATH'].split(';').find_all{|dir| File.directory? dir}.map{|dir| File.expand_path(dir)} if ENV['PATH']
      end

      default_paths |= TkLib_Config["checked_shlib_dirs"]

      unless TkLib_Config["space-on-tk-libpath"]
        default_paths.delete_if{|path| path =~ / /}
      end

      if (paths = opt_paths.compact).empty?
        paths = check_tk_NG_path(default_paths)
      end

      incflags = ($INCFLAGS ||= "").dup
      libpath = ($LIBPATH ||= []).dup
      libs_param = ($libs ||= "").dup
      tcllibs = nil

      exts = "(" + get_ext_list.join('|') + ")"

      paths.map{|path|
        lib_w_sufx = lib
        begin
          $LIBPATH |= [path]
          inc = [File.join(File.dirname(path),"include"), File.dirname(path)]
          inc.each{|f| $INCFLAGS << " -I" << f }

          if tklib
            print(".")
            if have_library(tklib, func, ["tcl.h", "tk.h"])
              return [true, path, tklib, nil, *inc]
            end
          else
            sufx_list = ['', 't', 'g', 's', 'x']
            search_vers_on_path(versions, path, lib, 'tk').find{|ver|
              dir_enum = Dir.foreach(path)
              no_dot_ver = ver.delete('.')
              libnames = ["#{lib}#{ver}", "#{lib}#{no_dot_ver}"]
              libnames << "tk#{ver}" << "tk#{no_dot_ver}"  if lib != "tk"
              libnames.find{|libname|
                sufx_list.find{|sufx|
                  print(".")
                  dir_enum.map{|fname|
                    if fname =~ /^.*(#{libname}.*#{sufx})\.(#{exts}).*$/
                      [fname, $1, $2]
                    end
                  }.compact.find{|fname, lib_w_sufx, ext|
                    if (ext != CONFIG['DLEXT'] && ext == CONFIG['LIBEXT']) ||
                        ext == "a"
                      # static link
                      tklibs = libs_param + " -DSTATIC_BUILD " + fname.quote
                    else
                      tklibs = append_library($libs, lib_w_sufx)
                      tklibs = "#{libpathflag([path])} #{tklibs}"
                    end
                    if try_func(func, tklibs, ["tcl.h", "tk.h"])
                      return [true, path, nil, tklibs, *inc]
                    end
                  }
                }
              }
            }
            if (!version && (print(".");try_func(func, libs_param, ["tcl.h", "tk.h"])))
              return [true, path, lib_w_sufx, nil, *inc]
            end
          end
        ensure
          $LIBPATH = libpath
          $libs = libs_param
          $INCFLAGS = incflags.dup
        end
      }

      progress("\n")
      [false, nil, nil, nil]
    end

get_ext_list() click to toggle source

    # File ext/tk/extconf.rb, line 567
    def get_ext_list()
      exts = [CONFIG['DLEXT']]
      exts.concat %w(dll) if is_win32?
      exts.concat %w(bundle dylib) if is_macosx?
      exts.concat %w(dll.a) if /cygwin/ =~ RUBY_PLATFORM

      if TkLib_Config["tcltk-stubs"] || TkLib_Config['enable-shared'] == false
        exts.unshift "lib" if is_win32?
        exts.unshift "a"
        exts.unshift CONFIG['LIBEXT']
      end

      if is_win32?
        exts.map!{|ext| [ext.downcase, ext.upcase]}.flatten!
      end

      exts
    end

get_libpath(lib_flag, lib_spec) click to toggle source

    # File ext/tk/extconf.rb, line 418
    def get_libpath(lib_flag, lib_spec)
      # get libpath from {TCL,Tk}_LIB_FLAG and {TCL,Tk}_LIB_SPEC
      lib_spec.gsub(/(#{lib_flag}|-L)/, "").strip
    end

get_pkg_list(file) click to toggle source

    # File lib/tkextlib/pkg_checker.rb, line 67
    def get_pkg_list(file)
      pkg_list = []

      File.foreach(file){|l|
        if l =~ /^(?:[^#]+\s|\s*)(?:|;\s*)TkPackage\s*\.\s*require\s*\(?\s*(["'])((\w|:)+)\1/
          pkg = [$2, :package]
          pkg_list << pkg unless pkg_list.member?(pkg)
        end
        if l =~ /^(?:[^#]+\s|\s*)(?:|;\s*)Tk\s*\.\s*load_tcllibrary\s*\(?\s*(["'])((\w|:)+)\1/
          pkg = [$2, :library]
          pkg_list << pkg unless pkg_list.member?(pkg)
        end
        if l =~ /^(?:[^#]+\s|\s*)(?:|;\s*)Tk\s*\.\s*load_tclscript\s*\(?\s*(["'])((\w|:)+)\1/
          pkg = [$2, :script]
          pkg_list << pkg unless pkg_list.member?(pkg)
        end
        if l =~ /^(?:[^#]+\s|\s*)(?:|;\s*)require\s*\(?\s*(["'])((\w|\/|:)+)\1/
          pkg = [$2, :require_ruby_lib]
          pkg_list << pkg unless pkg_list.member?(pkg)
        end
      }

      pkg_list
    end

get_shlib_path_head() click to toggle source

    # File ext/tk/extconf.rb, line 208
    def get_shlib_path_head
      path_head = []
      path_dirs = []

      if TkLib_Config["ActiveTcl"].kind_of?(String)  # glob path
        # path_head << TkLib_Config["ActiveTcl"]
        path_head.concat Dir.glob(TkLib_Config["ActiveTcl"], File::FNM_CASEFOLD).sort.reverse
        # path_dirs.concat Dir.glob(File.join(TkLib_Config["ActiveTcl"], 'lib'), File::FNM_CASEFOLD).sort.reverse
      end

      if CROSS_COMPILING
      elsif is_win32?
        if TkLib_Config["ActiveTcl"]
          path_head.concat ["c:/ActiveTcl", "c:/Program Files/ActiveTcl",
                            "c:/Program Files (x86)/ActiveTcl"]
        end
        path_head.concat [
          "c:/Tcl", "c:/Program Files/Tcl", "c:/Program Files (x86)/Tcl",
          "/Tcl", "/Program Files/Tcl", "/Program Files (x86)/Tcl"
        ]
        path_head.uniq!
        #path_head.each{|dir| path_dirs << dir.dup if File.directory? dir}
        path_head.each{|dir| path_dirs << File.expand_path(dir) if File.directory? dir}

        # for MinGW
        ["/usr/local/lib64", "/usr/lib64", "/usr/local/lib", "/usr/lib"].each{|dir|
          #path_dirs << dir if File.directory? dir
          path_dirs << File.expand_path(dir) if File.directory? dir
        }
        path_dirs |= ENV['LIBRARY_PATH'].split(';').find_all{|dir| File.directory? dir}.map{|dir| File.expand_path(dir)} if ENV['LIBRARY_PATH']
        path_dirs |= ENV['PATH'].split(';').find_all{|dir| File.directory? dir}.map{|dir| File.expand_path(dir)} if ENV['PATH']

      else
        [
          '/opt', '/pkg', '/share',
          '/usr/local/opt', '/usr/local/pkg', '/usr/local/share', '/usr/local',
          '/usr/opt', '/usr/pkg', '/usr/share', '/usr/contrib', '/usr'
        ].each{|dir|
          next unless File.directory?(dir)

          path_dirs << "#{dir}/lib64" if maybe_64bit?
          path_dirs << "#{dir}/lib"
          path_dirs << "#{dir}" unless Dir.glob("#{dir}/lib*.*", File::FNM_CASEFOLD).empty?

          dirnames = []
          if TkLib_Config["ActiveTcl"]
            dirnames.concat ["ActiveTcl"]
          end
          dirnames.concat ["TclTk","Tcl_Tk","Tcl-Tk"]

          dirnames.each{|name|
            path_dirs << "#{dir}/#{name}" if File.directory?("#{dir}/#{name}")
            path_head << "#{dir}/#{name}" unless Dir.glob("#{dir}/#{name}[-89_]*", File::FNM_CASEFOLD).empty?
          }
        }
      end

      unless TkLib_Config["space-on-tk-libpath"]
        path_head.delete_if{|path| path =~ / /}
        path_dirs.delete_if{|path| path =~ / /}
      end

      [path_head, path_dirs]
    end

get_shlib_versions(major = 8, minor_max = 9, minor_min = 0, ext = "") click to toggle source

    # File ext/tk/extconf.rb, line 180
    def get_shlib_versions(major = 8, minor_max = 9, minor_min = 0, ext = "")
      if tclcfg = TkLib_Config["tclConfig_info"]
        major = tclcfg['TCL_MAJOR_VERSION'].to_i
        minor_min = tclcfg['TCL_MINOR_VERSION'].to_i

      elsif TkLib_Config["tcltkversion"]
        tclver, tkver = TkLib_Config["tcltkversion"]
        if tclver =~ /8\.?(\d)(.*)/
          minor_min = $1.to_i
          ext = $2
        else
          # unsupported version
          return [""]
        end
      end

      # if disable-stubs, version is fixed.
      minor_max = minor_min unless TkLib_Config["tcltk-stubs"]

      vers = []
      minor_max.downto(minor_min){|minor|
        vers << "#{major}.#{minor}#{ext}" unless ext.empty?
        vers << "#{major}.#{minor}"
      }

      vers << ""
    end

get_tclConfig(tclConfig_file, tkConfig_file, tclConfig_dir, tkConfig_dir) click to toggle source

    # File ext/tk/extconf.rb, line 908
    def get_tclConfig(tclConfig_file, tkConfig_file, tclConfig_dir, tkConfig_dir)
      use_tclConfig = tclConfig_file != false && tclConfig_dir != false
      use_tkConfig  = tkConfig_file  != false && tkConfig_dir  != false

      unless use_tclConfig || use_tkConfig
        puts("Don't use [tclConfig.sh, tkConfig.sh]")
        return [nil, nil]
      end

      tclConfig_file = nil unless tclConfig_file.kind_of? String
      tkConfig_file = nil unless tkConfig_file.kind_of? String
      tclConfig_dir = nil unless tclConfig_dir.kind_of? String
      tkConfig_dir = nil unless tkConfig_dir.kind_of? String

      if use_tclConfig && !tclConfig_dir
        if tclConfig_file
          tclConfig_dir = File.dirname(tclConfig_file)
        elsif tkConfig_dir
          tclConfig_dir = tkConfig_dir
        end
      end
      if use_tkConfig && !tkConfig_dir
        if tkConfig_file
          tkConfig_dir = File.dirname(tkConfig_file)
        elsif tclConfig_dir
          tkConfig_dir = tclConfig_dir
        end
      end
      tkConfig_dir ||= tclConfig_dir

      if use_tclConfig
        TkLib_Config["tclConfig-file"] = tclConfig_file
        TkLib_Config["tclConfig-dir"] = tclConfig_dir
      else
        tclConfig_file = false
        tclConfig_dir = false
      end
      if use_tkConfig
        TkLib_Config["tkConfig-file"] = tkConfig_file
        TkLib_Config["tkConfig-dir"] = tkConfig_dir
      else
        tkConfig_file = false
        tkConfig_dir = false
      end

      print ("Don't use tclConfig.sh (specified by configure option).\n") unless use_tclConfig
      print ("Don't use tkConfig.sh (specified by configure option).\n") unless use_tkConfig
      print("Search ")
      print("tclConfig.sh", (tclConfig_dir)? " (in #{tclConfig_dir})": "") if use_tclConfig
      print((use_tclConfig)? " and ": "", "tkConfig.sh", (tkConfig_dir)? " (in #{tkConfig_dir})": "") if use_tkConfig
      print(".")

      if tclConfig_dir || tkConfig_dir || !use_tclConfig || !use_tkConfig
        tclConfig, tkConfig =
          search_tclConfig([ ((tclConfig_file)? tclConfig_file: tclConfig_dir),
                             ((tkConfig_file)?  tkConfig_file:  tkConfig_dir) ])
      else
        tclConfig, tkConfig = search_tclConfig()
      end
      print("\n")
      # TclConfig_Info = TkLib_Config["tclConfig_info"]
      # TkConfig_Info  = TkLib_Config["tkConfig_info"]

      if tclConfig || tkConfig
        dirs = TkLib_Config["tclConfig_paths"].map{|tclpath, tkpath|
          [ (tclpath)? File.dirname(tclpath): nil,
            (tkpath)? File.dirname(tkpath): nil ]
        }
        dirs |= dirs
        puts("Valid [tclConfig.sh, tkConfig.sh] are found in #{dirs.inspect}")
        puts("Use [tclConfig.sh, tkConfig.sh] == #{[tclConfig, tkConfig].inspect}")
        $LIBPATH ||= []
        $LIBPATH |= [File.dirname(tclConfig)] if tclConfig
        $LIBPATH |= [File.dirname(tkConfig)]  if tkConfig
        #TkLib_Config["tclConfig_paths"].each{|tclcfg, tkcfg|
        #  $LIBPATH |= [File.dirname(tclcfg)] | [File.dirname(tkcfg)]
        #}
      else
        puts("Fail to find [tclConfig.sh, tkConfig.sh]")
      end

      [tclConfig, tkConfig]
    end

get_tclConfig_dirs() click to toggle source

    # File ext/tk/extconf.rb, line 423
    def get_tclConfig_dirs
      config_dir = []

      if CROSS_COMPILING
      elsif is_win32?
        if TkLib_Config["ActiveTcl"]
          dirs = []
          if TkLib_Config["ActiveTcl"].kind_of?(String)
            dirs << File.join(TkLib_Config["ActiveTcl"], 'lib')
          end
          dirs.concat [
            "c:/ActiveTcl*/lib", "c:/Tcl*/lib",
            "c:/Program Files*/ActiveTcl*/lib", "c:/Program Files*/Tcl*/lib",
            "/ActiveTcl*/lib", "/Tcl*/lib",
            "/Program Files*/ActiveTcl*/lib", "/Program Files*/Tcl*/lib"
          ]
        else
          dirs = [
            "c:/Tcl*/lib", "c:/Program Files*/Tcl*/lib",
            "/Tcl*/lib", "/Program Files*/Tcl*/lib"
          ]
        end
        dirs = dirs.collect{|d| Dir.glob(d, File::FNM_CASEFOLD)}.flatten.uniq

        dirs |= ENV['LIBRARY_PATH'].split(';')  if ENV['LIBRARY_PATH']
        dirs |= ENV['PATH'].split(';')  if ENV['PATH']

        exeext = RbConfig::CONFIG['EXEEXT']
        ENV['PATH'].split(File::PATH_SEPARATOR).each{|dir|
          dir.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
          next if Dir.glob(File.join(dir, "{tclsh,wish}*#{exeext}"), File::FNM_CASEFOLD).empty?
          dirs << File.expand_path(File.join(dir, '..', 'lib'))
          dirs << dir
          # dirs << File.expand_path(File.join(dir, '..'))
        }

        unless TkLib_Config["space-on-tk-libpath"]
          dirs.delete_if{|path| path =~ / /}
        end

        config_dir.concat(dirs.zip(dirs))

      else
        if framework = find_macosx_framework()
          config_dir.unshift(framework)
        end

        if activeTcl = TkLib_Config['ActiveTcl']
          # check latest version at first
          if is_macosx?
            base = File.expand_path(activeTcl)
            config_dir << [
              File.join(base, 'Tcl.framework'), File.join(base, 'Tk.framework')
            ]

            config_dir << [
              File.join(base, 'Tcl.framework', 'Versions', 'Current'),
              File.join(base, 'Tk.framework', 'Versions', 'Current')
            ]

            Dir.glob(File.join(base, 'Tcl.framework',
                               'Versions', '*')).sort.reverse.each{|dir|
              next if dir =~ /Current/
              config_dir << [dir, dir.gsub(/Tcl/, 'Tk')]
            }
          else
            config_dir.concat(Dir.glob(File.join(activeTcl, 'lib'), File::FNM_CASEFOLD).sort.reverse)
          end
        end

        config_dir << RbConfig::CONFIG['libdir']

        ((maybe_64bit?)? ['lib64', 'lib']: ['lib']).each{|dir|
          config_dir.concat [
            File.join(RbConfig::CONFIG['exec_prefix'], dir),
            File.join(RbConfig::CONFIG['prefix'], dir),
            "/usr/local/opt/#{dir}", "/usr/local/pkg/#{dir}",
            "/usr/local/share/#{dir}", "/usr/local/#{dir}",
            "/usr/opt/#{dir}", "/usr/pkg/#{dir}", "/usr/share/#{dir}",
            "/usr/contrib/#{dir}", "/usr/#{dir}"
          ]
        }

        config_dir.concat [
          '/opt', '/pkg', '/share',
          '/usr/local/opt', '/usr/local/pkg', '/usr/local/share', '/usr/local',
          '/usr/opt', '/usr/pkg', '/usr/share', '/usr/contrib', '/usr'
        ].map{|dir|
          Dir.glob(dir + "/{tcltk,tcl,tk}[#{TkLib_Config['major_nums']}*/lib",
                   File::FNM_CASEFOLD)
          Dir.glob(dir + "/{tcltk,tcl,tk}[#{TkLib_Config['major_nums']}*",
                   File::FNM_CASEFOLD)
          Dir.glob(dir + '/{tcltk,tcl,tk}/lib', File::FNM_CASEFOLD)
          Dir.glob(dir + '/{tcltk,tcl,tk}', File::FNM_CASEFOLD)
        }.flatten!

        exeext = RbConfig::CONFIG['EXEEXT']
        ENV['PATH'].split(File::PATH_SEPARATOR).each{|dir|
          dir.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
          next if Dir.glob(File.join(dir, "{tclsh,wish}*#{exeext}"), File::FNM_CASEFOLD).empty?
          config_dir << File.expand_path(File.join(dir, '..', 'lib'))
        }

        # for MacOS X
        paths = [
          #"~/Library/Tcl",
          "/Library/Tcl", "/Network/Library/Tcl", "/System/Library/Tcl"
        ]
        paths.reverse! unless TkLib_Config["ActiveTcl"]

        paths.each{|path|
          config_dir << path
          config_dir.concat(Dir.glob(File.join(path, '{tcl,tk}*'), File::FNM_CASEFOLD).sort.reverse.find_all{|d| File.directory?(d)})
        }

        paths = [
          #"~/Library/Frameworks",
          "/Library/Frameworks",
          "/Network/Library/Frameworks", "/System/Library/Frameworks"
        ]
        paths.reverse! unless TkLib_Config["ActiveTcl"]

        paths.each{|frmwk|
          base = File.expand_path(frmwk)
          config_dir << [
            File.join(base, 'Tcl.framework'), File.join(base, 'Tk.framework')
          ]

          config_dir << [
            File.join(base, 'Tcl.framework', 'Versions', 'Current'),
            File.join(base, 'Tk.framework', 'Versions', 'Current')
          ]

          Dir.glob(File.join(base, 'Tcl.framework',
                             'Versions', '*')).sort.reverse.each{|dir|
            next if dir =~ /Current/
            config_dir << [dir, dir.gsub(/Tcl/, 'Tk')]
          }
        }
      end

      config_dir
    end

help_msg() click to toggle source

    # File lib/tkextlib/pkg_checker.rb, line 17
    def help_msg
      print "Usage: #{$0} [-l] [-v] [-h] [--] [dir]\n"
      print "\tIf dir is omitted, check the directory that this command exists.\n"
      print "\tAvailable options are \n"
      print "\t  -l : Add dir to $LOAD_PATH\n"
      print "\t       (If dir == '<parent>/tkextlib', add <parent> also.)\n"
      print "\t  -v : Verbose mode (show reason of fail)\n"
      print "\t  -h : Show this message\n"
      print "\t  -- : End of options\n"
    end

is_macosx?() click to toggle source

    # File ext/tk/extconf.rb, line 122
    def is_macosx?
     /darwin/ =~ RUBY_PLATFORM
    end

is_win32?() click to toggle source

functions

    # File ext/tk/extconf.rb, line 118
    def is_win32?
      /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
    end

libcheck_for_tclConfig(tcldir, tkdir, tclconf, tkconf) click to toggle source

    # File ext/tk/extconf.rb, line 586
    def libcheck_for_tclConfig(tcldir, tkdir, tclconf, tkconf)
      tcllib_ok = tklib_ok = false

      if TkLib_Config["tcltk-stubs"]
        stub = "stub"
        tclfunc = "Tcl_InitStubs"
        tkfunc  = "Tk_InitStubs"
      else
        stub = ""
        tclfunc = "Tcl_FindExecutable"
        tkfunc  = "Tk_Init"
      end

      incflags = ($INCFLAGS ||= "").dup
      libpath = ($LIBPATH ||= []).dup
      libs_param = ($libs ||= "").dup
      tcllibs = nil
      mkmf_param = nil

      tclver, tkver = TkLib_Config["tcltkversion"]
      exts = "(" + get_ext_list.join('|') + ")"

      if tclver
        tcl_glob = "*tcl#{stub}#{tclver}.*"
        tcl_regexp = /^.*(tcl#{stub}#{tclver}.*)\.(#{exts}).*$/
      elsif tclconf
        tcl_glob = "*tcl#{stub}#{tclconf['TCL_MAJOR_VERSION']}{.,}#{tclconf['TCL_MINOR_VERSION']}*.*"
        tcl_regexp = /^.*(tcl#{stub}#{tclconf['TCL_MAJOR_VERSION']}(?:\.|)#{tclconf['TCL_MINOR_VERSION']}.*)\.(#{exts}).*$/
      end
      if tkver
        tk_glob = "*tk#{stub}#{tkver}.*"
        tk_regexp = /^.*(tk#{stub}#{tkver}.*)\.(#{exts}).*$/
      elsif tkconf
        tk_glob = "*tk#{stub}#{tkconf['TK_MAJOR_VERSION']}{.,}#{tkconf['TK_MINOR_VERSION']}*.*"
        tk_regexp = /^.*(tk#{stub}#{tkconf['TK_MAJOR_VERSION']}(?:\.|)#{tkconf['TK_MINOR_VERSION']}.*)\.#{exts}.*$/
      end

      tcllib_ok ||= !tclconf || Dir.glob(File.join(tcldir, tcl_glob), File::FNM_CASEFOLD).find{|file|
        if file =~ tcl_regexp
          libname = $1
          ext = $2.downcase
          begin
            $INCFLAGS = incflags.dup << " " << tclconf["TCL_INCLUDE_SPEC"]
            #puts "check #{file} #{$1} #{tclfunc} #{tcldir}"
            #find_library($1, tclfunc, tcldir)
            if (tclconf && tclconf["TCL_SHARED_BUILD"] == "0") ||
                (!tclconf && ((ext != CONFIG['DLEXT'] && ext == CONFIG['LIBEXT']) || ext == "a"))
              # static link
              tcllibs = $libs + " -DSTATIC_BUILD " + file.quote

              # FIX ME: avoid pathname trouble (fail to find) on MinGW.
              #   e.g. TCL_INCLUDE_SPEC describes "-I/usr/local/include",
              #        but compiler can find "-IC:/msys/1.0/local/include" only.
              $INCFLAGS << " -I" << File.join(File.dirname(File.dirname(file)),"include") if is_win32?
            else
              tcllibs = append_library($libs, libname)
              tcllibs = "#{libpathflag([tcldir])} #{tcllibs}"

              # FIX ME: avoid pathname trouble (fail to find) on MinGW.
              $INCFLAGS << " -I" << File.join(File.dirname(tcldir),"include") if is_win32?
            end

            $LIBPATH = libpath | [tcldir]
            try_func(tclfunc, tcllibs, ["tcl.h"]) ||
              ( try_func(tclfunc, tcllibs << " " << tclconf['TCL_LIBS'], ["tcl.h"]) if tclconf['TCL_LIBS'] )

          ensure
            mkmf_param = {
              'PATH' => file,
              'LIBNAME' => libname,
              'libs' => tcllibs.dup,
              'INCFLAGS' => $INCFLAGS.dup,
              'LIBPATH' => $LIBPATH.dup,
            }
            $LIBPATH = libpath.dup
            $libs = libs_param.dup
          end
        end
      }
      tclconf['MKMF_PARAMS'] = mkmf_param if tclconf && tcllib_ok

      tklib_ok ||= !tkconf || Dir.glob(File.join(tkdir, tk_glob), File::FNM_CASEFOLD).find{|file|
        if file =~ tk_regexp
          libname = $1
          ext = $2.downcase
          begin
            #puts "check #{file} #{$1} #{tkfunc} #{tkdir}"
            # find_library($1, tkfunc, tkdir)
            if (tkconf && tkconf["TCL_SHARED_BUILD"] == "0") ||
                (!tkconf && ((ext != CONFIG['DLEXT'] && ext == CONFIG['LIBEXT']) || ext == "a"))
              # static link
              tklibs = " -DSTATIC_BUILD " + file.quote

              # FIX ME: avoid pathname trouble (fail to find) on MinGW.
              $INCFLAGS << " -I" << File.join(File.dirname(File.dirname(file)),"include") if is_win32?
            else
              tklibs = append_library("", libname)
              #tklibs = append_library("", $1)
              tklibs = "#{libpathflag([tkdir])} #{tklibs}"

              # FIX ME: avoid pathname trouble (fail to find) on MinGW.
              $INCFLAGS << " -I" << File.join(File.dirname(tcldir),"include") if is_win32?
            end

            tklibs << " " <<  tcllibs if tcllibs
            tmp_tklibs = tklibs.dup
            $LIBPATH = libpath | [tkdir]
            try_func(tkfunc, tklibs, ["tcl.h", "tk.h"]) ||
              ( try_func(tkfunc, tklibs << " " << tkconf['TK_LIBS'], ["tcl.h", "tk.h"]) if tkconf['TK_LIBS'] ) ||
              ( try_func(tkfunc, (tklibs = tmp_tklibs.dup) << " " << tkconf['TK_XLIBSW'], ["tcl.h", "tk.h"]) if tkconf['TK_XLIBSW'] ) ||
              ( try_func(tkfunc, tklibs << " " << tkconf['TK_LIBS'], ["tcl.h", "tk.h"]) if tkconf['TK_LIBS'] )

          ensure
            mkmf_param = {
              'PATH' => file,
              'LIBNAME' => libname,
              'libs' => tklibs.dup,
              'INCFLAGS' => $INCFLAGS.dup,
              'LIBPATH' => $LIBPATH.dup,
            }
            $LIBPATH = libpath.dup
            $libs = libs_param.dup
          end
        end
      }

      $INCFLAGS = incflags.dup
      tkconf['MKMF_PARAMS'] = mkmf_param if tkconf && tklib_ok

      [tcllib_ok, tklib_ok]
    end

maybe_64bit?() click to toggle source

    # File ext/tk/extconf.rb, line 126
    def maybe_64bit?
      /64|universal|s390x/ =~ RUBY_PLATFORM
    end

method_missing(id, *args) click to toggle source

    # File lib/multi-tk.rb, line 2068
    def method_missing(id, *args)
      begin
        has_top = (top = MultiTkIp.__getip.__pseudo_toplevel) &&
          top.respond_to?(:pseudo_toplevel_evaluable?) &&
          top.pseudo_toplevel_evaluable? &&
          top.respond_to?(id)
      rescue Exception => e
        has_top = false
      end

      if has_top
        top.__send__(id, *args)
      else
        __method_missing_alias_for_MultiTkIp__(id, *args)
      end
    end

Also aliased as: __method_missing_alias_for_MultiTkIp__
newline() click to toggle source

    # File ext/tk/extconf.rb, line 134
    def newline
    end

parse_TK_LIBS(tklibs) click to toggle source

    # File ext/tk/extconf.rb, line 1204
    def parse_TK_LIBS(tklibs)
      sfx = "lib|shlib|dll|so"
      re = /(("|')[^"']+\.(#{sfx})\2|[^"' ]+\.(#{sfx})|-l("|')[^"']+\5|-l[^" ]+)/#'

      tklibs.scan(re).map{|lib,|
        if lib =~ /^("|')([^"]+)\.(#{sfx})\1/
            "\"-l#{$2}\""
        elsif lib =~ /([^" ]+)\.(#{sfx})/
            "-l#{$1}"
        else
          lib
        end
      }.join(' ')
    end

parse_tclConfig(file) click to toggle source

    # File ext/tk/extconf.rb, line 402
    def parse_tclConfig(file)
      # check tclConfig.sh/tkConfig.sh
      tbl = Hash.new{|h,k| h[k] = ""}
      return tbl unless file
      IO.foreach(file){|line|
        line.strip!
        next if line !~ /^([^\#=][^=]*)=(['"]|)(.*)\2$/
        key, val = $1, $3
        tbl[key] = val.gsub(/\$\{([^}]+)\}/){|s|
          subst = $1
          (tbl[subst])? tbl[subst]: s
        } rescue nil
      }
      tbl
    end

progress(s) click to toggle source

    # File ext/tk/extconf.rb, line 131
    def progress(s)
      print(s)
    end

pthread_check() click to toggle source

    # File ext/tk/extconf.rb, line 1651
    def pthread_check()
      tcl_major_ver = nil
      tcl_minor_ver = nil

      # Is tcl-thread given by user ?
      case enable_config("tcl-thread")
      when true
        tcl_enable_thread = true
      when false
        tcl_enable_thread = false
      else
        tcl_enable_thread = nil
      end

      if TclConfig_Info['config_file_path']
        if tcl_enable_thread == true
          puts("\n""Warning: definition of tclConfig.sh is ignored, because --enable-tcl-thread option is given.")
        elsif tcl_enable_thread == false
          puts("\n""Warning: definition of tclConfig.sh is ignored, because --disable-tcl-thread option is given.")
        else
          # tcl-thread is unknown and tclConfig.sh is given
          if TclConfig_Info['TCL_THREADS']
            tcl_enable_thread = (TclConfig_Info['TCL_THREADS'] == "1")
          else
            tcl_major_ver = TclConfig_Info['TCL_MAJOR_VERSION'].to_i
            tcl_minor_ver = TclConfig_Info['TCL_MINOR_VERSION'].to_i
            if tcl_major_ver < 8 || (tcl_major_ver == 8 && tcl_minor_ver == 0)
              tcl_enable_thread = false
            end
          end

          if tcl_enable_thread == nil
            # cannot find definition
            if tcl_major_ver
              puts("\n""Warning: '#{TclConfig_Info['config_file_path']}' doesn't include TCL_THREADS definition.")
            else
              puts("\n""Warning: '#{TclConfig_Info['config_file_path']}' may not be a tclConfig file.")
            end
            #tclConfig = false
          end
        end
      end

      if tcl_enable_thread == nil && !TclConfig_Info['config_file_path']
        # tcl-thread is unknown and tclConfig is unavailable
        begin
          try_run("int main() { exit(0); }")
        rescue Exception
          # cannot try_run. Is CROSS-COMPILE environment?
          puts(%Q'\
    *****************************************************************************
    **
    ** NATIVETHREAD SUPPORT CHECK WARNING:
    **
    **   We cannot check the consistency of nativethread support between
    **   Ruby and the Tcl/Tk library in your environment (are you perhaps
    **   cross-compiling?). If nativethread support for these 2 packages
    **   is inconsistent you may find you get errors when running Ruby/Tk
    **   (e.g. hangs or segmentation faults).  We strongly recommend
    **   you to check the consistency manually.
    **
    *****************************************************************************
    ')
          return true
        end
      end

      if tcl_enable_thread == nil
        # tcl-thread is unknown
        if try_run(<<EOF)
    #include <tcl.h>
    int main() {
       Tcl_Interp *ip;
       ip = Tcl_CreateInterp();
       exit((Tcl_Eval(ip, "set tcl_platform(threaded)") == TCL_OK)? 0: 1);
    }
    EOF
          tcl_enable_thread = true
        elsif try_run(<<EOF)
    #include <tcl.h>
    static Tcl_ThreadDataKey dataKey;
    int main() { exit((Tcl_GetThreadData(&dataKey, 1) == dataKey)? 1: 0); }
    EOF
          tcl_enable_thread = true
        else
          tcl_enable_thread = false
        end
      end

      # check pthread mode
      if (TkLib_Config["ruby_with_thread"])
        $CPPFLAGS ||= ""

        # ruby -> enable
        unless tcl_enable_thread
          # ruby -> enable && tcl -> disable
          puts(%Q'\
    *****************************************************************************
    **
    ** NATIVETHREAD SUPPORT MODE WARNING:
    **
    **   Ruby is compiled with --enable-pthread, but your Tcl/Tk library
    **   seems to be compiled without nativethread support. Although you can
    **   create the tcltklib library, this combination may cause errors (e.g.
    **   hangs or segmentation faults). If you have no reason to keep the
    **   current nativethread support status, we recommend you reconfigure and
    **   recompile the libraries so that both or neither support nativethreads.
    **
    **   If you want change the status of nativethread support, please recompile
    **   Ruby without "--enable-pthread" configure option (If you use Ruby 1.9.x
    **   or later, you cannot remove this option, because it requires native-
    **   thread support.) or recompile Tcl/Tk with "--enable-threads" configure
    **   option (if your Tcl/Tk is later than or equal to Tcl/Tk 8.1).
    **
    *****************************************************************************
    ')
        end

        # ruby -> enable && tcl -> enable/disable
        if tcl_enable_thread
          $CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=1'
        else
          $CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=0'
        end

        return true

      else
        # ruby -> disable
        if tcl_enable_thread
          # ruby -> disable && tcl -> enable
          puts(%Q'\
    *****************************************************************************
    **
    ** NATIVETHREAD SUPPORT MODE ERROR:
    **
    **   Ruby is not compiled with --enable-pthread, but your Tcl/Tk
    **   library seems to be compiled with nativethread support. This
    **   combination may cause frequent hang or segmentation fault
    **   errors when Ruby/Tk is working. We recommend that you NEVER
    **   create the library with such a combination of nativethread support.
    **
    **   Please recompile Ruby with the "--enable-pthread" configure option
    **   or recompile Tcl/Tk with the "--disable-threads" configure option.
    **
    *****************************************************************************
    ')
          $CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=1'
          return false
        else
          # ruby -> disable && tcl -> disable
          $CPPFLAGS += ' -DWITH_TCL_ENABLE_THREAD=0'
          return true
        end
      end
    end

search_X_libraries() click to toggle source

    # File ext/tk/extconf.rb, line 1609
    def search_X_libraries
      use_tkConfig = false
      if TkConfig_Info['config_file_path']
        # use definitions on tkConfig.sh
        if (/\S/ =~ TkConfig_Info['TK_XINCLUDES'] ||
            /\S/ =~ TkConfig_Info['TK_XLIBSW'])
          use_tkConfig = true
          #use_X = true && with_config("X11", ! is_win32?)
          use_X = with_config("X11", true)
        else
          #use_X = false || with_config("X11", false)
          use_X = with_config("X11", false)
        end
      else
        # depend on configure options
        use_X = with_config("X11", !(is_win32? || TkLib_Config["tcltk-framework"]))
      end

      if /\S/ =~ TkConfig_Info['TK_XINCLUDES']
        ($INCFLAGS ||= "") << " " << TkConfig_Info['TK_XINCLUDES'].strip
      end

      if use_X
        puts("Use X11 libraries (or use TK_XINCLUDES/TK_XLIBSW information on tkConfig.sh).")
        x11_idir, x11_ldir = dir_config("X11")
        x11_ldir2 = with_config("X11-lib")
        unless find_X11(x11_ldir2, x11_ldir)
          puts("Can't find X11 libraries. ")
          if use_tkConfig &&
              /\S/ =~ TkConfig_Info['TK_XLIBSW']
            puts("But, try to use TK_XLIBSW information (believe tkConfig.sh).")
            ($libs ||= "") << " " << TkConfig_Info['TK_XLIBSW'] << " "
          else
            puts("So, can't make tcltklib.so which is required by Ruby/Tk.")
            exit
          end
        end
      end

      use_X
    end

search_tclConfig(*paths) click to toggle source

    # File ext/tk/extconf.rb, line 718
    def search_tclConfig(*paths) # libdir list or [tcl-libdir|file, tk-libdir|file]
      TkLib_Config["tclConfig_paths"] = []

      paths.compact!
      if paths.empty?
        config_dir = get_tclConfig_dirs
      elsif paths.length == 1 && !paths[0][0] && !paths[0][1]
        config_dir = get_tclConfig_dirs.map{|dir|
          if dir.kind_of? Array
            [ (paths[0][0] == false)? nil: dir[0],
              (paths[0][1] == false)? nil: dir[1] ]
          else
            [ (paths[0][0] == false)? nil: dir,
              (paths[0][1] == false)? nil: dir ]
          end
        }
      else
        # fixed tclConfig
        config_dir = []
        paths.each{|path|
          if path.kind_of?(Array)
            config_dir << path
          else
            dirs = Dir.glob(path, File::FNM_CASEFOLD)
            config_dir.concat(dirs.zip(dirs))
          end
        }
      end

      tclver, tkver = TkLib_Config['tcltkversion']
      if tclver && tclver =~ /^\D*(\d)\.?(\d)?/  # ignore PATCH_LEVEL
        tclver_major = $1
        tclver_minor = $2
      else
        tclver_major = nil
        tclver_minor = nil
      end
      if tkver && tkver =~ /^\D*(\d)\.?(\d)?/  # ignore PATCH_LEVEL
        tkver_major = $1
        tkver_minor = $2
      else
        tkver_major = nil
        tkver_minor = nil
      end

      conf = nil
      progress_flag = false

      config_dir.uniq!
      config_dir.map{|dir|
        if dir.kind_of? Array
          [ (dir[0])? dir[0].strip.chomp('/'): nil,
            (dir[1])? dir[1].strip.chomp('/'): nil ]
        else
          dir.strip.chomp('/')
        end
      }.each{|dir|
        progress("."); progress_flag = true
        # print("check #{dir} ==>");
        if dir.kind_of? Array
          tcldir, tkdir = dir
        else
          tcldir = tkdir = dir
        end

        tails = ['Config-shared.sh', 'config-shared.sh', 'Config.sh', 'config.sh']

        if tcldir
          if File.file?(tcldir)
            tclcfg_files = [tcldir] * tails.length
          else
            tclcfg_files = tails.map{|f| File.join(tcldir, 'tcl' << f)}
          end
        else
          tclcfg_files = [nil] * tails.length
        end

        if tkdir
          if File.file?(tkdir)
            tkcfg_files = [tkdir] * tails.length
          else
            tkcfg_files = tails.map{|f| File.join(tkdir, 'tk' << f)}
          end
        else
          tkcfg_files = [nil] * tails.length
        end

        tclcfg_files.zip(tkcfg_files).map{|tclpath, tkpath|
          [ (tclpath && File.exist?(tclpath))? File.expand_path(tclpath): tclpath,
            (tkpath && File.exist?(tkpath))? File.expand_path(tkpath): tkpath ]
        }.uniq.each{|tclpath, tkpath|
          next if tclpath && !File.exist?(tclpath)
          next if tkpath && !File.exist?(tkpath)

          # parse tclConfig.sh/tkConfig.sh
          tclconf = (tclpath)? parse_tclConfig(tclpath): nil
          if tclconf
            if tclver && ((tclver_major && tclver_major != tclconf['TCL_MAJOR_VERSION']) || (tclver_minor && tclver_minor != tclconf['TCL_MINOR_VERSION']))
              print("\n") if progress_flag
              puts "Ignore \"#{tclpath}\" (unmatch with configured version)."
              progress_flag = false
              next
            end
            if TkLib_Config['unsupported_versions'].find{|ver| ver == "#{tclconf['TCL_MAJOR_VERSION']}.#{tclconf['TCL_MINOR_VERSION']}"}
              print("\n") if progress_flag
              puts "Ignore \"#{tclpath}\" (unsupported version of Tcl/Tk)."
              progress_flag = false
              next
            end
          end

          tkconf = (tkpath)? parse_tclConfig(tkpath): nil
          if tkconf
            if tkver && ((tkver_major && tkver_major != tkconf['TK_MAJOR_VERSION']) || (tkver_minor && tkver_minor != tkconf['TK_MINOR_VERSION']))
              print("\n") if progress_flag
              puts "Ignore \"#{tkpath}\" (unmatch with configured version)."
              progress_flag = false
              next
            end
            if TkLib_Config['unsupported_versions'].find{|ver| ver == "#{tkconf['TK_MAJOR_VERSION']}.#{tkconf['TK_MINOR_VERSION']}"}
              print("\n") if progress_flag
              puts "Ignore \"#{tkpath}\" (unsupported version of Tcl/Tk)."
              progress_flag = false
              next
            end
          end

          # nativethread check
          if !TkLib_Config["ruby_with_thread"]
            if tclconf
              if tclconf['TCL_THREADS'] == '1'
                puts "\nWARNING: found #{tclpath.inspect}, but it WITH nativethread-support under ruby WITHOUT nativethread-support. So, ignore it."
                TkLib_Config["tcl-NG-path"] << File.dirname(tclpath)
                next
              end
            else
              puts "\nWARNING: When not refer tclConfig.sh, cannot check native-thread support on Tcl/Tk libraries. Ruby, which is used now, does NOT support native-thread. So, if Tcl/Tk libraries support native-thread, it will NOT work properly."
            end
          end

          # find tclConfig.sh & tkConfig.sh
          conf = [tclconf, tkconf] unless conf

          # check Tcl library
          if is_macosx? && TkLib_Config["tcltk-framework"]
            # if use framework, not check (believe it is installed properly)
            tcllib_ok = tklib_ok = true
          else
            tcllib_ok, tklib_ok =
              libcheck_for_tclConfig((tclpath)? File.dirname(tclpath): nil,
                                     (tkpath)? File.dirname(tkpath): nil,
                                     tclconf, tkconf)
          end

          unless tcllib_ok && tklib_ok
            unless tcllib_ok
              puts "\nWARNING: found #{tclpath.inspect}, but cannot find valid Tcl library for the tclConfig.sh. So, ignore it."
              TkLib_Config["tcl-NG-path"] << File.dirname(tclpath)
            end
            unless tklib_ok
              puts "\nWARNING: found #{tkpath.inspect}, but cannot find valid Tk library for the tkConfig.sh. So, ignore it."
              TkLib_Config["tk-NG-path"] << File.dirname(tkpath)
            end
            next
          end

          #return [tclpath, tkpath]
          # print(" #{[tclpath, tkpath].inspect}");
          TkLib_Config["tclConfig_paths"] << [tclpath, tkpath]
        }

        # print("\n");
      }

      if is_macosx? && TkLib_Config["tcltk-stubs"]
        CONFIG['LDSHARED'] << " -Xlinker -bind_at_load"
        if config_string('LDSHAREDXX')
          config_string('LDSHAREDXX') << " -Xlinker -bind_at_load"
        end
      end

      if TkLib_Config["tclConfig_paths"].empty?
        [nil, nil]
      else
        # find tclConfig.sh and tkConfig.sh
        TkLib_Config["tclConfig_info"], TkLib_Config["tkConfig_info"] = conf
        TkLib_Config["tclConfig_paths"][0]
      end
    end

search_vers_on_path(vers, path, *heads) click to toggle source

    # File ext/tk/extconf.rb, line 1069
    def search_vers_on_path(vers, path, *heads)
      exts = get_ext_list.join(',')
      files = Dir.glob(File.join(path, "*{#{heads.join(',')}}*.{#{exts}}"), File::FNM_CASEFOLD)
      vers.find_all{|ver| files.find{|f| f =~ /(#{ver}|#{ver.delete('.')})/} }
    end

setup_for_macosx_framework(tclver, tkver) click to toggle source

    # File ext/tk/extconf.rb, line 1551
    def setup_for_macosx_framework(tclver, tkver)
      # use framework, but no tclConfig.sh
      unless $LIBS && $LIBS.include?('-framework')
        ($LIBS ||= "") << ' -framework Tk -framework Tcl'
      end

      if TkLib_Config["tcl-framework-header"]
        TclConfig_Info['TCL_INCLUDE_SPEC'][0,0] =
          " -I#{TkLib_Config["tcl-framework-header"].quote} "
      else
        tcl_base = File.join(TkLib_Config["tcltk-framework"], 'Tcl.framework')
        if tclver
          TclConfig_Info['TCL_INCLUDE_SPEC'] <<
            " -I#{File.join(tcl_base, 'Versions', tclver, 'Headers').quote} "
        end

        TclConfig_Info['TCL_INCLUDE_SPEC'] << File.join(tcl_base, 'Headers')

        unless tclver
          dir = Dir.glob(File.join(tcl_base, 'Versions', '*', 'Headers'),
                         File::FNM_CASEFOLD).sort.reverse[0]
          TclConfig_Info['TCL_INCLUDE_SPEC'] << "-I#{dir.quote} " if dir
        end
      end

      if TkLib_Config["tk-framework-header"]
        TkConfig_Info['TK_INCLUDE_SPEC'][0,0] =
          " -I#{TkLib_Config["tk-framework-header"].quote} "
      else
        tk_base  = File.join(TkLib_Config["tcltk-framework"], 'Tk.framework')
        if tkver
          TkConfig_Info['TK_INCLUDE_SPEC'] <<
            " -I#{File.join(tk_base, 'Versions', tkver, 'Headers').quote} "
        end

        TkConfig_Info['TK_INCLUDE_SPEC'] << File.join(tk_base, 'Headers')

        unless tkver
          dir = Dir.glob(File.join(tk_base, 'Versions', '*', 'Headers'),
                         File::FNM_CASEFOLD).sort.reverse[0]
          TkConfig_Info['TK_INCLUDE_SPEC'] << "-I#{dir.quote} " if dir
        end
      end
    end

subdir_check(dir, verbose=false) click to toggle source

    # File lib/tkextlib/pkg_checker.rb, line 144
    def subdir_check(dir, verbose=false)
      Dir.foreach(dir){|f|
        next if f == '.' || f == '..'
        if File.directory?(f)
          subdir_check(File.join(dir, f))
        elsif File.extname(f) == '.rb'
          path = File.join(dir, f)
          suc, err = check_pkg(path, verbose)
          if err.empty?
            print 'Ready : ', path, ' : require->', suc.inspect, "\n"
          else
            print '*LACK : ', path, ' : require->', suc.inspect,
              '  FAIL->', err.inspect, "\n"
          end
        end
      }
    end