| # |
| # 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() |
| |
| if 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() |