from distutils.core import setup
from distutils.extension import Extension
from distutils.command.install_lib import install_lib as _install
from Cython.Distutils import build_ext

VERSION = '4.0'

compile_args = ['-O3', '-fomit-frame-pointer']

ext_modules = [
    Extension("capstone.ccapstone", ["pyx/ccapstone.pyx"], libraries=["capstone"], extra_compile_args=compile_args),
    Extension("capstone.arm", ["pyx/arm.pyx"], extra_compile_args=compile_args),
    Extension("capstone.arm_const", ["pyx/arm_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.arm64", ["pyx/arm64.pyx"], extra_compile_args=compile_args),
    Extension("capstone.arm64_const", ["pyx/arm64_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.m68k", ["pyx/m68k.pyx"], extra_compile_args=compile_args),
    Extension("capstone.m68k_const", ["pyx/m68k_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.mips", ["pyx/mips.pyx"], extra_compile_args=compile_args),
    Extension("capstone.mips_const", ["pyx/mips_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.ppc", ["pyx/ppc.pyx"], extra_compile_args=compile_args),
    Extension("capstone.ppc_const", ["pyx/ppc_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.x86", ["pyx/x86.pyx"], extra_compile_args=compile_args),
    Extension("capstone.x86_const", ["pyx/x86_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.sparc", ["pyx/sparc.pyx"], extra_compile_args=compile_args),
    Extension("capstone.sparc_const", ["pyx/sparc_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.systemz", ["pyx/systemz.pyx"], extra_compile_args=compile_args),
    Extension("capstone.sysz_const", ["pyx/sysz_const.pyx"], extra_compile_args=compile_args),
    Extension("capstone.xcore", ["pyx/xcore.pyx"], extra_compile_args=compile_args),
    Extension("capstone.xcore_const", ["pyx/xcore_const.pyx"], extra_compile_args=compile_args)
]

# clean package directory first
#import os.path, shutil, sys
#for f in sys.path:
#    if f.endswith('packages'):
#        pkgdir = os.path.join(f, 'capstone')
#        #print(pkgdir)
#        try:
#            shutil.rmtree(pkgdir)
#        except:
#            pass

setup(
    provides     = ['capstone'],
    package_dir  = {'capstone' : 'pyx'},
    packages     = ['capstone'],
    name         = 'capstone',
    version      = VERSION,
    cmdclass     = {'build_ext': build_ext},
    ext_modules  = ext_modules,
    author       = 'Nguyen Anh Quynh',
    author_email = 'aquynh@gmail.com',
    description  = 'Capstone disassembly engine',
    url          = 'http://www.capstone-engine.org',
    classifiers  = [
                'License :: OSI Approved :: BSD License',
                'Programming Language :: Python :: 2',
                ],
)
