-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
setup.py
133 lines (105 loc) · 3.58 KB
/
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# pylint: disable=missing-class-docstring
from __future__ import annotations
import glob
import importlib.resources
import os
import platform
import shutil
import subprocess
import sys
from distutils.command.build import build as st_build
from distutils.util import get_platform
from setuptools import Command, setup
from setuptools.command.develop import develop as st_develop
from setuptools.errors import LibError
if sys.platform == "darwin":
library_file = "angr_native.dylib"
elif sys.platform in ("win32", "cygwin"):
library_file = "angr_native.dll"
else:
library_file = "angr_native.so"
def _build_native():
try:
importlib.import_module("pyvex")
except ImportError as e:
raise LibError("You must install pyvex before building angr") from e
try:
importlib.import_module("unicorn")
except ImportError as e:
raise LibError("You must install unicorn before building angr") from e
env = os.environ.copy()
env_data = (
("UNICORN_INCLUDE_PATH", "unicorn", "include"),
("UNICORN_LIB_PATH", "unicorn", "lib"),
("UNICORN_LIB_FILE", "unicorn", "lib\\unicorn.lib"),
("PYVEX_INCLUDE_PATH", "pyvex", "include"),
("PYVEX_LIB_PATH", "pyvex", "lib"),
("PYVEX_LIB_FILE", "pyvex", "lib\\pyvex.lib"),
)
for var, pkg, fnm in env_data:
base = importlib.resources.files(pkg)
for child in fnm.split("\\"):
base = base.joinpath(child)
env[var] = str(base)
if sys.platform == "win32":
cmd = ["nmake", "/f", "Makefile-win"]
elif shutil.which("gmake") is not None:
cmd = ["gmake"]
else:
cmd = ["make"]
try:
subprocess.run(cmd, cwd="native", env=env, check=True)
except FileNotFoundError as err:
raise LibError("Couldn't find " + cmd[0] + " in PATH") from err
except subprocess.CalledProcessError as err:
raise LibError("Error while building angr_native: " + str(err)) from err
shutil.rmtree("angr/lib", ignore_errors=True)
os.mkdir("angr/lib")
shutil.copy(os.path.join("native", library_file), "angr/lib")
def _clean_native():
oglob = glob.glob("native/*.o")
oglob += glob.glob("native/*.obj")
oglob += glob.glob("native/*.so")
oglob += glob.glob("native/*.dll")
oglob += glob.glob("native/*.dylib")
for fname in oglob:
os.unlink(fname)
class build(st_build):
def run(self, *args):
self.execute(_build_native, (), msg="Building angr_native")
super().run(*args)
class clean_native(Command):
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
self.execute(_clean_native, (), msg="Cleaning angr_native")
class develop(st_develop):
def run(self):
self.run_command("build")
super().run()
cmdclass = {
"build": build,
"clean_native": clean_native,
"develop": develop,
}
try:
from setuptools.command.editable_wheel import editable_wheel as st_editable_wheel
class editable_wheel(st_editable_wheel):
def run(self):
self.run_command("build")
super().run()
cmdclass["editable_wheel"] = editable_wheel
except ModuleNotFoundError:
pass
if "bdist_wheel" in sys.argv and "--plat-name" not in sys.argv:
sys.argv.append("--plat-name")
name = get_platform()
if "linux" in name:
sys.argv.append("manylinux2014_" + platform.machine())
else:
# https://www.python.org/dev/peps/pep-0425/
sys.argv.append(name.replace(".", "_").replace("-", "_"))
setup(cmdclass=cmdclass)