I am trying to port the build system for a python package (GitHub - PySCeS/pysces: The official PySCeS project source code repository.) from
numpy.distutils to use
scikit-build because of the deprecation of
distutils (the package contains 2 Fortran extension modules wrapped with
f2py). To get to know the system I’ve started with a minimal example. I have been getting compile failures on Windows (on Linux and macOS everything works).
SUBROUTINE HELLO() PRINT*,"Hello from fortran" END
! -*- f90 -*- ! Note: the context of this file is case sensitive. python module hi ! in interface ! in :hi subroutine hello ! in :hi:hi.f end subroutine hello end interface end python module hi ! This file was auto-generated with f2py (version:1.23.2). ! See: ! https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e
During compilation with
python setup.py build the build fails. In tracking it down I saw that ninja/cmake expands the full path of the source files and this is where it fails. To ensure that it is not a problem with the
skbuild build system I verified that the failure can be reproduced on the command line using
f2py on its own as follows - copy the Fortran files above to the same folder and then run in a command prompt:
(skbuild) Z:\Documents\Python\skbuild_test\simple\hello\shout>f2py.exe -m hi -c hi.pyf hi.f
(works and generates the
However, specifying the full path, fails:
(skbuild) Z:\Documents\Python\skbuild_test\simple\hello\shout>f2py.exe -m hi -c Z:/Documents/Python/skbuild_test/simple/hello/shout/hi.pyf Z:/Documents/Python/skbuild_test/simple/hello/shout/hi.f running build running config_cc INFO: unifing config_cc, config, build_clib, build_ext, build commands --compiler options running config_fc INFO: unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options running build_src INFO: build_src INFO: building extension "hi" sources creating C: creating C:Users creating C:Users\jr creating C:Users\jr\AppData creating C:Users\jr\AppData\Local creating C:Users\jr\AppData\Local\Temp creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10 creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10\Documents creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10\Documents\Python creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10\Documents\Python\skbuild_test creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10\Documents\Python\skbuild_test\simple creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10\Documents\Python\skbuild_test\simple\hello creating C:Users\jr\AppData\Local\Temp\tmpdbudw6jh\src.win-amd64-3.10\Documents\Python\skbuild_test\simple\hello\shout INFO: f2py options:  INFO: f2py: Z:/Documents/Python/skbuild_test/simple/hello/shout/hi.pyf error: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:C:\\Users\\jr\\AppData\\Local\\Temp\\tmpdbudw6jh\\src.win-amd64-3.10\\Documents\\Python\\skbuild_test\\simple\\hello\\shout'
The problem seems to be with the
creating C:Users part leading to the malformed filename in the last line.
Specifying only the filename for
hi.pyf but the full path for
hi.f does work strangely enough, but as soon as the full path for
hi.pyf is specified it fails. As mentioned, on Linux and macOS all works fine.
I could of course skip the
.pyf file and then it works. However, the Fortran code I’m wrapping is F77 and needs to be redistributed in unmodified form due to licensing conditions, so I do need a custom
.pyf file to integrate it into my Python module.
- Windows 10 64-bit
- MSVC 2022 build tools
- mingw 11.2.0.07112021 (installed with chocolatey)
- python 3.10.6
- numpy 1.23.2
I have no idea what is going on here.