From: Hidetoshi NAGAI Date: 2010-12-27T10:05:13+09:00 Subject: [ruby-core:33917] Re: [Ruby 1.9-Bug#4141][Open] Tk extension is not accepting any type of parameter combination Hi, From: Luis Lavena Subject: [ruby-core:33656] [Ruby 1.9-Bug#4141][Open] Tk extension is not accepting any type of parameter combination Date: Fri, 10 Dec 2010 05:02:24 +0900 Message-ID: <4d0135a0109e7_28b2b60701035e@redmine.ruby-lang.org> > Bug #4141: Tk extension is not accepting any type of parameter combination > http://redmine.ruby-lang.org/issues/show/4141 I'm very sorry. My reply is too late for a new RubyInstaller. Could you try the following patch (and new options)? Index: README.tcltklib =================================================================== --- README.tcltklib (revision 30168) +++ README.tcltklib (working copy) @@ -29,10 +29,32 @@ Old "extconf.rb" doesn't support this option. --with-tcltkversion= + --with-tcltkversion=, force version of Tcl/Tk libaray - (e.g. libtcl8.4g.so ==> --with-tcltkversion=8.4g) + (e.g. libtcl8.4g.so & libtk8.4g.so ==> --with-tcltkversion=8.4g + libtcl8.4.so & libtk8.4g.so ==> --with-tcltkversion=8.4,8.4g) - --without-tcl-config / --without-tk-config + --enable-tcl-h-ver-check/--disable-tcl-h-ver-check + --enable-tk-h-ver-check/--disable-tk-h-ver-check + enable or disable for checking MAJOR_VERSION and + MINOR_VERSION on tcl.h/tk.h whether match with + Tcl/Tk libraries' version or not. + + --with-tcl-build-dir= + --with-tk-build-dir= If you want to compile with pre-installed Tcl/Tk + libraries, you must use these options. + (e.g. --with-tcl-build-dir=./build/tcl8.5.9/unix) + When use these options, --with-tclConfig-dir and + --with-tkConfig-dir options are ignored (however, + --with-tclConfig-file and --with-tkConfig-file + options are still available). + + --with-tclConfig-file= + --with-tkConfig-file= file path of tclConfig.sh/tkConfig.sh. + If you want use non-standard filenames of config + files (e.g. tclConfig-static.sh), you must use + these options. + --with-tclConfig-dir= --with-tkConfig-dir= the directory contains 'tclConfig.sh' and 'tkConfig.sh'. Index: extconf.rb =================================================================== --- extconf.rb (revision 30168) +++ extconf.rb (working copy) @@ -10,7 +10,9 @@ # %w[8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0] %w[8.7 8.6 8.5 8.4 8.0] # to shorten search steps +TkLib_Config['major_nums'] = '87' + ############################################################## # use old extconf.rb ? ############################################################## @@ -111,23 +113,25 @@ /darwin/ =~ RUBY_PLATFORM end +def maybe_64bit? + /64|universal/ =~ RUBY_PLATFORM +end + def check_tcltk_version(version) return [nil, nil] unless version.kind_of? String - version = version.strip + tclver, tkver = version.split(',') + tclver = tclver.strip + return [tclver, tkver.strip] if tkver - tclver = version.dup - tkver = version.dup - dot = major = minor_dot = minor = plvl_dot = plvl = ext = nil - - if version =~ /^(\d)(\.?)(\d)(\.?)(\d*)(.*)$/ + 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 version =~ /^(\d)(\.?)(\d?)(.*)$/ + elsif tclver =~ /^(\d)(\.?)(\d?)(.*)$/ major = $1; minor_dot = $2; minor = $3; ext = $4 dot = ! minor_dot.empty? else # unknown -> believe user @@ -140,9 +144,12 @@ 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 @@ -187,11 +194,12 @@ if CROSS_COMPILING elsif is_win32? if TkLib_Config["ActiveTcl"] - path_head.concat ["c:/ActiveTcl", "c:/Program Files/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", - "/Tcl", "/Program Files/Tcl" + "c:/Tcl", "c:/Program Files/Tcl", "c:/Program Files (x86)/Tcl", + "/Tcl", "/Program Files/Tcl", "/Program Files (x86)/Tcl" ] path_head.each{|dir| path_dirs << "#{dir}"} @@ -203,6 +211,7 @@ ].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? @@ -371,8 +380,8 @@ end def get_libpath(lib_flag, lib_spec) - # get libpath fro {TCL,Tk}_LIB_FLAG and {TCL,Tk}_LIB_SPEC - libpath = lib_spec.gsub(/(#{lib_flag}|-L)/, "").strip + # get libpath from {TCL,Tk}_LIB_FLAG and {TCL,Tk}_LIB_SPEC + lib_spec.gsub(/(#{lib_flag}|-L)/, "").strip end def get_tclConfig_dirs @@ -387,14 +396,14 @@ end dirs.concat [ "c:/ActiveTcl*/lib", "c:/Tcl*/lib", - "c:/Program Files/ActiveTcl*/lib", "c:/Program Files/Tcl*/lib", + "c:/Program Files*/ActiveTcl*/lib", "c:/Program Files*/Tcl*/lib", "/ActiveTcl*/lib", "/Tcl*/lib", - "/Program Files/ActiveTcl*/lib", "/Program Files/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" + "c:/Tcl*/lib", "c:/Program Files*/Tcl*/lib", + "/Tcl*/lib", "/Program Files*/Tcl*/lib" ] end dirs.collect{|d| Dir.glob(d, File::FNM_CASEFOLD)}.flatten! @@ -443,22 +452,28 @@ end end - config_dir.concat [ - RbConfig::CONFIG['libdir'], - File.join(RbConfig::CONFIG['exec_prefix'], 'lib'), - File.join(RbConfig::CONFIG['prefix'], 'lib'), - "/usr/local/opt/lib", "/usr/local/pkg/lib", "/usr/local/share/lib", - "/usr/local/lib", "/usr/opt/lib", "/usr/pkg/lib", - "/usr/share/lib", "/usr/contrib/lib", "/usr/lib" - ] + 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}[87]*/lib', File::FNM_CASEFOLD) - Dir.glob(dir + '/{tcltk,tcl,tk}[87]*', File::FNM_CASEFOLD) + 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! @@ -489,8 +504,8 @@ ] paths.reverse! unless TkLib_Config["ActiveTcl"] - paths.each{|framework| - base = File.expand_path(framework) + paths.each{|frmwk| + base = File.expand_path(frmwk) config_dir << [ File.join(base, 'Tcl.framework'), File.join(base, 'Tk.framework') ] @@ -511,7 +526,7 @@ config_dir end -def libcheck_for_tclConfig(dir, tclconf, tkconf) +def libcheck_for_tclConfig(tcldir, tkdir, tclconf, tkconf) tcllib_ok = tklib_ok = false if TkLib_Config["tcltk-stubs"] @@ -524,29 +539,35 @@ tkfunc = "Tk_Init" end + incflags = $INCFLAGS libpath = $LIBPATH tcllibs = nil begin - tcllib_ok ||= Dir.glob(File.join(dir, "*tcl#{stub}#{tclconf['TCL_MAJOR_VERSION']}{.,}#{tclconf['TCL_MINOR_VERSION']}*.*"), File::FNM_CASEFOLD).find{|file| + tcllib_ok ||= Dir.glob(File.join(tcldir, "*tcl#{stub}#{tclconf['TCL_MAJOR_VERSION']}{.,}#{tclconf['TCL_MINOR_VERSION']}*.*"), File::FNM_CASEFOLD).find{|file| if file =~ /^.*(tcl#{stub}#{tclconf['TCL_MAJOR_VERSION']}(\.|)#{tclconf['TCL_MINOR_VERSION']}.*)\.[^.]*$/ - #puts "check #{file} #{$1} #{tclfunc} #{dir}" - #find_library($1, tclfunc, dir) + #puts "check #{file} #{$1} #{tclfunc} #{tcldir}" + #find_library($1, tclfunc, tcldir) tcllibs = append_library($libs, $1) - $LIBPATH = libpath | [dir] + $LIBPATH = libpath | [tcldir] try_func(tclfunc, tcllibs) end } - tklib_ok ||= Dir.glob(File.join(dir, "*tk#{stub}#{tkconf['TK_MAJOR_VERSION']}{.,}#{tkconf['TK_MINOR_VERSION']}*.*"), File::FNM_CASEFOLD).find{|file| + tklib_ok ||= Dir.glob(File.join(tkdir, "*tk#{stub}#{tkconf['TK_MAJOR_VERSION']}{.,}#{tkconf['TK_MINOR_VERSION']}*.*"), File::FNM_CASEFOLD).find{|file| if file =~ /^.*(tk#{stub}#{tkconf['TK_MAJOR_VERSION']}(\.|)#{tkconf['TK_MINOR_VERSION']}.*)\.[^.]*$/ - #puts "check #{file} #{$1} #{tkfunc} #{dir}" - # find_library($1, tkfunc, dir) - tklibs = append_library(tcllibs, $1) - $LIBPATH = libpath | [dir] + $INCFLAGS << " " << tkconf['TK_XINCLUDES'] if tkconf['TK_XINCLUDES'] + + #puts "check #{file} #{$1} #{tkfunc} #{tkdir}" + # find_library($1, tkfunc, tkdir) + tklibs = append_library("", $1) + tklibs << " " << tkconf['TK_XLIBSW'] if tkconf['TK_XLIBSW'] + tklibs << " " << tcllibs + $LIBPATH = libpath | [tkdir] try_func(tkfunc, tklibs) end } ensure + $INCFLAGS = incflags $LIBPATH = libpath end @@ -630,7 +651,8 @@ tcllib_ok = tklib_ok = true else tcllib_ok, tklib_ok = libcheck_for_tclConfig(File.dirname(tclpath), - tclconf, tkconf) + File.dirname(tkpath), + tclconf, tkconf) =begin tcllib_ok = tklib_ok = false if TkLib_Config["tcltk-stubs"] @@ -877,8 +899,8 @@ if !CROSS_COMPILING and is_win32? default_paths.concat [ - "c:/Tcl/lib", "c:/Program Files/Tcl/lib", - "/Tcl/lib", "/Program Files/Tcl/lib" + "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)} end @@ -928,15 +950,19 @@ print(".") [path, find_library(tcllib, func, path)] else + sufx_list = ['', 't', 'g', 's', 'x'] st = search_vers_on_path(versions, path, lib, 'tcl').find{|ver| - (print(".");find_library("#{lib}#{ver}", func, path)) or - (print(".");find_library("#{lib}#{ver.delete('.')}", func, path)) or - (print(".");find_library("#{lib}#{ver}g", func, path)) or - (print(".");find_library("#{lib}#{ver.delete('.')}g", func, path)) or - (print(".");find_library("tcl#{ver}", func, path)) or - (print(".");find_library("tcl#{ver.delete('.')}", func, path)) or - (print(".");find_library("tcl#{ver}g", func, path)) or - (print(".");find_library("tcl#{ver.delete('.')}g", func, path)) + 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.find{|fname| fname =~ /#{libname + sufx}/} && + find_library(libname + sufx, func, path) + } + } } || (!version && (print(".");find_library(lib, func, path))) [path, st] end @@ -989,8 +1015,8 @@ if !CROSS_COMPILING and is_win32? default_paths.concat [ - "c:/Tcl/lib", "c:/Program Files/Tcl/lib", - "/Tcl/lib", "/Program Files/Tcl/lib" + "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)} end @@ -1039,15 +1065,19 @@ print(".") [path, find_library(tklib, func, path)] else + sufx_list = ['', 't', 'g', 's', 'x'] st = search_vers_on_path(versions, path, lib, 'tk').find{|ver| - (print(".");find_library("#{lib}#{ver}", func, path)) or - (print(".");find_library("#{lib}#{ver.delete('.')}", func, path)) or - (print(".");find_library("#{lib}#{ver}g", func, path)) or - (print(".");find_library("#{lib}#{ver.delete('.')}g", func, path)) or - (print(".");find_library("tk#{ver}", func, path)) or - (print(".");find_library("tk#{ver.delete('.')}", func, path)) or - (print(".");find_library("tk#{ver}g", func, path)) or - (print(".");find_library("tk#{ver.delete('.')}g", func, path)) + 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.find{|fname| fname =~ /#{libname + sufx}/} && + find_library(libname + sufx, func, path) + } + } } || (!version && (print(".");find_library(lib, func, path))) [path, st] end @@ -1085,8 +1115,10 @@ if !CROSS_COMPILING && is_win32? base_dir.concat [ - "c:/Tcl/include", "c:/Program Files/Tcl/include", - "/Tcl/include", "/Program Files/Tcl/include" + "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)} end @@ -1097,41 +1129,81 @@ if TclConfig_Info['TCL_INCLUDE_SPEC'] && have_tcl_h = try_cpp('#include ', TclConfig_Info['TCL_INCLUDE_SPEC']) $INCFLAGS << " " << TclConfig_Info['TCL_INCLUDE_SPEC'] - elsif have_tcl_h = have_header('tcl.h') - # find else - if tclver && ! tclver.empty? - versions = [tclver] + if enable_config("tcl-h-ver-check", true) && + tclver && tclver =~ /^\D*(\d)\.?(\d)/ + major = $1; minor = $2 else - versions = TkLib_Config['search_versions'] + major = minor = nil end - paths = base_dir.dup - versions.each{|ver| - paths.concat(base_dir.map{|dir| - [dir + '/tcl' + ver, dir + '/tcl' + ver.delete('.')] - }.flatten) - } - have_tcl_h = find_header('tcl.h', *paths) + if major && minor + # version check on tcl.h + have_tcl_h = try_cpp("#include \n#if TCL_MAJOR_VERSION != #{major} || TCL_MINOR_VERSION != #{minor}\n#error VERSION does not match\n#fi") + else + have_tcl_h = have_header('tcl.h') + end + 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.delete('.')] + }.flatten) + } + if enable_config("tcl-h-ver-check", true) + # version check on tcl.h + have_tcl_h = paths.find{|path| + try_cpp("#include \n#if TCL_MAJOR_VERSION != #{major} || TCL_MINOR_VERSION != #{minor}\n#error VERSION does not match\n#fi", "-I#{path.quote}") + } + $INCFLAGS << " " << "-I#{have_tcl_h.quote}" if have_tcl_h + else + have_tcl_h = find_header('tcl.h', *paths) + end + end end if TkConfig_Info['TK_INCLUDE_SPEC'] && have_tk_h = try_cpp('#include ', TkConfig_Info['TK_INCLUDE_SPEC']) $INCFLAGS << " " << TkConfig_Info['TK_INCLUDE_SPEC'] - elsif have_tk_h = have_header('tk.h') - # find else - if tkver && ! tkver.empty? - versions = [tkver] + if enable_config("tk-h-ver-check", true) && + tkver && tkver =~ /^\D*(\d)\.?(\d)/ + major = $1; minor = $2 else - versions = TkLib_Config['search_versions'] + major = minor = nil end - paths = base_dir.dup - versions.each{|ver| - paths.concat(base_dir.map{|dir| - [dir + '/tk' + ver, dir + '/tk' + ver.delete('.')] - }.flatten) - } - have_tk_h = find_header('tk.h', *paths) + if major && minor + # version check on tk.h + have_tk_h = try_cpp("#include \n#if TK_MAJOR_VERSION != #{major} || TK_MINOR_VERSION != #{minor}\n#error VERSION does not match\n#fi") + else + have_tk_h = have_header('tk.h') + end + 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.delete('.')] + }.flatten) + } + if enable_config("tk-h-ver-check", true) + # version check on tk.h + have_tk_h = paths.find{|path| + try_cpp("#include \n#if TK_MAJOR_VERSION != #{major} || TK_MINOR_VERSION != #{minor}\n#error VERSION does not match\n#fi", "-I#{path.quote}") + } + $INCFLAGS << " " << "-I#{have_tk_h.quote}" if have_tk_h + else + have_tk_h = find_header('tk.h', *paths) + end + end end have_tcl_h && have_tk_h @@ -1200,11 +1272,13 @@ end def search_X_libraries + use_tkConfig = false if TkConfig_Info['config_file_path'] # use definitions on tkConfig.sh - if TkConfig_Info['TK_XINCLUDES'] && TkConfig_Info['TK_XLIBSW'] && - !TkConfig_Info['TK_XINCLUDES'].strip.empty? && - !TkConfig_Info['TK_XLIBSW'].strip.empty? + if (TkConfig_Info['TK_XINCLUDES'] && + !TkConfig_Info['TK_XINCLUDES'].strip.empty?) || + (TkConfig_Info['TK_XLIBSW'] && !TkConfig_Info['TK_XLIBSW'].strip.empty?) + use_tkConfig = true #use_X = true && with_config("X11", ! is_win32?) use_X = with_config("X11", true) else @@ -1216,21 +1290,28 @@ use_X = with_config("X11", !(is_win32? || TkLib_Config["tcltk-framework"])) end + if TkConfig_Info['TK_XINCLUDES'] && + !TkConfig_Info['TK_XINCLUDES'].strip.empty? + $INCFLAGS << " " << TkConfig_Info['TK_XINCLUDES'].strip + end + if use_X - puts("Use X11 libraries.") + 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. So, can't make tcltklib.so which is required by Ruby/Tk.") - exit + puts("Can't find X11 libraries. ") + if use_tkConfig && + TkConfig_Info['TK_XLIBSW'] && !TkConfig_Info['TK_XLIBSW'].strip.empty? + 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 - if TkConfig_Info['TK_XINCLUDES'] && - !TkConfig_Info['TK_XINCLUDES'].strip.empty? - $INCFLAGS << " " << TkConfig_Info['TK_XINCLUDES'].strip - end - use_X end @@ -1272,7 +1353,7 @@ else puts("Warning: '#{TclConfig_Info['config_file_path']}' may not be a tclConfig file.") end - tclConfig = false + #tclConfig = false end end end @@ -1280,7 +1361,7 @@ if tcl_enable_thread == nil && !TclConfig_Info['config_file_path'] # tcl-thread is unknown and tclConfig is unavailable begin - try_run_available = try_run("int main() { exit(0); }") + try_run("int main() { exit(0); }") rescue Exception # cannot try_run. Is CROSS-COMPILE environment? puts(%Q'\ @@ -1439,15 +1520,61 @@ #--------------------------------------------------- +TclConfig_Info = {} +TkConfig_Info = {} + +# use Tcl/Tk build dir? (has highest priority) +TkLib_Config["tcl-build-dir"] = with_config("tcl-build-dir") +TkLib_Config["tk-build-dir"] = with_config("tk-build-dir") +if TkLib_Config["tcl-build-dir"] + puts("use Tcl build (pre-install) dir \"#{TkLib_Config["tcl-build-dir"]}\"") + TkLib_Config["tcl-build-dir"] = File.expand_path(TkLib_Config["tcl-build-dir"]) + base = File.dirname(TkLib_Config["tcl-build-dir"]) + $INCFLAGS << " -I#{File.join(base, "generic").quote} -I#{TkLib_Config["tcl-build-dir"].quote}" + $LIBPATH |= [TkLib_Config["tcl-build-dir"]] +end +if TkLib_Config["tk-build-dir"] + puts("use Tk build (pre-install) dir \"#{TkLib_Config["tk-build-dir"]}\"") + TkLib_Config["tk-build-dir"] = File.expand_path(TkLib_Config["tk-build-dir"]) + base = File.dirname(TkLib_Config["tk-build-dir"]) + $INCFLAGS << " -I#{File.join(base, "generic").quote} -I#{TkLib_Config["tk-build-dir"].quote}" + $LIBPATH |= [TkLib_Config["tk-build-dir"]] +end + # check requirement of Tcl/tk version tcltk_version = with_config("tcltkversion") -tclver, tkver = - TkLib_Config["tcltkversion"] = check_tcltk_version(tcltk_version) -puts("Specified Tcl/Tk version is #{[tclver, tkver].inspect}") if tclver&&tkver +TkLib_Config["tcltkversion"] = check_tcltk_version(tcltk_version) +if TkLib_Config["tcl-build-dir"] + if (cfgfile = with_config("tclConfig-file", Dir.glob(File.join(TkLib_Config["tcl-build-dir"], "tclConfig*.sh"), File::FNM_CASEFOLD)[0])) + TclConfig_Info['config_file_path'] = cfgfile + TkLib_Config["tclConfig_info"] = cfginfo = parse_tclConfig(cfgfile) + if tclver = TkLib_Config["tcltkversion"][0] + TkLib_Config["tcltkversion"][0].sub!(/\d(\.?)\d/, "#{cfginfo['TCL_MAJOR_VERSION']}\\1#{cfginfo['TCL_MINOR_VERSION']}") + else + TkLib_Config["tcltkversion"][0] = "#{cfginfo['TCL_MAJOR_VERSION']}.#{cfginfo['TCL_MINOR_VERSION']}" + end + end +end +if TkLib_Config["tk-build-dir"] + if (cfgfile = with_config("tkConfig-file", Dir.glob(File.join(TkLib_Config["tk-build-dir"], "tkConfig*.sh"), File::FNM_CASEFOLD)[0])) + TkConfig_Info['config_file_path'] = cfgfile + TkLib_Config["tkConfig_info"] = cfginfo = parse_tclConfig(cfgfile) + if TkLib_Config["tcltkversion"][1] + TkLib_Config["tcltkversion"][1].sub!(/\d(\.?)\d/, "#{cfginfo['TK_MAJOR_VERSION']}\\1#{cfginfo['TK_MINOR_VERSION']}") + else + TkLib_Config["tcltkversion"][1] = "#{cfginfo['TK_MAJOR_VERSION']}.#{cfginfo['TK_MINOR_VERSION']}" + end + end +end + +tclver, tkver = TkLib_Config["tcltkversion"] +puts("Specified Tcl/Tk version is #{[tclver, tkver].inspect}") if tclver||tkver + # use ActiveTcl ? #if activeTcl = with_config("ActiveTcl") -if activeTcl = with_config("ActiveTcl", true) +#if activeTcl = with_config("ActiveTcl", true) +if activeTcl = with_config("ActiveTcl", !(TkLib_Config["tcl-build-dir"] && TkLib_Config["tk-build-dir"])) puts("Use ActiveTcl libraries (if available).") unless activeTcl.kind_of? String # set default ActiveTcl path @@ -1490,8 +1617,18 @@ end # directory configuration of Tcl/Tk libraries -tk_idir, tk_ldir = dir_config("tk") -tcl_idir, tcl_ldir = dir_config("tcl") +if TkLib_Config["tcl-build-dir"] + tcl_idir = File.join(File.dirname(TkLib_Config["tcl-build-dir"]),"generic") + tcl_ldir = TkLib_Config["tcl-build-dir"] +else + tcl_idir, tcl_ldir = dir_config("tcl") +end +if TkLib_Config["tk-build-dir"] + tk_idir = File.join(File.dirname(TkLib_Config["tk-build-dir"]),"generic") + tk_ldir = TkLib_Config["tk-build-dir"] +else + tk_idir, tk_ldir = dir_config("tk") +end tcl_idir = tk_idir unless tcl_idir tcl_ldir = tk_ldir unless tcl_ldir @@ -1500,14 +1637,21 @@ # get tclConfig.sh/tkConfig.sh TkLib_Config["tcltk-NG-path"] = [] -tclcfg, tkcfg = get_tclConfig(with_config("tclConfig-file", true), - with_config("tkConfig-file", true), - with_config("tclConfig-dir", tcl_ldir || true), - with_config("tkConfig-dir", tk_ldir || true)) -TclConfig_Info = TkLib_Config["tclConfig_info"] || {} -TkConfig_Info = TkLib_Config["tkConfig_info"] || {} -TclConfig_Info['config_file_path'] = tclcfg -TkConfig_Info['config_file_path'] = tkcfg +tclcfg, tkcfg = + get_tclConfig( + TclConfig_Info['config_file_path'] || with_config("tclConfig-file", true), + TkConfig_Info['config_file_path'] || with_config("tkConfig-file", true), + (TclConfig_Info['config_file_path'])? + File.dirname(TclConfig_Info['config_file_path']) : + with_config("tclConfig-dir", tcl_ldir || true), + (TkConfig_Info['config_file_path'])? + File.dirname(TkConfig_Info['config_file_path']) : + with_config("tkConfig-dir", tk_ldir || true) + ) +TclConfig_Info.merge!(TkLib_Config["tclConfig_info"]) +TkConfig_Info.merge!(TkLib_Config["tkConfig_info"]) +TclConfig_Info['config_file_path'] ||= tclcfg +TkConfig_Info['config_file_path'] ||= tkcfg TclConfig_Info['TCL_INCLUDE_SPEC'] = "-I#{tcl_idir.quote}" if tcl_idir TkConfig_Info['TK_INCLUDE_SPEC'] = "-I#{tk_idir.quote}" if tk_idir @@ -1515,9 +1659,26 @@ tk_cfg_dir = File.dirname(TkConfig_Info['config_file_path']) rescue nil tcl_cfg_dir = File.dirname(TclConfig_Info['config_file_path']) rescue nil -tk_ldir_list = [tk_ldir, tk_cfg_dir] -tcl_ldir_list = [tcl_ldir, tcl_cfg_dir] +tk_ldir_list = [tk_ldir, tk_cfg_dir].uniq +tcl_ldir_list = [tcl_ldir, tcl_cfg_dir].uniq +if TkConfig_Info['config_file_path'] + if TkLib_Config["tk-build-dir"] + spec_dir = get_libpath(TkConfig_Info['TK_LIB_FLAG'], TkConfig_Info['TK_BUILD_LIB_SPEC']) + else + spec_dir = get_libpath(TkConfig_Info['TK_LIB_FLAG'], TkConfig_Info['TK_LIB_SPEC']) + end + tk_ldir_list << spec_dir if File.directory?(spec_dir) +end +if TclConfig_Info['config_file_path'] + if TkLib_Config["tcl-build-dir"] + spec_dir = get_libpath(TclConfig_Info['TCL_LIB_FLAG'], TclConfig_Info['TCL_BUILD_LIB_SPEC']) + else + spec_dir = get_libpath(TclConfig_Info['TCL_LIB_FLAG'], TclConfig_Info['TCL_LIB_SPEC']) + end + tcl_ldir_list << spec_dir if File.directory?(spec_dir) +end + # check tk_shlib_search_path check_shlib_search_path(with_config('tk-shlib-search-path')) @@ -1529,22 +1690,49 @@ # MacOS X Frameworks? if TkLib_Config["tcltk-framework"] puts("Use MacOS X Frameworks.") + $LDFLAGS << " -L#{TkLib_Config["tcl-build-dir"].quote}" if TkLib_Config["tcl-build-dir"] if tcl_cfg_dir $INCFLAGS << ' ' << TclConfig_Info['TCL_INCLUDE_SPEC'] $LDFLAGS << ' ' << TclConfig_Info['TCL_LIBS'] if stubs - $LDFLAGS << ' ' << TclConfig_Info['TCL_STUB_LIB_SPEC'] + if TkLib_Config["tcl-build-dir"] && + TclConfig_Info['TCL_BUILD_STUB_LIB_SPEC'] && + !TclConfig_Info['TCL_BUILD_STUB_LIB_SPEC'].strip.empty? + $LDFLAGS << ' ' << TclConfig_Info['TCL_BUILD_STUB_LIB_SPEC'] + else + $LDFLAGS << ' ' << TclConfig_Info['TCL_STUB_LIB_SPEC'] + end else - $LDFLAGS << ' ' << TclConfig_Info['TCL_LIB_SPEC'] + if TkLib_Config["tcl-build-dir"] && + TclConfig_Info['TCL_BUILD_LIB_SPEC'] && + !TclConfig_Info['TCL_BUILD_LIB_SPEC'].strip.empty? + $LDFLAGS << ' ' << TclConfig_Info['TCL_BUILD_LIB_SPEC'] + else + $LDFLAGS << ' ' << TclConfig_Info['TCL_LIB_SPEC'] + end end end + + $LDFLAGS << " -L#{TkLib_Config["tk-build-dir"].quote}" if TkLib_Config["tk-build-dir"] if tk_cfg_dir $INCFLAGS << ' ' << TkConfig_Info['TK_INCLUDE_SPEC'] $LDFLAGS << ' ' << TkConfig_Info['TK_LIBS'] if stubs - $LDFLAGS << ' ' << TkConfig_Info['TK_STUB_LIB_SPEC'] + if TkLib_Config["tk-build-dir"] && + TclConfig_Info['TK_BUILD_STUB_LIB_SPEC'] && + !TclConfig_Info['TK_BUILD_STUB_LIB_SPEC'].strip.empty? + $LDFLAGS << ' ' << TkConfig_Info['TK_BUILD_STUB_LIB_SPEC'] + else + $LDFLAGS << ' ' << TkConfig_Info['TK_STUB_LIB_SPEC'] + end else - $LDFLAGS << ' ' << TkConfig_Info['TK_LIB_SPEC'] + if TkLib_Config["tk-build-dir"] && + TclConfig_Info['TK_BUILD_LIB_SPEC'] && + !TclConfig_Info['TK_BUILD_LIB_SPEC'].strip.empty? + $LDFLAGS << ' ' << TkConfig_Info['TK_BUILD_LIB_SPEC'] + else + $LDFLAGS << ' ' << TkConfig_Info['TK_LIB_SPEC'] + end end end setup_for_macosx_framework(tclver, tkver) if tcl_cfg_dir && tk_cfg_dir -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) Department of Artificial Intelligence, Kyushu Institute of Technology