
    CEjV                         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mZ ddgZdddddd	Z		 dd
Z
d Zd Zd Zd Zd Zd Zy)zb
Build a c-extension module on-the-fly in tests.
See build_and_import_extensions for usage hints

    N   )run_subprocessbuild_and_import_extensioncompile_extension_module )prologue	build_dirinclude_dirs	more_initc                b   |g }|t        ||       z   }d}|st        j                  d      }|r
|dz  }||z  }|dz  }t        | ||      }t	        | |||      }	ddl}
|
j                  j                  | |	      }|
j                  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('abc')
    >>> assert mod.test_bytes(b'abc')
    Nz
    PyObject *mod = PyModule_Create(&moduledef);
    #ifdef Py_GIL_DISABLED
    PyUnstable_Module_SetGIL(mod, Py_MOD_GIL_NOT_USED);
    #endif
           .z.#define INITERROR return NULL
                z
return mod;r   )_make_methodspathlibPath_make_sourcer   importlib.utilutilspec_from_file_locationmodule_from_specloaderexec_module)modname	functionsr   r	   r
   r   bodyinitsource_stringmod_so	importlibspecfoos                m/var/www/html/eeg-assistent/strom-signal/venv/lib/python3.12/site-packages/numpy/testing/_private/extbuild.pyr   r      s    N mIw77DD LL%	  		OD $5M%L-9F>>11'6BD
..
)
)$
/CKKC J    c                     | j                  d      d   }|| z  }|j                  d       t        ||      }|xs g }|xs g }|xs g }t        |||z  |||      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)outputfilenamer
   	librarieslibrary_dirs)splitmkdir_convert_str_to_file
_c_compile)	namebuilddirr
   r   r(   r)   r   dirnamecfiles	            r!   r   r   S   su    * jjob!GoGMM4M  8E%2LRI%2Lg/!Y!
 
r"   c                     |dz  }|j                  d      5 }|j                  t        |              ddd       |S # 1 sw Y   |S xY w)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)sourcer0   filenamefs       r!   r,   r,   w   sF     #H	s	 q	FOOs	   <Ac           
      
   g }g }| D ]M  \  }}}| d| }d|v rd}nd}|j                  d| d| d| d       d	| | d
| d}	|j                  |	       O dj                  |      }
dj                  |      d|
 d| dz   }|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
    _METH_KEYWORDSz2(PyObject *self, PyObject *args, PyObject *kwargs)z (PyObject *self, PyObject *args)z{"z", (PyCFunction)z, z},z
        static PyObject* z
        {
        z
        }
        
z*
    static PyMethodDef methods[] = {
    zi
    { NULL }
    };
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "z",    /* m_name */
        NULL,           /* m_doc */
        -1,             /* m_size */
        methods,        /* m_methods */
    };
    )appendjoin)r   r   methods_tablecodesfuncnameflagscode	cfuncname	signature	func_codemethods_strr   s               r!   r   r      s     ME!*  %iq
+	e#LI:Is8*,<YKr%PSTU#YK 0		 		 	Y  ))M*K99U #M 

   D Kr"   c                     d| d|  d| d}|S )zG Combines the code fragments into source code ready to be compiled
    z
    #include <Python.h>

    z 

    PyMODINIT_FUNC
    PyInit_z(void) {
    z
    }
     )r.   r   r   rD   s       r!   r   r      s7     
F  6 	F 	D Kr"   c           	          g }t         j                  dk(  rdg}|j                  d       n&t         j                  j                  d      rg d}ng }t	        | ||||||      S )Nwin32z/we4013z/DEBUGlinux)z-O0z-gz%-Werror=implicit-function-declarationz-fPIC)sysplatformr>   
startswithbuild)r1   r'   r
   r(   r)   
link_extracompile_extras          r!   r-   r-      sg    J
||w"(#		 	 	)K ~zi/ /r"   c                    | j                   dz  }t        j                  |d       t        | j                   dz  d      5 }|D 	cg c]  }	d|	z   	 }
}	|j	                  t        j                  d|j                  d    d	| j                  d    d
| d|
 d| d             ddd       | j                   dz  }t        |d      5 }|j	                  t        j                  dt        j                   d             ddd       t        j                  dk(  rt        g d|       n't        dddddt        j                  |       g|       |j                  d   t               z   }t        ddg|       t        j                  t        ||z        | j                   |z         | j                   |z  S c c}	w # 1 sw Y   xY w# 1 sw Y   xY w)zuse meson to buildrQ   Tr%   zmeson.buildwtz-Lz            project('foo', 'c')
            py = import('python').find_installation(pure: false)
            py.extension_module(
                'r$   z',
                'z',
                c_args: z,
                link_args: z',
                include_directories: z,
            )
        Nz.mesonpy-native-file.iniz-            [binaries]
            python = 'z
'
        rL   )mesonsetupz--buildtype=release--vsenv..rV   rW   rX   rY   z--native-file=compile)parentosmakedirsr4   r5   textwrapdedentpartsrN   
executablerO   r   fspathget_so_suffixrenamer6   )r1   r'   rS   rR   r
   r(   r)   r	   fidd	link_dirsnative_file_nameso_names                r!   rQ   rQ      s    w&IKK	D)	ell]*D	1 S'34!TAX4	4		(// ' !&&r*+ ,++b/" #& (%; '&&2^ 4	
# 
 
	 ||&@@		% 		(// '~~& '	#  	
 ||w ) !	"
 	)ryy9I/J.KLN 	" ""2&8GGY'3IIc)g%&w(>?<<'!!? 5  s+    F7F2AF77G2F77GGc                  8    t        j                  d      } | sJ | S )N
EXT_SUFFIX)	sysconfigget_config_var)rets    r!   rc   rc      s    

"
"<
0CJ3Jr"   )NN)__doc__r\   r   rN   rl   r^   utilsr   __all__r   r   r,   r   r   r-   rQ   rc   rJ   r"   r!   <module>rr      sf    
  
   !')C
D )+dR>F 59!
H%P /$&"Rr"   