
    wg('                         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c m	Z d dlmZ dej4                  v Z G d d      Z G d d      Zd Zy)    N)cache_from_source)path)	build_extget_abi3_suffix)Distribution)CompileError)	Extension   )environment)DALS)get_config_var__pypy__c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestBuildExtc                     t               }t        |      }d|j                  d<   |j                  d      }t        j                  j                  |d      }||k(  sJ y)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wanteds        d/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/setuptools/tests/test_build_ext.pytest_get_ext_filenamez"TestBuildExt.test_get_ext_filename   sT     ~o!#I""5)00e<f}}    c                    t        t                      t        ddgd      }t        t	        |g            }t        |      }|j                          d|j                  v sJ |j                  d      }t               s|j                  t        d            sJ y
t        j                  dk(  r|j                  d      sJ y
d	|v sJ y
)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   s        r   test_abi3_filenamezTestBuildExt.test_abi3_filename$   s    
 	o kH:dK	Di[9:ockk)))"";/ <<| <===\\W$<<
+++S= =r   c                    t               }t        |      }t        ddgd      x|j                  d<   }d|_        t
        s|j                  d      }nd}	 dt        j                  d<   |j                  d	      }d
|k(  sJ |j                  d      }||k(  sJ 	 t        j                  d= y# t        j                  d= w xY 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   s         r   test_ext_suffix_overridez%TestBuildExt.test_ext_suffix_override9   s    
 ~o(1G	)
 	
J# !&))*5F ,F	42@BJJ./&&x0C'3...&&z2CS= =

23

23s   AB, ,B?c                     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        j                  |       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?   ext2rA   s        r   dist_with_examplezTestBuildExt.dist_with_exampleY   s    h278#h^4

 (B'CD,/H.IJ"6!78

5# $-;
  	r   c           	      L   |j                  dd       |j                  dd       | j                         }|j                  d      }d|_         |j
                          |j                  j                  t        j                  d      } |j                         D cg c]"  }|j                  t        j                  d      $ }}|| d| d| d	gk(  sJ  |j                         i k(  sJ |j                  d       d
|_         |j
                           |j                         j                         D 	ci c]D  \  }}	|j                  t        j                  d      |	j                  t        j                  d      F }
}}	|
| dd| dd| d	dik(  sJ y c c}w c c}	}w )Nr3   .mp3&setuptools.command.build_ext.use_stubsFr   /	/ext3.mp3/mypkg/ext1.mp3/mypkg/subpkg/ext2.mp3Tsrc/ext3.mp3src/mypkg/ext1.mp3src/mypkg/subpkg/ext2.mp3)setenvsetattrrG   get_command_objeditable_modeensure_finalized	build_libreplacer7   sepget_outputsget_output_mappingreinitialize_commanditems)r   
tmpdir_cwdmonkeypatchr   r   rW   xoutputskvmappings              r   test_get_outputszTestBuildExt.test_get_outputsj   s   2F;DeL%%' ((5	"'	"	""$''//<	3H93H3H3JKa199RVVS)KKk#k)k/0
 
 	
 

 ,y++-333 	!!+."&	"	""$ 5	446<<>
1 IIbffc"AIIbffc$::
 
 k#^k)+?k/02M
 
 	
 
! L
s   'F8A	F c                 r   |j                  dd       |j                  dd       | j                         }|j                  d      }d|_         |j
                          |j                  D ]  }|j                  |dd        |j                  j                  t        j                  d      } |j                         j                         D ci c]D  \  }}|j                  t        j                  d      |j                  t        j                  d      F }	}}d }
|	 |
| d	       |
d
      | dd |
| d       |
d      | dd |
| d       |
d      | ddik(  sJ | d|	vsJ | d|	vsJ  |
| d      }||	v sJ |j                  | d      sJ |j                  d      sJ y c c}}w )Nr3   rI   rJ   Tr   _needs_stubrK   c                 T    t        |       j                  t        j                  d      S )zDMake it possible to do comparisons and tests in a OS-independent wayrK   )_compiled_file_namerX   r7   rY   )files    r   Cz9TestBuildExt.test_get_output_mapping_with_stub.<locals>.C   s    &t,44RVVSAAr   z/ext3.pyzsrc/ext3.pyrL   rO   z/mypkg/ext1.pyzsrc/mypkg/ext1.pyrM   rP   z/mypkg/subpkg/ext2.pyzsrc/mypkg/subpkg/ext2.pyrN   rQ   z/mypkg/__pycache__/ext1z.pyc)rR   rS   rG   rT   rU   rV   
extensionsrW   rX   r7   rY   r[   r]   
startswithr,   )r   r^   r_   r   r   r9   rW   rb   rc   rd   rk   example_stubs               r   !test_get_output_mapping_with_stubz.TestBuildExt.test_get_output_mapping_with_stub   s   2F;DdK%%' ((5	"&	"	""$'' 	:C]D9	: ''//<	 5	446<<>
1 IIbffc"AIIbffc$::
 

	B 8$%q'7k#^>*+Q/B-Ck)+?012A6P4Qk/02M
 
 	
 
 N+7:::12'AAA I;n56w&&&&&)4K'LMMM$$V,,,5
s   A	F3N)	__name__
__module____qualname__r   r0   r;   rG   re   ro    r   r   r   r      s"    !*4@"
@'-r   r   c                   .    e Zd ZdedefdZd Zd Zd Zy)TestBuildExtInplaceoptionalreturnc                 
   di i dd}t        j                  |       t        ddg|      }t        t	        |g            }d|_        t        |      } t        |      j                  dd	d
d| |j                          |S )Nz#include missingheader.h
)libtmp)r!   z.buildr    r!   )rv   r$   setup.pyz
.build/libz
.build/tmp)rW   
build_temprs   )
r   rD   r	   r   r*   rB   r   varsupdaterV   )r   rv   optsrE   r/   r   r   s          r   get_build_ext_cmdz%TestBuildExtInplace.get_build_ext_cmd   s    2 ,
 	

5kH:I	Di[9:%oS	Q<LQDQ
r   c                     |j                         }|j                  j                         |j                  j                         z   |j                  z   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stds       r   get_log_messagesz$TestBuildExtInplace.get_log_messages   s@     !ww!!#cgg&8&8&::V__LLr   c                     | j                  dd      }|j                          t        d | j                  ||      D              sJ y)z
        If optional extensions fail to build, setuptools should show the error
        in the logs but not fail to build
        Trv   inplacec              3       K   | ]  }d   yw)z0build_ext: building extension "spam.eggs" failedNrs   ).0msgs     r   	<genexpr>z4TestBuildExtInplace.test_optional.<locals>.<genexpr>   s      
 ?
s   N)r   runanyr   )r   r^   r   r   r   s        r   test_optionalz!TestBuildExtInplace.test_optional   sN    
 $$dD$A	 
,,VV<
 
 	
 
r   c                     | j                  dd      }t        j                  t              5  |j	                          d d d        y # 1 sw Y   y xY w)NFTr   )r   pytestraisesr   r   )r   r^   r   s      r   test_non_optionalz%TestBuildExtInplace.test_non_optional   sA    $$eT$B]]<( 	GGI	 	 	s   AAN)	rp   rq   rr   boolr   r   r   r   r   rs   r   r   ru   ru      s%    $ 9 M

r   ru   c                     t        d      t        d      t        d      d}t        j                  |       t        j                  dgd      \  }}|dk(  s
J d	|z         y )
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
            )r{   zfoo.cz	setup.cfgrD   )r      )r   data_streamr   z
STDOUT:
%s
STDERR:
%s)r   r   rD   r   run_setup_py)r^   rE   codeoutputs       r   test_build_ext_config_handlingr      sz    	
 (*
V 
m<Ez 	JJu++ILD& 19;2V;;9r   )r7   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_namesr6   r   ru   r   rs   r   r   <module>r      s]    	 
 C   C ( * *   * * .
00
0[- [-|) )XC<r   