Skompilować interpreter Pythona statycznie?

Buduję specjalny wbudowany interpreter Pythona i chcę uniknąć zależności od bibliotek dynamicznych, więc chcę skompilować interpreter z bibliotekami statycznymi (np. libc.a nie libc.so).

Chciałbym również statycznie połączyć wszystkie dynamiczne biblioteki, które są częścią standardowej biblioteki Pythona. Wiem, że można to zrobić za pomocą Freeze.py, ale czy istnieje alternatywa, dzięki której można to zrobić w jednym kroku?

Author: Andrew Medico, 2009-07-19

4 answers

Znalazłem to (głównie dotyczące statycznej kompilacji modułów Pythona):

Opisujący plik używany do konfiguracji znajdujący się tutaj:

<Python_Source>/Modules/Setup

Jeśli ten plik nie istnieje, można go utworzyć przez skopiowanie:

<Python_Source>/Modules/Setup.dist

Plik Setup zawiera mnóstwo dokumentacji, a README dołączony do źródła oferuje wiele dobrych informacji kompilacyjnych jako cóż.

Jeszcze nie próbowałem kompilacji, ale myślę, że z tymi Zasobami powinienem odnieść sukces, gdy spróbuję. Opublikuję moje wyniki jako komentarz tutaj.

Update

Aby uzyskać program wykonywalny Pythona o czystym statusie, musisz również skonfigurować w następujący sposób:

./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"

Gdy zbudujesz z włączonymi flagami, prawdopodobnie otrzymasz wiele ostrzeżeń o "zmianie nazwy, ponieważ biblioteka nie jest obecna". Oznacza to, że nie skonfigurowałeś Modules/Setup poprawnie i musisz:

A) Dodaj a pojedyncza linia (w pobliżu góry) tak:

*static*

(to gwiazdka / gwiazdka słowo "static" i gwiazdka bez spacji)

B) odkomentuj wszystkie moduły, które chcesz być dostępne statycznie(takie jak matematyka, tablica itp...)

Może być również konieczne dodanie określonych FLAG linkera(jak wspomniano w linku, który opublikowałem powyżej). Z mojego dotychczasowego doświadczenia wynika, że biblioteki działają bez modyfikacji.

Pomocne może być również uruchomienie make Z as follows:

make 2>&1 | grep 'renaming'

Wyświetli wszystkie moduły, które nie są kompilowane ze względu na statyczne połączenie.

 30
Author: Jeremy Cowles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 14:15:50

CPython CMake Buildsystem oferuje alternatywny sposób budowania Pythona, używając CMake .

Może budować lib Pythona statycznie i zawierać w niej wszystkie moduły, które chcesz. Po prostu ustaw opcje CMake

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

I ustaw BUILTIN_<extension>, które chcesz ON.

 7
Author: Gaëtan Lehmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-04 19:49:26

Użycie freeze nie uniemożliwia wykonania tego wszystkiego w jednym uruchomieniu(bez względu na to, jakiego podejścia użyjesz, będziesz potrzebował wielu kroków budowania - np. wielu wywołań kompilatora). Najpierw edytujesz Modules/Setup, aby uwzględnić wszystkie moduły rozszerzeń, które chcesz. Następnie budujesz Pythona, dostając libpythonxy.a. następnie uruchamiasz freeze, uzyskując liczbę plików C i konfigurację.c. je również kompilujesz i integrujesz z libpythonxy.a (lub utworzyć oddzielną bibliotekę).

Robisz to wszystko raz, dla każdej architektury i wersji Pythona, którą chcesz zintegrować. Podczas tworzenia aplikacji łączysz się tylko z libpythonxy.a, oraz bibliotekę, którą stworzył freeze.

 6
Author: Martin v. Löwis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 17:54:36

Możesz spróbować z STATIFIER elfa . Używałem go wcześniej i działa dość dobrze. Po prostu miałem z tym problemy w kilku przypadkach, a potem musiałem użyć innego podobnego programu o nazwie Gronostaj. Niestety ten jest programem komercyjnym.

 3
Author: javier-sanz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 22:00:25