# SPDX-License-Identifier: MIT # # Copyright (C) 2017 Francis Deslauriers # Copyright (C) 2020 Jérémie Galarneau import sys import os import distutils.sysconfig from distutils.core import setup, Extension PY_PATH_WARN_MSG = """ -------------------------------------WARNING------------------------------------ The install directory used:\n ({})\nis not included in your PYTHONPATH. To add this directory to your Python search path permanently you can add the following command to your .bashrc/.zshrc: export PYTHONPATH="${{PYTHONPATH}}:{}" -------------------------------------------------------------------------------- """ original_get_config_vars = distutils.sysconfig.get_config_vars def get_cflags(): cflags = os.environ.get('CFLAGS') if cflags is None: [cflags] = original_get_config_vars('CFLAGS') return cflags # distutils performs a similar transformation step on LDSHARED on # darwin to use the overriden CC as the default command for LDSHARED # (see distutils' customize_compiler() step in the sysconfig module). # # This takes it a step further by using our own LDFLAGS (when available) # along with the overriden compiler and ensure that flags that are unsupported # by either the Python interprter's CC or the overriden CC don't cause a # build failure. def get_ldshared(): cc = os.environ.get('CC') ldflags = os.environ.get('LDFLAGS') [py_cc] = original_get_config_vars('CC') [py_ldshared] = original_get_config_vars('LDSHARED') if not py_ldshared.startswith(py_cc): return py_ldshared if cc and ldflags: return '{} -shared {}'.format(cc, ldflags) elif cc: return cc + py_ldshared[len(py_cc) :] elif ldflags: return py_cc + py_ldshared[len(py_cc) :] else: return py_ldshared def our_get_config_vars(*args): overridden_config_vars = { 'CFLAGS': get_cflags(), 'LDSHARED': get_ldshared(), } if len(args) == 0: all_config_vars = original_get_config_vars() for name in overridden_config_vars: all_config_vars[name] = overridden_config_vars[name] return all_config_vars subset_config_vars = [] for name in args: if name not in overridden_config_vars: [var] = original_get_config_vars(name) subset_config_vars.append(var) continue subset_config_vars.append(overridden_config_vars[name]) return subset_config_vars distutils.sysconfig.get_config_vars = our_get_config_vars def main(): babeltrace_ext = Extension( 'bt2._native_bt', sources=['bt2/native_bt.c', '@srcdir@/bt2/logging.c'], libraries=['babeltrace2', 'glib-2.0'], extra_objects=[ '@top_builddir@/src/autodisc/.libs/libbabeltrace2-autodisc.a', '@top_builddir@/src/logging/.libs/libbabeltrace2-logging.a', '@top_builddir@/src/common/.libs/libbabeltrace2-common.a', '@top_builddir@/src/py-common/.libs/libbabeltrace2-py-common.a', '@top_builddir@/src/string-format/.libs/libbabeltrace2-string-format.a', ], ) dist = setup( name='bt2', version='@PACKAGE_VERSION@', description='Babeltrace 2 Python Bindings', packages=['bt2'], package_dir={'bt2': 'bt2'}, options={ 'build': {'build_base': 'build', 'build_lib': 'build/build_lib'}, 'build_ext': {'build_lib': 'build/build_lib'}, }, url='https://babeltrace.org/', ext_modules=[babeltrace_ext], license='MIT', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: The MIT License', 'Programming Language :: Python :: 3' 'Topic :: System :: Logging', ], ) # After the installation, we check that the install directory is included in # the Python search path and we print a warning message when it's not. # We need to do this because Python search path differs depending on the distro # and some distros don't include any /usr/local/ in the search path. This is # also useful for out-of-tree installs and tests. # It's only relevant to make this check on the `install` command. if 'install' in dist.command_obj: install_dir = dist.command_obj['install'].install_libbase if install_dir not in sys.path: # We can't consider this an error because if affects every # distro differently. We only warn the user that some # extra configuration is needed to use the bindings print(PY_PATH_WARN_MSG.format(install_dir, install_dir)) if __name__ == "__main__": main()