Ошибка при компиляции python в Termux на Android, как исправить?
устанавливаю python 3.10.6 на android 13 в эмуляторе терминала Termux с помощью pyenv, в процессе компиляции появляется следующая ошибка:
Python/thread_pthread.h:476:33: error: call to undeclared function 'sem_clockwait'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
ошибка появляется и при ручной компиляции
что можно сделать?
Скриншот фрагмента кода удалён модератором. Фрагменты кода надо размещать в виде текста и оборачивать тэгом code для корректного отображения. Удобно делать кнопкой </> Это обязательно, см.п.3.8 Регламента.
Сюда же относится traceback, ввод и вывод в консоли и другая структурированная текстовая инфа.
```bash
make distclean
bash configure --prefix=$PREFIX --enable-optimizations
```
- `$PREFIX` нужен для того, чтобы `make install` понимал, куда ставить результат сборки.
- `--enable-optimizations` используется на протяжении всего этого руководства.
---
## ⚡ Использование параллельной сборки
Полезно запускать:
```bash
make -j$(nproc)
```
Это распределяет нагрузку между всеми 8 ядрами процессора, вместо того чтобы всё шло в один поток.
---
## Ошибка отсутствия архиватора `ar`
Если появляется ошибка об отсутствии архиватора `ar`, установи нужный пакет:
- Для сборки через GCC:
```bash
pkg install binutils
```
- Для сборки через Clang:
```bash
pkg install binutils-is-llvm
```
---
## ⚙️ Исправление специфичных ошибок платформы
В рабочей директории репозитория CPython есть файл `pyconfig.h`.
Просто допиши в конец (либо, как я, ищи каждый параметр вручную и закомментируй соответствующий `#define`):
```c
#undef HAVE_SEM_CLOCKWAIT
#undef HAVE_PTHREAD_GETNAME_NP
#undef HAVE_PTHREAD_SETNAME_NP
// Один лишь Modules/posixmodule.c нарожал этих ошибок:
#undef HAVE_STATX
#undef HAVE_FEXECVE
#undef HAVE_GETLOGIN_R
#undef HAVE_GETLOADAVG
#undef HAVE_PWRITEV2
#undef HAVE_PREADV2
#undef HAVE_GETPWENT
```
Это особенность Termux: компилятор GCC просто не снабжён этими функциями
Если будут проблемы — смотри по коду, какие `#if` или `#ifdef` туда ведут. Обычно имя отсутствующего символа дублируется в переменной `HAVE_...`.
---
## ⚠️ Ловушка: `#define ... 0` не срабатывает
```c
#define HAVE_PTHREAD_GETNAME_NP 0 // ❌ Не работает
#undef HAVE_PTHREAD_GETNAME_NP // ✅ Работает
```
Я думал, что разработчики накосячили, но на практике нужно смотреть на комментарий перед `#define`, заканчивающийся на:
`", and to 0 if you don't."`
Хотя это не всегда объективно — разные разработчики просто не договорились…
---
## Запуск Python из репозитория CPython
Чтобы запустить собранный Python:
```bash
./python
```
Если прописать просто `python`, запустится версия Termux — на момент написания это 3.12.9.
---
## Грубый, но рабочий способ перезаписи (без `make install`, PGO и симлинков)
Как видно, `re` работает. Ошибка теста заключалась в вызове `fork()` или аналогичной системной функции, не поддерживаемой Android — можно игнорировать.
---
## Очистка PGO-тестов перед `make install`
Перед запуском `make install` открой:
```
Lib/test/libregrtest/pgo.py
```
Удалите все тесты, которые валятся. Особенно `'test_time'` — он вообще валит процесс.
Можно удалить все, но лучше оставить первые 7 — они быстрые и проходят успешно.
Это позволит сохранить режим `--pgo` (включается через `--enable-optimizations`) и при этом корректно установить Python.
Да, сборка повторится… и без параметра `-j`
Зато Python будет хорошо оптимизирован