a
    p=ic2                     @   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dDddZi ZdEddZedkrd 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/rVe0dAej/Z1e1s8e"dBne12d<Z(e12d8Z3e3e&j4e(< ej5rle'e&5e. ej6re'e&6e. ej7re'e&j7 ej8re'e&j7ej8k dS )F    N)RawConfigParser)FormatErrorPkgNotFoundLibraryInfoVariableSetread_configparse_flagsz\$\{([a-zA-Z0-9_-]+)\}c                   @   s    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   s
   || _ d S Nmsgselfr    r   o/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/numpy/distutils/npy_pkg_config.py__init__   s    zFormatError.__init__c                 C   s   | j S r	   r
   r   r   r   r   __str__   s    zFormatError.__str__N__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   z3Exception raised when a package can not be located.c                 C   s
   || _ d S r	   r
   r   r   r   r   r      s    zPkgNotFound.__init__c                 C   s   | j S r	   r
   r   r   r   r   r      s    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r"|dr`|d |dd	   q"|d
r|d |dd	   q"|dr|d |dd	   q"|dr|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    r,   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   r-   r.   r0   sectionsr2   r/   r   r   r   r   g   s    zLibraryInfo.__init__c                 C   s   t | j S )z
        Return the section headers of the config file.

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

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

        )listr1   keysr   r   r   r   r3   r   s    zLibraryInfo.sectionsdefaultc                 C   s   | j | j| d }t|S )Ncflagsr2   interpolater1   r,   r   sectionr+   r   r   r   r7      s    zLibraryInfo.cflagsc                 C   s   | j | j| d }t|S )Nlibsr8   r:   r   r   r   r<      s    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
)r-   r.   r/   r#   joinr0   )r   mr   r   r   r      s    zLibraryInfo.__str__)N)r6   )r6   )	r   r   r   r   r   r3   r7   r<   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	   )rH   rG   _init_parse_var)r   rB   rC   r   r   r   rK      s    zVariableSet._init_parsec                 C   s"   t d| | j|< || j|< d S )Nz\$\{%s\})recompilerI   rJ   r   r-   valuer   r   r   rL      s    zVariableSet._init_parse_varc                    s2    fdd}t |r.||}||kr(q.|}q|S )Nc                    s,    j  D ]} j |  j| | } q
| S r	   )rI   r5   subrJ   )rP   rB   r   r   r   _interpolate   s    z-VariableSet.interpolate.<locals>._interpolate)_VARsearch)r   rP   rR   Znvaluer   r   r   r9      s    
zVariableSet.interpolatec                 C   s   t | j S )z
        Return the list of variable names.

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

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

        )r4   rH   r5   r   r   r   r   	variables   s    zVariableSet.variablesc                 C   s
   | j | S r	   )rH   )r   r-   r   r   r   __getitem__   s    zVariableSet.__getitem__c                 C   s   || j |< | || d S r	   )rH   rL   rO   r   r   r   __setitem__   s    
zVariableSet.__setitem__N)r   r   r   r   r   rK   rL   r9   rU   rV   rW   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rNg |d< |S )NmetazNo meta section found !)r-   r.   r0   z6Option %s (section [meta]) is mandatory, but not foundr/   )has_sectionr   rF   rG   )configr&   rB   r   r   r   
parse_meta   s    
r[   c                 C   s:   |  dstdi }| dD ]\}}|||< q t|S )NrU   zNo variables section found !)rY   r   rG   r   )rZ   r&   r-   rP   r   r   r   parse_variables   s    

r\   c                 C   s   t tfS r	   )Zmeta_dr)rZ   r   r   r   parse_sections   s    r^   c                 C   s   d|  S )Nz%s.inir   )pkg_namer   r   r   pkg_to_filename   s    r`   c                    s   |r fdd|D }n g}t  }||}t|dksJtdt| t|}i }|dr|dD ]\}}t|||< qjdd |	 D }	i }
i }|	D ]H}i }|
|dr||d||< ||D ]\}}|||< q||
|< q|||
|fS )Nc                    s   g | ]}t j| qS r   )ospathr?   )rA   r&   filenamer   r   rD      rE   z parse_config.<locals>.<listcomp>   zCould not find file(s) %srU   c                 S   s   g | ]}|d vr|qS ))rX   rU   r   )rA   sr   r   r   rD     rE   r/   )r   readr!   r   strr[   rY   rG   r,   r3   
has_optionget)rd   dirs	filenamesrZ   nrX   r2   r-   rP   Zsecsr3   r/   rf   r&   r   rc   r   parse_config   s.    



rn   c                    s    fdd  | \}}}}d|vrtd|v rt|d }|t jvrTtd||d f t j| }ttj|j|d< t|d |d |d |t	|d	S )
Nc                    s   t | \}}}}| D ]p\}} t|\}}}	}
| D ]\}}||vr>|||< q>|	|  D ]$\}}|rd|| |  d| 7  < qdq||||fS )Nz %s)rn   rG   r`   )frX   r2   r3   reqsrnameZrvalueZnmetaZnvarsZ	nsectionsZnreqsrB   rC   ZonameZovalue_read_configrk   r   r   rs     s    
z&_read_config_imp.<locals>._read_configZpkgdirpkgnamez-You should import %s to get information on %sr-   r.   r0   )r-   r.   r0   r3   r2   )
sysmodules
ValueErrorr,   ra   rb   dirname__file__r   r   )rl   rk   rX   r2   r3   rp   rt   modr   rr   r   _read_config_imp  s    


r{   c                 C   s<   z
t |  W S  ty6   tt| |}|t | < | Y S 0 dS )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

    N)_CACHEKeyErrorr{   r`   )rt   rk   rC   r   r   r   r   F  s    '
r   __main__)OptionParserz--cflagsr7   
store_truez*output all preprocessor and compiler flags)destactionhelpz--libsr<   zoutput all linker flagsz--use-sectionr;   z/use this section instead of default for options)r   r   z	--versionr0   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 - %sre   ZNPY_PKG_CONFIG_PATHznumpy/core/lib/npy-pkg-config.r6   z([\S]+)=([\S]+)zH--define-variable option should be of the form --define-variable=foo=bar)N)N)N)9ru   rM   ra   configparserr   __all__rN   rS   OSErrorr   r   r   r,   r   r   r[   r\   r^   r`   rn   r{   r|   r   r   optparser   globparser
add_option
parse_argsargvoptionsargsr!   rw   r   filesro   infoprintr-   r.   r_   environrj   r&   r;   r   rT   r@   grouprP   r2   r7   r<   r0   r   r   r   r   r   <module>   s   
*HD
$
(
3










