2020VERSION_MAJOR = 1
2121VERSION_MINOR = 0
2222VERSION_PATCH = 0
23+ ON = "ON"
24+ OFF = "OFF"
25+
26+ clang = "clang"
27+ clang_cl = "clang_cl"
28+ vs2022 = "vs2022"
29+ Release = "Release"
30+ Debug = "Debug"
2331
2432RELEASE_CANDIDATE = 4
33+ Z3_INTERFACE = ON
34+ LLVM_INTERFACE = OFF
35+ BITWUZLA_INTERFACE = OFF
36+ BOOST_INTERFACE = OFF
37+
38+ BUILDTOOLS = vs2022 # clang or clang_cl or vs2022
39+ CMAKE_BUILD_TYPE = Release # Release or Debug
2540
2641VERSION = f'{ VERSION_MAJOR } .{ VERSION_MINOR } .{ VERSION_PATCH } ' + \
2742 f'rc{ RELEASE_CANDIDATE } ' if RELEASE_CANDIDATE else ''
@@ -59,7 +74,7 @@ def build_extension(self, ext):
5974 cmake_args = [
6075 # General arguments.
6176 '-DPYTHON_EXECUTABLE=' + sys .executable ,
62- '-DCMAKE_BUILD_TYPE=Release' ,
77+ '-DCMAKE_BUILD_TYPE=' + CMAKE_BUILD_TYPE ,
6378 ]
6479
6580 # Interfaces can be defined using environment variables.
@@ -70,7 +85,7 @@ def build_extension(self, ext):
7085 # BITWUZLA_INTERFACE=Off
7186 # BOOST_INTERFACE=Off
7287 #
73- for arg , value in [('Z3_INTERFACE' , 'On' ), ('LLVM_INTERFACE' , 'Off' ), ('BITWUZLA_INTERFACE' , 'Off' ), ('BOOST_INTERFACE' , 'Off' )]:
88+ for arg , value in [('Z3_INTERFACE' , Z3_INTERFACE ), ('LLVM_INTERFACE' , LLVM_INTERFACE ), ('BITWUZLA_INTERFACE' , BITWUZLA_INTERFACE ), ('BOOST_INTERFACE' , BOOST_INTERFACE )]:
7489 if os .getenv (arg ):
7590 cmake_args += [f'-D{ arg } =' + os .getenv (arg )]
7691 else :
@@ -89,11 +104,27 @@ def build_extension(self, ext):
89104 build_args += ['--' , '-j4' ]
90105
91106 elif platform .system () == "Windows" :
92- cmake_args += [
93- '-G Visual Studio 17 2022' ,
94- ]
95- build_args += ['--' , '/m:4' ]
96-
107+ if BUILDTOOLS == vs2022 :
108+ cmake_args += [
109+ "-G Visual Studio 17 2022" ,
110+ ]
111+ build_args += ["--" , "/m:4" ]
112+ else :
113+ assert os .getenv ('COMPILER_DIR' ), "COMPILER_DIR(clang or clang_cl) env not found"
114+ if BUILDTOOLS == clang :
115+ cmake_args += [
116+ "-DCMAKE_C_COMPILER=" + os .getenv ('COMPILER_DIR' ) + "/clang.exe" ,
117+ "-DCMAKE_CXX_COMPILER=" + os .getenv ('COMPILER_DIR' ) + "/clang++.exe" ,
118+ "-DCMAKE_RC_COMPILER=" + os .getenv ('COMPILER_DIR' ) + "/llvm-rc.exe" ,
119+ "-G Ninja" ,
120+ ]
121+ if BUILDTOOLS == clang_cl :
122+ cmake_args += [
123+ "-DCMAKE_C_COMPILER= " + os .getenv ('COMPILER_DIR' ) + "/clang-cl.exe" ,
124+ "-DCMAKE_CXX_COMPILER=" + os .getenv ('COMPILER_DIR' ) + "/clang-cl.exe" ,
125+ "-DCMAKE_RC_COMPILER=" + os .getenv ('COMPILER_DIR' ) + "/llvm-rc.exe" ,
126+ "-G Ninja" ,
127+ ]
97128 else :
98129 raise Exception (f'Platform not supported: { platform .system ()} ' )
99130
@@ -123,7 +154,6 @@ def build_extension(self, ext):
123154
124155 if os .getenv ('BITWUZLA_INCLUDE_DIRS' ):
125156 cmake_args += ['-DBITWUZLA_INCLUDE_DIRS=' + os .getenv ('BITWUZLA_INCLUDE_DIRS' )]
126-
127157 # Custom Capstone paths.
128158 if os .getenv ('CAPSTONE_LIBRARIES' ):
129159 cmake_args += ['-DCAPSTONE_LIBRARIES=' + os .getenv ('CAPSTONE_LIBRARIES' )]
@@ -155,11 +185,11 @@ def build_extension(self, ext):
155185 os .makedirs (self .build_lib )
156186
157187 subprocess .check_call (['cmake' , ext .sourcedir ] + cmake_args , cwd = self .build_temp , env = env )
158- subprocess .check_call (['cmake' , '--build' , '.' , '--config' , 'Release' , '--target' , 'python-triton' ] + build_args , cwd = self .build_temp )
188+ subprocess .check_call (['cmake' , '--build' , '.' , '--config' , CMAKE_BUILD_TYPE , '--target' , 'python-triton' ] + build_args , cwd = self .build_temp )
159189
160190 # The autocomplete file has to be built separately.
161191 if (is_cmake_true (python_autocomplete_value )):
162- subprocess .check_call (['cmake' , '--build' , '.' , '--config' , 'Release' , '--target' , 'python_autocomplete' ], cwd = self .build_temp )
192+ subprocess .check_call (['cmake' , '--build' , '.' , '--config' , CMAKE_BUILD_TYPE , '--target' , 'python_autocomplete' ], cwd = self .build_temp )
163193
164194 def copy_extension_to_source (self , ext ):
165195 fullname = self .get_ext_fullname (ext .name )
@@ -172,7 +202,10 @@ def copy_extension_to_source(self, ext):
172202 src_filename = os .path .join (self .build_temp + '/src/libtriton' , 'libtriton.dylib' )
173203 dst_filename = os .path .join (self .build_lib , os .path .basename (filename ))
174204 elif platform .system () == "Windows" :
175- src_filename = os .path .join (self .build_temp + '\\ src\\ libtriton\\ Release' , 'triton.pyd' )
205+ if BUILDTOOLS == vs2022 :
206+ src_filename = os .path .join (self .build_temp + '/src/libtriton/' + CMAKE_BUILD_TYPE , 'triton.pyd' )
207+ else :
208+ src_filename = os .path .join (self .build_temp + '/src/libtriton' , 'triton.pyd' )
176209 dst_filename = os .path .join (self .build_lib , os .path .basename (filename ))
177210 else :
178211 raise Exception (f'Platform not supported: { platform .system ()} ' )
0 commit comments