Switch to using a fake llvm-config program, so there's just one setup.py
This should help keep windows and other platforms in synch easier.
This commit is contained in:
parent
bc2c9a24ed
commit
397a81d5bd
3 changed files with 83 additions and 163 deletions
70
llvm-config-win32.py
Normal file
70
llvm-config-win32.py
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
import sys, os
|
||||
|
||||
def find_path_of(filename):
|
||||
"""Finds the path from $PATH where the file exists, returns None if not found."""
|
||||
pathlist = os.getenv('PATH').split(os.pathsep)
|
||||
for path in pathlist:
|
||||
if os.path.exists(os.path.join(path, filename)):
|
||||
return os.path.abspath(path)
|
||||
return None
|
||||
|
||||
if sys.argv[1] == '--version':
|
||||
cmd = 'llvm-tblgen --version'
|
||||
# Hardcoded extraction, only tested on llvm 3.1
|
||||
result = os.popen(cmd).read().split('\n')[1].strip().split(' ')[2]
|
||||
print result
|
||||
elif sys.argv[1] == '--libs':
|
||||
# NOTE: instead of actually looking at the components requested,
|
||||
# we just spit out a bunch of libs
|
||||
for lib in """
|
||||
LLVMAnalysis
|
||||
LLVMAsmParser
|
||||
LLVMAsmPrinter
|
||||
LLVMBitReader
|
||||
LLVMBitWriter
|
||||
LLVMCodeGen
|
||||
LLVMCore
|
||||
LLVMExecutionEngine
|
||||
LLVMInstCombine
|
||||
LLVMInstrumentation
|
||||
LLVMInterpreter
|
||||
LLVMipa
|
||||
LLVMipo
|
||||
LLVMJIT
|
||||
LLVMLinker
|
||||
LLVMMC
|
||||
LLVMMCParser
|
||||
LLVMScalarOpts
|
||||
LLVMSelectionDAG
|
||||
LLVMSupport
|
||||
LLVMTarget
|
||||
LLVMTransformUtils
|
||||
LLVMVectorize
|
||||
LLVMX86AsmParser
|
||||
LLVMX86AsmPrinter
|
||||
LLVMX86CodeGen
|
||||
LLVMX86Desc
|
||||
LLVMX86Info
|
||||
LLVMX86Utils
|
||||
Advapi32
|
||||
Shell32
|
||||
""".split():
|
||||
print('-l%s' % lib)
|
||||
elif sys.argv[1] == '--includedir':
|
||||
llvmbin = find_path_of('llvm-tblgen.exe')
|
||||
if llvmbin is None:
|
||||
raise RuntimeError('Could not find LLVM')
|
||||
incdir = os.path.abspath(os.path.join(llvmbin, '../include'))
|
||||
if not os.path.exists(os.path.join(incdir, 'llvm/BasicBlock.h')):
|
||||
raise RuntimeError('Could not find LLVM include dir')
|
||||
print incdir
|
||||
elif sys.argv[1] == '--libdir':
|
||||
llvmbin = find_path_of('llvm-tblgen.exe')
|
||||
if llvmbin is None:
|
||||
raise RuntimeError('Could not find LLVM')
|
||||
libdir = os.path.abspath(os.path.join(llvmbin, '../lib'))
|
||||
if not os.path.exists(os.path.join(libdir, 'LLVMCore.lib')):
|
||||
raise RuntimeError('Could not find LLVM lib dir')
|
||||
print libdir
|
||||
else:
|
||||
raise RuntimeError('Unrecognized llvm-config command %s' % sys.argv[1])
|
||||
161
setup-win32.py
161
setup-win32.py
|
|
@ -1,161 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright (c) 2008, Mahadevan R All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
#
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# * Neither the name of this software, nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import sys, os
|
||||
import os.path
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
LLVM_PY_VERSION = '0.7'
|
||||
|
||||
|
||||
def get_libs_and_objs(llvm_lib_dir):
|
||||
# Libraries that are not included in the build
|
||||
not_required_libs = """
|
||||
BrainF
|
||||
bugpoint
|
||||
Fibonacci
|
||||
HowToUseJIT
|
||||
Kaleidoscope
|
||||
llc
|
||||
lli
|
||||
llvm-as
|
||||
llvm-bcanalyzer
|
||||
llvm-extract
|
||||
llvm-ld
|
||||
llvm-link
|
||||
llvm-mc
|
||||
LLVMArchive
|
||||
LLVMAsmPrinter
|
||||
LLVMHello
|
||||
LLVMDebugger
|
||||
llvm_headers_do_not_build
|
||||
ModuleMaker
|
||||
opt
|
||||
tblgen
|
||||
"""
|
||||
libs = """
|
||||
LLVMAnalysis
|
||||
LLVMAsmParser
|
||||
LLVMAsmPrinter
|
||||
LLVMBitReader
|
||||
LLVMBitWriter
|
||||
LLVMCodeGen
|
||||
LLVMCore
|
||||
LLVMExecutionEngine
|
||||
LLVMInstCombine
|
||||
LLVMInstrumentation
|
||||
LLVMInterpreter
|
||||
LLVMipa
|
||||
LLVMipo
|
||||
LLVMJIT
|
||||
LLVMLinker
|
||||
LLVMMC
|
||||
LLVMMCParser
|
||||
LLVMScalarOpts
|
||||
LLVMSelectionDAG
|
||||
LLVMSupport
|
||||
LLVMTarget
|
||||
LLVMTransformUtils
|
||||
LLVMVectorize
|
||||
LLVMX86AsmParser
|
||||
LLVMX86AsmPrinter
|
||||
LLVMX86CodeGen
|
||||
LLVMX86Desc
|
||||
LLVMX86Info
|
||||
LLVMX86Utils
|
||||
Advapi32
|
||||
Shell32
|
||||
""".split()
|
||||
return (libs, [])
|
||||
|
||||
|
||||
def get_llvm_config():
|
||||
|
||||
# get from command-line, or use default
|
||||
llvm_dir = r'C:\Program Files\LLVM 3.1.1'
|
||||
i = 0
|
||||
while i < len(sys.argv):
|
||||
arg = sys.argv[i]
|
||||
if arg.startswith('--llvm-dir='):
|
||||
del sys.argv[i]
|
||||
llvm_dir = arg.split('=')[1]
|
||||
else:
|
||||
i += 1
|
||||
good = os.path.isdir( llvm_dir )
|
||||
return (llvm_dir, good)
|
||||
|
||||
|
||||
def call_setup(llvm_dir):
|
||||
incdirs = [os.path.join(llvm_dir, 'include')]
|
||||
libdir = os.path.join(llvm_dir, 'lib')
|
||||
|
||||
libs_core, objs_core = get_libs_and_objs(libdir)
|
||||
std_libs = []
|
||||
|
||||
ext_core = Extension(
|
||||
'llvm._core',
|
||||
['llvm/_core.cpp', 'llvm/wrap.cpp', 'llvm/extra.cpp'],
|
||||
include_dirs = incdirs,
|
||||
library_dirs = [libdir],
|
||||
libraries = std_libs + libs_core,
|
||||
language = 'c++' )
|
||||
|
||||
setup(
|
||||
name='llvm-py',
|
||||
version=LLVM_PY_VERSION,
|
||||
description='Python Bindings for LLVM',
|
||||
author='Mahadevan R',
|
||||
author_email='mdevan@mdevan.org',
|
||||
url='http://www.mdevan.org/llvm-py/',
|
||||
packages=['llvm'],
|
||||
py_modules = [ 'llvm.core' ],
|
||||
ext_modules = [ ext_core ],)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
# get llvm config
|
||||
llvm_dir, is_good = get_llvm_config()
|
||||
print("Using llvm-dir=" + llvm_dir)
|
||||
if not is_good:
|
||||
print("Cannot find llvm-dir")
|
||||
print("Try again with --llvm-dir=/path/to/llvm-top-dir.")
|
||||
return 1
|
||||
|
||||
# setup
|
||||
call_setup(llvm_dir)
|
||||
|
||||
# done
|
||||
return 0
|
||||
|
||||
|
||||
ev = main()
|
||||
sys.exit(ev)
|
||||
15
setup.py
15
setup.py
|
|
@ -4,8 +4,13 @@ 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', 'llvm-config')
|
||||
llvm_config = os.environ.get('LLVM_CONFIG_PATH', default_llvm_config)
|
||||
# set LLVMPY_DYNLINK=1, if you want to link _core.so dynamically to libLLVM.so
|
||||
dynlink = int(os.environ.get('LLVMPY_DYNLINK', 0))
|
||||
|
||||
|
|
@ -61,7 +66,10 @@ if dynlink:
|
|||
libs_core = ['LLVM-%d.%d' % llvm_version]
|
||||
objs_core = []
|
||||
else:
|
||||
if llvm_version <= (3, 1): # select between PTX & NVPTX
|
||||
if sys.platform == 'win32':
|
||||
print('PTX is disabled on Win32 at the moment')
|
||||
ptx_components = []
|
||||
elif llvm_version <= (3, 1): # select between PTX & NVPTX
|
||||
print('Using PTX')
|
||||
ptx_components = ['ptx',
|
||||
'ptxasmprinter',
|
||||
|
|
@ -86,6 +94,9 @@ std_libs = ['pthread', 'm', 'stdc++', 'dl']
|
|||
extra_link_args = ["-fPIC"]
|
||||
if sys.platform == 'darwin':
|
||||
std_libs.append("ffi")
|
||||
elif sys.platform == 'win32':
|
||||
std_libs = []
|
||||
extra_link_args = []
|
||||
|
||||
kwds = dict(ext_modules = [Extension(
|
||||
name='llvm._core',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue