o
    Ô­jQ  ã                   @   sš   d Z ddlZddlZddlZddlZddlZddlZddgZddg ddœdd„Zg g fdd„Z	d	d
„ Z
dd„ Zdd„ Zg g g fdd„Zdd„ Zdd„ ZdS )zb
Build a c-extension module on-the-fly in tests.
See build_and_import_extensions for usage hints

é    NÚbuild_and_import_extensionÚcompile_extension_moduleÚ )ÚprologueÚ	build_dirÚinclude_dirsÚ	more_initc             
   C   s¸   |t || ƒ }d}|st d¡}|r|d7 }||7 }|d7 }t| ||ƒ}z	t| |||ƒ}	W n tyB }
 z	td|› d�ƒ|
‚d}
~
ww ddl}|j 	| |	¡}|j 
|¡}|j |¡ |S )	a  
    Build and imports a c-extension module `modname` from a list of function
    fragments `functions`.


    Parameters
    ----------
    functions : list of fragments
        Each fragment is a sequence of func_name, calling convention, snippet.
    prologue : string
        Code to precede the rest, usually extra ``#include`` or ``#define``
        macros.
    build_dir : pathlib.Path
        Where to build the module, usually a temporary directory
    include_dirs : list
        Extra directories to find include files when compiling
    more_init : string
        Code to appear in the module PyMODINIT_FUNC

    Returns
    -------
    out: module
        The module will have been loaded and is ready for use

    Examples
    --------
    >>> functions = [("test_bytes", "METH_O", """
        if ( !PyBytesCheck(args)) {
            Py_RETURN_FALSE;
        }
        Py_RETURN_TRUE;
    """)]
    >>> mod = build_and_import_extension("testme", functions)
    >>> assert not mod.test_bytes(u'abc')
    >>> assert mod.test_bytes(b'abc')
    z8PyObject *mod = PyModule_Create(&moduledef);
           Ú.z.#define INITERROR return NULL
                z
return mod;zcould not compile in ú:Nr   )Ú_make_methodsÚpathlibÚPathÚ_make_sourcer   Ú	ExceptionÚRuntimeErrorÚimportlib.utilÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)ÚmodnameÚ	functionsr   r   r   r   ÚbodyÚinitÚsource_stringÚmod_soÚeÚ	importlibÚspecÚfoo© r!   ú\/var/www/html/CropPilot/venv/lib/python3.10/site-packages/numpy/testing/_private/extbuild.pyr      s,   '
ÿ€þc           	      C   sR   |   d¡d }||  }|jdd� t||ƒ}|t d¡g }t||| |g g d�S )aH  
    Build an extension module and return the filename of the resulting
    native code file.

    Parameters
    ----------
    name : string
        name of the module, possibly including dots if it is a module inside a
        package.
    builddir : pathlib.Path
        Where to build the module, usually a temporary directory
    include_dirs : list
        Extra directories to find include files when compiling
    libraries : list
        Libraries to link into the extension module
    library_dirs: list
        Where to find the libraries, ``-L`` passed to the linker
    r	   éÿÿÿÿT©Úexist_okÚ	INCLUDEPY)Úoutputfilenamer   Ú	librariesÚlibrary_dirs)ÚsplitÚmkdirÚ_convert_str_to_fileÚ	sysconfigÚget_config_varÚ
_c_compile)	ÚnameÚbuilddirr   r   r(   r)   r   ÚdirnameÚcfiler!   r!   r"   r   P   s   
þc                 C   sF   |d }|  d¡�}| t| ƒ¡ W d  ƒ |S 1 sw   Y  |S )zHelper function to create a file ``source.c`` in `dirname` that contains
    the string in `source`. Returns the file name
    zsource.cÚwN)ÚopenÚwriteÚstr)Úsourcer2   ÚfilenameÚfr!   r!   r"   r,   q   s   
ÿþr,   c                 C   sˆ   g }g }| D ]+\}}}d||f }d|v rd}nd}|  d|||f ¡ dj|||d�}	|  |	¡ qd |¡d	td |¡|d
�  }
|
S )zõ Turns the name, signature, code in functions into complete functions
    and lists them in a methods_table. Then turns the methods_table into a
    ``PyMethodDef`` structure and returns the resulting code fragment ready
    for compilation
    z%s_%sÚMETH_KEYWORDSz2(PyObject *self, PyObject *args, PyObject *kwargs)z (PyObject *self, PyObject *args)z{"%s", (PyCFunction)%s, %s},z^
        static PyObject* {cfuncname}{signature}
        {{
        {code}
        }}
        )Ú	cfuncnameÚ	signatureÚcodeÚ
a6  
    static PyMethodDef methods[] = {
    %(methods)s
    { NULL }
    };
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "%(modname)s",  /* m_name */
        NULL,           /* m_doc */
        -1,             /* m_size */
        methods,        /* m_methods */
    };
    )Úmethodsr   )ÚappendÚformatÚjoinÚdict)r   r   Úmethods_tableÚcodesÚfuncnameÚflagsr>   r<   r=   Ú	func_coder   r!   r!   r"   r   {   s$   ÿû
ôr   c                 C   s   dt | ||d� }|S )zG Combines the code fragments into source code ready to be compiled
    zn
    #include <Python.h>

    %(body)s

    PyMODINIT_FUNC
    PyInit_%(name)s(void) {
    %(init)s
    }
    )r0   r   r   )rD   )r0   r   r   r>   r!   r!   r"   r   £   s   	ÿ÷r   c                 C   sì   t jdkrdg}dtj t jd¡ g}nt j d¡r!g d¢}g }ng  }}	 t jdkr0|dg }t jdkrdd	D ],}|d
 |vrNtj |d
 ¡rN| |d
 ¡ |d |vrctj |d ¡rc| |d ¡ q7| 	t
ƒ ¡}t| ||||||ƒ |S )NÚwin32z/we4013z	/LIBPATH:ÚlibsÚlinux)z-O0z-gz%-Werror=implicit-function-declarationz-fPICz/DEBUGÚdarwin)z/sw/z/opt/local/ÚincludeÚlib)ÚsysÚplatformÚosÚpathrC   Úbase_prefixÚ
startswithÚexistsrA   Úwith_suffixÚget_so_suffixÚbuild)r3   r'   r   r(   r)   Úcompile_extraÚ
link_extraÚsr!   r!   r"   r/   µ   s4   



ÿ€ýr/   c                 C   s  | j d }tj|dd� |jd }t| j d dƒ�7}	dd„ |D ƒ}
d	d„ |D ƒ}|	 t d
|› d| jd › d|
› d|› d|› d|› d|› d�¡¡ W d  ƒ n1 sSw   Y  tj	dkrgt
jg d¢|d� n	t
jg d¢|d� t
jddg|d� t t|| ƒd | j | ¡ dS )zuse meson to buildrY   Tr$   r#   zmeson.buildÚwtc                 S   ó   g | ]}d | ‘qS )z-Ir!   ©Ú.0Údr!   r!   r"   Ú
<listcomp>Ü   ó    zbuild.<locals>.<listcomp>c                 S   r^   )z-Lr!   r_   r!   r!   r"   rb   Ý   rc   z;            project('foo', 'c')
            shared_module('z', 'z',
                c_args: z + z,
                link_args: z,
                link_with: z_,
                name_prefix: '',
                name_suffix: 'dummy',
            )
        NrJ   )ÚmesonÚsetupz--buildtype=releaseú--vsenvú..)Úcwd)rd   re   rf   rg   rd   Úcompilez.dummy)ÚparentrR   ÚmakedirsÚpartsr5   r6   ÚtextwrapÚdedentrP   rQ   Ú
subprocessÚ
check_callÚrenamer7   )r3   r'   rZ   r[   r   r(   r)   r   Úso_nameÚfidÚincludesÚ	link_dirsr!   r!   r"   rY   Ô   s>   


þþýýüüûý

ý
ÿ"rY   c                  C   s   t  d¡} | s	J ‚| S )NÚ
EXT_SUFFIX)r-   r.   )Úretr!   r!   r"   rX   õ   s   
rX   )Ú__doc__rR   r   ro   rP   r-   rm   Ú__all__r   r   r,   r   r   r/   rY   rX   r!   r!   r!   r"   Ú<module>   s*    þA
þ!
(
ÿ!