1*9a0e4156SSadaf Ebrahimi#!/usr/bin/env python 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimiimport glob 4*9a0e4156SSadaf Ebrahimiimport os 5*9a0e4156SSadaf Ebrahimiimport shutil 6*9a0e4156SSadaf Ebrahimiimport sys 7*9a0e4156SSadaf Ebrahimiimport platform 8*9a0e4156SSadaf Ebrahimi 9*9a0e4156SSadaf Ebrahimifrom distutils import log 10*9a0e4156SSadaf Ebrahimifrom setuptools import setup 11*9a0e4156SSadaf Ebrahimifrom distutils.util import get_platform 12*9a0e4156SSadaf Ebrahimifrom distutils.command.build import build 13*9a0e4156SSadaf Ebrahimifrom distutils.command.sdist import sdist 14*9a0e4156SSadaf Ebrahimifrom setuptools.command.bdist_egg import bdist_egg 15*9a0e4156SSadaf Ebrahimi 16*9a0e4156SSadaf EbrahimiSYSTEM = sys.platform 17*9a0e4156SSadaf Ebrahimi 18*9a0e4156SSadaf Ebrahimi# adapted from commit e504b81 of Nguyen Tan Cong 19*9a0e4156SSadaf Ebrahimi# Reference: https://docs.python.org/2/library/platform.html#cross-platform 20*9a0e4156SSadaf EbrahimiIS_64BITS = sys.maxsize > 2**32 21*9a0e4156SSadaf Ebrahimi 22*9a0e4156SSadaf Ebrahimi# are we building from the repository or from a source distribution? 23*9a0e4156SSadaf EbrahimiROOT_DIR = os.path.dirname(os.path.realpath(__file__)) 24*9a0e4156SSadaf EbrahimiLIBS_DIR = os.path.join(ROOT_DIR, 'capstone', 'lib') 25*9a0e4156SSadaf EbrahimiHEADERS_DIR = os.path.join(ROOT_DIR, 'capstone', 'include') 26*9a0e4156SSadaf EbrahimiSRC_DIR = os.path.join(ROOT_DIR, 'src') 27*9a0e4156SSadaf EbrahimiBUILD_DIR = SRC_DIR if os.path.exists(SRC_DIR) else os.path.join(ROOT_DIR, '../..') 28*9a0e4156SSadaf Ebrahimi 29*9a0e4156SSadaf Ebrahimi# Parse version from pkgconfig.mk 30*9a0e4156SSadaf EbrahimiVERSION_DATA = {} 31*9a0e4156SSadaf Ebrahimiwith open(os.path.join(BUILD_DIR, 'pkgconfig.mk')) as fp: 32*9a0e4156SSadaf Ebrahimi lines = fp.readlines() 33*9a0e4156SSadaf Ebrahimi for line in lines: 34*9a0e4156SSadaf Ebrahimi line = line.strip() 35*9a0e4156SSadaf Ebrahimi if len(line) == 0: 36*9a0e4156SSadaf Ebrahimi continue 37*9a0e4156SSadaf Ebrahimi if line.startswith('#'): 38*9a0e4156SSadaf Ebrahimi continue 39*9a0e4156SSadaf Ebrahimi if '=' not in line: 40*9a0e4156SSadaf Ebrahimi continue 41*9a0e4156SSadaf Ebrahimi 42*9a0e4156SSadaf Ebrahimi k, v = line.split('=', 1) 43*9a0e4156SSadaf Ebrahimi k = k.strip() 44*9a0e4156SSadaf Ebrahimi v = v.strip() 45*9a0e4156SSadaf Ebrahimi if len(k) == 0 or len(v) == 0: 46*9a0e4156SSadaf Ebrahimi continue 47*9a0e4156SSadaf Ebrahimi VERSION_DATA[k] = v 48*9a0e4156SSadaf Ebrahimi 49*9a0e4156SSadaf Ebrahimiif 'PKG_MAJOR' not in VERSION_DATA or \ 50*9a0e4156SSadaf Ebrahimi 'PKG_MINOR' not in VERSION_DATA or \ 51*9a0e4156SSadaf Ebrahimi 'PKG_EXTRA' not in VERSION_DATA: 52*9a0e4156SSadaf Ebrahimi raise Exception("Malformed pkgconfig.mk") 53*9a0e4156SSadaf Ebrahimi 54*9a0e4156SSadaf Ebrahimiif 'PKG_TAG' in VERSION_DATA: 55*9a0e4156SSadaf Ebrahimi VERSION = '{PKG_MAJOR}.{PKG_MINOR}.{PKG_EXTRA}.{PKG_TAG}'.format(**VERSION_DATA) 56*9a0e4156SSadaf Ebrahimielse: 57*9a0e4156SSadaf Ebrahimi VERSION = '{PKG_MAJOR}.{PKG_MINOR}.{PKG_EXTRA}'.format(**VERSION_DATA) 58*9a0e4156SSadaf Ebrahimi 59*9a0e4156SSadaf Ebrahimiif SYSTEM == 'darwin': 60*9a0e4156SSadaf Ebrahimi VERSIONED_LIBRARY_FILE = "libcapstone.{PKG_MAJOR}.dylib".format(**VERSION_DATA) 61*9a0e4156SSadaf Ebrahimi LIBRARY_FILE = "libcapstone.dylib" 62*9a0e4156SSadaf Ebrahimi STATIC_LIBRARY_FILE = 'libcapstone.a' 63*9a0e4156SSadaf Ebrahimielif SYSTEM in ('win32', 'cygwin'): 64*9a0e4156SSadaf Ebrahimi VERSIONED_LIBRARY_FILE = "capstone.dll" 65*9a0e4156SSadaf Ebrahimi LIBRARY_FILE = "capstone.dll" 66*9a0e4156SSadaf Ebrahimi STATIC_LIBRARY_FILE = None 67*9a0e4156SSadaf Ebrahimielse: 68*9a0e4156SSadaf Ebrahimi VERSIONED_LIBRARY_FILE = "libcapstone.so.{PKG_MAJOR}".format(**VERSION_DATA) 69*9a0e4156SSadaf Ebrahimi LIBRARY_FILE = "libcapstone.so" 70*9a0e4156SSadaf Ebrahimi STATIC_LIBRARY_FILE = 'libcapstone.a' 71*9a0e4156SSadaf Ebrahimi 72*9a0e4156SSadaf Ebrahimidef clean_bins(): 73*9a0e4156SSadaf Ebrahimi shutil.rmtree(LIBS_DIR, ignore_errors=True) 74*9a0e4156SSadaf Ebrahimi shutil.rmtree(HEADERS_DIR, ignore_errors=True) 75*9a0e4156SSadaf Ebrahimi 76*9a0e4156SSadaf Ebrahimidef copy_sources(): 77*9a0e4156SSadaf Ebrahimi """Copy the C sources into the source directory. 78*9a0e4156SSadaf Ebrahimi This rearranges the source files under the python distribution 79*9a0e4156SSadaf Ebrahimi directory. 80*9a0e4156SSadaf Ebrahimi """ 81*9a0e4156SSadaf Ebrahimi src = [] 82*9a0e4156SSadaf Ebrahimi 83*9a0e4156SSadaf Ebrahimi try: 84*9a0e4156SSadaf Ebrahimi shutil.rmtree("src/") 85*9a0e4156SSadaf Ebrahimi except (IOError, OSError): 86*9a0e4156SSadaf Ebrahimi pass 87*9a0e4156SSadaf Ebrahimi 88*9a0e4156SSadaf Ebrahimi shutil.copytree(os.path.join(BUILD_DIR, "arch"), os.path.join(SRC_DIR, "arch")) 89*9a0e4156SSadaf Ebrahimi shutil.copytree(os.path.join(BUILD_DIR, "include"), os.path.join(SRC_DIR, "include")) 90*9a0e4156SSadaf Ebrahimi 91*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "*.[ch]"))) 92*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "*.mk"))) 93*9a0e4156SSadaf Ebrahimi 94*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "Makefile"))) 95*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "LICENSE*"))) 96*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "README"))) 97*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "*.TXT"))) 98*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "RELEASE_NOTES"))) 99*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "make.sh"))) 100*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "CMakeLists.txt"))) 101*9a0e4156SSadaf Ebrahimi src.extend(glob.glob(os.path.join(BUILD_DIR, "pkgconfig.mk"))) 102*9a0e4156SSadaf Ebrahimi 103*9a0e4156SSadaf Ebrahimi for filename in src: 104*9a0e4156SSadaf Ebrahimi outpath = os.path.join(SRC_DIR, os.path.basename(filename)) 105*9a0e4156SSadaf Ebrahimi log.info("%s -> %s" % (filename, outpath)) 106*9a0e4156SSadaf Ebrahimi shutil.copy(filename, outpath) 107*9a0e4156SSadaf Ebrahimi 108*9a0e4156SSadaf Ebrahimidef build_libraries(): 109*9a0e4156SSadaf Ebrahimi """ 110*9a0e4156SSadaf Ebrahimi Prepare the capstone directory for a binary distribution or installation. 111*9a0e4156SSadaf Ebrahimi Builds shared libraries and copies header files. 112*9a0e4156SSadaf Ebrahimi 113*9a0e4156SSadaf Ebrahimi Will use a src/ dir if one exists in the current directory, otherwise assumes it's in the repo 114*9a0e4156SSadaf Ebrahimi """ 115*9a0e4156SSadaf Ebrahimi cwd = os.getcwd() 116*9a0e4156SSadaf Ebrahimi clean_bins() 117*9a0e4156SSadaf Ebrahimi os.mkdir(HEADERS_DIR) 118*9a0e4156SSadaf Ebrahimi os.mkdir(LIBS_DIR) 119*9a0e4156SSadaf Ebrahimi 120*9a0e4156SSadaf Ebrahimi # copy public headers 121*9a0e4156SSadaf Ebrahimi shutil.copytree(os.path.join(BUILD_DIR, 'include', 'capstone'), os.path.join(HEADERS_DIR, 'capstone')) 122*9a0e4156SSadaf Ebrahimi 123*9a0e4156SSadaf Ebrahimi # if prebuilt libraries are available, use those and cancel build 124*9a0e4156SSadaf Ebrahimi if os.path.exists(os.path.join(ROOT_DIR, 'prebuilt', LIBRARY_FILE)) and \ 125*9a0e4156SSadaf Ebrahimi (not STATIC_LIBRARY_FILE or os.path.exists(os.path.join(ROOT_DIR, 'prebuilt', STATIC_LIBRARY_FILE))): 126*9a0e4156SSadaf Ebrahimi shutil.copy(os.path.join(ROOT_DIR, 'prebuilt', LIBRARY_FILE), LIBS_DIR) 127*9a0e4156SSadaf Ebrahimi if STATIC_LIBRARY_FILE is not None: 128*9a0e4156SSadaf Ebrahimi shutil.copy(os.path.join(ROOT_DIR, 'prebuilt', STATIC_LIBRARY_FILE), LIBS_DIR) 129*9a0e4156SSadaf Ebrahimi return 130*9a0e4156SSadaf Ebrahimi 131*9a0e4156SSadaf Ebrahimi os.chdir(BUILD_DIR) 132*9a0e4156SSadaf Ebrahimi 133*9a0e4156SSadaf Ebrahimi # platform description refers at https://docs.python.org/2/library/sys.html#sys.platform 134*9a0e4156SSadaf Ebrahimi if SYSTEM == "win32": 135*9a0e4156SSadaf Ebrahimi # Windows build: this process requires few things: 136*9a0e4156SSadaf Ebrahimi # - CMake + MSVC installed 137*9a0e4156SSadaf Ebrahimi # - Run this command in an environment setup for MSVC 138*9a0e4156SSadaf Ebrahimi if not os.path.exists("build"): os.mkdir("build") 139*9a0e4156SSadaf Ebrahimi os.chdir("build") 140*9a0e4156SSadaf Ebrahimi # Do not build tests & static library 141*9a0e4156SSadaf Ebrahimi os.system('cmake -DCMAKE_BUILD_TYPE=RELEASE -DCAPSTONE_BUILD_TESTS=0 -DCAPSTONE_BUILD_STATIC=0 -G "NMake Makefiles" ..') 142*9a0e4156SSadaf Ebrahimi os.system("nmake") 143*9a0e4156SSadaf Ebrahimi elif "bsd" in SYSTEM: 144*9a0e4156SSadaf Ebrahimi # *BSD distinguishes make (BSD) vs gmake (GNU). Use cmake + bsd make :-) 145*9a0e4156SSadaf Ebrahimi if not os.path.exists("build"): os.mkdir("build") 146*9a0e4156SSadaf Ebrahimi os.chdir("build") 147*9a0e4156SSadaf Ebrahimi # Do not build tests & static library 148*9a0e4156SSadaf Ebrahimi os.system('cmake -DCMAKE_BUILD_TYPE=RELEASE -DCAPSTONE_BUILD_TESTS=0 -DCAPSTONE_BUILD_STATIC=0 ..') 149*9a0e4156SSadaf Ebrahimi os.system("make") 150*9a0e4156SSadaf Ebrahimi else: # Unix incl. cygwin 151*9a0e4156SSadaf Ebrahimi os.system("CAPSTONE_BUILD_CORE_ONLY=yes bash ./make.sh") 152*9a0e4156SSadaf Ebrahimi 153*9a0e4156SSadaf Ebrahimi shutil.copy(VERSIONED_LIBRARY_FILE, os.path.join(LIBS_DIR, LIBRARY_FILE)) 154*9a0e4156SSadaf Ebrahimi 155*9a0e4156SSadaf Ebrahimi # only copy static library if it exists (it's a build option) 156*9a0e4156SSadaf Ebrahimi if STATIC_LIBRARY_FILE and os.path.exists(STATIC_LIBRARY_FILE): 157*9a0e4156SSadaf Ebrahimi shutil.copy(STATIC_LIBRARY_FILE, LIBS_DIR) 158*9a0e4156SSadaf Ebrahimi os.chdir(cwd) 159*9a0e4156SSadaf Ebrahimi 160*9a0e4156SSadaf Ebrahimi 161*9a0e4156SSadaf Ebrahimiclass custom_sdist(sdist): 162*9a0e4156SSadaf Ebrahimi def run(self): 163*9a0e4156SSadaf Ebrahimi clean_bins() 164*9a0e4156SSadaf Ebrahimi copy_sources() 165*9a0e4156SSadaf Ebrahimi return sdist.run(self) 166*9a0e4156SSadaf Ebrahimi 167*9a0e4156SSadaf Ebrahimi 168*9a0e4156SSadaf Ebrahimiclass custom_build(build): 169*9a0e4156SSadaf Ebrahimi def run(self): 170*9a0e4156SSadaf Ebrahimi if 'LIBCAPSTONE_PATH' in os.environ: 171*9a0e4156SSadaf Ebrahimi log.info('Skipping building C extensions since LIBCAPSTONE_PATH is set') 172*9a0e4156SSadaf Ebrahimi else: 173*9a0e4156SSadaf Ebrahimi log.info('Building C extensions') 174*9a0e4156SSadaf Ebrahimi build_libraries() 175*9a0e4156SSadaf Ebrahimi return build.run(self) 176*9a0e4156SSadaf Ebrahimi 177*9a0e4156SSadaf Ebrahimi 178*9a0e4156SSadaf Ebrahimiclass custom_bdist_egg(bdist_egg): 179*9a0e4156SSadaf Ebrahimi def run(self): 180*9a0e4156SSadaf Ebrahimi self.run_command('build') 181*9a0e4156SSadaf Ebrahimi return bdist_egg.run(self) 182*9a0e4156SSadaf Ebrahimi 183*9a0e4156SSadaf Ebrahimidef dummy_src(): 184*9a0e4156SSadaf Ebrahimi return [] 185*9a0e4156SSadaf Ebrahimi 186*9a0e4156SSadaf Ebrahimicmdclass = {} 187*9a0e4156SSadaf Ebrahimicmdclass['build'] = custom_build 188*9a0e4156SSadaf Ebrahimicmdclass['sdist'] = custom_sdist 189*9a0e4156SSadaf Ebrahimicmdclass['bdist_egg'] = custom_bdist_egg 190*9a0e4156SSadaf Ebrahimi 191*9a0e4156SSadaf Ebrahimitry: 192*9a0e4156SSadaf Ebrahimi from setuptools.command.develop import develop 193*9a0e4156SSadaf Ebrahimi class custom_develop(develop): 194*9a0e4156SSadaf Ebrahimi def run(self): 195*9a0e4156SSadaf Ebrahimi log.info("Building C extensions") 196*9a0e4156SSadaf Ebrahimi build_libraries() 197*9a0e4156SSadaf Ebrahimi return develop.run(self) 198*9a0e4156SSadaf Ebrahimi 199*9a0e4156SSadaf Ebrahimi cmdclass['develop'] = custom_develop 200*9a0e4156SSadaf Ebrahimiexcept ImportError: 201*9a0e4156SSadaf Ebrahimi print("Proper 'develop' support unavailable.") 202*9a0e4156SSadaf Ebrahimi 203*9a0e4156SSadaf Ebrahimiif 'bdist_wheel' in sys.argv and '--plat-name' not in sys.argv: 204*9a0e4156SSadaf Ebrahimi idx = sys.argv.index('bdist_wheel') + 1 205*9a0e4156SSadaf Ebrahimi sys.argv.insert(idx, '--plat-name') 206*9a0e4156SSadaf Ebrahimi name = get_platform() 207*9a0e4156SSadaf Ebrahimi if 'linux' in name: 208*9a0e4156SSadaf Ebrahimi # linux_* platform tags are disallowed because the python ecosystem is fubar 209*9a0e4156SSadaf Ebrahimi # linux builds should be built in the centos 6 vm for maximum compatibility 210*9a0e4156SSadaf Ebrahimi # see https://github.com/pypa/manylinux 211*9a0e4156SSadaf Ebrahimi # see also https://github.com/angr/angr-dev/blob/master/bdist.sh and 212*9a0e4156SSadaf Ebrahimi # https://www.python.org/dev/peps/pep-0599/ 213*9a0e4156SSadaf Ebrahimi sys.argv.insert(idx + 1, 'manylinux2014_' + platform.machine()) 214*9a0e4156SSadaf Ebrahimi else: 215*9a0e4156SSadaf Ebrahimi # https://www.python.org/dev/peps/pep-0425/ 216*9a0e4156SSadaf Ebrahimi sys.argv.insert(idx + 1, name.replace('.', '_').replace('-', '_')) 217*9a0e4156SSadaf Ebrahimi 218*9a0e4156SSadaf Ebrahimilong_desc = ''' 219*9a0e4156SSadaf EbrahimiCapstone is a disassembly framework with the target of becoming the ultimate 220*9a0e4156SSadaf Ebrahimidisasm engine for binary analysis and reversing in the security community. 221*9a0e4156SSadaf Ebrahimi 222*9a0e4156SSadaf EbrahimiCreated by Nguyen Anh Quynh, then developed and maintained by a small community, 223*9a0e4156SSadaf EbrahimiCapstone offers some unparalleled features: 224*9a0e4156SSadaf Ebrahimi 225*9a0e4156SSadaf Ebrahimi- Support multiple hardware architectures: ARM, ARM64 (ARMv8), Mips, PPC, Sparc, 226*9a0e4156SSadaf Ebrahimi SystemZ, XCore and X86 (including X86_64). 227*9a0e4156SSadaf Ebrahimi 228*9a0e4156SSadaf Ebrahimi- Having clean/simple/lightweight/intuitive architecture-neutral API. 229*9a0e4156SSadaf Ebrahimi 230*9a0e4156SSadaf Ebrahimi- Provide details on disassembled instruction (called "decomposer" by others). 231*9a0e4156SSadaf Ebrahimi 232*9a0e4156SSadaf Ebrahimi- Provide semantics of the disassembled instruction, such as list of implicit 233*9a0e4156SSadaf Ebrahimi registers read & written. 234*9a0e4156SSadaf Ebrahimi 235*9a0e4156SSadaf Ebrahimi- Implemented in pure C language, with lightweight wrappers for C++, C#, Go, 236*9a0e4156SSadaf Ebrahimi Java, NodeJS, Ocaml, Python, Ruby & Vala ready (available in main code, 237*9a0e4156SSadaf Ebrahimi or provided externally by the community). 238*9a0e4156SSadaf Ebrahimi 239*9a0e4156SSadaf Ebrahimi- Native support for all popular platforms: Windows, Mac OSX, iOS, Android, 240*9a0e4156SSadaf Ebrahimi Linux, *BSD, Solaris, etc. 241*9a0e4156SSadaf Ebrahimi 242*9a0e4156SSadaf Ebrahimi- Thread-safe by design. 243*9a0e4156SSadaf Ebrahimi 244*9a0e4156SSadaf Ebrahimi- Special support for embedding into firmware or OS kernel. 245*9a0e4156SSadaf Ebrahimi 246*9a0e4156SSadaf Ebrahimi- High performance & suitable for malware analysis (capable of handling various 247*9a0e4156SSadaf Ebrahimi X86 malware tricks). 248*9a0e4156SSadaf Ebrahimi 249*9a0e4156SSadaf Ebrahimi- Distributed under the open source BSD license. 250*9a0e4156SSadaf Ebrahimi 251*9a0e4156SSadaf EbrahimiFurther information is available at http://www.capstone-engine.org 252*9a0e4156SSadaf Ebrahimi 253*9a0e4156SSadaf Ebrahimi 254*9a0e4156SSadaf Ebrahimi[License] 255*9a0e4156SSadaf Ebrahimi 256*9a0e4156SSadaf EbrahimiThis project is released under the BSD license. If you redistribute the binary 257*9a0e4156SSadaf Ebrahimior source code of Capstone, please attach file LICENSE.TXT with your products. 258*9a0e4156SSadaf Ebrahimi''' 259*9a0e4156SSadaf Ebrahimi 260*9a0e4156SSadaf Ebrahimisetup( 261*9a0e4156SSadaf Ebrahimi provides=['capstone'], 262*9a0e4156SSadaf Ebrahimi packages=['capstone'], 263*9a0e4156SSadaf Ebrahimi name='capstone', 264*9a0e4156SSadaf Ebrahimi version=VERSION, 265*9a0e4156SSadaf Ebrahimi author='Nguyen Anh Quynh', 266*9a0e4156SSadaf Ebrahimi author_email='[email protected]', 267*9a0e4156SSadaf Ebrahimi description='Capstone disassembly engine', 268*9a0e4156SSadaf Ebrahimi long_description=long_desc, 269*9a0e4156SSadaf Ebrahimi long_description_content_type="text/markdown", 270*9a0e4156SSadaf Ebrahimi url='https://www.capstone-engine.org', 271*9a0e4156SSadaf Ebrahimi python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*', 272*9a0e4156SSadaf Ebrahimi classifiers=[ 273*9a0e4156SSadaf Ebrahimi 'Development Status :: 5 - Production/Stable', 274*9a0e4156SSadaf Ebrahimi 'Intended Audience :: Developers', 275*9a0e4156SSadaf Ebrahimi 'Topic :: Software Development :: Build Tools', 276*9a0e4156SSadaf Ebrahimi 'License :: OSI Approved :: BSD License', 277*9a0e4156SSadaf Ebrahimi 'Programming Language :: Python :: 2', 278*9a0e4156SSadaf Ebrahimi 'Programming Language :: Python :: 2.7', 279*9a0e4156SSadaf Ebrahimi 'Programming Language :: Python :: 3', 280*9a0e4156SSadaf Ebrahimi ], 281*9a0e4156SSadaf Ebrahimi requires=['ctypes'], 282*9a0e4156SSadaf Ebrahimi cmdclass=cmdclass, 283*9a0e4156SSadaf Ebrahimi zip_safe=True, 284*9a0e4156SSadaf Ebrahimi include_package_data=True, 285*9a0e4156SSadaf Ebrahimi is_pure=False, 286*9a0e4156SSadaf Ebrahimi package_data={ 287*9a0e4156SSadaf Ebrahimi "capstone": ["lib/*", "include/capstone/*"], 288*9a0e4156SSadaf Ebrahimi } 289*9a0e4156SSadaf Ebrahimi) 290