162 lines
4.3 KiB
Python
162 lines
4.3 KiB
Python
#!/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
|
|
LLVMX86AsmPrinter
|
|
llvm_headers_do_not_build
|
|
ModuleMaker
|
|
opt
|
|
tblgen
|
|
"""
|
|
libs = """
|
|
LLVMAnalysis
|
|
LLVMAsmParser
|
|
LLVMAsmPrinter
|
|
LLVMBitReader
|
|
LLVMBitWriter
|
|
LLVMCodeGen
|
|
LLVMCore
|
|
LLVMExecutionEngine
|
|
LLVMInstrumentation
|
|
LLVMInterpreter
|
|
LLVMipa
|
|
LLVMipo
|
|
LLVMJIT
|
|
LLVMLinker
|
|
LLVMMC
|
|
LLVMScalarOpts
|
|
LLVMSelectionDAG
|
|
LLVMSupport
|
|
LLVMSystem
|
|
LLVMTarget
|
|
LLVMTransformUtils
|
|
LLVMX86AsmParser
|
|
LLVMX86CodeGen
|
|
LLVMX86Info
|
|
""".split()
|
|
return (libs, [])
|
|
|
|
|
|
def get_llvm_config():
|
|
|
|
# get from command-line, or use default
|
|
llvm_dir = '../llvm-2.9'
|
|
llvm_build_dir = None
|
|
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]
|
|
elif arg.startswith('--llvm-build-dir='):
|
|
del sys.argv[i]
|
|
llvm_build_dir = arg.split('=')[1]
|
|
else:
|
|
i += 1
|
|
if llvm_build_dir is None:
|
|
llvm_build_dir = os.path.join( llvm_dir, 'build' )
|
|
good = os.path.isdir( llvm_dir ) and os.path.isdir( llvm_build_dir )
|
|
return (llvm_dir, llvm_build_dir, good)
|
|
|
|
|
|
def call_setup(llvm_dir, llvm_build_dir):
|
|
incdirs = [os.path.join( llvm_dir, 'include' ),
|
|
os.path.join( llvm_build_dir, 'include') ]
|
|
libdir = os.path.join( llvm_build_dir, 'lib', 'Release' )
|
|
|
|
libs_core, objs_core = get_libs_and_objs(libdir)
|
|
std_libs = []
|
|
|
|
ext_core = Extension(
|
|
'llvm._core',
|
|
['llvm/_core.c', 'llvm/wrap.c', '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, llvm_build_dir, is_good = get_llvm_config()
|
|
print("Using llvm-dir=" + llvm_dir + " and llvm-build-dir=" + llvm_build_dir)
|
|
if not is_good:
|
|
print("Cannot find llvm-dir or llvm-build-dir")
|
|
print("Try again with --llvm-dir=/path/to/llvm-top-dir --llvm-build-dir=/path/to/llvm/cmake/dir.")
|
|
return 1
|
|
|
|
# setup
|
|
call_setup(llvm_dir, llvm_build_dir)
|
|
|
|
# done
|
|
return 0
|
|
|
|
|
|
ev = main()
|
|
sys.exit(ev)
|