diff --git a/hpy/tools/autogen/parse.py b/hpy/tools/autogen/parse.py index ce40e263..a7d83b0f 100644 --- a/hpy/tools/autogen/parse.py +++ b/hpy/tools/autogen/parse.py @@ -202,16 +202,26 @@ class HPyAPI: re.DOTALL | re.MULTILINE) def __init__(self, filename): - cpp_cmd = get_config_var('CC').split(' ') + cpp_cmd = get_config_var('CC') + if cpp_cmd: + cpp_cmd = cpp_cmd.split(' ') + elif sys.platform == 'win32': + cpp_cmd = [shutil.which("cl.exe")] if sys.platform == 'win32': cpp_cmd += ['/E', '/I%s' % CURRENT_DIR] else: cpp_cmd += ['-E', '-I%s' % CURRENT_DIR] + msvc = "cl.exe" in cpp_cmd[0].casefold() + csource = pycparser.preprocess_file(filename, cpp_path=str(cpp_cmd[0]), cpp_args=cpp_cmd[1:]) + # MSVC preprocesses _Pragma(foo) to __pragma(foo) + if msvc: + csource = re.sub(r'__pragma\(([^)]+)\)', r'#pragma \1\n', csource) + # Remove comments. NOTE: this assumes that comments are never inside # string literals, but there shouldn't be any here. def replace_keeping_newlines(m):