From 966e86332648299d039abb34d4a89be3374a44ee Mon Sep 17 00:00:00 2001
From: Martin Bauer <martin.bauer@fau.de>
Date: Thu, 14 Jun 2018 09:35:48 +0200
Subject: [PATCH] New CPU backend - windows adaptations

---
 cpu/cpujit.py | 45 ++++++++++++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/cpu/cpujit.py b/cpu/cpujit.py
index f014ec7e2..de832d240 100644
--- a/cpu/cpujit.py
+++ b/cpu/cpujit.py
@@ -56,7 +56,7 @@ from appdirs import user_config_dir, user_cache_dir
 from collections import OrderedDict
 from pystencils.utils import recursive_dict_update
 from sysconfig import get_paths
-from pystencils import FieldType
+from pystencils import FieldType, Field
 from pystencils.data_types import get_base_type
 from pystencils.backends.cbackend import generate_c, get_headers
 from pystencils.utils import file_handle_for_atomic_write, atomic_file_write
@@ -320,15 +320,17 @@ def create_function_boilerplate_code(parameter_info, name, insert_checks=True):
 
                 shapes = ", ".join(["buffer_{name}.shape[{i}]".format(name=arg.field_name, i=i)
                                     for i in range(len(arg.field.strides))])
-                pre_call_code += "Py_ssize_t {name}_shape[] = {{ {elements} }};\n".format(name=arg.field_name,
-                                                                                          elements=shapes)
+                pre_call_code += "{type} {name}_shape[] = {{ {elements} }};\n".format(type=get_base_type(Field.SHAPE_DTYPE),
+                                                                                      name=arg.field_name,
+                                                                                      elements=shapes)
 
                 item_size = get_base_type(arg.dtype).numpy_dtype.itemsize
                 strides = ["buffer_{name}.strides[{i}] / {bytes}".format(i=i, name=arg.field_name, bytes=item_size)
                            for i in range(len(arg.field.strides))]
                 strides = ", ".join(strides)
-                pre_call_code += "Py_ssize_t {name}_strides[] = {{ {elements} }};\n".format(name=arg.field_name,
-                                                                                            elements=strides)
+                pre_call_code += "{type} {name}_strides[] = {{ {elements} }};\n".format(type=get_base_type(Field.STRIDE_DTYPE),
+                                                                                        name=arg.field_name,
+                                                                                        elements=strides)
 
                 if insert_checks and arg.field.has_fixed_shape:
                     shape_cond = ["{name}_shape[{i}] == {s}".format(s=s, name=arg.field_name, i=i)
@@ -447,7 +449,7 @@ def compile_and_load(ast):
 
     if compiler_config['os'].lower() == 'windows':
         function_prefix = '__declspec(dllexport)'
-        lib_suffix = '.dll'
+        lib_suffix = '.pyd'
         object_suffix = '.obj'
         windows = True
     else:
@@ -467,19 +469,28 @@ def compile_and_load(ast):
         if not os.path.exists(object_file):
             with file_handle_for_atomic_write(src_file) as f:
                 code.write_to_file(compiler_config['restrict_qualifier'], function_prefix, f)
-            with atomic_file_write(object_file) as file_name:
-                if windows:
-                    compile_cmd = ['cl.exe', '/c', '/EHsc'] + compiler_config['flags'].split()
-                    compile_cmd += [*extra_flags, src_file, '/Fo' + object_file]
-                else:
+
+            if windows:
+                compile_cmd = ['cl.exe', '/c', '/EHsc'] + compiler_config['flags'].split()
+                compile_cmd += [*extra_flags, src_file, '/Fo' + object_file]
+                run_compile_step(compile_cmd)
+            else:
+                with atomic_file_write(object_file) as file_name:
                     compile_cmd = [compiler_config['command'], '-c'] + compiler_config['flags'].split()
                     compile_cmd += [*extra_flags, '-o', file_name, src_file]
-                run_compile_step(compile_cmd)
-
-        # Linking
-        with atomic_file_write(lib_file) as file_name:
-            run_compile_step([compiler_config['command'], '-shared', object_file, '-o', file_name] +
-                             compiler_config['flags'].split())
+                    run_compile_step(compile_cmd)
+
+            # Linking
+            if windows:
+                import sysconfig
+                config_vars = sysconfig.get_config_vars()
+                py_lib = os.path.join(config_vars["installed_base"], "libs",
+                                      "python{}.lib".format(config_vars["py_version_nodot"]))
+                run_compile_step(['link.exe', py_lib, '/DLL', '/out:' + lib_file, object_file])
+            else:
+                with atomic_file_write(lib_file) as file_name:
+                    run_compile_step([compiler_config['command'], '-shared', object_file, '-o', file_name] +
+                                     compiler_config['flags'].split())
 
     result = load_kernel_from_file(code_hash_str, ast.function_name, lib_file)
     return KernelWrapper(result, ast.parameters, ast)
-- 
GitLab