Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aea66e0

Browse files
committed
Yet more improvments to finding Tcl/Tk. Recent versions of Tcl/Tk put "real" bash code in tclConfig.sh and tkConfig.sh so the hackish "treat this as an ini file" approach no longer works. The new way is to actually source the file with bash and "eval echo" environment variables to get the results back. This should work fine on Unices -- it doesn't have to work on Windows since we use a more hard-coded config there.
1 parent 45c4667 commit aea66e0

File tree

1 file changed

+28
-49
lines changed

1 file changed

+28
-49
lines changed

setupext.py

Lines changed: 28 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -914,9 +914,11 @@ def query_tcltk():
914914
def parse_tcl_config(tcl_lib_dir, tk_lib_dir):
915915
import Tkinter
916916
tcl_poss = [tcl_lib_dir,
917+
os.path.normpath(os.path.join(tcl_lib_dir, '..')),
917918
"/usr/lib/tcl"+str(Tkinter.TclVersion),
918919
"/usr/lib"]
919920
tk_poss = [tk_lib_dir,
921+
os.path.normpath(os.path.join(tk_lib_dir, '..')),
920922
"/usr/lib/tk"+str(Tkinter.TkVersion),
921923
"/usr/lib"]
922924
for ptcl, ptk in zip(tcl_poss, tk_poss):
@@ -927,52 +929,29 @@ def parse_tcl_config(tcl_lib_dir, tk_lib_dir):
927929
if not (os.path.exists(tcl_config) and os.path.exists(tk_config)):
928930
return None
929931

930-
# These files are shell scripts that set a bunch of
931-
# environment variables. To actually get at the
932-
# values, we use ConfigParser, which supports almost
933-
# the same format, but requires at least one section.
934-
# So, we push a "[default]" section to a copy of the
935-
# file in a StringIO object.
936-
try:
937-
tcl_vars_str = cStringIO.StringIO(
938-
"[default]\n" + open(tcl_config, "r").read())
939-
tk_vars_str = cStringIO.StringIO(
940-
"[default]\n" + open(tk_config, "r").read())
941-
except IOError:
942-
# if we can't read the file, that's ok, we'll try
943-
# to guess instead
944-
return None
945-
946-
tcl_vars_str.seek(0)
947-
tcl_vars = ConfigParser.RawConfigParser()
948-
tk_vars_str.seek(0)
949-
tk_vars = ConfigParser.RawConfigParser()
950-
try:
951-
tcl_vars.readfp(tcl_vars_str)
952-
tk_vars.readfp(tk_vars_str)
953-
except ConfigParser.ParsingError:
954-
# if we can't read the file, that's ok, we'll try
955-
# to guess instead
956-
return None
957-
958-
try:
959-
tcl_lib = tcl_vars.get("default", "TCL_LIB_SPEC")[1:-1].split()[0][2:]
960-
tcl_inc = tcl_vars.get("default", "TCL_INCLUDE_SPEC")[3:-1]
961-
962-
tk_lib = tk_vars.get("default", "TK_LIB_SPEC")[1:-1].split()[0][2:]
963-
if tk_vars.has_option("default", "TK_INCLUDE_SPEC"):
964-
# On Ubuntu 8.04
965-
tk_inc = tk_vars.get("default", "TK_INCLUDE_SPEC")[3:-1]
966-
else:
967-
# On RHEL4
968-
tk_inc = tcl_inc
969-
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
970-
return None
932+
def get_var(file, varname):
933+
p = subprocess.Popen(
934+
'source %s ; eval echo ${%s}' % (file, varname),
935+
shell=True, stdout=subprocess.PIPE)
936+
result = p.communicate()[0]
937+
return result
938+
939+
tcl_lib_dir = get_var(tcl_config, 'TCL_LIB_SPEC').split()[0][2:]
940+
tcl_inc_dir = get_var(tcl_config, 'TCL_INCLUDE_SPEC')[2:]
941+
tcl_lib = get_var(tcl_config, 'TCL_LIB_FLAG')[2:].strip()
942+
943+
tk_lib_dir = get_var(tk_config, 'TK_LIB_SPEC').split()[0][2:]
944+
tk_inc_dir = get_var(tk_config, 'TK_INCLUDE_SPEC').strip()
945+
if tk_inc_dir == '':
946+
tk_inc_dir = tcl_inc_dir
947+
else:
948+
tk_inc_dir = tk_inc_dir[2:]
949+
tk_lib = get_var(tk_config, 'TK_LIB_FLAG')[2:].strip()
971950

972-
if not os.path.exists(os.path.join(tk_inc, 'tk.h')):
951+
if not os.path.exists(os.path.join(tk_inc_dir, 'tk.h')):
973952
return None
974953

975-
return tcl_lib, tcl_inc, tk_lib, tk_inc
954+
return tcl_lib_dir, tcl_inc_dir, tcl_lib, tk_lib_dir, tk_inc_dir, tk_lib
976955

977956
def guess_tcl_config(tcl_lib_dir, tk_lib_dir, tk_ver):
978957
if not (os.path.exists(tcl_lib_dir) and os.path.exists(tk_lib_dir)):
@@ -1007,14 +986,14 @@ def guess_tcl_config(tcl_lib_dir, tk_lib_dir, tk_ver):
1007986
if not os.path.exists(os.path.join(tk_inc, 'tk.h')):
1008987
return None
1009988

1010-
return tcl_lib, tcl_inc, tk_lib, tk_inc
989+
return tcl_lib, tcl_inc, 'tcl' + tk_ver, tk_lib, tk_inc, 'tk' + tk_ver
1011990

1012991
def hardcoded_tcl_config():
1013992
tcl_inc = "/usr/local/include"
1014993
tk_inc = "/usr/local/include"
1015994
tcl_lib = "/usr/local/lib"
1016995
tk_lib = "/usr/local/lib"
1017-
return tcl_lib, tcl_inc, tk_lib, tk_inc
996+
return tcl_lib, tcl_inc, 'tcl', tk_lib, tk_inc, 'tk'
1018997

1019998
def add_tk_flags(module):
1020999
'Add the module flags to build extensions which use tk'
@@ -1115,10 +1094,10 @@ def add_tk_flags(module):
11151094
result = hardcoded_tcl_config()
11161095

11171096
# Add final versions of directories and libraries to module lists
1118-
tcl_lib, tcl_inc, tk_lib, tk_inc = result
1119-
module.include_dirs.extend([tcl_inc, tk_inc])
1120-
module.library_dirs.extend([tcl_lib, tk_lib])
1121-
module.libraries.extend(['tk' + tk_ver, 'tcl' + tk_ver])
1097+
tcl_lib_dir, tcl_inc_dir, tcl_lib, tk_lib_dir, tk_inc_dir, tk_lib = result
1098+
module.include_dirs.extend([tcl_inc_dir, tk_inc_dir])
1099+
module.library_dirs.extend([tcl_lib_dir, tk_lib_dir])
1100+
module.libraries.extend([tcl_lib, tk_lib])
11221101

11231102
return message
11241103

0 commit comments

Comments
 (0)