1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
|
.. _f2py-windows:
=================
F2PY and Windows
=================
.. warning::
F2PY support for Windows is not at par with Linux support, and
OS specific flags can be seen via ``python -m numpy.f2py``
Broadly speaking, there are two issues working with F2PY on Windows:
- the lack of actively developed FOSS Fortran compilers, and,
- the linking issues related to the C runtime library for building Python-C extensions.
The focus of this section is to establish a guideline for developing and
extending Fortran modules for Python natively, via F2PY on Windows.
Overview
========
From a user perspective, the most UNIX compatible Windows
development environment is through emulation, either via the Windows Subsystem
on Linux, or facilitated by Docker. In a similar vein, traditional
virtualization methods like VirtualBox are also reasonable methods to develop
UNIX tools on Windows.
Native Windows support is typically stunted beyond the usage of commercial compilers.
However, as of 2022, most commercial compilers have free plans which are sufficient for
general use. Additionally, the Fortran language features supported by ``f2py``
(partial coverage of Fortran 2003), means that newer toolchains are often not
required. Briefly, then, for an end user, in order of use:
Classic Intel Compilers (commercial)
These are maintained actively, though licensing restrictions may apply as
further detailed in :ref:`f2py-win-intel`.
Suitable for general use for those building native Windows programs by
building off of MSVC.
MSYS2 (FOSS)
In conjunction with the ``mingw-w64`` project, ``gfortran`` and ``gcc``
toolchains can be used to natively build Windows programs.
Windows Subsystem for Linux
Assuming the usage of ``gfortran``, this can be used for cross-compiling
Windows applications, but is significantly more complicated.
Conda
Windows support for compilers in ``conda`` is facilitated by pulling MSYS2
binaries, however these `are outdated`_, and therefore not recommended (as of 30-01-2022).
PGI Compilers (commercial)
Unmaintained but sufficient if an existing license is present. Works
natively, but has been superseded by the Nvidia HPC SDK, with no `native
Windows support`_.
Cygwin (FOSS)
Can also be used for ``gfortran``. Howeve, the POSIX API compatibility layer provided by
Cygwin is meant to compile UNIX software on Windows, instead of building
native Windows programs. This means cross compilation is required.
The compilation suites described so far are compatible with the `now
deprecated`_ ``np.distutils`` build backend which is exposed by the F2PY CLI.
Additional build system usage (``meson``, ``cmake``) as described in
:ref:`f2py-bldsys` allows for a more flexible set of compiler
backends including:
Intel oneAPI
The newer Intel compilers (``ifx``, ``icx``) are based on LLVM and can be
used for native compilation. Licensing requirements can be onerous.
Classic Flang (FOSS)
The backbone of the PGI compilers were cannibalized to form the "classic" or
`legacy version of Flang`_. This may be compiled from source and used
natively. `LLVM Flang`_ does not support Windows yet (30-01-2022).
LFortran (FOSS)
One of two LLVM based compilers. Not all of F2PY supported Fortran can be
compiled yet (30-01-2022) but uses MSVC for native linking.
Baseline
========
For this document we will assume the following basic tools:
- The IDE being considered is the community supported `Microsoft Visual Studio Code`_
- The terminal being used is the `Windows Terminal`_
- The shell environment is assumed to be `Powershell 7.x`_
- Python 3.10 from `the Microsoft Store`_ and this can be tested with
``Get-Command python.exe`` resolving to
``C:\Users\$USERNAME\AppData\Local\Microsoft\WindowsApps\python.exe``
- The Microsoft Visual C++ (MSVC) toolset
With this baseline configuration, we will further consider a configuration
matrix as follows:
.. _table-f2py-winsup-mat:
.. table:: Support matrix, exe implies a Windows installer
+----------------------+--------------------+-------------------+
| **Fortran Compiler** | **C/C++ Compiler** | **Source** |
+======================+====================+===================+
| Intel Fortran | MSVC / ICC | exe |
+----------------------+--------------------+-------------------+
| GFortran | MSVC | MSYS2/exe |
+----------------------+--------------------+-------------------+
| GFortran | GCC | WSL |
+----------------------+--------------------+-------------------+
| Classic Flang | MSVC | Source / Conda |
+----------------------+--------------------+-------------------+
| Anaconda GFortran | Anaconda GCC | exe |
+----------------------+--------------------+-------------------+
For an understanding of the key issues motivating the need for such a matrix
`Pauli Virtanen's in-depth post on wheels with Fortran for Windows`_ is an
excellent resource. An entertaining explanation of an application binary
interface (ABI) can be found in this post by `JeanHeyd Meneide`_.
Powershell and MSVC
====================
MSVC is installed either via the Visual Studio Bundle or the lighter (preferred)
`Build Tools for Visual Studio`_ with the ``Desktop development with C++``
setting.
.. note::
This can take a significant amount of time as it includes a download of around
2GB and requires a restart.
It is possible to use the resulting environment from a `standard command
prompt`_. However, it is more pleasant to use a `developer powershell`_,
with a `profile in Windows Terminal`_. This can be achieved by adding the
following block to the ``profiles->list`` section of the JSON file used to
configure Windows Terminal (see ``Settings->Open JSON file``):
.. code-block:: json
{
"name": "Developer PowerShell for VS 2019",
"commandline": "powershell.exe -noe -c \"$vsPath = (Join-Path ${env:ProgramFiles(x86)} -ChildPath 'Microsoft Visual Studio\\2019\\BuildTools'); Import-Module (Join-Path $vsPath 'Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'); Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation\"",
"icon": "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png"
}
Now, testing the compiler toolchain could look like:
.. code-block:: powershell
# New Windows Developer Powershell instance / tab
# or
$vsPath = (Join-Path ${env:ProgramFiles(x86)} -ChildPath 'Microsoft Visual Studio\\2019\\BuildTools');
Import-Module (Join-Path $vsPath 'Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll');
Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation
**********************************************************************
** Visual Studio 2019 Developer PowerShell v16.11.9
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
cd $HOME
echo "#include<stdio.h>" > blah.cpp; echo 'int main(){printf("Hi");return 1;}' >> blah.cpp
cl blah.cpp
.\blah.exe
# Hi
rm blah.cpp
It is also possible to check that the environment has been updated correctly
with ``$ENV:PATH``.
Windows Store Python Paths
==========================
The MS Windows version of Python discussed here installs to a non-deterministic
path using a hash. This needs to be added to the ``PATH`` variable.
.. code-block:: powershell
$Env:Path += ";$env:LOCALAPPDATA\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\scripts"
.. toctree::
:maxdepth: 2
intel
msys2
conda
pgi
.. _the Microsoft Store: https://www.microsoft.com/en-us/p/python-310/9pjpw5ldxlz5
.. _Microsoft Visual Studio Code: https://code.visualstudio.com/Download
.. _more complete POSIX environment: https://www.cygwin.com/
.. _This MSYS2 document: https://www.msys2.org/wiki/How-does-MSYS2-differ-from-Cygwin/
.. _Build Tools for Visual Studio: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2019
.. _Windows Terminal: https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab
.. _Powershell 7.x: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.1
.. _standard command prompt: https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160#developer_command_file_locations
.. _developer powershell: https://docs.microsoft.com/en-us/visualstudio/ide/reference/command-prompt-powershell?view=vs-2019
.. _profile in Windows Terminal: https://techcommunity.microsoft.com/t5/microsoft-365-pnp-blog/add-developer-powershell-and-developer-command-prompt-for-visual/ba-p/2243078
.. _Pauli Virtanen's in-depth post on wheels with Fortran for Windows: https://pav.iki.fi/blog/2017-10-08/pywingfortran.html#building-python-wheels-with-fortran-for-windows
.. _Nvidia HPC SDK: https://www.pgroup.com/index.html
.. _JeanHeyd Meneide: https://thephd.dev/binary-banshees-digital-demons-abi-c-c++-help-me-god-please
.. _legacy version of Flang: https://github.com/flang-compiler/flang
.. _native Windows support: https://developer.nvidia.com/nvidia-hpc-sdk-downloads#collapseFour
.. _are outdated: https://github.com/conda-forge/conda-forge.github.io/issues/1044
.. _now deprecated: https://github.com/numpy/numpy/pull/20875
.. _LLVM Flang: https://releases.llvm.org/11.0.0/tools/flang/docs/ReleaseNotes.html
|