In article <m0n3n3$48j$1...@dont-email.me>, Kevin Walzer <k...@codebykevin.com> wrote: > On 10/3/14, 3:55 PM, Ned Deily wrote: > > Even if there were no incompatibilities, on OS X with Tcl and Tk (and > > other) frameworks, the version number is embedded in the path to the > > shared library and the linker normally creates an absolute path at that. > > Is this because Python lacks the concept of stubs? > > A Tcl library compiled for 8.5 can be loaded into 8.6 with no > re-compiling required because of stubs.
It has nothing to do with Python per se; that's just the way linking with OS frameworks work. Both Apple and ActiveState install their versions of Tcl and Tk as frameworks. What gets installed and what the OS X compilers and linkers expect is something like this: $ cd /Library/Frameworks/Tk.framework/Versions/8.5 $ ls -l total 5720 drwxr-xr-x+ 3 root wheel 272 Nov 24 2013 Headers drwxr-xr-x+ 2 root wheel 340 Nov 24 2013 PrivateHeaders drwxr-xr-x+ 4 root wheel 272 Nov 24 2013 Resources -rw-r--r--+ 1 root wheel 2905000 Oct 27 2013 Tk -rw-r--r--+ 1 root wheel 12240 Oct 27 2013 libtkstub8.5.a -rw-r--r--+ 1 root wheel 4622 Oct 27 2013 tkConfig.sh $ file Tk Tk: Mach-O universal binary with 2 architectures Tk (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 Tk (for architecture i386): Mach-O dynamically linked shared library i386 $ file libtkstub8.5.a libtkstub8.5.a: Mach-O universal binary with 2 architectures libtkstub8.5.a (for architecture x86_64): current ar archive random library libtkstub8.5.a (for architecture i386): current ar archive random library $ otool -D Tk Tk: /Library/Frameworks/Tk.framework/Versions/8.5/Tk When Python or other programs link with a framework, they use the cc or ld -framework option, rather than -l: -framework Tcl -framework Tk That causes the linker to look in the default search paths for frameworks, /Library/Frameworks followed by /System/Library/Frameworks. The install names of the framework shared libraries used are embedded in the Mach-O file (executable, bundle, or shared library) produced by ld. So the stub library archive is there but is not used, AFAIK. There may be other ways to do it but that's how Python has always linked to Tcl and Tk. FWIW, that's how both Apple's and ActiveState's wish executables are linked as well: $ more /usr/local/bin/wish8.5 #!/bin/sh "$(dirname $0)/../../../Library/Frameworks/Tk.framework/Versions/8.5/Resources/Wish. app/Contents/MacOS/Wish" "$@" $ otool -L /Library/Frameworks/Tk.framework/Versions/8.5/Resources/Wish.app/Contents /MacOS/Wish /Library/Frameworks/Tk.framework/Versions/8.5/Resources/Wish.app/Contents /MacOS/Wish: /Library/Frameworks/Tk.framework/Versions/8.5/Tk (compatibility version 8.5.0, current version 8.5.15) /Library/Frameworks/Tcl.framework/Versions/8.5/Tcl (compatibility version 8.5.0, current version 8.5.15) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0) /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 152.0.0) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 625.0.0) There's more info about frameworks in various Apple developer docs and in the man pages for ld, otool, and install_name_tool. -- Ned Deily, n...@acm.org -- https://mail.python.org/mailman/listinfo/python-list