web-dev-qa-db-fra.com

Compiler le Python Interprète statiquement?

Je construis un spécial intégré Python Interprète et souhaitez éviter d'avoir des dépendances sur des bibliothèques dynamiques afin que je souhaite plutôt compiler l'interprète avec des bibliothèques statiques (par exemple, libc.a non libc.so).

Je voudrais également lier statiquement toutes les bibliothèques dynamiques qui font partie de Python Bibliothèque standard. Je sais que cela peut être fait en utilisant Freeze.py, mais y a-t-il une alternative pour que Cela peut être fait en une étape?

44
Jeremy Cowles

J'ai trouvé cela (principalement concernant la compilation statique de Python modules):

Qui décrit un fichier utilisé pour la configuration située ici:

<Python_Source>/Modules/Setup

Si ce fichier n'est pas présent, il peut être créé en copiant:

<Python_Source>/Modules/Setup.dist

Le fichier Setup a des tonnes de documentation et le README inclus dans la source offre également beaucoup d'informations de bonne compilation.

Je n'ai pas encore essayé de compiler, mais je pense avec ces ressources, je devrais réussir quand j'essaie. Je posterai mes résultats comme un commentaire ici.

Mettre à jour

Pour obtenir un pur-statique python exécutable, vous devez également configurer comme suit:

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

Une fois que vous avez construit avec ces drapeaux activés, vous obtiendrez probablement beaucoup d'avertissements sur "Renommer parce que la bibliothèque n'est pas présente". Cela signifie que vous n'avez pas configuré Modules/Setup correctement et besoin de:

a) Ajoutez une seule ligne (près du sommet) comme ceci:

*static*

(C'est astérisque/star du mot "statique" et astérisque sans espaces)

b) Définissez tous les modules que vous souhaitez être disponibles statiquement (tels que les mathématiques, la matrice, etc.)

Vous devrez peut-être également ajouter des drapeaux de liaison spécifiques (comme mentionné dans le lien que j'ai publié ci-dessus). Mon expérience jusqu'à présent est que les bibliothèques travaillent sans modification.

Il peut également être utile de fonctionner comme suit:

make 2>&1 | grep 'renaming'

Cela montrera tous les modules qui ne sont pas compilés en raison d'être liés statiquement.

31
Jeremy Cowles

Système de construire CPPHON CUMAKE offre une solution alternative de construire Python, en utilisant cmake .

Il peut construire python libédiez statiquement et inclure dans ce que liber tous les modules que vous souhaitez. Il suffit de définir les options de Clake

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

et définir le BUILTIN_<extension> vous voulez ON.

9
Gaëtan Lehmann

Vous pouvez essayer avec STATEUR ELF . Je l'ai déjà utilisé et ça marche assez bien. J'avais juste des problèmes avec cela dans quelques cas, puis je devais utiliser un autre programme similaire appelé ermine . Malheureusement, celui-ci est un programme commercial.

3
javier-sanz