[ruby-core:33917] Re: [Ruby 1.9-Bug#4141][Open] Tk extension is not accepting any type of parameter combination
From:
Hidetoshi NAGAI <nagai@...>
Date:
2010-12-27 01:05:13 UTC
List:
ruby-core #33917
Hi,
From: Luis Lavena <redmine@ruby-lang.org>
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=<version>
+ --with-tcltkversion=<tclversion>,<tkversion>
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=<dir>
+ --with-tk-build-dir=<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=<file>
+ --with-tkConfig-file=<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=<dir>
--with-tkConfig-dir=<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 <tcl.h>', 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 <tcl.h>\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 <tcl.h>\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 <tk.h>', 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 <tk.h>\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 <tk.h>\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