Repository navigation
Description
Bug summary
When the build gets to https://github.com/matplotlib/matplotlib/blob/main/src/_tkagg.cpp#L262-L273 on Cygwin, the build fails with a few goto crosses initialization warnings, which are easy to fix (closed by #23051), and two error: ‘PyErr_SetFromWindowsErr’ was not declared in this scope, which are less easy to fix.
Code for reproduction
pip install matplotlibActual outcome
...
lots of compiler command lines and some warnings (`array subscript has type 'char'`)
...
gcc ... -I/usr/include/python3.8 -c src/_tkagg.cpp -o build/temp.cygwin-3.3.4-x86_64-3.8/matplotlib.backends._tkagg/src/_tkagg.o -fvisibility=hidden -flto
src/_tkagg.cpp: In function ‘void load_tkinter_funcs()’:
src/_tkagg.cpp:263:9: error: ‘PyErr_SetFromWindowsErr’ was not declared in this scope
263 | PyErr_SetFromWindowsErr(0);
| ^~~~~~~~~~~~~~~~~~~~~~~
src/_tkagg.cpp:271:9: error: ‘PyErr_SetFromWindowsErr’ was not declared in this scope
271 | PyErr_SetFromWindowsErr(0);
| ^~~~~~~~~~~~~~~~~~~~~~~
src/_tkagg.cpp:283:1: error: jump to label ‘exit’
283 | exit:
| ^~~~
src/_tkagg.cpp:272:14: note: from here
272 | goto exit;
| ^~~~
src/_tkagg.cpp:274:26: note: crosses initialization of ‘bool tk_ok’
274 | bool tcl_ok = false, tk_ok = false;
| ^~~~~
src/_tkagg.cpp:274:10: note: crosses initialization of ‘bool tcl_ok’
274 | bool tcl_ok = false, tk_ok = false;
| ^~~~~~
src/_tkagg.cpp:283:1: error: jump to label ‘exit’
283 | exit:
| ^~~~
src/_tkagg.cpp:268:14: note: from here
268 | goto exit;
| ^~~~
src/_tkagg.cpp:274:26: note: crosses initialization of ‘bool tk_ok’
274 | bool tcl_ok = false, tk_ok = false;
| ^~~~~
src/_tkagg.cpp:274:10: note: crosses initialization of ‘bool tcl_ok’
274 | bool tcl_ok = false, tk_ok = false;
| ^~~~~~
src/_tkagg.cpp:283:1: error: jump to label ‘exit’
283 | exit:
| ^~~~
src/_tkagg.cpp:264:14: note: from here
264 | goto exit;
| ^~~~
src/_tkagg.cpp:274:26: note: crosses initialization of ‘bool tk_ok’
274 | bool tcl_ok = false, tk_ok = false;
| ^~~~~
src/_tkagg.cpp:274:10: note: crosses initialization of ‘bool tcl_ok’
274 | bool tcl_ok = false, tk_ok = false;
| ^~~~~~
error: command '/usr/bin/gcc' failed with exit code 1
...
pip reminds me this is not pip's fault
Expected outcome
...
Successfully installed collected packages: matplotlib
Additional information
Cygwin 3.3.4
GCC 11.2.0
Python 3.8.12
I've installed matplotlib in earlier versions. #17415 rather suggests that Cygwin builds worked at that time, and probably made using the default backend somewhat easier. #22445 seems to be where the PyErr_SetFromWindowsErr calls came in.
I've attempted to create a dummy PyErr_SetFromWindowsErr on Cygwin, but, given the number of failures in the test suite, I probably didn't do it right.
Operating system
Cygwin 3.3.4 on Windows 10
Matplotlib Version
3.5.2
Matplotlib Backend
TkAgg
Python version
3.8.12
Jupyter version
N/A
Installation
pip
Activity
tacaswell commentedon May 6, 2022
This was last touched in 9d325ae
I suspect we "just" need some better gating around cygwin?
tacaswell commentedon May 6, 2022
Actions here:
#ifndefprotect the windows only functions and replace them withPyErr_SetString(or similar)DWesl commentedon May 6, 2022
That looks like a good summary. Where should the Cygwin CI run end up?
.github/workflows/tests.yml?nightlies.ymlor a new file are the other likely spots.tacaswell commentedon May 6, 2022
If it can be done on GHA, add it to
.github/workflows/tests.yml(we also have appveyor and azure setup if those are easier to work with). I would very much prefer to not pick up yet another CI service (YACS .... that would be a good name of a new CI service ;) ).I assume you found this already, but we have
matplotlib/src/_tkagg.cpp
Lines 15 to 27 in 7bb3ff5
DWesl commentedon May 6, 2022
I can do CI on GHA. I'm less sure about the fixing-my-problem part.
Yes. That's from #17415; basically Cygwin inherits Windows's dynamic library semantics, so treating them the same (for related issues) generally solves more problems than it causes.
anntzer commentedon May 7, 2022
I guess you need something like
(not the cleanest solution, but inlining all the implementation of PyErr_SetFromWindowsErr from cpython's errors.c seems a bit overkill; I would also suggest opening an issue on the cpython tracker to make PyErr_SetFromWindowsErr (and related functions) available on cygwin too -- from a first look (I may well be mistaken), it's just an oversight on their side?)
DWesl commentedon May 10, 2022
Would a function like:
also work? Compiler error reporting around preprocessor tokens has gotten better recently, but reporting around functions is often better still.
On a related note, should I make a separate PR for these fixes, since trying to make get a Cygwin CI working in #22999 is still fighting me?
anntzer commentedon May 18, 2022
I guess so? (x2)
DWesl commentedon May 18, 2022
The barebones function based on the macro proposed earlier has been proposed as PR #23066.
tacaswell commentedon May 18, 2022
Sorry my request for CI sent you down a rabbit hole! Thank you for your work and patience
.
DWesl commentedon May 18, 2022
I've done a few Cygwin CI setups, so I thought that would be simpler. I wasn't expecting that updating the Libtool configuration of FreeType would fail.