3 \[@ã@sþdZddlZddlZddlZddlmZmZmZddlZddl m Z m Z ddl m Z ddlmZddlmZmZmZmZddlmZdd lmZdd lmZd d „ZGd d„de ƒZGdd„deƒZdZdZdZ dd„Z!ej"dƒZ#dd„Z$dd„Z%dd„Z&dS)adistutils.cygwinccompiler Provides the CygwinCCompiler class, a subclass of UnixCCompiler that handles the Cygwin port of the GNU C compiler to Windows. It also contains the Mingw32CCompiler class which handles the mingw32 port of GCC (same as cygwin in no-cygwin mode). éN)ÚPopenÚPIPEÚ check_output)Úgen_preprocess_optionsÚgen_lib_options)Ú UnixCCompiler)Ú write_file)ÚDistutilsExecErrorÚCCompilerErrorÚ CompileErrorÚUnknownFileError)Úlog)Ú LooseVersion)Úfind_executablecCs€tjjdƒ}|dkr|tj|d|d…}|dkr8dgS|dkrFdgS|d krTd gS|d krbd gS|d krpdgStd|ƒ‚dS)zaInclude the appropriate MSVC runtime library if Python was built with MSVC 7.0 or later. zMSC v.ééé Z1300Zmsvcr70Z1310Zmsvcr71Z1400Zmsvcr80Z1500Zmsvcr90Z1600Zmsvcr100zUnknown MS Compiler version %s Néÿÿÿÿ)ÚsysÚversionÚfindÚ ValueError)Zmsc_posZmsc_ver©rú1/usr/lib64/python3.6/distutils/cygwinccompiler.pyÚ get_msvcr?s rc @sReZdZdZdZdZdZdZdZdZ dZ dd d „Z d d „Z ddd„Z ddd„ZdS)ÚCygwinCCompilerz? Handles the Cygwin port of the GNU C compiler to Windows. Úcygwinz.oz.az.dllzlib%s%sz%s%sz.exercCsètj||||ƒtƒ\}}|jd||fƒ|tk rB|jd|ƒtƒ\|_|_|_ |j|j d|j|j|j fƒ|jdkr†d|_ nd|_ |jdkrœd}nd }|j d d d d d|j |fd�|jdkrÜdg|_ |jdƒntƒ|_ dS)Nz%Python's GCC status: %s (details: %s)zƒPython's pyconfig.h doesn't seem to support your compiler. Reason: %s. Compiling may fail because of undefined preprocessor macros.z: gcc %s, ld %s, dllwrap %s z2.10.90ÚgccÚdllwrapz2.13z-sharedz -mdll -staticzgcc -mcygwin -O -Wallzgcc -mcygwin -mdll -O -Wallzg++ -mcygwin -O -Wallz gcc -mcygwinz%s -mcygwin %s)ÚcompilerÚ compiler_soÚ compiler_cxxÚ linker_exeÚ linker_soz2.91.57Zmsvcrtz,Consider upgrading to a newer version of gcc)rÚ__init__Úcheck_config_hZ debug_printÚ CONFIG_H_OKÚwarnÚ get_versionsÚ gcc_versionÚ ld_versionZdllwrap_versionÚ compiler_typeÚ linker_dllÚset_executablesÚ dll_librariesr)ÚselfÚverboseÚdry_runÚforceZstatusZdetailsÚ shared_optionrrrr$ds<      zCygwinCCompiler.__init__cCs¨|dks|dkrVy|jdd|d|gƒWq¤tk rR}zt|ƒ‚WYdd}~Xq¤XnNy"|j|j||d|g|ƒWn*tk r¢}zt|ƒ‚WYdd}~XnXdS)z:Compiles the source by spawning GCC and windres if needed.z.rcz.resZwindresz-iz-oN)Zspawnr r r )r/ÚobjÚsrcÚextZcc_argsÚextra_postargsZpp_optsÚmsgrrrÚ_compileŸs zCygwinCCompiler._compileNcCsRtj| p gƒ} tj|pgƒ}tj|p&gƒ}|j|jƒ|dk oP||jksT|jdk�rtjj|dƒ}tjjtjj |ƒƒ\}}tjj ||dƒ}tjj |d|dƒ}dtjj |ƒdg}x|D]}|j |ƒq¾W|j t ||fd |ƒ|jd k�r| jd |gƒ| jd |gƒn |j |ƒ| �s*| j d ƒtj||||||||d| | | | | ƒdS)zLink the objects.Nrrz.defÚlibz.az LIBRARY %sZEXPORTSz writing %srz --output-libz--defz-s)ÚcopyÚextendr.Z EXECUTABLEr,ÚosÚpathÚdirnameÚsplitextÚbasenameÚjoinÚappendZexecuterrÚlink)r/Z target_descZobjectsZoutput_filenameÚ output_dirZ librariesZ library_dirsZruntime_library_dirsZexport_symbolsÚdebugZ extra_preargsr7Z build_tempZ target_langZtemp_dirZdll_nameZ dll_extensionZdef_fileZlib_fileÚcontentsZsymrrrrD®s:         zCygwinCCompiler.linkÚcCs®|dkr d}g}x˜|D]�}tjjtjj|ƒƒ\}}||jddgkrTtd||fƒ‚|rdtjj|ƒ}|dkrŒ|jtjj||||j ƒƒq|jtjj|||j ƒƒqW|S)z#Adds supports for rc and res files.NrHú.rcú.resz"unknown file type '%s' (from '%s'))rJrI) r=r>r@ÚnormcaseZsrc_extensionsr rArCrBÚ obj_extension)r/Zsource_filenamesZ strip_dirrEZ obj_namesZsrc_nameÚbaser6rrrÚobject_filenamesüs      z CygwinCCompiler.object_filenames)rrr) NNNNNrNNNN)rrH)Ú__name__Ú __module__Ú __qualname__Ú__doc__r+rLZstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionr$r9rDrNrrrrrYs ; Krc@seZdZdZdZddd„ZdS)ÚMingw32CCompilerz@ Handles the Mingw32 port of the GNU C compiler to Windows. Zmingw32rc Csxtj||||ƒ|jdkr d}nd}|jdkr4d}nd}tƒrFtdƒ‚|jdd d d d |j||fd �g|_t ƒ|_dS)Nz2.13z-sharedz -mdll -staticz2.91.57z--entry _DllMain@12rHz1Cygwin gcc cannot be used with --compiler=mingw32z gcc -O -Wallzgcc -mdll -O -Wallz g++ -O -Wallrz%s %s %s)rr r!r"r#) rr$r*r)Ú is_cygwingccr r-r,r.r)r/r0r1r2r3Z entry_pointrrrr$s&   zMingw32CCompiler.__init__N)rrr)rOrPrQrRr+r$rrrrrSsrSÚokznot okZ uncertaincCsšddlm}dtjkrtdfS|jƒ}y@t|ƒ}z(d|jƒkrJtd|fStd|fSWd|j ƒXWn.t k r”}zt d ||j ffSd}~XnXdS) awCheck if the current Python installation appears amenable to building extensions with GCC. Returns a tuple (status, details), where 'status' is one of the following constants: - CONFIG_H_OK: all is well, go ahead and compile - CONFIG_H_NOTOK: doesn't look good - CONFIG_H_UNCERTAIN: not sure -- unable to read pyconfig.h 'details' is a human-readable string explaining the situation. Note there are two ways to conclude "OK": either 'sys.version' contains the string "GCC" (implying that this Python was built with GCC), or the installed "pyconfig.h" contains the string "__GNUC__". r)Ú sysconfigZGCCzsys.version mentions 'GCC'Z__GNUC__z'%s' mentions '__GNUC__'z '%s' does not mention '__GNUC__'Nzcouldn't read '%s': %s) Ú distutilsrVrrr&Úget_config_h_filenameÚopenÚreadÚCONFIG_H_NOTOKÚcloseÚOSErrorÚCONFIG_H_UNCERTAINÚstrerror)rVÚfnÚconfig_hÚexcrrrr%Hs    r%s(\d+\.\d+(\.\d+)*)c Csl|jƒd}t|ƒdkrdSt|dtd�j}z |jƒ}Wd|jƒXtj|ƒ}|dkrZdSt |j dƒj ƒƒS)z¤Find the version of an executable by running `cmd` in the shell. If the command is not found, or the output does not match `RE_VERSION`, returns None. rNT)ÚshellÚstdoutr) ÚsplitrrrrdrZr\Ú RE_VERSIONÚsearchrÚgroupÚdecode)ÚcmdÚ executableÚoutÚ out_stringÚresultrrrÚ_find_exe_versionus     rocCsdddg}tdd„|DƒƒS)zg Try to find out the versions of gcc, ld and dllwrap. If not possible it returns None for it. zgcc -dumpversionzld -vzdllwrap --versioncSsg|] }t|ƒ‘qSr)ro)Ú.0rjrrrú �sz get_versions..)Útuple)Zcommandsrrrr(Šs r(cCstddgƒ}|jƒjdƒS)z>Try to determine if the gcc that would be used is from cygwin.rz -dumpmachinescygwin)rÚstripÚendswith)rmrrrrT’s rT)'rRr=rr;Ú subprocessrrrÚreZdistutils.ccompilerrrZdistutils.unixccompilerrZdistutils.file_utilrZdistutils.errorsr r r r rWr Zdistutils.versionrZdistutils.spawnrrrrSr&r[r^r%Úcompilerfror(rTrrrrÚs0)     ;1+