xref: /aosp_15_r20/external/capstone/bindings/python/setup.py (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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