164 lines
5.1 KiB
Python
164 lines
5.1 KiB
Python
import sys
|
|
import os
|
|
import re
|
|
from distutils.core import setup, Extension
|
|
|
|
|
|
# On win32, there is a fake llvm-config since llvm doesn't supply one
|
|
if sys.platform == 'win32':
|
|
default_llvm_config = 'python llvm-config-win32.py'
|
|
else:
|
|
default_llvm_config = 'llvm-config'
|
|
|
|
llvm_config = os.environ.get('LLVM_CONFIG_PATH', default_llvm_config)
|
|
# set LLVMPY_DYNLINK=0, if you want to link _core.so statically
|
|
dynlink = int(os.environ.get('LLVMPY_DYNLINK', 1))
|
|
|
|
def run_llvm_config(args):
|
|
cmd = llvm_config + ' ' + ' '.join(args)
|
|
return os.popen(cmd).read().rstrip()
|
|
|
|
if run_llvm_config(['--version']) == '':
|
|
sys.exit("Cannot invoke llvm-config.\n"
|
|
"Try setting LLVM_CONFIG_PATH=/path/to/llvm-config")
|
|
|
|
|
|
def get_libs_and_objs(components):
|
|
parts = run_llvm_config(['--libs'] + components).split()
|
|
libs = []
|
|
objs = []
|
|
for part in parts:
|
|
if part.startswith('-l'):
|
|
libs.append(part[2:])
|
|
elif part.endswith('.o'):
|
|
objs.append(part)
|
|
return libs, objs
|
|
|
|
def get_enabled_components():
|
|
return run_llvm_config(['--components']).split()
|
|
|
|
def get_llvm_version():
|
|
return run_llvm_config([' --version'])
|
|
|
|
|
|
def auto_intrinsic_gen(incdir):
|
|
# let's do auto intrinsic generation
|
|
print("Generate intrinsic IDs")
|
|
from tools import intrgen
|
|
path = "%s/llvm/Intrinsics.gen" % incdir
|
|
with open('llvm/_intrinsic_ids.py', 'w') as fout:
|
|
intrgen.gen(path, fout)
|
|
|
|
|
|
incdir = run_llvm_config(['--includedir'])
|
|
libdir = run_llvm_config(['--libdir'])
|
|
ldflags = run_llvm_config(['--ldflags'])
|
|
|
|
llvm_version = get_llvm_version()
|
|
print('LLVM version = %s' % llvm_version)
|
|
|
|
auto_intrinsic_gen(incdir)
|
|
|
|
macros = [('__STDC_CONSTANT_MACROS', None),
|
|
('__STDC_LIMIT_MACROS', None)]
|
|
if dynlink:
|
|
libs_core = ['LLVM-%s' % llvm_version]
|
|
objs_core = []
|
|
else:
|
|
enabled_components = set(get_enabled_components())
|
|
ptx_components = set(['ptx',
|
|
'ptxasmprinter',
|
|
'ptxcodegen',
|
|
'ptxdesc',
|
|
'ptxinfo'])
|
|
nvptx_components = set(['nvptx',
|
|
'nvptxasmprinter',
|
|
'nvptxcodegen',
|
|
'nvptxdesc',
|
|
'nvptxinfo'])
|
|
|
|
extra_components = []
|
|
if (nvptx_components & enabled_components) == nvptx_components:
|
|
print("Using NVPTX")
|
|
extra_components.extend(nvptx_components)
|
|
elif (ptx_components & enabled_components) == ptx_components:
|
|
print("Using PTX")
|
|
extra_components.extend(ptx_components)
|
|
else:
|
|
print("No CUDA support")
|
|
macros.append(('LLVM_DISABLE_PTX', None))
|
|
|
|
libs_core, objs_core = get_libs_and_objs(
|
|
['core', 'analysis', 'scalaropts', 'executionengine',
|
|
'jit', 'native', 'interpreter', 'bitreader', 'bitwriter',
|
|
'instrumentation', 'ipa', 'ipo', 'transformutils',
|
|
'asmparser', 'linker', 'support', 'vectorize']
|
|
+ extra_components)
|
|
|
|
if sys.platform == 'win32':
|
|
# If no PTX lib got added, disable PTX in the build
|
|
if 'LLVMPTXCodeGen' not in libs_core:
|
|
macros.append(('LLVM_DISABLE_PTX', None))
|
|
else:
|
|
macros.append(('_GNU_SOURCE', None))
|
|
|
|
extra_link_args = ldflags.split()
|
|
kwds = dict(ext_modules = [Extension(
|
|
name='llvm._core',
|
|
sources=['llvm/_core.cpp', 'llvm/wrap.cpp', 'llvm/extra.cpp'],
|
|
define_macros = macros,
|
|
include_dirs = ['/usr/include', incdir],
|
|
library_dirs = [libdir],
|
|
libraries = libs_core,
|
|
extra_objects = objs_core,
|
|
extra_link_args = extra_link_args),
|
|
|
|
Extension(name='llvm._dwarf',
|
|
sources=['llvm/_dwarf.cpp'],
|
|
include_dirs=[incdir])
|
|
])
|
|
|
|
def run_2to3():
|
|
import lib2to3.refactor
|
|
from distutils.command.build_py import build_py_2to3 as build_py
|
|
print("Installing 2to3 fixers")
|
|
# need to convert sources to Py3 on installation
|
|
fixes = lib2to3.refactor.get_fixers_from_package("lib2to3.fixes")
|
|
#fixes = [fix for fix in fixes
|
|
# if fix.split('fix_')[-1] not in ('next',)
|
|
#]
|
|
|
|
kwds["cmdclass"] = {"build_py": build_py}
|
|
|
|
if sys.version_info[0] >= 3:
|
|
run_2to3()
|
|
|
|
# Read version from llvm/__init__.py
|
|
pat = re.compile(r'__version__\s*=\s*(\S+)', re.M)
|
|
data = open('llvm/__init__.py').read()
|
|
kwds['version'] = eval(pat.search(data).group(1))
|
|
kwds['long_description'] = open('README.rst').read()
|
|
|
|
setup(
|
|
name = 'llvmpy',
|
|
description = 'Python bindings for LLVM',
|
|
author = 'R Mahadevan',
|
|
maintainer = 'Continuum Analytics, Inc.',
|
|
maintainer_email = 'llvmpy@continuum.io',
|
|
url = 'http://www.llvmpy.org/',
|
|
packages = ['llvm', 'llvm_cbuilder', 'llpython'],
|
|
py_modules = ['llvm.core'],
|
|
license = "BSD",
|
|
classifiers = [
|
|
"Intended Audience :: Developers",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: C++",
|
|
"Programming Language :: Python :: 2",
|
|
"Programming Language :: Python :: 2.6",
|
|
"Programming Language :: Python :: 2.7",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.2",
|
|
"Programming Language :: Python :: 3.3",
|
|
],
|
|
**kwds
|
|
)
|