o
    5‘ðis'  ã                   @  sØ   d dl mZ d dlZd dlZd dlmZ d dlZd dlm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d	d
lmZ d	dlmZ d dlm  mZ d dlmZ dejv ZG dd„ dƒZG dd„ dƒZdd„ Z dS )é    )ÚannotationsN)Úcache_from_source)Úpath)Ú	build_extÚget_abi3_suffix)ÚDistribution)ÚCompileError)Ú	Extensioné   )Úenvironment)ÚDALS)Úget_config_varÚ__pypy__c                   @  s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestBuildExtc                 C  s@   t ƒ }t|ƒ}d|jd< | d¡}tj |d¡}||ksJ ‚dS )z…
        Setuptools needs to give back the same
        result as distutils, even if the fullname
        is not in ext_map.
        Ú zfoo/barÚfooN)r   r   Úext_mapÚget_ext_filenameÚorig)ÚselfÚdistÚcmdÚresÚwanted© r   ú^/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/tests/test_build_ext.pyÚtest_get_ext_filename   s   

z"TestBuildExt.test_get_ext_filenamec                 C  sš   t tƒ ƒ tddgdd�}tt|gd�ƒ}t|ƒ}| ¡  d|jv s$J ‚| d¡}tƒ s7| 	t
dƒ¡s5J ‚d
S tjdkrE| 	d¡sCJ ‚d
S d	|v sKJ ‚d
S )z}
        Filename needs to be loadable by several versions
        of Python 3 if 'is_abi3' is truthy on Extension()
        ú	spam.eggsúeggs.cT©Úpy_limited_api©Úext_modulesÚ
EXT_SUFFIXÚwin32zeggs.pydÚabi3N)Úprintr   r	   r   Údictr   Úfinalize_optionsr   r   Úendswithr   ÚsysÚplatform)r   Ú	extensionr   r   r   r   r   r   Útest_abi3_filename&   s   


zTestBuildExt.test_abi3_filenamec                 C  s’   t ƒ }t|ƒ}tddgdd� |jd< }d|_ts| d¡}nd}z"dtjd< | d	¡}d
|ks2J ‚| d¡}||ks=J ‚W tjd= dS tjd= w )zd
        SETUPTOOLS_EXT_SUFFIX variable always overrides
        default extension options.
        Úfor_abi3zs.cTr   Fzfor_abi3.test-suffixz.test-suffixÚSETUPTOOLS_EXT_SUFFIXÚnormalznormal.test-suffixN)	r   r   r	   r   Ú_links_to_dynamicÚIS_PYPYr   ÚosÚenviron)r   r   r   ÚextÚexpectr   r   r   r   Útest_ext_suffix_override;   s$   ü


z%TestBuildExt.test_ext_suffix_overridec                 C  sf   ddddiiidddiidœ}t dd	gƒ}t d
dgƒ}t ddgƒ}t |¡ td|||gddidœƒS )NÚmypkgÚsubpkgzext2.cr   Úext1zmain.c)Úsrczc-extensionsz
mypkg.ext1zc-extensions/ext1/main.czmypkg.subpkg.ext2zsrc/mypkg/subpkg/ext2.cÚext3zc-extension/ext3.cz%test%r;   )Úscript_namer"   Úpackage_dir)r	   r   Úbuildr   )r   Úfilesr:   Úext2r<   r   r   r   Údist_with_example[   s   
þ
ýzTestBuildExt.dist_with_examplec                 C  sê   |  dd¡ | dd¡ |  ¡ }| d¡}d|_| ¡  |j tj	d¡}dd„ | 
¡ D ƒ}||› d	�|› d
�|› d�gks?J ‚| ¡ i ksGJ ‚| d¡ d|_| ¡  dd„ | ¡  ¡ D ƒ}||› d	�d|› d
�d|› d�dikssJ ‚d S )Nr/   ú.mp3ú&setuptools.command.build_ext.use_stubsFr   ú/c                 S  s   g | ]	}|  tjd ¡‘qS ©rE   ©Úreplacer3   Úsep)Ú.0Úxr   r   r   Ú
<listcomp>v   s    z1TestBuildExt.test_get_outputs.<locals>.<listcomp>ú	/ext3.mp3ú/mypkg/ext1.mp3ú/mypkg/subpkg/ext2.mp3Tc                 S  ó*   i | ]\}}|  tjd ¡|  tjd ¡“qS rF   rG   ©rJ   ÚkÚvr   r   r   Ú
<dictcomp>‚   ó    ÿÿz1TestBuildExt.test_get_outputs.<locals>.<dictcomp>úsrc/ext3.mp3úsrc/mypkg/ext1.mp3úsrc/mypkg/subpkg/ext2.mp3)ÚsetenvÚsetattrrB   Úget_command_objÚeditable_modeÚensure_finalizedÚ	build_librH   r3   rI   Úget_outputsÚget_output_mappingÚreinitialize_commandÚitems)r   Ú
tmpdir_cwdÚmonkeypatchr   r   r^   ÚoutputsÚmappingr   r   r   Útest_get_outputsl   s2   

ý

þ


ýzTestBuildExt.test_get_outputsc           
      C  sD  |  dd¡ | dd¡ |  ¡ }| d¡}d|_| ¡  |jD ]	}| |dd¡ q|j t	j
d¡}dd	„ | ¡  ¡ D ƒ}d
d„ }|||› d�ƒ|dƒ|› d�d||› d�ƒ|dƒ|› d�d||› d�ƒ|dƒ|› d�dikspJ ‚|› d�|vsyJ ‚|› d�|vs‚J ‚||› d�ƒ}	|	|v s�J ‚|	 |› d�¡s™J ‚|	 d¡s J ‚d S )Nr/   rC   rD   Tr   Ú_needs_stubrE   c                 S  rP   rF   rG   rQ   r   r   r   rT   ™   rU   zBTestBuildExt.test_get_output_mapping_with_stub.<locals>.<dictcomp>c                 S  s   t | ƒ tjd¡S )zDMake it possible to do comparisons and tests in a OS-independent wayrE   )Ú_compiled_file_namerH   r3   rI   )Úfiler   r   r   ÚCž   s   z9TestBuildExt.test_get_output_mapping_with_stub.<locals>.Cz/ext3.pyzsrc/ext3.pyrM   rV   z/mypkg/ext1.pyzsrc/mypkg/ext1.pyrN   rW   z/mypkg/subpkg/ext2.pyzsrc/mypkg/subpkg/ext2.pyrO   rX   z/mypkg/__pycache__/ext1z.pyc)rY   rZ   rB   r[   r\   r]   Ú
extensionsr^   rH   r3   rI   r`   rb   Ú
startswithr)   )
r   rc   rd   r   r   r5   r^   rf   rk   Úexample_stubr   r   r   Ú!test_get_output_mapping_with_stubŒ   s6   


þ



ú
z.TestBuildExt.test_get_output_mapping_with_stubN)	Ú__name__Ú
__module__Ú__qualname__r   r-   r7   rB   rg   ro   r   r   r   r   r      s      r   c                   @  s.   e Zd Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestBuildExtInplaceÚoptionalÚboolÚreturnr   c                 K  sn   di i dœdœ}t  |¡ tddg|d�}tt|gd�ƒ}d|_t|ƒ}t|ƒjdd	d
dœ|¤Ž | 	¡  |S )Nz#include missingheader.h
)ÚlibÚtmp)r   z.buildr   r   )rt   r!   úsetup.pyz
.build/libz
.build/tmp)r^   Ú
build_tempr   )
r   r?   r	   r   r'   r=   r   ÚvarsÚupdater]   )r   rt   Úoptsr@   r,   r   r   r   r   r   Úget_build_ext_cmd·   s   þ
z%TestBuildExtInplace.get_build_ext_cmdc                 C  s"   |  ¡ }|j ¡ |j ¡  |j S )z½
        Historically, distutils "logged" by printing to sys.std*.
        Later versions adopted the logging framework. Grab
        messages regardless of how they were captured.
        )Ú
readouterrÚoutÚ
splitlinesÚerrÚmessages)r   ÚcaplogÚcapsysÚstdr   r   r   Úget_log_messagesÅ   s   z$TestBuildExtInplace.get_log_messagesc                 C  s8   | j ddd�}| ¡  tdd„ |  ||¡D ƒƒsJ ‚dS )z‚
        If optional extensions fail to build, setuptools should show the error
        in the logs but not fail to build
        T©rt   Úinplacec                 s  s   � | ]}d V  qdS )z0build_ext: building extension "spam.eggs" failedNr   )rJ   Úmsgr   r   r   Ú	<genexpr>Õ   s
   € ÿ
ÿz4TestBuildExtInplace.test_optional.<locals>.<genexpr>N)r~   ÚrunÚanyr‡   )r   rc   r„   r…   r   r   r   r   Útest_optionalÎ   s
   
þz!TestBuildExtInplace.test_optionalc                 C  sF   | j ddd�}t t¡� | ¡  W d   ƒ d S 1 sw   Y  d S )NFTrˆ   )r~   ÚpytestÚraisesr   rŒ   )r   rc   r   r   r   r   Útest_non_optionalÛ   s   
"ÿz%TestBuildExtInplace.test_non_optionalN)rt   ru   rv   r   )rp   rq   rr   r~   r‡   rŽ   r‘   r   r   r   r   rs   ¶   s
    
	rs   c                 C  sZ   t dƒt dƒt dƒdœ}t |¡ tjdgdd�\}\}}|dks+J d	|› d
|› �ƒ‚d S )NzÚ
            from setuptools import Extension, setup
            setup(
                name='foo',
                version='0.0.0',
                ext_modules=[Extension('foo', ['foo.c'])],
            )
            aÜ  
            #include "Python.h"

            #if PY_MAJOR_VERSION >= 3

            static struct PyModuleDef moduledef = {
                    PyModuleDef_HEAD_INIT,
                    "foo",
                    NULL,
                    0,
                    NULL,
                    NULL,
                    NULL,
                    NULL,
                    NULL
            };

            #define INITERROR return NULL

            PyMODINIT_FUNC PyInit_foo(void)

            #else

            #define INITERROR return

            void initfoo(void)

            #endif
            {
            #if PY_MAJOR_VERSION >= 3
                PyObject *module = PyModule_Create(&moduledef);
            #else
                PyObject *module = Py_InitModule("extension", NULL);
            #endif
                if (module == NULL)
                    INITERROR;
            #if PY_MAJOR_VERSION >= 3
                return module;
            #endif
            }
            zD
            [build]
            build_base = foo_build
            )ry   zfoo.cz	setup.cfgr?   )r   é   )r   Údata_streamr   z	
STDOUT:
z	
STDERR:
)r   r   r?   r   Úrun_setup_py)rc   r@   ÚcodeÚstdoutÚstderrr   r   r   Útest_build_ext_config_handlingâ   s    ÿ
ÿ+ÿÊ
=þ r˜   )!Ú
__future__r   r3   r*   Úimportlib.utilr   ri   r�   Újaracor   Úsetuptools.command.build_extr   r   Úsetuptools.distr   Úsetuptools.errorsr   Úsetuptools.extensionr	   r   r   Útextwrapr   Údistutils.command.build_extÚcommandr   Údistutils.sysconfigr   Úbuiltin_module_namesr2   r   rs   r˜   r   r   r   r   Ú<module>   s&    
 ,