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

Python 3.11 is unbuildable with GCC on macOS (error: 'HAVE_MKFIFOAT_RUNTIME' undeclared, error: 'HAVE_MKNODAT_RUNTIME' undeclared) #104106

Closed
biergaizi opened this issue May 2, 2023 · 5 comments
Labels
build The build process and cross-build OS-mac type-bug An unexpected behavior, bug, or error

Comments

@biergaizi
Copy link

biergaizi commented May 2, 2023

Bug report

Due to missing fallback macro definitions in Modules/posixmodule.c (source) for HAVE_MKFIFOAT_RUNTIME and HAVE_MKNODAT_RUNTIME, Python 3.11 cannot be built with GCC on macOS, due to the following failures:

./Modules/posixmodule.c: In function 'parse_posix_spawn_flags':
./Modules/posixmodule.c:186:64: warning: comparison between pointer and integer
  186 |                                 (posix_spawn != NULL && setsid != NULL)
      |                                                                ^~
./Modules/posixmodule.c:6026:13: note: in expansion of macro 'HAVE_POSIX_SPAWN_SETSID_RUNTIME'
 6026 |         if (HAVE_POSIX_SPAWN_SETSID_RUNTIME) {
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./Modules/posixmodule.c: In function 'os_mkfifo_impl':
./Modules/posixmodule.c:10690:17: error: 'HAVE_MKFIFOAT_RUNTIME' undeclared (first use in this function); did you mean 'HAVE_MKDIRAT_RUNTIME'?
10690 |             if (HAVE_MKFIFOAT_RUNTIME) {
      |                 ^~~~~~~~~~~~~~~~~~~~~
      |                 HAVE_MKDIRAT_RUNTIME
./Modules/posixmodule.c:10690:17: note: each undeclared identifier is reported only once for each function it appears in
./Modules/posixmodule.c: In function 'os_mknod_impl':
./Modules/posixmodule.c:10759:17: error: 'HAVE_MKNODAT_RUNTIME' undeclared (first use in this function); did you mean 'HAVE_MKDIRAT_RUNTIME'?
10759 |             if (HAVE_MKNODAT_RUNTIME) {
      |                 ^~~~~~~~~~~~~~~~~~~~
      |                 HAVE_MKDIRAT_RUNTIME
./Modules/posixmodule.c: In function 'probe_mkfifoat':
arm64-apple-darwin22-gcc  -Wsign-compare -DNDEBUG     -O2 -pipe -fwrapv -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal  -I. -I./Include -I/Users/gentoo/gentoo/tmp/usr/include/ncursesw   -DPy_BUILD_CORE_BUILTIN -c ./Modules/_codecsmodule.c -o Modules/_codecsmodule.o
./Modules/posixmodule.c:15647:23: error: 'HAVE_MKFIFOAT_RUNTIME' undeclared (first use in this function); did you mean 'HAVE_MKDIRAT_RUNTIME'?
15647 | PROBE(probe_mkfifoat, HAVE_MKFIFOAT_RUNTIME)
      |                       ^~~~~~~~~~~~~~~~~~~~~
./Modules/posixmodule.c:15611:11: note: in definition of macro 'PROBE'
15611 |       if (test) {        \
      |           ^~~~
./Modules/posixmodule.c: In function 'probe_mknodat':
./Modules/posixmodule.c:15651:22: error: 'HAVE_MKNODAT_RUNTIME' undeclared (first use in this function); did you mean 'HAVE_MKDIRAT_RUNTIME'?
15651 | PROBE(probe_mknodat, HAVE_MKNODAT_RUNTIME)
      |                      ^~~~~~~~~~~~~~~~~~~~
./Modules/posixmodule.c:15611:11: note: in definition of macro 'PROBE'
15611 |       if (test) {        \
      |           ^~~~
make: *** [Makefile:2695: Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....

In Modules/posixmodule.c, Python conditionally defines a series of macros that indicate whether a system call is supported based on #ifdef checks. By default, the clang specific __builtin_available() compiler built-in function is used to check them. But if __builtin_available() is unavailable, a fallback is also provided.

For example, for HAVE_FSTATAT_RUNTIME, we have:

#ifdef HAVE_BUILTIN_AVAILABLE
#  define HAVE_FSTATAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *)
// [...]

#else /* Xcode 8 or earlier */

   /* __builtin_available is not present in these compilers, but
    * some of the symbols might be weak linked (10.10 SDK or later
    * deploying on 10.9.
    *
    * Fall back to the older style of availability checking for
    * symbols introduced in macOS 10.10.
    */

#  ifdef HAVE_FSTATAT
#    define HAVE_FSTATAT_RUNTIME (fstatat != NULL)
#  endif

#endif

The fallback is important because it's not only used to support older Xcode or macOS, but it also provides fallback when GCC is used. The function __builtin_available() is clang-only and does not exist in GCC. In the past, this was handled by the else portion of the ifdef, so it worked on GCC as well. Unfortunately, when HAVE_MKFIFOAT_RUNTIME and HAVE_MKDIRAT_RUNTIME have been added to the code, a fallback was never provided, thus, compiling Python 3.11 with GCC now fails due to undeclared macros.

Your environment

  • CPython versions tested on: Python 3.11.3
  • Operating system and architecture: macOS 13.2.1
  • GCC 12.2.0

Linked PRs

@biergaizi biergaizi added the type-bug An unexpected behavior, bug, or error label May 2, 2023
@biergaizi biergaizi changed the title Python 3.11 is unbuildable with GCC on macOS (error: 'HAVE_MKNODAT_RUNTIME' undeclared, error: 'HAVE_MKNODAT_RUNTIME' undeclared) Python 3.11 is unbuildable with GCC on macOS (error: 'HAVE_MKFIFOAT_RUNTIME' undeclared, error: 'HAVE_MKNODAT_RUNTIME' undeclared) May 2, 2023
@arhadthedev arhadthedev added the build The build process and cross-build label May 3, 2023
corona10 added a commit to corona10/cpython that referenced this issue May 3, 2023
corona10 added a commit to corona10/cpython that referenced this issue May 3, 2023
@corona10
Copy link
Member

corona10 commented May 3, 2023

@biergaizi Can you please check that #104129 solve your issue?

--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -175,6 +175,14 @@
 #    define HAVE_PWRITEV_RUNTIME (pwritev != NULL)
 #  endif
 
+#  ifdef HAVE_MKFIFOAT
+#    define HAVE_MKFIFOAT_RUNTIME (mkfifoat != NULL)
+#  endif
+
+#  ifdef HAVE_MKNODAT
+#    define HAVE_MKNODAT_RUNTIME (mknodat != NULL)
+#  endif
+
 #endif
 
 #ifdef HAVE_FUTIMESAT

@biergaizi
Copy link
Author

No, because this patch contains a typo. #ifdef HAVE_MKNODAT_RUNTIME should be #ifdef HAVE_MKNODAT

corona10 added a commit to corona10/cpython that referenced this issue May 4, 2023
@corona10
Copy link
Member

corona10 commented May 4, 2023

@biergaizi Thanks, I updated the diff, is the changes solve your issue?

@biergaizi
Copy link
Author

Yes, the revised patch works, posixmodule.c now passes build without failures.

biergaizi added a commit to biergaizi/prefix that referenced this issue May 5, 2023
Currently, dev-lang/python-3.11.3 is unbuildable on macOS due to GCC
incompatibility. There exists two "#ifdef" checks for the system calls
mkfifoat() and mknodat(), which are not compatible with GCC. Because
they're defined using the __builtin_available() function - specific to
clang without a fallback for GCC, they're never defined, thus creating
the following errors:

    ./Modules/posixmodule.c:15647:23: error: 'HAVE_MKFIFOAT_RUNTIME'
    undeclared (first use in this function); did you mean
    'HAVE_MKDIRAT_RUNTIME'?
    ./Modules/posixmodule.c:15651:22: error: 'HAVE_MKNODAT_RUNTIME'
    undeclared (first use in this function); did you mean
    'HAVE_MKDIRAT_RUNTIME'?

This bug [1] has already been reported to upstream with a patch [2]
waiting to be merged. This commit applies the upstream patch to add
the missing GCC fallbacks.

[1] python/cpython#104106
[2] python/cpython#104129

Closes: https://bugs.gentoo.org/905618
Signed-off-by: Yifeng Li <tomli@tomli.me>
corona10 added a commit to corona10/cpython that referenced this issue May 5, 2023
pythongh-104129).

(cherry picked from commit e5b8b19)

Co-authored-by: Dong-hee Na <donghee.na@python.org>
corona10 added a commit that referenced this issue May 5, 2023
@corona10
Copy link
Member

corona10 commented May 5, 2023

@biergaizi Thank you for the report!

@corona10 corona10 closed this as completed May 5, 2023
carljm added a commit to carljm/cpython that referenced this issue May 5, 2023
* main: (61 commits)
  pythongh-64595: Argument Clinic: Touch source file if any output file changed (python#104152)
  pythongh-64631: Test exception messages in cloned Argument Clinic funcs (python#104167)
  pythongh-68395: Avoid naming conflicts by mangling variable names in Argument Clinic (python#104065)
  pythongh-64658: Expand Argument Clinic return converter docs (python#104175)
  pythonGH-103092: port `_asyncio` freelist to module state (python#104196)
  pythongh-104051: fix crash in test_xxtestfuzz with -We (python#104052)
  pythongh-104190: fix ubsan crash (python#104191)
  pythongh-104106: Add gcc fallback of mkfifoat/mknodat for macOS (pythongh-104129)
  pythonGH-104142: Fix _Py_RefcntAdd to respect immortality (pythonGH-104143)
  pythongh-104112: link from cached_property docs to method-caching FAQ (python#104113)
  pythongh-68968: Correcting message display issue with assertEqual (python#103937)
  pythonGH-103899: Provide a hint when accidentally calling a module (pythonGH-103900)
  pythongh-103963: fix 'make regen-opcode' in out-of-tree builds (python#104177)
  pythongh-102500: Add PEP 688 and 698 to the 3.12 release highlights (python#104174)
  pythonGH-81079: Add case_sensitive argument to `pathlib.Path.glob()` (pythonGH-102710)
  pythongh-91896: Deprecate collections.abc.ByteString (python#102096)
  pythongh-99593: Add tests for Unicode C API (part 2) (python#99868)
  pythongh-102500: Document PEP 688 (python#102571)
  pythongh-102500: Implement PEP 688 (python#102521)
  pythongh-96534: socketmodule: support FreeBSD divert(4) socket (python#96536)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
build The build process and cross-build OS-mac type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

4 participants