summaryrefslogtreecommitdiff
path: root/build/get-py-info.py
diff options
context:
space:
mode:
Diffstat (limited to 'build/get-py-info.py')
-rw-r--r--build/get-py-info.py158
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()