
     h                     |    d 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Zg g fdZd	 Zd
 Z	d Z
g g g fdZd Z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                   ddl m} |t          ||           z   }d}|st          j        d          }|r
|dz  }||z  }|dz  }t          | ||          }		 t          | |||	          }
n!# |$ r}t          d| d          |d	}~ww xY 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')
    r   )CompileErrorz8PyObject *mod = PyModule_Create(&moduledef);
           .z.#define INITERROR return NULL
                z
return mod;zcould not compile in :N)distutils.errorsr   _make_methodspathlibPath_make_sourcer   RuntimeErrorimportlib.utilutilspec_from_file_locationmodule_from_specloaderexec_module)modname	functionsr   r   r   r	   r   bodyinitsource_stringmod_soe	importlibspecfoos                  [/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/numpy/testing/_private/extbuild.pyr   r      s9   N .-----mIw777DD &L%%	   		OD $55MH)Ym= = H H H?9???@@aGH >11'6BBD
.
)
)$
/
/CKC   Js   A( (B-BBc                     |                      d          d         }|| z  }|                    d           t          ||          }|t          j        d          gz   }t          |||z  |g g           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cfiles	            r$   r   r   P   s    * jjoob!GoGMM4M    88E9#;K#H#H"IILg/!Rb
 
 
 
    c                     |dz  }|                     d          5 }|                    t          |                      ddd           n# 1 swxY 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)sourcer4   filenamefs       r$   r.   r.   q   s     #H	s		 q	F              Os   #A

AAc           
      R   g }g }| D ]b\  }}}|d|}d|v rd}nd}|                     d|d|d|d           d	                    |||
          }	|                     |	           cd                    |          dt          d                    |          |          z  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* {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flagsrD   rB   rC   	func_coder   s              r$   r   r   {   s     ME!*    %&ww1	e##LII:I08)))UUUK	M 	M 	M
 FY)$FGG 	 	Y99U  tyy//
A
A
AB BD Kr6   c                 0    dt          | ||          z  }|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
    }
    )r2   r   r   )rJ   )r2   r   r   rD   s       r$   r   r      s0    	 4  D Kr6   c           	          t           j        dk    r2dg}dt          j                            t           j        d          z   g}n+t           j                            d          rg d}d }nd x}}	 t           j        dk    r|dgz   }t           j        dk    rd	D ]}|d
z   |vr:t          j                            |d
z             r|                    |d
z              |dz   |vr:t          j                            |dz             r|                    |dz              |	                    t                                }t          j                                        }	 t          | ||||||           |                                D ]7\  }	}
t          j                            |	          |
k    r|
t          j        |	<   8nQ# |                                D ]7\  }	}
t          j                            |	          |
k    r|
t          j        |	<   8w xY w|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pathrI   base_prefix
startswithexistsrG   with_suffixget_so_suffixenvironcopybuilditemsget)r5   r)   r   r*   r+   compile_extra
link_extrassaved_environkeyvalues              r$   r1   r1      s   
|w"!BGLL&$I$IIJ

		 	 	)	) K K K

%))

|w8*,

|x( 	/ 	/AI\11q9}55 2##A	M2225y,,E	1J1J,##AI...#//@@NJOO%%M
(>:)\	3 	3 	3 (--// 	( 	(JCz~~c""e++"'
3	(---// 	( 	(JCz~~c""e++"'
3	( s   F= =AHc                     ddl m}  |dd          }|                    d           g }	t          j                    }
t          j         j                   	 |                    t           j	                  g||          }|	 fd|D             z  }	t          j        |
           n# t          j        |
           w xY w|
                    |	t          |          |||	           d
S )z@cd into the directory where the cfile is, use distutils to buildr   )new_compiler      )forceverboser   )r   extra_preargsc                 >    g | ]}t          j        |z            S  )r;   parent).0rr5   s     r$   
<listcomp>zbuild.<locals>.<listcomp>   s(    777aCq())777r6   )r*   rr   r+   N)numpy.distutils.ccompilerrm   	customizerZ   getcwdchdirru   compiler;   r2   link_shared_object)r5   r)   rf   rg   r   r*   r+   rm   compilerobjectsoldress   `           r$   rc   rc      s    766666|!Q///HrG
)++CHU\__%'   
 	777737777
^$$ !	   # # # # #s   <B* *C c                  6    t          j        d          } | sJ | S )N
EXT_SUFFIX)r/   r0   )rets    r$   r`   r`      s     

"<
0
0CJJ3Jr6   )__doc__rZ   r   rX   r/   __all__r   r   r.   r   r   r1   rc   r`   rt   r6   r$   <module>r      s     
			  



    ')C
D )+d2> > > > >F "$"
 
 
 
B  % % %P  $ 46$ $ $ $N# # #8    r6   