Index: get-py-info.py =================================================================== --- get-py-info.py (revision 15946) +++ get-py-info.py (working copy) @@ -9,7 +9,6 @@ import sys import os -import string from distutils import sysconfig def usage(): @@ -42,62 +41,75 @@ print cc, opt, ccshared sys.exit(0) -def ldshared_process(just_libs = None): - libdir = sysconfig.get_config_var('LIBDIR') - ldshared = sysconfig.get_config_var('LDSHARED') - ldlibrary = sysconfig.get_config_var('LDLIBRARY') - libpyfwdir = sysconfig.get_config_var('PYTHONFRAMEWORKDIR') - ldshared_elems = string.split(ldshared, " ") - libs_elems = [] - for i in range(len(ldshared_elems)): - if ldshared_elems[i] == '-framework': - ldshared_elems[i] = '-Wl,' + ldshared_elems[i] - ldshared_elems[i+1] = '-Wl,' + ldshared_elems[i+1] - libs_elems.append(ldshared_elems[i]) - libs_elems.append(ldshared_elems[i+1]) - elif ldshared_elems[i][:2] == '-L': - if ldshared_elems[i][:3] != '-L:': - libs_elems.append(ldshared_elems[i]) - elif ldshared_elems[i][:2] == '-l': - libs_elems.append(ldshared_elems[i]) - ldlibpath = os.path.join(libdir, ldlibrary) - if libpyfwdir and libpyfwdir != "no-framework": - libpyfw = sysconfig.get_config_var('PYTHONFRAMEWORK') - py_lopt = "-framework " + libpyfw - libs_elems.append(py_lopt) - ldshared_elems.append(py_lopt) - elif (os.path.exists(ldlibpath)): - if libdir != '/usr/lib': - py_Lopt = "-L" + libdir - libs_elems.append(py_Lopt) - ldshared_elems.append(py_Lopt) - ldlibname, ldlibext = os.path.splitext(ldlibrary) - if ldlibname[:3] == 'lib' and ldlibext == '.so': - py_lopt = '-l' + ldlibname[3:] - else: - py_lopt = ldlibrary - libs_elems.append(py_lopt) - ldshared_elems.append(py_lopt) +def remove_option(options, option, value=None): + """Remove an option from a list of options""" + try: + index = options.index(option) + if value is None: + options[index:index+1] = [] + elif options[index+1] == value: + options[index:index+2] = [] + except ValueError: + pass + +def add_option(options, option, value=None, linker=None): + """Add an option to a list of options""" + remove_option(options, option, value) + if linker: + option = "-Wl,%s" % option + if value is not None: + value = "-Wl,%s" % value + remove_option(options, option, value) + options.append(option) + if value is not None: + options.append(value) + +def link_options(): + """Get list of Python linker options""" + options = sysconfig.get_config_var('LDSHARED').split() + fwdir = sysconfig.get_config_var('PYTHONFRAMEWORKDIR') + if fwdir and fwdir != "no-framework": + + # Setup the framework system + fwprefix = sysconfig.get_config_var('PYTHONFRAMEWORKPREFIX') + fw = sysconfig.get_config_var('PYTHONFRAMEWORK') + add_option(options, "-F%s" % fwprefix, linker=1) + add_option(options, "-framework", fw) + + elif sys.platform == 'darwin': + + # Load bundles from python + python_exe = os.path.join(sysconfig.get_config_var("BINDIR"), + sysconfig.get_config_var('PYTHON')) + add_option(options, "-bundle_loader", python_exe) + add_option(options, "-bundle") + add_option(options, "-flat_namespace", linker=1) + add_option(options, "-undefined", "suppress", linker=1) + else: - python_version = sys.version[:3] - py_Lopt = "-L" + os.path.join(sys.prefix, "lib", "python" + - python_version, "config") - py_lopt = "-lpython" + python_version - libs_elems.append(py_Lopt) - libs_elems.append(py_lopt) - ldshared_elems.append(py_Lopt) - ldshared_elems.append(py_lopt) - if just_libs: - return string.join(libs_elems, " ") - else: - return string.join(ldshared_elems, " ") + # Standard library imports + libdir = sysconfig.get_config_var('LIBDIR') + if libdir != '/usr/lib': + add_option(options, '-L%s' % libdir) + add_option(options, "-L%s" % sysconfig.get_config_var('LIBPL')) + add_option(options, "-lpython%s" % sysconfig.get_config_var('VERSION')) + + return options + +def lib_options(): + """Get list of Python library options""" + return [option for option in link_options() if + not option.startswith("-L:") and option.startswith("-L") or + option.startswith("-Wl,") or option.startswith("-l") or + option.startswith("-bundle") or option.startswith("-framework")] + if sys.argv[1] == '--link': - print ldshared_process() + print " ".join(link_options()) sys.exit(0) if sys.argv[1] == '--libs': - print ldshared_process(just_libs = 1) + print " ".join(lib_options()) sys.exit(0) usage()