Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-108765: Python.h no longer includes <unistd.h> #108783

Merged
merged 1 commit into from
Sep 2, 2023

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Sep 1, 2023

@vstinner vstinner marked this pull request as ready for review September 2, 2023 14:11
@vstinner vstinner merged commit 594b000 into python:main Sep 2, 2023
18 checks passed
@vstinner vstinner deleted the remove_unistd_h branch September 2, 2023 14:50
@vstinner
Copy link
Member Author

vstinner commented Sep 2, 2023

I merged my PR.

If it causes too many trouble in 3rd party C extensions (require to update too many C extensions before Python 3.13 beta1), I can make this change conditional only in the limited C API version 3.13, as I did for other headers in Python.h:

// errno.h, stdio.h, stdlib.h and string.h headers are no longer used by Python
// headers, but kept for backward compatibility (no introduce new compiler
// warnings). They are not included by the limited C API version 3.11 and
// above.
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
#  include <errno.h>              // errno
#  include <stdio.h>              // FILE*
#  include <stdlib.h>             // getenv()
#  include <string.h>             // memcpy()
#endif

I consider that <unistd.h> is less commonly used by than the very common <errno.h>, <stdio.h>, <stdlib.h> and <string.h>. Again, if it causes too much burden, I can make the change conditional.

@jibal
Copy link

jibal commented Oct 22, 2023

breaks signalmodule.c

@vstinner
Copy link
Member Author

breaks signalmodule.c

Would you mind to elaborate your comment "a little bit"? What is broken? Is it a build issue? On which Python version? On which OS (name, version) and compiler (name, version)?

@jibal
Copy link

jibal commented Oct 22, 2023

signalmodule.c calls pause() and alarm() (under #ifdef HAVE_{PAUSE,ALARM} guards), which are defined in unistd.h

On the Python version where you deleted unistd.h from Python.h, of course.

@vstinner
Copy link
Member Author

signalmodule.c calls pause() and alarm() (under #ifdef HAVE_{PAUSE,ALARM} guards), which are defined in unistd.h

Hum, in fact, <unistd.h> is included indirectly by pycore_pythread.h. But well, I wrote PR #111402 to make it extra clear.

@jibal
Copy link

jibal commented Oct 27, 2023

Hum, in fact, <unistd.h> is included indirectly by pycore_pythread.h.

Which is not necessarily included when signalmodule.c is compiled ... it wasn't in my build. (Which I've abandoned ... I never actually intended to build the top of tree.)

But well, I wrote PR #111402 to make it extra clear.

Seems like the right thing to do.

@vstinner
Copy link
Member Author

Which is not necessarily included when signalmodule.c is compiled ... it wasn't in my build. (Which I've abandoned ... I never actually intended to build the top of tree.)

You didn't reply to my question about OS and compiler... Also, pycore_pythread.h was modified recently.

rathann added a commit to rathann/python-zstandard that referenced this pull request Nov 25, 2023
This fixes the following compilation error with Python 3.13.0a1:
```
c-ext/backend_c.c:275:13: error: implicit declaration of function ‘sysconf’; did you mean ‘sscanf’? [-Werror=implicit-function-declaration]
  275 |     count = sysconf(_SC_NPROCESSORS_ONLN);
      |             ^~~~~~~
      |             sscanf
```

According to https://docs.python.org/3.13/whatsnew/3.13.html:

Python.h no longer includes the <unistd.h> standard header file.
If needed, it should now be included explicitly.
For example, it provides the functions: read(), write(), close(), isatty(), lseek(), getpid(), getcwd(), sysconf() and getpagesize().
As a consequence, _POSIX_SEMAPHORES and _POSIX_THREADS macros are no longer defined by Python.h.
The HAVE_UNISTD_H and HAVE_PTHREAD_H macros defined by Python.h can be used to decide if <unistd.h> and <pthread.h> header files can be included.

See python/cpython#108783 .
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants