11#!/usr/bin/env python3
22
33import argparse
4+ import os
5+ import platform
46import sys
57from pathlib import Path
68
@@ -156,7 +158,7 @@ def render_fficonfig(os_name, target_arch):
156158
157159def generate_headers (output_dir , target_arch , os_name ):
158160 base_dir = Path (__file__ ).resolve ().parent
159- output_dir = Path (output_dir )
161+ output_dir = Path (str ( output_dir ). strip (). strip ( '"' ) )
160162 output_dir .mkdir (parents = True , exist_ok = True )
161163
162164 target , target_dir = get_target (os_name , target_arch )
@@ -175,15 +177,62 @@ def generate_headers(output_dir, target_arch, os_name):
175177 encoding = 'utf-8' )
176178
177179
180+ def detect_os_name ():
181+ if sys .platform .startswith ('win' ):
182+ return 'win'
183+ if sys .platform == 'darwin' :
184+ return 'mac'
185+ if sys .platform .startswith ('linux' ):
186+ return 'linux'
187+ if sys .platform .startswith ('freebsd' ):
188+ return 'freebsd'
189+ raise ValueError (f'Unsupported host platform { sys .platform !r} ' )
190+
191+
192+ def detect_target_arch ():
193+ candidates = [
194+ os .environ .get ('TARGET_ARCH' ),
195+ os .environ .get ('npm_config_arch' ),
196+ os .environ .get ('VSCMD_ARG_TGT_ARCH' ),
197+ os .environ .get ('Platform' ),
198+ os .environ .get ('PROCESSOR_ARCHITECTURE' ),
199+ platform .machine (),
200+ ]
201+
202+ aliases = {
203+ 'amd64' : 'x64' ,
204+ 'x86_64' : 'x64' ,
205+ 'x64' : 'x64' ,
206+ 'win32' : 'x64' ,
207+ 'i386' : 'x86' ,
208+ 'i686' : 'x86' ,
209+ 'x86' : 'x86' ,
210+ 'arm64' : 'arm64' ,
211+ 'aarch64' : 'arm64' ,
212+ 'arm' : 'arm' ,
213+ }
214+
215+ for candidate in candidates :
216+ if not candidate :
217+ continue
218+ normalized = aliases .get (candidate .lower ())
219+ if normalized is not None :
220+ return normalized
221+
222+ raise ValueError ('Unable to determine target architecture for libffi headers' )
223+
224+
178225def main (argv = None ):
179226 parser = argparse .ArgumentParser (description = 'Generate libffi headers' )
180227 parser .add_argument ('--output-dir' , required = True )
181- parser .add_argument ('--target-arch' , required = True )
182- parser .add_argument ('--os' , required = True )
228+ parser .add_argument ('--target-arch' )
229+ parser .add_argument ('--os' )
183230 args = parser .parse_args (argv )
184231
185232 try :
186- generate_headers (args .output_dir , args .target_arch , args .os )
233+ generate_headers (args .output_dir ,
234+ args .target_arch or detect_target_arch (),
235+ args .os or detect_os_name ())
187236 except Exception as exc : # pylint: disable=broad-except
188237 print (exc , file = sys .stderr )
189238 return 1
0 commit comments