o
    g2                     @   s  d dl Z d dlZd dlZd dlmZ g dZedZG dd deZ	G dd deZ
d	d
 Zdd ZG dd dZG dd dZdd Zdd Zdd Zdd ZdCddZdCddZi ZdCddZedkrSd d lmZ d dlZe Zejd!d"d#d$d% ejd&d'd#d(d% ejd)d*d+d, ejd-d.d#d/d% ejd0d1d2d, ejd3d4d#d2d% ejd5d6d7d, ee j\ZZ e!e d8k re"d9ej#red:Z$e$D ]Z%ee%Z&e'd;e&j(e&j(e&j)f  qe d< Z*ej+,d=Z-e-ree*d>d?e-gZ&nee*d>d?gZ&ej.rej.Z.nd@Z.ej/r&e0dAej/Z1e1se"dBe12d<Z(e12d8Z3e3e&j4e(< ej5r1e'e&5e. ej6r<e'e&6e. ej7rEe'e&j7 ej8rUe'e&j7ej8k dS dS dS )D    N)RawConfigParser)FormatErrorPkgNotFoundLibraryInfoVariableSetread_configparse_flagsz\$\{([a-zA-Z0-9_-]+)\}c                   @       e Zd ZdZdd Zdd ZdS )r   zQ
    Exception thrown when there is a problem parsing a configuration file.

    c                 C   
   || _ d S Nmsgselfr    r   X/var/www/html/api-tag/env/lib/python3.10/site-packages/numpy/distutils/npy_pkg_config.py__init__      
zFormatError.__init__c                 C      | j S r   r   r   r   r   r   __str__      zFormatError.__str__N__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    r   c                   @   r	   )r   z3Exception raised when a package can not be located.c                 C   r
   r   r   r   r   r   r   r      r   zPkgNotFound.__init__c                 C   r   r   r   r   r   r   r   r      r   zPkgNotFound.__str__Nr   r   r   r   r   r      s    r   c                 C   s   g g g g g d}d|   d}|D ]_}d| }t|dkrp|dr0|d |dd	   q|d
rC|d |dd	   q|drV|d |dd	   q|dri|d |dd	   q|d | q|S )a  
    Parse a line from a config file containing compile flags.

    Parameters
    ----------
    line : str
        A single line containing one or more compile flags.

    Returns
    -------
    d : dict
        Dictionary of parsed flags, split into relevant categories.
        These categories are the keys of `d`:

        * 'include_dirs'
        * 'library_dirs'
        * 'libraries'
        * 'macros'
        * 'ignored'

    )include_dirslibrary_dirs	librariesmacrosignored z --r   z-Ir      Nz-Lr   z-lr   z-Dr    r!   )splitlen
startswithappendstrip)linedflagsflagr   r   r   r      s$   



r   c                 C   s   |  ddS )N\z\\)replace)valr   r   r   _escape_backslashI   s   r1   c                   @   s>   e Zd ZdZdddZdd Zddd	Zdd
dZdd ZdS )r   a$  
    Object containing build information about a library.

    Parameters
    ----------
    name : str
        The library name.
    description : str
        Description of the library.
    version : str
        Version string.
    sections : dict
        The sections of the configuration file for the library. The keys are
        the section headers, the values the text under each header.
    vars : class instance
        A `VariableSet` instance, which contains ``(name, value)`` pairs for
        variables defined in the configuration file for the library.
    requires : sequence, optional
        The required libraries for the library to be installed.

    Notes
    -----
    All input parameters (except "sections" which is a method) are available as
    attributes of the same name.

    Nc                 C   s4   || _ || _|r|| _ng | _|| _|| _|| _d S r   )namedescriptionrequiresversion	_sectionsvars)r   r2   r3   r5   sectionsr7   r4   r   r   r   r   g   s   
zLibraryInfo.__init__c                 C      t | j S )z
        Return the section headers of the config file.

        Parameters
        ----------
        None

        Returns
        -------
        keys : list of str
            The list of section headers.

        )listr6   keysr   r   r   r   r8   r      zLibraryInfo.sectionsdefaultc                 C      | j | j| d }t|S )Ncflagsr7   interpolater6   r1   r   sectionr0   r   r   r   r?         zLibraryInfo.cflagsc                 C   r>   )Nlibsr@   rB   r   r   r   rE      rD   zLibraryInfo.libsc                 C   sV   d| j  d| j g}| jr|d n|dd| j  |d| j  d|S )NzName: %szDescription: %sz	Requires:zRequires: %s,zVersion: %s
)r2   r3   r4   r(   joinr5   )r   mr   r   r   r      s   
zLibraryInfo.__str__r   )r=   )	r   r   r   r   r   r8   r?   rE   r   r   r   r   r   r   L   s    


r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )r   a  
    Container object for the variables defined in a config file.

    `VariableSet` can be used as a plain dictionary, with the variable names
    as keys.

    Parameters
    ----------
    d : dict
        Dict of items in the "variables" section of the configuration file.

    c                 C   s0   t dd | D | _i | _i | _|   d S )Nc                 S   s   g | ]\}}||fqS r   r   ).0kvr   r   r   
<listcomp>       z(VariableSet.__init__.<locals>.<listcomp>)dictitems	_raw_data_re_re_sub_init_parse)r   r+   r   r   r   r      s   zVariableSet.__init__c                 C   s$   | j  D ]
\}}| || qd S r   )rQ   rP   _init_parse_var)r   rK   rL   r   r   r   rT      s   zVariableSet._init_parsec                 C   s"   t d| | j|< || j|< d S )Nz\$\{%s\})recompilerR   rS   r   r2   valuer   r   r   rU      s   zVariableSet._init_parse_varc                    s>    fdd}t |r||}||kr	 |S |}t |s|S )Nc                    s,    j  D ]} j |  j| | } q| S r   )rR   r;   subrS   )rY   rK   r   r   r   _interpolate   s   z-VariableSet.interpolate.<locals>._interpolate)_VARsearch)r   rY   r[   nvaluer   r   r   rA      s   

zVariableSet.interpolatec                 C   r9   )z
        Return the list of variable names.

        Parameters
        ----------
        None

        Returns
        -------
        names : list of str
            The names of all variables in the `VariableSet` instance.

        )r:   rQ   r;   r   r   r   r   	variables   r<   zVariableSet.variablesc                 C   s
   | j | S r   )rQ   )r   r2   r   r   r   __getitem__   r   zVariableSet.__getitem__c                 C   s   || j |< | || d S r   )rQ   rU   rX   r   r   r   __setitem__   s   
zVariableSet.__setitem__N)r   r   r   r   r   rT   rU   rA   r_   r`   ra   r   r   r   r   r      s    r   c                 C   sR   |  ds	tdt| d}dD ]}||vrtd| qd|vr'g |d< |S )NmetazNo meta section found !)r2   r3   r5   z6Option %s (section [meta]) is mandatory, but not foundr4   )has_sectionr   rO   rP   )configr+   rK   r   r   r   
parse_meta   s   
re   c                 C   s:   |  ds	tdi }| dD ]\}}|||< qt|S )Nr_   zNo variables section found !)rc   r   rP   r   )rd   r+   r2   rY   r   r   r   parse_variables   s   

rf   c                 C   s   t tfS r   )meta_dr)rd   r   r   r   parse_sections      ri   c                 C   s   d|  S )Nz%s.inir   )pkg_namer   r   r   pkg_to_filename   rj   rl   c                    s   |r fdd|D }n g}t  }||}t|dks%tdt| t|}i }|dr@|dD ]
\}}t|||< q5dd |	 D }	i }
i }|	D ]$}i }|
|dra||d||< ||D ]\}}|||< qf||
|< qO|||
|fS )Nc                    s   g | ]	}t j| qS r   )ospathrH   )rJ   r+   filenamer   r   rM      s    z parse_config.<locals>.<listcomp>   zCould not find file(s) %sr_   c                 S   s   g | ]}|d vr|qS ))rb   r_   r   )rJ   sr   r   r   rM     rN   r4   )r   readr&   r   strre   rc   rP   r1   r8   
has_optionget)rp   dirs	filenamesrd   nrb   r7   r2   rY   secsr8   r4   rr   r+   r   ro   r   parse_config   s.   



r{   c                    s    fdd  | \}}}}d|vr:d|v r:|d }|t jvr*td||d f t j| }ttj|j|d< t|d |d |d |t	|d	S )
Nc                    s   t | \}}}}| D ]8\}} t|\}}}	}
| D ]\}}||vr+|||< q|	|  D ]\}}|rD|| |  d| 7  < q2q||||fS )Nz %s)r{   rP   rl   )frb   r7   r8   reqsrnamervaluenmetanvars	nsectionsnreqsrK   rL   onameovalue_read_configrw   r   r   r     s   z&_read_config_imp.<locals>._read_configpkgdirpkgnamez-You should import %s to get information on %sr2   r3   r5   )r2   r3   r5   r8   r7   )
sysmodules
ValueErrorr1   rm   rn   dirname__file__r   r   )rx   rw   rb   r7   r8   r}   r   modr   r   r   _read_config_imp  s   


r   c                 C   s8   zt |  W S  ty   tt| |}|t | < | Y S w )a  
    Return library info for a package from its configuration file.

    Parameters
    ----------
    pkgname : str
        Name of the package (should match the name of the .ini file, without
        the extension, e.g. foo for the file foo.ini).
    dirs : sequence, optional
        If given, should be a sequence of directories - usually including
        the NumPy base directory - where to look for npy-pkg-config files.

    Returns
    -------
    pkginfo : class instance
        The `LibraryInfo` instance containing the build information.

    Raises
    ------
    PkgNotFound
        If the package is not found.

    See Also
    --------
    misc_util.get_info, misc_util.get_pkg_info

    Examples
    --------
    >>> npymath_info = np.distutils.npy_pkg_config.read_config('npymath')
    >>> type(npymath_info)
    <class 'numpy.distutils.npy_pkg_config.LibraryInfo'>
    >>> print(npymath_info)
    Name: npymath
    Description: Portable, core math library implementing C99 standard
    Requires:
    Version: 0.1  #random

    )_CACHEKeyErrorr   rl   )r   rw   rL   r   r   r   r   F  s   '
r   __main__)OptionParserz--cflagsr?   
store_truez*output all preprocessor and compiler flags)destactionhelpz--libsrE   zoutput all linker flagsz--use-sectionrC   z/use this section instead of default for options)r   r   z	--versionr5   zoutput versionz--atleast-versionmin_versionzMinimal versionz
--list-alllist_allz--define-variabledefine_variablez%Replace variable with the given valuer$   z(Expect package name on the command line:z*.iniz
%s	%s - %srq   NPY_PKG_CONFIG_PATHznumpy/_core/lib/npy-pkg-config.r=   z([\S]+)=([\S]+)zH--define-variable option should be of the form --define-variable=foo=barr   )9r   rV   rm   configparserr   __all__rW   r\   OSErrorr   r   r   r1   r   r   re   rf   ri   rl   r{   r   r   r   r   optparser   globparser
add_option
parse_argsargvoptionsargsr&   r   r   filesr|   infoprintr2   r3   rk   environrv   r+   rC   r   r]   rI   grouprY   r7   r?   rE   r5   r   r   r   r   r   <module>   s    
*HD

$(

3









?