diff --git a/CMakeModules/FindNumpy.cmake b/CMakeModules/FindNumpy.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..dde321cfbb53a5a435518e61c57d3e812dd8fb3f
--- /dev/null
+++ b/CMakeModules/FindNumpy.cmake
@@ -0,0 +1,41 @@
+# Find the Python NumPy package
+# PYTHON_NUMPY_INCLUDE_DIR
+# PYTHON_NUMPY_FOUND
+# will be set by this script
+
+cmake_minimum_required(VERSION 2.6)
+
+if(NOT Python3_EXECUTABLE)
+    if(NumPy_FIND_QUIETLY)
+        find_package(Python3 QUIET)
+    else()
+        find_package(Python3)
+        set(__numpy_out 1)
+    endif()
+endif()
+
+if (Python3_EXECUTABLE)
+    # Find out the include path
+    execute_process(
+            COMMAND "${Python3_EXECUTABLE}" -c
+            "from __future__ import print_function\ntry: import numpy; print(numpy.get_include(), end='')\nexcept:pass\n"
+            OUTPUT_VARIABLE __numpy_path)
+    # And the version
+    execute_process(
+            COMMAND "${Python3_EXECUTABLE}" -c
+            "from __future__ import print_function\ntry: import numpy; print(numpy.__version__, end='')\nexcept:pass\n"
+            OUTPUT_VARIABLE __numpy_version)
+elseif(__numpy_out)
+    message(STATUS "Python executable not found.")
+endif(Python3_EXECUTABLE)
+
+find_path(PYTHON_NUMPY_INCLUDE_DIR numpy/arrayobject.h
+        HINTS "${__numpy_path}" "${PYTHON_INCLUDE_PATH}" NO_DEFAULT_PATH)
+
+if(PYTHON_NUMPY_INCLUDE_DIR)
+    set(PYTHON_NUMPY_FOUND 1 CACHE INTERNAL "Python numpy found")
+endif(PYTHON_NUMPY_INCLUDE_DIR)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(NumPy REQUIRED_VARS PYTHON_NUMPY_INCLUDE_DIR
+        VERSION_VAR __numpy_version)
\ No newline at end of file
diff --git a/CMakeModules/FindPython.cmake b/CMakeModules/FindPython.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..8969b896bde7029c28827e4072efee4faacdb226
--- /dev/null
+++ b/CMakeModules/FindPython.cmake
@@ -0,0 +1,224 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindPython
+----------
+
+Find Python interpreter, compiler and development environment (include
+directories and libraries).
+
+Three components are supported:
+
+* ``Interpreter``: search for Python interpreter.
+* ``Compiler``: search for Python compiler. Only offered by IronPython.
+* ``Development``: search for development artifacts (include directories and
+  libraries).
+* ``NumPy``: search for NumPy include directories.
+
+If no ``COMPONENTS`` is specified, ``Interpreter`` is assumed.
+
+To ensure consistent versions between components ``Interpreter``, ``Compiler``,
+``Development`` and ``NumPy``, specify all components at the same time::
+
+  find_package (Python COMPONENTS Interpreter Development)
+
+This module looks preferably for version 3 of Python. If not found, version 2
+is searched.
+To manage concurrent versions 3 and 2 of Python, use :module:`FindPython3` and
+:module:`FindPython2` modules rather than this one.
+
+.. note::
+
+  If components ``Interpreter`` and ``Development`` are both specified, this
+  module search only for interpreter with same platform architecture as the one
+  defined by ``CMake`` configuration. This contraint does not apply if only
+  ``Interpreter`` component is specified.
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+This module defines the following :ref:`Imported Targets <Imported Targets>`
+(when :prop_gbl:`CMAKE_ROLE` is ``PROJECT``):
+
+``Python::Interpreter``
+  Python interpreter. Target defined if component ``Interpreter`` is found.
+``Python::Compiler``
+  Python compiler. Target defined if component ``Compiler`` is found.
+``Python::Python``
+  Python library. Target defined if component ``Development`` is found.
+``Python::NumPy``
+  NumPy Python library. Target defined if component ``NumPy`` is found.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module will set the following variables in your project
+(see :ref:`Standard Variable Names <CMake Developer Standard Variable Names>`):
+
+``Python_FOUND``
+  System has the Python requested components.
+``Python_Interpreter_FOUND``
+  System has the Python interpreter.
+``Python_EXECUTABLE``
+  Path to the Python interpreter.
+``Python_INTERPRETER_ID``
+  A short string unique to the interpreter. Possible values include:
+    * Python
+    * ActivePython
+    * Anaconda
+    * Canopy
+    * IronPython
+``Python_STDLIB``
+  Standard platform independent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``.
+``Python_STDARCH``
+  Standard platform dependent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``.
+``Python_SITELIB``
+  Third-party platform independent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``.
+``Python_SITEARCH``
+  Third-party platform dependent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``.
+``Python_Compiler_FOUND``
+  System has the Python compiler.
+``Python_COMPILER``
+  Path to the Python compiler. Only offered by IronPython.
+``Python_COMPILER_ID``
+  A short string unique to the compiler. Possible values include:
+    * IronPython
+``Python_Development_FOUND``
+  System has the Python development artifacts.
+``Python_INCLUDE_DIRS``
+  The Python include directories.
+``Python_LIBRARIES``
+  The Python libraries.
+``Python_LIBRARY_DIRS``
+  The Python library directories.
+``Python_RUNTIME_LIBRARY_DIRS``
+  The Python runtime library directories.
+``Python_VERSION``
+  Python version.
+``Python_VERSION_MAJOR``
+  Python major version.
+``Python_VERSION_MINOR``
+  Python minor version.
+``Python_VERSION_PATCH``
+  Python patch version.
+``Python_NumPy_FOUND``
+  System has the NumPy.
+``Python_NumPy_INCLUDE_DIRS``
+  The NumPy include directries.
+``Python_NumPy_VERSION``
+  The NumPy version.
+
+Hints
+^^^^^
+
+``Python_ROOT_DIR``
+  Define the root directory of a Python installation.
+
+``Python_USE_STATIC_LIBS``
+  * If not defined, search for shared libraries and static libraries in that
+    order.
+  * If set to TRUE, search **only** for static libraries.
+  * If set to FALSE, search **only** for shared libraries.
+
+``Python_FIND_REGISTRY``
+  On Windows the ``Python_FIND_REGISTRY`` variable determine the order
+  of preference between registry and environment variables.
+  the ``Python_FIND_REGISTRY`` variable can be set to empty or one of the
+  following:
+
+  * ``FIRST``: Try to use registry before environment variables.
+    This is the default.
+  * ``LAST``: Try to use registry after environment variables.
+  * ``NEVER``: Never try to use registry.
+
+``CMAKE_FIND_FRAMEWORK``
+  On OS X the :variable:`CMAKE_FIND_FRAMEWORK` variable determine the order of
+  preference between Apple-style and unix-style package components.
+
+  .. note::
+
+    Value ``ONLY`` is not supported so ``FIRST`` will be used instead.
+
+.. note::
+
+  If a Python virtual environment is configured, set variable
+  ``Python_FIND_REGISTRY`` (Windows) or ``CMAKE_FIND_FRAMEWORK`` (macOS) with
+  value ``LAST`` or ``NEVER`` to select it preferably.
+
+Commands
+^^^^^^^^
+
+This module defines the command ``Python_add_library`` (when
+:prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
+:command:`add_library`, but takes care of Python module naming rules
+(only applied if library is of type ``MODULE``), and adds a dependency to target
+``Python::Python``::
+
+  Python_add_library (my_module MODULE src1.cpp)
+
+If library type is not specified, ``MODULE`` is assumed.
+#]=======================================================================]
+
+
+set (_PYTHON_PREFIX Python)
+
+if (DEFINED Python_FIND_VERSION)
+    set (_Python_REQUIRED_VERSION_MAJOR ${Python_FIND_VERSION_MAJOR})
+
+    include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake)
+else()
+    # iterate over versions in quiet and NOT required modes to avoid multiple
+    # "Found" messages and prematurally failure.
+    set (_Python_QUIETLY ${Python_FIND_QUIETLY})
+    set (_Python_REQUIRED ${Python_FIND_REQUIRED})
+    set (Python_FIND_QUIETLY TRUE)
+    set (Python_FIND_REQUIRED FALSE)
+
+    set (_Python_REQUIRED_VERSIONS 3 2)
+    set (_Python_REQUIRED_VERSION_LAST 2)
+
+    foreach (_Python_REQUIRED_VERSION_MAJOR IN LISTS _Python_REQUIRED_VERSIONS)
+        set (Python_FIND_VERSION ${_Python_REQUIRED_VERSION_MAJOR})
+        include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake)
+        if (Python_FOUND OR
+                _Python_REQUIRED_VERSION_MAJOR EQUAL _Python_REQUIRED_VERSION_LAST)
+            break()
+        endif()
+        # clean-up some CACHE variables to ensure look-up restart from scratch
+        foreach (_Python_ITEM IN LISTS _Python_CACHED_VARS)
+            unset (${_Python_ITEM} CACHE)
+        endforeach()
+    endforeach()
+
+    unset (Python_FIND_VERSION)
+
+    set (Python_FIND_QUIETLY ${_Python_QUIETLY})
+    set (Python_FIND_REQUIRED ${_Python_REQUIRED})
+    if (Python_FIND_REQUIRED OR NOT Python_FIND_QUIETLY)
+        # call again validation command to get "Found" or error message
+        find_package_handle_standard_args (Python HANDLE_COMPONENTS
+                REQUIRED_VARS ${_Python_REQUIRED_VARS}
+                VERSION_VAR Python_VERSION)
+    endif()
+endif()
+
+if (COMMAND __Python_add_library)
+    macro (Python_add_library)
+        __Python_add_library (Python ${ARGV})
+    endmacro()
+endif()
+
+unset (_PYTHON_PREFIX)
\ No newline at end of file
diff --git a/CMakeModules/FindPython/Support.cmake b/CMakeModules/FindPython/Support.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..4ff49d40881617506bf4d7108cb991d82b9ffe38
--- /dev/null
+++ b/CMakeModules/FindPython/Support.cmake
@@ -0,0 +1,1316 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#
+# This file is a "template" file used by various FindPython modules.
+#
+
+cmake_policy (VERSION 3.7)
+
+#
+# Initial configuration
+#
+if (NOT DEFINED _PYTHON_PREFIX)
+    message (FATAL_ERROR "FindPython: INTERNAL ERROR")
+endif()
+if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+    message (FATAL_ERROR "FindPython: INTERNAL ERROR")
+endif()
+if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 3)
+    set(_${_PYTHON_PREFIX}_VERSIONS 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
+elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 2)
+    set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0)
+else()
+    message (FATAL_ERROR "FindPython: INTERNAL ERROR")
+endif()
+
+get_property(_${_PYTHON_PREFIX}_CMAKE_ROLE GLOBAL PROPERTY CMAKE_ROLE)
+
+
+#
+# helper commands
+#
+macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG)
+    if (${_PYTHON_PREFIX}_FIND_REQUIRED)
+        message (FATAL_ERROR "${_PYTHON_MSG}")
+    else()
+        if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY)
+            message(STATUS "${_PYTHON_MSG}")
+        endif ()
+    endif()
+
+    set (${_PYTHON_PREFIX}_FOUND FALSE)
+    string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX)
+    set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE)
+    return()
+endmacro()
+
+
+macro (_PYTHON_FIND_FRAMEWORKS)
+    set (${_PYTHON_PREFIX}_FRAMEWORKS)
+    if (APPLE)
+        set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH}
+                $ENV{CMAKE_FRAMEWORK_PATH}
+                ~/Library/Frameworks
+                /usr/local/Frameworks
+                ${CMAKE_SYSTEM_FRAMEWORK_PATH})
+        list (REMOVE_DUPLICATES _pff_frameworks)
+        foreach (_pff_framework IN LISTS _pff_frameworks)
+            if (EXISTS ${_pff_framework}/Python.framework)
+                list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework)
+            endif()
+        endforeach()
+        unset (_pff_frameworks)
+        unset (_pff_framework)
+    endif()
+endmacro()
+
+function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION)
+    set (_PYTHON_FRAMEWORK_PATHS)
+    foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS)
+        list (APPEND _PYTHON_FRAMEWORK_PATHS
+                "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}")
+    endforeach()
+    set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE)
+endfunction()
+
+
+function (_PYTHON_VALIDATE_INTERPRETER)
+    if (NOT ${_PYTHON_PREFIX}_EXECUTABLE)
+        return()
+    endif()
+
+    if (ARGC EQUAL 1)
+        set (expected_version ${ARGV0})
+    else()
+        unset (expected_version)
+    endif()
+
+    get_filename_component (python_name "${${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
+
+    if (expected_version AND NOT python_name STREQUAL "python${expected_version}${CMAKE_EXECUTABLE_SUFFIX}")
+        # executable found must have a specific version
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))"
+                RESULT_VARIABLE result
+                OUTPUT_VARIABLE version
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (result OR NOT version EQUAL expected_version)
+            # interpreter not usable or has wrong major version
+            set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
+            return()
+        endif()
+    else()
+        if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}")
+            # executable found do not have version in name
+            # ensure major version is OK
+            execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                    "import sys; sys.stdout.write(str(sys.version_info[0]))"
+                    RESULT_VARIABLE result
+                    OUTPUT_VARIABLE version
+                    ERROR_QUIET
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+            if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+                # interpreter not usable or has wrong major version
+                set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
+                return()
+            endif()
+        endif()
+    endif()
+
+    if (CMAKE_SIZEOF_VOID_P AND "Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+            AND NOT CMAKE_CROSSCOMPILING)
+        # In this case, interpreter must have same architecture as environment
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))"
+                RESULT_VARIABLE result
+                OUTPUT_VARIABLE size
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P)
+            # interpreter not usable or has wrong architecture
+            set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
+            return()
+        endif()
+    endif()
+endfunction()
+
+
+function (_PYTHON_VALIDATE_COMPILER expected_version)
+    if (NOT ${_PYTHON_PREFIX}_COMPILER)
+        return()
+    endif()
+
+    # retrieve python environment version from compiler
+    set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
+    file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n")
+    execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${working_dir}/version.py"
+            WORKING_DIRECTORY "${working_dir}"
+            OUTPUT_QUIET
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+    execute_process (COMMAND "${working_dir}/version"
+            WORKING_DIRECTORY "${working_dir}"
+            RESULT_VARIABLE result
+            OUTPUT_VARIABLE version
+            ERROR_QUIET)
+    file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
+
+    if (result OR NOT version EQUAL expected_version)
+        # Compiler not usable or has wrong major version
+        set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE)
+    endif()
+endfunction()
+
+
+function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB)
+    string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}")
+    # look at runtime part on systems supporting it
+    if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR
+    (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN"
+            AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$"))
+        set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
+        # MSYS has a special syntax for runtime libraries
+        if (CMAKE_SYSTEM_NAME MATCHES "MSYS")
+            list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-")
+        endif()
+        find_library (${ARGV})
+    endif()
+endfunction()
+
+
+function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT)
+    unset (_PYTHON_DIRS)
+    set (_PYTHON_LIBS ${ARGV})
+    list (REMOVE_AT _PYTHON_LIBS 0)
+    foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS)
+        if (${_PYTHON_LIB})
+            get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY)
+            list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}")
+        endif()
+    endforeach()
+    if (_PYTHON_DIRS)
+        list (REMOVE_DUPLICATES _PYTHON_DIRS)
+    endif()
+    set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE)
+endfunction()
+
+
+# If major version is specified, it must be the same as internal major version
+if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR
+        AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+    _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong major version specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}\", but expected major version is \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"")
+endif()
+
+
+# handle components
+if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+    set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter)
+    set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE)
+endif()
+if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+    list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development")
+    list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+endif()
+foreach (_${_PYTHON_PREFIX}_COMPONENT IN LISTS ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+    set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE)
+endforeach()
+unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
+
+# Set versions to search
+## default: search any version
+set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS})
+
+if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1)
+    if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
+        set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR})
+    else()
+        unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
+        # add all compatible versions
+        foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
+            if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION)
+                list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
+            endif()
+        endforeach()
+    endif()
+endif()
+
+# Python and Anaconda distributions: define which architectures can be used
+if (CMAKE_SIZEOF_VOID_P)
+    # In this case, search only for 64bit or 32bit
+    math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
+    set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
+else()
+    # architecture unknown, search for both 64bit and 32bit
+    set (_${_PYTHON_PREFIX}_ARCH 64)
+    set (_${_PYTHON_PREFIX}_ARCH2 32)
+endif()
+
+# IronPython support
+if (CMAKE_SIZEOF_VOID_P)
+    # In this case, search only for 64bit or 32bit
+    math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
+    set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy)
+else()
+    # architecture unknown, search for natural interpreter
+    set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy)
+endif()
+set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40)
+
+# Apple frameworks handling
+_python_find_frameworks ()
+
+# Save CMAKE_FIND_APPBUNDLE
+if (DEFINED CMAKE_FIND_APPBUNDLE)
+    set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
+else()
+    unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
+endif()
+# To avoid app bundle lookup
+set (CMAKE_FIND_APPBUNDLE "NEVER")
+
+# Save CMAKE_FIND_FRAMEWORK
+if (DEFINED CMAKE_FIND_FRAMEWORK)
+    set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
+    if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
+        message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.")
+        set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
+    else()
+        set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
+    endif()
+else()
+    unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
+    set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
+endif()
+# To avoid framework lookup
+set (CMAKE_FIND_FRAMEWORK "NEVER")
+
+# Windows Registry handling
+if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY)
+    if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$")
+        message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_REGISTRY}: invalid value for '${_PYTHON_PREFIX}_FIND_REGISTRY'. 'FIRST', 'LAST' or 'NEVER' expected.")
+        set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
+    else()
+        set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY})
+    endif()
+else()
+    set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
+endif()
+
+
+unset (_${_PYTHON_PREFIX}_REQUIRED_VARS)
+unset (_${_PYTHON_PREFIX}_CACHED_VARS)
+
+
+# first step, search for the interpreter
+if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+    if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
+        list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
+        list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
+    endif()
+
+    set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
+
+    # look-up for various versions and locations
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
+        string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
+
+        _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
+
+        # Apple frameworks handling
+        if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+            find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                    python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    NAMES_PER_DIR
+                    PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                    PATH_SUFFIXES bin
+                    NO_CMAKE_PATH
+                    NO_CMAKE_ENVIRONMENT_PATH
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+        endif()
+
+        # Windows registry
+        if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+            find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                    python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    python
+                    ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                    NAMES_PER_DIR
+                    HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                    PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+        endif()
+
+        # try using HINTS
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                python
+                ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                NAMES_PER_DIR
+                HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                NO_SYSTEM_ENVIRONMENT_PATH
+                NO_CMAKE_SYSTEM_PATH)
+        # try using standard paths.
+        if (WIN32)
+            find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                    python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    python
+                    ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                    NAMES_PER_DIR)
+        else()
+            find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                    python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    NAMES_PER_DIR)
+        endif()
+
+        # Apple frameworks handling
+        if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+            find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                    python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    NAMES_PER_DIR
+                    PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                    PATH_SUFFIXES bin
+                    NO_DEFAULT_PATH)
+        endif()
+
+        # Windows registry
+        if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+            find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                    python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    python
+                    ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                    NAMES_PER_DIR
+                    PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                    NO_DEFAULT_PATH)
+        endif()
+
+        _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION})
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+            break()
+        endif()
+    endforeach()
+
+    if (NOT ${_PYTHON_PREFIX}_EXECUTABLE)
+        # No specific version found. Retry with generic names
+        # try using HINTS
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                python
+                ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                NAMES_PER_DIR
+                HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                NO_SYSTEM_ENVIRONMENT_PATH
+                NO_CMAKE_SYSTEM_PATH)
+        # try using standard paths.
+        # NAMES_PER_DIR is not defined on purpose to have a chance to find
+        # expected version.
+        # For example, typical systems have 'python' for version 2.* and 'python3'
+        # for version 3.*. So looking for names per dir will find, potentially,
+        # systematically 'python' (i.e. version 2) even if version 3 is searched.
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                python
+                ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
+
+        _python_validate_interpreter ()
+    endif()
+
+    # retrieve exact version of executable found
+    if (${_PYTHON_PREFIX}_EXECUTABLE)
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+            string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
+            list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
+            list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR)
+            list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH)
+        else()
+            # Interpreter is not usable
+            set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
+            unset (${_PYTHON_PREFIX}_VERSION)
+        endif()
+    endif()
+
+    if (${_PYTHON_PREFIX}_EXECUTABLE
+            AND ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+        set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
+        # Use interpreter version for future searches to ensure consistency
+        set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
+    endif()
+
+    if (${_PYTHON_PREFIX}_Interpreter_FOUND)
+        if (NOT CMAKE_SIZEOF_VOID_P)
+            # determine interpreter architecture
+            execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.maxsize > 2**32)"
+                    RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                    OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT
+                    ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT)
+            if (NOT _${_PYTHON_PREFIX}_RESULT)
+                if (${_PYTHON_PREFIX}_IS64BIT)
+                    set (_${_PYTHON_PREFIX}_ARCH 64)
+                    set (_${_PYTHON_PREFIX}_ARCH2 64)
+                else()
+                    set (_${_PYTHON_PREFIX}_ARCH 32)
+                    set (_${_PYTHON_PREFIX}_ARCH2 32)
+                endif()
+            endif()
+        endif()
+
+        # retrieve interpreter identity
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -V
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
+                ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+            if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda")
+                set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
+            elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
+                set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
+            else()
+                string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
+                if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
+                    # try to get a more precise ID
+                    execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)"
+                            RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                            OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
+                            ERROR_QUIET)
+                    if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState")
+                        set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython")
+                    endif()
+                endif()
+            endif()
+        else()
+            set (${_PYTHON_PREFIX}_INTERPRETER_ID Python)
+        endif()
+    else()
+        unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
+    endif()
+
+    # retrieve various package installation directories
+    execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))"
+
+            RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+            OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
+            ERROR_QUIET)
+    if (NOT _${_PYTHON_PREFIX}_RESULT)
+        list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
+        list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
+        list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB)
+        list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH)
+    else()
+        unset (${_PYTHON_PREFIX}_STDLIB)
+        unset (${_PYTHON_PREFIX}_STDARCH)
+        unset (${_PYTHON_PREFIX}_SITELIB)
+        unset (${_PYTHON_PREFIX}_SITEARCH)
+    endif()
+
+    mark_as_advanced (${_PYTHON_PREFIX}_EXECUTABLE)
+endif()
+
+
+# second step, search for compiler (IronPython)
+if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
+    if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler)
+        list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
+        list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_COMPILER)
+    endif()
+
+    # IronPython specific artifacts
+    # If IronPython interpreter is found, use its path
+    unset (_${_PYTHON_PREFIX}_IRON_ROOT)
+    if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
+        get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
+    endif()
+
+    # try using root dir and registry
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
+        if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+            find_program (${_PYTHON_PREFIX}_COMPILER
+                    NAMES ipyc
+                    HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
+                    PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+        endif()
+
+        find_program (${_PYTHON_PREFIX}_COMPILER
+                NAMES ipyc
+                HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
+                PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                NO_SYSTEM_ENVIRONMENT_PATH
+                NO_CMAKE_SYSTEM_PATH)
+
+        if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+            find_program (${_PYTHON_PREFIX}_COMPILER
+                    NAMES ipyc
+                    PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                    NO_DEFAULT_PATH)
+        endif()
+
+        _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION})
+        if (${_PYTHON_PREFIX}_COMPILER)
+            break()
+        endif()
+    endforeach()
+
+    # no specific version found, re-try in standard paths
+    find_program (${_PYTHON_PREFIX}_COMPILER
+            NAMES ipyc
+            HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
+            PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+
+    if (${_PYTHON_PREFIX}_COMPILER)
+        # retrieve python environment version from compiler
+        set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
+        file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
+                WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
+                OUTPUT_QUIET
+                ERROR_QUIET)
+        execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version"
+                WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
+                ERROR_QUIET)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+            string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
+            list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
+            list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
+            list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
+
+            if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND)
+                # set public version information
+                set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
+                set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
+                set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
+                set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
+            endif()
+        else()
+            # compiler not usable
+            set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE)
+        endif()
+        file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
+    endif()
+
+    if (${_PYTHON_PREFIX}_COMPILER)
+        if (${_PYTHON_PREFIX}_Interpreter_FOUND)
+            # Compiler must be compatible with interpreter
+            if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
+                set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
+            endif()
+        elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+            set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
+            # Use compiler version for future searches to ensure consistency
+            set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
+        endif()
+    endif()
+
+    if (${_PYTHON_PREFIX}_Compiler_FOUND)
+        set (${_PYTHON_PREFIX}_COMPILER_ID IronPython)
+    else()
+        unset (${_PYTHON_PREFIX}_COMPILER_ID)
+    endif()
+
+    mark_as_advanced (${_PYTHON_PREFIX}_COMPILER)
+endif()
+
+
+# third step, search for the development artifacts
+## Development environment is not compatible with IronPython interpreter
+if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+        AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
+    if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
+        list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARY
+                ${_PYTHON_PREFIX}_INCLUDE_DIR)
+        list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_LIBRARY
+                ${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+                ${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
+                ${_PYTHON_PREFIX}_INCLUDE_DIR)
+    endif()
+
+    # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
+    unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
+    if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32)
+        set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+        if(${_PYTHON_PREFIX}_USE_STATIC_LIBS)
+            set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
+        else()
+            list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
+        endif()
+    else()
+    endif()
+
+    # if python interpreter is found, use its location and version to ensure consistency
+    # between interpreter and development environment
+    unset (_${_PYTHON_PREFIX}_PREFIX)
+    if (${_PYTHON_PREFIX}_Interpreter_FOUND)
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX)"
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (_${_PYTHON_PREFIX}_RESULT)
+            unset (_${_PYTHON_PREFIX}_PREFIX)
+        endif()
+    endif()
+    set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
+
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
+        string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
+
+        # try to use pythonX.Y-config tool
+        set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
+        if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+            set (_${_PYTHON_PREFIX}_CONFIG_NAMES "${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config")
+        endif()
+        list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES "python${_${_PYTHON_PREFIX}_VERSION}-config")
+        find_program (_${_PYTHON_PREFIX}_CONFIG
+                NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
+                NAMES_PER_DIR
+                HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                PATH_SUFFIXES bin)
+        unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
+
+        if (NOT _${_PYTHON_PREFIX}_CONFIG)
+            continue()
+        endif()
+        if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+            # check that config tool match library architecture
+            execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
+                    RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                    OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
+                    ERROR_QUIET
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+            if (_${_PYTHON_PREFIX}_RESULT)
+                unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+                continue()
+            endif()
+            string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
+            if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
+                unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+                continue()
+            endif()
+        endif()
+
+        # retrieve root install directory
+        execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (_${_PYTHON_PREFIX}_RESULT)
+            # python-config is not usable
+            unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+            continue()
+        endif()
+        set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
+
+        # retrieve library
+        execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+            # retrieve library directory
+            string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_FLAGS}")
+            string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_LIB_DIRS}")
+            list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS)
+            # retrieve library name
+            string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_FLAGS}")
+            string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_LIB_NAMES}")
+            list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES)
+
+            find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                    NAMES_PER_DIR
+                    HINTS ${_${_PYTHON_PREFIX}_HINTS} ${_${_PYTHON_PREFIX}_LIB_DIRS}
+                    PATH_SUFFIXES lib
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+            # retrieve runtime library
+            if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+                get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+                _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+                        NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                        NAMES_PER_DIR
+                        HINTS ${_${_PYTHON_PREFIX}_PATH} ${_${_PYTHON_PREFIX}_HINTS}
+                        PATH_SUFFIXES bin
+                        NO_SYSTEM_ENVIRONMENT_PATH
+                        NO_CMAKE_SYSTEM_PATH)
+            endif()
+        endif()
+
+        # retrieve include directory
+        execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
+                ERROR_QUIET
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+            # retrieve include directory
+            string (REGEX MATCHALL "-I[^ ]+" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_FLAGS}")
+            string (REPLACE "-I" "" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIRS}")
+            list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_DIRS)
+
+            find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                    NAMES Python.h
+                    HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+        endif()
+
+        if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
+            break()
+        endif()
+    endforeach()
+
+    # Rely on HINTS and standard paths if config tool failed to locate artifacts
+    if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR)
+        foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
+            string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
+
+            _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
+
+            set (_${_PYTHON_PREFIX}_REGISTRY_PATHS
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+                    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath])
+
+            if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+                find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                        NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
+                        python${_${_PYTHON_PREFIX}_VERSION}mu
+                        python${_${_PYTHON_PREFIX}_VERSION}m
+                        python${_${_PYTHON_PREFIX}_VERSION}u
+                        python${_${_PYTHON_PREFIX}_VERSION}
+                        NAMES_PER_DIR
+                        PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                        PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config
+                        NO_CMAKE_PATH
+                        NO_CMAKE_ENVIRONMENT_PATH
+                        NO_SYSTEM_ENVIRONMENT_PATH
+                        NO_CMAKE_SYSTEM_PATH)
+            endif()
+
+            if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+                find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                        NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
+                        python${_${_PYTHON_PREFIX}_VERSION}mu
+                        python${_${_PYTHON_PREFIX}_VERSION}m
+                        python${_${_PYTHON_PREFIX}_VERSION}u
+                        python${_${_PYTHON_PREFIX}_VERSION}
+                        NAMES_PER_DIR
+                        HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                        PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                        PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
+                        lib/python${_${_PYTHON_PREFIX}_VERSION}/config
+                        NO_SYSTEM_ENVIRONMENT_PATH
+                        NO_CMAKE_SYSTEM_PATH)
+            endif()
+
+            # search in HINTS locations
+            find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
+                    python${_${_PYTHON_PREFIX}_VERSION}mu
+                    python${_${_PYTHON_PREFIX}_VERSION}m
+                    python${_${_PYTHON_PREFIX}_VERSION}u
+                    python${_${_PYTHON_PREFIX}_VERSION}
+                    NAMES_PER_DIR
+                    HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                    PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+
+            if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+                set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
+            else()
+                unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+            endif()
+
+            if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+                set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
+            else()
+                unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+            endif()
+
+            # search in all default paths
+            find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                    NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
+                    python${_${_PYTHON_PREFIX}_VERSION}mu
+                    python${_${_PYTHON_PREFIX}_VERSION}m
+                    python${_${_PYTHON_PREFIX}_VERSION}u
+                    python${_${_PYTHON_PREFIX}_VERSION}
+                    NAMES_PER_DIR
+                    PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                    ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                    PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
+                    lib/python${_${_PYTHON_PREFIX}_VERSION}/config)
+            # retrieve runtime library
+            if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+                get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+                _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+                        NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
+                        python${_${_PYTHON_PREFIX}_VERSION}mu
+                        python${_${_PYTHON_PREFIX}_VERSION}m
+                        python${_${_PYTHON_PREFIX}_VERSION}u
+                        python${_${_PYTHON_PREFIX}_VERSION}
+                        NAMES_PER_DIR
+                        HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
+                        PATH_SUFFIXES bin)
+            endif()
+
+            if (WIN32)
+                # search for debug library
+                if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+                    # use library location as a hint
+                    get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+                    find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                            NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                            NAMES_PER_DIR
+                            HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
+                            NO_DEFAULT_PATH)
+                else()
+                    # search first in known locations
+                    if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+                        find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                                NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                                NAMES_PER_DIR
+                                HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                                PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                                PATH_SUFFIXES lib libs
+                                NO_SYSTEM_ENVIRONMENT_PATH
+                                NO_CMAKE_SYSTEM_PATH)
+                    endif()
+                    # search in all default paths
+                    find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                            NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                            NAMES_PER_DIR
+                            HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                            PATHS ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                            PATH_SUFFIXES lib libs)
+                endif()
+                if (${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+                    get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
+                    _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
+                            NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                            NAMES_PER_DIR
+                            HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
+                            PATH_SUFFIXES bin)
+                endif()
+            endif()
+
+            # Don't search for include dir until library location is known
+            if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+                unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
+
+                if (${_PYTHON_PREFIX}_EXECUTABLE)
+                    # pick up include directory from configuration
+                    execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                            "import sys; import sysconfig; sys.stdout.write(sysconfig.get_path('include'))"
+                            RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                            OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PATH
+                            ERROR_QUIET
+                            OUTPUT_STRIP_TRAILING_WHITESPACE)
+                    if (NOT _${_PYTHON_PREFIX}_RESULT)
+                        file (TO_CMAKE_PATH "${_${_PYTHON_PREFIX}_PATH}" _${_PYTHON_PREFIX}_PATH)
+                        list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PATH}")
+                    endif()
+                endif()
+
+                foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+                    if (${_${_PYTHON_PREFIX}_LIB})
+                        # Use the library's install prefix as a hint
+                        if (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
+                            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+                        elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
+                            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+                        elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
+                            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+                        else()
+                            # assume library is in a directory under root
+                            get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY)
+                            get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
+                            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
+                        endif()
+                    endif()
+                endforeach()
+                list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS)
+
+                if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+                    find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                            NAMES Python.h
+                            HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                            PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                            PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
+                            include/python${_${_PYTHON_PREFIX}_VERSION}m
+                            include/python${_${_PYTHON_PREFIX}_VERSION}u
+                            include/python${_${_PYTHON_PREFIX}_VERSION}
+                            include
+                            NO_CMAKE_PATH
+                            NO_CMAKE_ENVIRONMENT_PATH
+                            NO_SYSTEM_ENVIRONMENT_PATH
+                            NO_CMAKE_SYSTEM_PATH)
+                endif()
+
+                if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+                    find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                            NAMES Python.h
+                            HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
+                            PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                            PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
+                            include/python${_${_PYTHON_PREFIX}_VERSION}m
+                            include/python${_${_PYTHON_PREFIX}_VERSION}u
+                            include/python${_${_PYTHON_PREFIX}_VERSION}
+                            include
+                            NO_SYSTEM_ENVIRONMENT_PATH
+                            NO_CMAKE_SYSTEM_PATH)
+                endif()
+
+                find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                        NAMES Python.h
+                        HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
+                        PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                        ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                        PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
+                        include/python${_${_PYTHON_PREFIX}_VERSION}m
+                        include/python${_${_PYTHON_PREFIX}_VERSION}u
+                        include/python${_${_PYTHON_PREFIX}_VERSION}
+                        include
+                        NO_SYSTEM_ENVIRONMENT_PATH
+                        NO_CMAKE_SYSTEM_PATH)
+            endif()
+
+            if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
+                break()
+            endif()
+        endforeach()
+
+        # search header file in standard locations
+        find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                NAMES Python.h)
+    endif()
+
+    if (${_PYTHON_PREFIX}_INCLUDE_DIR)
+        # retrieve version from header file
+        file (STRINGS "${${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" _${_PYTHON_PREFIX}_VERSION
+                REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
+        string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
+                _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_VERSION}")
+        string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
+        list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
+        list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
+        list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
+
+        if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND)
+            # set public version information
+            set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
+            set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
+            set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
+            set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
+        endif()
+    endif()
+
+    # define public variables
+    include (${CMAKE_CURRENT_LIST_DIR}/../SelectLibraryConfigurations.cmake)
+    select_library_configurations (${_PYTHON_PREFIX})
+    if (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
+        set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
+    elseif (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
+        set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
+    else()
+        set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "$${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
+    endif()
+
+    _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
+            ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+    if (UNIX)
+        if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
+                OR ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
+            set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
+        endif()
+    else()
+        _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
+                ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
+    endif()
+
+    set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
+
+    mark_as_advanced (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+            ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
+            ${_PYTHON_PREFIX}_INCLUDE_DIR)
+
+    if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+            AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
+        if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
+            # development environment must be compatible with interpreter/compiler
+            if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
+                set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
+            endif()
+        elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+            set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
+        endif()
+    endif()
+
+    # Restore the original find library ordering
+    if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
+        set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
+    endif()
+endif()
+
+if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Interpreter_FOUND)
+    if (${_PYTHON_PREFIX}_FIND_REQUIRED_NumPy)
+        list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
+        list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
+    endif()
+    execute_process(
+            COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+            "from __future__ import print_function\ntry: import numpy; print(numpy.get_include(), end='')\nexcept:pass\n"
+            RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+            OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if (NOT _${_PYTHON_PREFIX}_RESULT)
+        find_path(${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
+                NAMES "numpy/arrayobject.h" "numpy/numpyconfig.h"
+                HINTS "${_${_PYTHON_PREFIX}_NumPy_PATH}"
+                NO_DEFAULT_PATH)
+    endif()
+    if(${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
+        set(${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
+        set(${_PYTHON_PREFIX}_NumPy_FOUND TRUE)
+    endif()
+    if(${_PYTHON_PREFIX}_NumPy_FOUND)
+        execute_process(
+                COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                "from __future__ import print_function\ntry: import numpy; print(numpy.__version__, end='')\nexcept:pass\n"
+                RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+            set(${_PYTHON_PREFIX}_NumPy_VERSION "${_${_PYTHON_PREFIX}_NumPy_VERSION}")
+        endif()
+    endif()
+endif()
+
+# final validation
+if (${_PYTHON_PREFIX}_VERSION_MAJOR AND
+        NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
+    _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Found unsuitable major version \"${${_PYTHON_PREFIX}_VERSION_MAJOR}\", but required major version is exact version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"")
+endif()
+
+find_package_handle_standard_args (${_PYTHON_PREFIX}
+        REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS}
+        VERSION_VAR ${_PYTHON_PREFIX}_VERSION
+        HANDLE_COMPONENTS)
+
+# Create imported targets and helper functions
+if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
+    if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+            AND ${_PYTHON_PREFIX}_Interpreter_FOUND
+            AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter)
+        add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED)
+        set_property (TARGET ${_PYTHON_PREFIX}::Interpreter
+                PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}")
+    endif()
+
+    if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+            AND ${_PYTHON_PREFIX}_Compiler_FOUND
+            AND NOT TARGET ${_PYTHON_PREFIX}::Compiler)
+        add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED)
+        set_property (TARGET ${_PYTHON_PREFIX}::Compiler
+                PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
+    endif()
+
+    if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
+            AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python)
+
+        if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
+                OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
+                OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
+            set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED)
+        else()
+            set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC)
+        endif()
+
+        add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED)
+
+        set_property (TARGET ${_PYTHON_PREFIX}::Python
+                PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
+
+        if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
+                OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG))
+            # System manage shared libraries in two parts: import and runtime
+            if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+                set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
+                set_target_properties (${_PYTHON_PREFIX}::Python
+                        PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
+                        IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}"
+                        IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
+                set_target_properties (${_PYTHON_PREFIX}::Python
+                        PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
+                        IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}"
+                        IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
+            else()
+                set_target_properties (${_PYTHON_PREFIX}::Python
+                        PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+                        IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}"
+                        IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}")
+            endif()
+        else()
+            if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+                set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
+                set_target_properties (${_PYTHON_PREFIX}::Python
+                        PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
+                        IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
+                set_target_properties (${_PYTHON_PREFIX}::Python
+                        PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
+                        IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
+            else()
+                set_target_properties (${_PYTHON_PREFIX}::Python
+                        PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+                        IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}")
+            endif()
+        endif()
+
+        if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC")
+            # extend link information with dependent libraries
+            execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
+                    RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                    OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
+                    ERROR_QUIET
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+            if (NOT _${_PYTHON_PREFIX}_RESULT)
+                string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}")
+                # remove elements relative to python library itself
+                list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython")
+                foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS)
+                    list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}")
+                endforeach()
+                set_property (TARGET ${_PYTHON_PREFIX}::Python
+                        PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES})
+            endif()
+        endif()
+
+        #
+        # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN)
+        # It is used to build modules for python.
+        #
+        function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
+            cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
+                    "STATIC;SHARED;MODULE" "" "")
+
+            unset (type)
+            if (NOT (PYTHON_ADD_LIBRARY_STATIC
+                    OR PYTHON_ADD_LIBRARY_SHARED
+                    OR PYTHON_ADD_LIBRARY_MODULE))
+                set (type MODULE)
+            endif()
+            add_library (${name} ${type} ${ARGN})
+            target_link_libraries (${name} PRIVATE ${prefix}::Python)
+
+            # customize library name to follow module name rules
+            get_property (type TARGET ${name} PROPERTY TYPE)
+            if (type STREQUAL "MODULE_LIBRARY")
+                set_property (TARGET ${name} PROPERTY PREFIX "")
+                if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+                    set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
+                endif()
+            endif()
+        endfunction()
+    endif()
+
+    if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_NumPy_FOUND
+            AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET ${_PYTHON_PREFIX}::Python)
+        add_library (${_PYTHON_PREFIX}::NumPy INTERFACE IMPORTED)
+        set_property (TARGET ${_PYTHON_PREFIX}::NumPy
+                PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
+        target_link_libraries (${_PYTHON_PREFIX}::NumPy INTERFACE ${_PYTHON_PREFIX}::Python)
+    endif()
+endif()
+
+# final clean-up
+
+# Restore CMAKE_FIND_APPBUNDLE
+if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
+    set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE})
+    unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
+else()
+    unset (CMAKE_FIND_APPBUNDLE)
+endif()
+# Restore CMAKE_FIND_FRAMEWORK
+if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
+    set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK})
+    unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
+else()
+    unset (CMAKE_FIND_FRAMEWORK)
+endif()
+
+unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
\ No newline at end of file
diff --git a/CMakeModules/FindPython3.cmake b/CMakeModules/FindPython3.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3758908678a57eae74064e3e81412874968e015e
--- /dev/null
+++ b/CMakeModules/FindPython3.cmake
@@ -0,0 +1,189 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindPython3
+-----------
+
+Find Python 3 interpreter, compiler and development environment (include
+directories and libraries).
+
+Three components are supported:
+
+* ``Interpreter``: search for Python 3 interpreter
+* ``Compiler``: search for Python 3 compiler. Only offered by IronPython.
+* ``Development``: search for development artifacts (include directories and
+  libraries)
+* ``NumPy``: search for NumPy include directories.
+
+If no ``COMPONENTS`` is specified, ``Interpreter`` is assumed.
+
+To ensure consistent versions between components ``Interpreter``, ``Compiler``,
+``Development`` and ``NumPy``, specify all components at the same time::
+
+  find_package (Python3 COMPONENTS Interpreter Development)
+
+This module looks only for version 3 of Python. This module can be used
+concurrently with :module:`FindPython2` module to use both Python versions.
+
+The :module:`FindPython` module can be used if Python version does not matter
+for you.
+
+.. note::
+
+  If components ``Interpreter`` and ``Development`` are both specified, this
+  module search only for interpreter with same platform architecture as the one
+  defined by ``CMake`` configuration. This contraint does not apply if only
+  ``Interpreter`` component is specified.
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+This module defines the following :ref:`Imported Targets <Imported Targets>`
+(when :prop_gbl:`CMAKE_ROLE` is ``PROJECT``):
+
+``Python3::Interpreter``
+  Python 3 interpreter. Target defined if component ``Interpreter`` is found.
+``Python3::Compiler``
+  Python 3 compiler. Target defined if component ``Compiler`` is found.
+``Python3::Python``
+  Python 3 library. Target defined if component ``Development`` is found.
+``Python3::NumPy``
+  NumPy library for Python 3. Target defined if component ``NumPy`` is found.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module will set the following variables in your project
+(see :ref:`Standard Variable Names <CMake Developer Standard Variable Names>`):
+
+``Python3_FOUND``
+  System has the Python 3 requested components.
+``Python3_Interpreter_FOUND``
+  System has the Python 3 interpreter.
+``Python3_EXECUTABLE``
+  Path to the Python 3 interpreter.
+``Python3_INTERPRETER_ID``
+  A short string unique to the interpreter. Possible values include:
+    * Python
+    * ActivePython
+    * Anaconda
+    * Canopy
+    * IronPython
+``Python3_STDLIB``
+  Standard platform independent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``.
+``Python3_STDARCH``
+  Standard platform dependent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``.
+``Python3_SITELIB``
+  Third-party platform independent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``.
+``Python3_SITEARCH``
+  Third-party platform dependent installation directory.
+
+  Information returned by
+  ``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``.
+``Python3_Compiler_FOUND``
+  System has the Python 3 compiler.
+``Python3_COMPILER``
+  Path to the Python 3 compiler. Only offered by IronPython.
+``Python3_COMPILER_ID``
+  A short string unique to the compiler. Possible values include:
+    * IronPython
+``Python3_Development_FOUND``
+  System has the Python 3 development artifacts.
+``Python3_INCLUDE_DIRS``
+  The Python 3 include directories.
+``Python3_LIBRARIES``
+  The Python 3 libraries.
+``Python3_LIBRARY_DIRS``
+  The Python 3 library directories.
+``Python3_RUNTIME_LIBRARY_DIRS``
+  The Python 3 runtime library directories.
+``Python3_VERSION``
+  Python 3 version.
+``Python3_VERSION_MAJOR``
+  Python 3 major version.
+``Python3_VERSION_MINOR``
+  Python 3 minor version.
+``Python3_VERSION_PATCH``
+  Python 3 patch version.
+``Python3_NumPy_FOUND``
+  System has the NumPy.
+``Python3_NumPy_INCLUDE_DIRS``
+  The NumPy include directries.
+``Python3_NumPy_VERSION``
+  The NumPy version.
+
+Hints
+^^^^^
+
+``Python3_ROOT_DIR``
+  Define the root directory of a Python 3 installation.
+
+``Python3_USE_STATIC_LIBS``
+  * If not defined, search for shared libraries and static libraries in that
+    order.
+  * If set to TRUE, search **only** for static libraries.
+  * If set to FALSE, search **only** for shared libraries.
+
+``Python3_FIND_REGISTRY``
+  On Windows the ``Python3_FIND_REGISTRY`` variable determine the order
+  of preference between registry and environment variables.
+  the ``Python3_FIND_REGISTRY`` variable can be set to empty or one of the
+  following:
+
+  * ``FIRST``: Try to use registry before environment variables.
+    This is the default.
+  * ``LAST``: Try to use registry after environment variables.
+  * ``NEVER``: Never try to use registry.
+
+``CMAKE_FIND_FRAMEWORK``
+  On OS X the :variable:`CMAKE_FIND_FRAMEWORK` variable determine the order of
+  preference between Apple-style and unix-style package components.
+
+  .. note::
+
+    Value ``ONLY`` is not supported so ``FIRST`` will be used instead.
+
+.. note::
+
+  If a Python virtual environment is configured, set variable
+  ``Python_FIND_REGISTRY`` (Windows) or ``CMAKE_FIND_FRAMEWORK`` (macOS) with
+  value ``LAST`` or ``NEVER`` to select it preferably.
+
+Commands
+^^^^^^^^
+
+This module defines the command ``Python3_add_library`` (when
+:prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
+:command:`add_library`, but takes care of Python module naming rules
+(only applied if library is of type ``MODULE``), and adds a dependency to target
+``Python3::Python``::
+
+  Python3_add_library (my_module MODULE src1.cpp)
+
+If library type is not specified, ``MODULE`` is assumed.
+#]=======================================================================]
+
+
+set (_PYTHON_PREFIX Python3)
+
+set (_Python3_REQUIRED_VERSION_MAJOR 3)
+
+include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake)
+
+if (COMMAND __Python3_add_library)
+    macro (Python3_add_library)
+        __Python3_add_library (Python3 ${ARGV})
+    endmacro()
+endif()
+
+unset (_PYTHON_PREFIX)
\ No newline at end of file
diff --git a/CMakeModules/SelectLibraryConfigurations.cmake b/CMakeModules/SelectLibraryConfigurations.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..5c02324e910b37d3db1c695dcf0abd64f4c5ad09
--- /dev/null
+++ b/CMakeModules/SelectLibraryConfigurations.cmake
@@ -0,0 +1,80 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+SelectLibraryConfigurations
+---------------------------
+
+.. code-block:: cmake
+
+  select_library_configurations(basename)
+
+This macro takes a library base name as an argument, and will choose
+good values for the variables
+
+::
+
+  basename_LIBRARY
+  basename_LIBRARIES
+  basename_LIBRARY_DEBUG
+  basename_LIBRARY_RELEASE
+
+depending on what has been found and set.
+
+If only ``basename_LIBRARY_RELEASE`` is defined, ``basename_LIBRARY`` will
+be set to the release value, and ``basename_LIBRARY_DEBUG`` will be set
+to ``basename_LIBRARY_DEBUG-NOTFOUND``.  If only ``basename_LIBRARY_DEBUG``
+is defined, then ``basename_LIBRARY`` will take the debug value, and
+``basename_LIBRARY_RELEASE`` will be set to ``basename_LIBRARY_RELEASE-NOTFOUND``.
+
+If the generator supports configuration types, then ``basename_LIBRARY``
+and ``basename_LIBRARIES`` will be set with debug and optimized flags
+specifying the library to be used for the given configuration.  If no
+build type has been set or the generator in use does not support
+configuration types, then ``basename_LIBRARY`` and ``basename_LIBRARIES``
+will take only the release value, or the debug value if the release one
+is not set.
+#]=======================================================================]
+
+# This macro was adapted from the FindQt4 CMake module and is maintained by Will
+# Dicharry <wdicharry@stellarscience.com>.
+
+macro(select_library_configurations basename)
+    if(NOT ${basename}_LIBRARY_RELEASE)
+        set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.")
+    endif()
+    if(NOT ${basename}_LIBRARY_DEBUG)
+        set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.")
+    endif()
+
+    get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+    if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND
+            NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND
+    ( _isMultiConfig OR CMAKE_BUILD_TYPE ) )
+        # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
+        # single-config generators, set optimized and debug libraries
+        set( ${basename}_LIBRARY "" )
+        foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE )
+            list( APPEND ${basename}_LIBRARY optimized "${_libname}" )
+        endforeach()
+        foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG )
+            list( APPEND ${basename}_LIBRARY debug "${_libname}" )
+        endforeach()
+    elseif( ${basename}_LIBRARY_RELEASE )
+        set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} )
+    elseif( ${basename}_LIBRARY_DEBUG )
+        set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} )
+    else()
+        set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND")
+    endif()
+
+    set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" )
+
+    if( ${basename}_LIBRARY )
+        set( ${basename}_FOUND TRUE )
+    endif()
+
+    mark_as_advanced( ${basename}_LIBRARY_RELEASE
+            ${basename}_LIBRARY_DEBUG
+            )
+endmacro()
\ No newline at end of file
diff --git a/examples/worker/CMakeLists.txt b/examples/worker/CMakeLists.txt
index 54145573c1ede4ab18ab85c7496a7eab097d2f0c..4b97248aca03755f5649458cdea4bbb5c37806e3 100644
--- a/examples/worker/CMakeLists.txt
+++ b/examples/worker/CMakeLists.txt
@@ -3,6 +3,5 @@ find_package(Threads)
 add_subdirectory(process_folder)
 
 add_subdirectory(getnext_broker)
-IF (UNIX)
- add_subdirectory(getnext_broker_python)
-ENDIF()
+
+add_subdirectory(getnext_broker_python)
diff --git a/examples/worker/getnext_broker_python/CMakeLists.txt b/examples/worker/getnext_broker_python/CMakeLists.txt
index 693152336378f2bf49459512ba108f5faa11f484..3964a2a0eb38860566fd739df4e3b00eec3dfa12 100644
--- a/examples/worker/getnext_broker_python/CMakeLists.txt
+++ b/examples/worker/getnext_broker_python/CMakeLists.txt
@@ -3,8 +3,11 @@ set(TARGET_NAME getnext_broker_python)
 
 prepare_asapo()
 
-get_target_property(PYTHON_LIBS python-lib2 BINARY_DIR)
-
+if (UNIX)
+    get_target_property(PYTHON_LIBS python-lib2 BINARY_DIR)
+else()
+    get_target_property(PYTHON_LIBS asapo_worker BINARY_DIR)
+endif()
 
 add_script_test("${TARGET_NAME}" ${PYTHON_LIBS} nomem)
 
diff --git a/examples/worker/getnext_broker_python/check_windows.bat b/examples/worker/getnext_broker_python/check_windows.bat
index eaabc479ac42e9bfbbcdd6b9710a44a23de75c3d..8ead907ad35b19c2838c41721b443e5a7e941fd2 100644
--- a/examples/worker/getnext_broker_python/check_windows.bat
+++ b/examples/worker/getnext_broker_python/check_windows.bat
@@ -12,8 +12,14 @@ ping 1.0.0.0 -n 10 -w 100 > nul
 
 for /l %%x in (1, 1, 3) do echo db.data.insert({"_id":%%x,"size":100,"name":"%%x","lastchange":1,"source":"none","buf_id":0}) | %mongo_exe% %database_name%  || goto :error
 
+set PYTHONPATH=%1
+
+python3 getnext.py 127.0.0.1:8400  %source_path% %database_name%  %token_test_run% > out
+type out
+type out | findstr /c:"100" || goto :error
+type out | findstr /c:"\"id_\": 1" || goto :error
+
 
-"%1" 127.0.0.1:8400 %source_path% %database_name% 1 %token_test_run% 1000 1 | findstr /c:"Processed 3 file" || goto :error
 goto :clean
 
 :error
diff --git a/worker/CMakeLists.txt b/worker/CMakeLists.txt
index 823c14ea8ad614c290479a20ebfb9137ea605b64..93fb3845bddf214cc5872dde5f22167d763a0e80 100644
--- a/worker/CMakeLists.txt
+++ b/worker/CMakeLists.txt
@@ -1,7 +1,6 @@
 add_subdirectory(api/cpp)
-IF (UNIX)
- add_subdirectory(api/python)
-ENDIF()
+add_subdirectory(api/python)
+
 
 if(BUILD_WORKER_TOOLS)
     set (BUILD_MONGODB ON)
diff --git a/worker/api/python/CMakeLists.txt b/worker/api/python/CMakeLists.txt
index cdbf6fec7097bd91a89eaed5db7d86faf995d98e..a27c7af959963f4c8b7f8f283a00c39ed8231213 100644
--- a/worker/api/python/CMakeLists.txt
+++ b/worker/api/python/CMakeLists.txt
@@ -3,37 +3,18 @@ get_property(ASAPO_WORKER_LIB TARGET asapo-worker PROPERTY LOCATION)
 
 set (ASAPO_WORKER_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp/include)
 
-if ((CMAKE_BUILD_TYPE STREQUAL "Debug") AND (CMAKE_C_COMPILER_ID STREQUAL "GNU"))
-    set (EXTRA_COMPILE_ARGS "['--std=c++11']")
-    set (EXTRA_LINK_ARGS "['--coverage','-fprofile-arcs','-ftest-coverage','-static-libgcc','-static-libstdc++']")
-ELSE()
-    set (EXTRA_COMPILE_ARGS "['--std=c++11']")
-    set (EXTRA_LINK_ARGS "['-static-libgcc','-static-libstdc++']")
-ENDIF()
-
-
-configure_files(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} @ONLY)
-
-ADD_CUSTOM_TARGET(python-lib2 ALL
-        COMMAND python setup.py build_ext --inplace)
-
-ADD_CUSTOM_TARGET(python-lib3 ALL
-        COMMAND python3 setup.py build_ext --inplace)
-
-ADD_DEPENDENCIES(python-lib2 asapo-worker)
-ADD_DEPENDENCIES(python-lib3 asapo-worker)
-
-if (WIN32)
-    set (suf "dll")
-ELSE()
+if (UNIX)
+    include(CMakeLists_Linux.cmake)
     set (suf "so")
+ELSEIF(CMAKE_BUILD_TYPE STREQUAL "Release")
+    set (suf "pyd")
+    include(CMakeLists_Windows.cmake)
 ENDIF()
 
 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ DESTINATION lib/python/
         FILES_MATCHING PATTERN "*.${suf}"
         PATTERN "build" EXCLUDE
-        PATTERN "dist" EXCLUDE
+        PATTERN "source_dist_linux" EXCLUDE
         PATTERN "CMakeFiles" EXCLUDE
         )
 
-add_subdirectory(dist)
\ No newline at end of file
diff --git a/worker/api/python/CMakeLists_Linux.cmake b/worker/api/python/CMakeLists_Linux.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..79632458f502926d3a7824bd28b61be3342143b6
--- /dev/null
+++ b/worker/api/python/CMakeLists_Linux.cmake
@@ -0,0 +1,20 @@
+if ((CMAKE_BUILD_TYPE STREQUAL "Debug") AND (CMAKE_C_COMPILER_ID STREQUAL "GNU"))
+    set (EXTRA_COMPILE_ARGS "['--std=c++11']")
+    set (EXTRA_LINK_ARGS "['--coverage','-fprofile-arcs','-ftest-coverage','-static-libgcc','-static-libstdc++']")
+ELSE()
+    set (EXTRA_COMPILE_ARGS "['--std=c++11']")
+    set (EXTRA_LINK_ARGS "['-static-libgcc','-static-libstdc++']")
+ENDIF()
+
+configure_files(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} @ONLY)
+
+ADD_CUSTOM_TARGET(python-lib2 ALL
+        COMMAND python setup.py build_ext --inplace)
+
+ADD_CUSTOM_TARGET(python-lib3 ALL
+        COMMAND python3 setup.py build_ext --inplace)
+
+ADD_DEPENDENCIES(python-lib2 asapo-worker)
+ADD_DEPENDENCIES(python-lib3 asapo-worker)
+
+add_subdirectory(source_dist_linux)
diff --git a/worker/api/python/CMakeLists_Windows.cmake b/worker/api/python/CMakeLists_Windows.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3d1454141c953cfd8ff42a5ac55d1ec95a29855e
--- /dev/null
+++ b/worker/api/python/CMakeLists_Windows.cmake
@@ -0,0 +1,27 @@
+configure_files(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} @ONLY)
+
+find_package (Python3 REQUIRED COMPONENTS Development)
+find_package (Numpy REQUIRED)
+message ("   Python libaries:" ${Python3_LIBRARIES})
+message ("   Python includes:" ${Python3_INCLUDE_DIRS})
+message ("   Numpy:" ${PYTHON_NUMPY_INCLUDE_DIR})
+
+
+add_custom_command(OUTPUT asapo_worker.cpp
+        COMMAND ${Python3_EXECUTABLE} cythonize.py
+        DEPENDS asapo-worker)
+
+
+set(TARGET_NAME asapo_worker)
+
+set(SOURCE_FILES
+        asapo_worker.cpp)
+
+add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
+set_target_properties(${TARGET_NAME} PROPERTIES SUFFIX ".pyd")
+
+target_link_libraries(${TARGET_NAME}  asapo-worker ${Python3_LIBRARIES})
+target_include_directories(${TARGET_NAME} PUBLIC include  ${Python3_INCLUDE_DIRS} ${PYTHON_NUMPY_INCLUDE_DIR})
+
+
+add_subdirectory(binary_dist_windows)
diff --git a/worker/api/python/asapo_worker.pyx b/worker/api/python/asapo_worker.pyx
index 4b871df0b9fadbf374a754ea28b52d307f7a9b68..2296f834ee193ec86aeacb15c36c65aa69bff6ac 100644
--- a/worker/api/python/asapo_worker.pyx
+++ b/worker/api/python/asapo_worker.pyx
@@ -1,3 +1,5 @@
+#distutils: language=c++
+
 cimport asapo_worker
 import numpy as np
 cimport numpy as np
diff --git a/worker/api/python/binary_dist_windows/CMakeLists.txt b/worker/api/python/binary_dist_windows/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c05288e150a39872b4731f2fec31531a3daf1398
--- /dev/null
+++ b/worker/api/python/binary_dist_windows/CMakeLists.txt
@@ -0,0 +1,16 @@
+configure_file(setup.py.in setup.py @ONLY)
+
+ADD_CUSTOM_TARGET(windows-bdist ALL
+        COMMAND ${Python3_EXECUTABLE} setup.py bdist_wheel
+        )
+
+
+ADD_CUSTOM_TARGET(copy_python_bdist ALL
+        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/asapo_worker
+        COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/../asapo_worker.pyd ${CMAKE_CURRENT_BINARY_DIR}/asapo_worker/
+        )
+
+
+ADD_DEPENDENCIES(copy_python_bdist asapo_worker)
+
+ADD_DEPENDENCIES(windows-bdist copy_python_bdist)
diff --git a/worker/api/python/binary_dist_windows/setup.py.in b/worker/api/python/binary_dist_windows/setup.py.in
new file mode 100644
index 0000000000000000000000000000000000000000..6eddd7eb67ba9107a47a23574d1b3d7a4e9abcea
--- /dev/null
+++ b/worker/api/python/binary_dist_windows/setup.py.in
@@ -0,0 +1,12 @@
+import setuptools
+
+setuptools.setup(
+      name ="asapo_worker",
+      version = "@ASAPO_VERSION@",
+      install_requires=['numpy'],
+      include_package_data=True,
+      packages=['asapo_worker'],
+      package_data={
+        'asapo_worker': ['asapo_worker.pyd'],
+      },
+)
diff --git a/worker/api/python/cythonize.py b/worker/api/python/cythonize.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0c0ae871b4d742ec7f4324d96100e722bb52198
--- /dev/null
+++ b/worker/api/python/cythonize.py
@@ -0,0 +1,3 @@
+from Cython.Build import cythonize
+
+cythonize(["asapo_worker.pyx"])
diff --git a/worker/api/python/setup.py.in b/worker/api/python/setup.py.in
index fce22d782e0d2364d211eeec477c307ff4a8a8c6..6d61825cfe2fd12b06616132409605cd204ffcfd 100644
--- a/worker/api/python/setup.py.in
+++ b/worker/api/python/setup.py.in
@@ -1,6 +1,6 @@
 from distutils.core import setup
 from distutils.core import Extension
-import setuptools
+
 from Cython.Build import cythonize
 
 import numpy
@@ -14,14 +14,6 @@ module = Extension("asapo_worker", ["asapo_worker.pyx"],
                        language="c++",
          )
 
-setup(ext_modules=cythonize("asapo_worker.pyx", extra_objects=['@ASAPO_WORKER_LIB@',
-                           '@CURL_LIBRARIES@'],
-                            include_dirs=["@ASAPO_CXX_COMMON_INCLUDE_DIR@","@ASAPO_WORKER_INCLUDE_DIR@",numpy.get_include()],
-                            extra_compile_args=@EXTRA_COMPILE_ARGS@,
-                            extra_link_args=@EXTRA_LINK_ARGS@,
-                            language="c++",
-                            build_dir="build"),
-                            script_args=['build'],
-                            options={'build':{'build_lib':'.'}})
-
+ext_modules = cythonize([module])
 
+setup(ext_modules = ext_modules)
diff --git a/worker/api/python/dist/CMakeLists.txt b/worker/api/python/source_dist_linux/CMakeLists.txt
similarity index 100%
rename from worker/api/python/dist/CMakeLists.txt
rename to worker/api/python/source_dist_linux/CMakeLists.txt
diff --git a/worker/api/python/dist/MANIFEST.in b/worker/api/python/source_dist_linux/MANIFEST.in
similarity index 100%
rename from worker/api/python/dist/MANIFEST.in
rename to worker/api/python/source_dist_linux/MANIFEST.in
diff --git a/worker/api/python/dist/setup.py.in b/worker/api/python/source_dist_linux/setup.py.in
similarity index 95%
rename from worker/api/python/dist/setup.py.in
rename to worker/api/python/source_dist_linux/setup.py.in
index 2400bdddd465e0ca24826a36dbf3a4cf84f90df2..0739c8ae82b876f5079b93e915f6d076fa991799 100644
--- a/worker/api/python/dist/setup.py.in
+++ b/worker/api/python/source_dist_linux/setup.py.in
@@ -13,7 +13,7 @@ ext_modules = [
 ]
 
 setup(
-      name ="asapo_worker_py",
+      name ="asapo_worker",
       ext_modules = ext_modules,
       version = "@ASAPO_VERSION@",
       setup_requires=["numpy"],