# # get-py-info.py: get various Python info (for building) # # This should be loaded/run by the appropriate Python, rather than executed # directly as a program. In other words, you should: # # $ python2 get-py-info.py --includes # import sys import os def usage(): print 'USAGE: python %s WHAT' % sys.argv[0] print ' Returns information about how to build Python extensions.' print ' WHAT may be one of:' print " --includes : return -I include flags" print " --compile : return a compile command" print " --link : return a link command" print " --libs : return just the library options for linking" sys.exit(1) if len(sys.argv) != 2: usage() try: from distutils import sysconfig except ImportError: # No information available print "none" sys.exit(1) if sys.argv[1] == '--includes': inc = sysconfig.get_python_inc() plat = sysconfig.get_python_inc(plat_specific=1) if inc == plat: print "-I" + inc else: print "-I%s -I%s" % (inc, plat) sys.exit(0) if sys.argv[1] == '--compile': cc, basecflags, opt, ccshared = \ sysconfig.get_config_vars('CC', 'BASECFLAGS', 'OPT', 'CCSHARED') if basecflags: opt = basecflags + ' ' + opt print cc, opt, ccshared sys.exit(0) def add_option(options, name, value=None): """Add option to list of options""" options.append(name) if value is not None: options.append(value) def add_option_if_missing(options, name, value=None): """Add option to list of options, if it is not already present""" if options.count(name) == 0 and options.count("-Wl,%s" % name) == 0: add_option(options, name, value) def link_options(): """Get list of Python linker options""" # Initialize config variables assert os.name == "posix" options = sysconfig.get_config_var('LDSHARED').split() fwdir = sysconfig.get_config_var('PYTHONFRAMEWORKDIR') if fwdir and fwdir != "no-framework": # Setup the framework prefix fwprefix = sysconfig.get_config_var('PYTHONFRAMEWORKPREFIX') if fwprefix != "/System/Library/Frameworks": add_option_if_missing(options, "-F%s" % fwprefix) # Load in the framework fw = sysconfig.get_config_var('PYTHONFRAMEWORK') 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_if_missing(options, "-bundle_loader", python_exe) elif sys.platform == 'cygwin' or sys.platform.startswith('openbsd'): # Add flags to build against the Python library (also necessary # for Darwin, but handled elsewhere). # Find the path to the library, and add a flag to include it as a # library search path. shared_libdir = sysconfig.get_config_var('LIBDIR') static_libdir = sysconfig.get_config_var('LIBPL') ldlibrary = sysconfig.get_config_var('LDLIBRARY') if os.path.exists(os.path.join(shared_libdir, ldlibrary)): if shared_libdir != '/usr/lib': add_option_if_missing(options, '-L%s' % shared_libdir) elif os.path.exists(os.path.join(static_libdir, ldlibrary)): add_option_if_missing(options, "-L%s" % static_libdir) # Add a flag to build against the library itself. python_version = sysconfig.get_config_var('VERSION') add_option_if_missing(options, "-lpython%s" % python_version) return options def lib_options(): """Get list of Python library options""" link_command = link_options() options = [] # Extract library-related options from link command for i in range(len(link_command)): option = link_command[i] if (not option.startswith("-L:") and option.startswith("-L") or option.startswith("-Wl,") or option.startswith("-l") or option.startswith("-F") or option == "-bundle" or option == "-flat_namespace"): options.append(option) elif (option == "-undefined" or option == "-bundle_loader" or option == "-framework"): options.append(option) options.append(link_command[i+1]) return options if sys.argv[1] == '--link': print " ".join(link_options()) sys.exit(0) if sys.argv[1] == '--libs': print " ".join(lib_options()) sys.exit(0) usage()