4. Construire des extensions C et C++
*************************************

Une extension C pour CPython est une bibliothèque partagée (Un ".so"
sur Linux, un ".pyd" sur Windows), qui expose une *fonction
d'initialisation*.

To be importable, the shared library must be available on
"PYTHONPATH", and must be named after the module name, with an
appropriate extension. When using setuptools, the correct filename is
generated automatically.

La fonction d'initialisation doit avoir le prototype :

PyObject *PyInit_modulename(void)

Elle doit donner soit un module entièrement initialisé, soit une
instance de "PyModuleDef". Voir Initializing C modules pour plus de
détails.

Pour les modules dont les noms sont entièrement en ASCII, la fonction
doit être nommée "PyInit_<modulename>", dont "<modulename>" est
remplacé par le nom du module. En utilisant Multi-phase
initialization, il est possible d'utiliser des noms de modules
comptant des caractères non ASCII. Dans ce cas, le nom de la fonction
d'initialisation est "PyInitU_<modulename>", où "modulename" est
encodé avec l'encodage *punyencode* de Python, dont les tirets sont
remplacés par des tirets-bas. En Python ça donne :

   def initfunc_name(name):
       try:
           suffix = b'_' + name.encode('ascii')
       except UnicodeEncodeError:
           suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
       return b'PyInit' + suffix

Il est possible d'exporter plusieurs modules depuis une seule
bibliothèque partagée en définissant plusieurs fonctions
d'initialisation. Cependant pour les importer, un lien symbolique doit
être créé pour chacun, ou un *importer* personnalisé, puisque par
défaut seule la fonction correspondant au nom du fichier est cherchée.
Voir le chapitre *"Multiple modules in one library"* dans la **PEP
489** pour plus d'informations.


4.1. Building C and C++ Extensions with setuptools
==================================================

Python 3.12 and newer no longer come with distutils. Please refer to
the "setuptools" documentation at
https://setuptools.readthedocs.io/en/latest/setuptools.html to learn
more about how build and distribute C/C++ extensions with setuptools.
