| # |
| # get-py-info.py: get various Python info (for building) |
| # |
| ###################################################################### |
| # |
| # Copyright (c) 2002-2006 CollabNet. All rights reserved. |
| # |
| # This software is licensed as described in the file COPYING, which |
| # you should have received as part of this distribution. The terms |
| # are also available at http://subversion.tigris.org/license-1.html. |
| # If newer versions of this license are posted there, you may use a |
| # newer version instead, at your option. |
| # |
| ###################################################################### |
| # |
| # 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() |