diff options
Diffstat (limited to 'build/get-py-info.py')
-rw-r--r-- | build/get-py-info.py | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/build/get-py-info.py b/build/get-py-info.py new file mode 100644 index 0000000..29a6c0a --- /dev/null +++ b/build/get-py-info.py @@ -0,0 +1,158 @@ +# +# get-py-info.py: get various Python info (for building) +# +###################################################################### +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +###################################################################### +# +# 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") + print(" --site : return the path to site-packages") + 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, ccshared = sysconfig.get_config_vars('CC', 'CCSHARED') + print("%s %s" % (cc, 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) + +if sys.argv[1] == '--site': + print(sysconfig.get_python_lib()) + sys.exit(0) + +usage() |