1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
U
O±dŒXã@sÖdZddlZddlZddlZddlZddlZddlZddlZddl    m
Z
ddl Z ddl mZddlmZddlmZddlmZmZmZmZdd    „Ze d
¡Ze d ¡ZGd d „d e jjƒZdd„Z dd„Z!dd„Z"dd„Z#d:dd„Z$dd„Z%dd„Z&dd„Z'dd „Z(iZ)ejd!kr˜z`ddl*Z*d"e)d#<d$e)d%<d&e)d'<e+e*d(dƒZ,e,dk    rre -d)e,¡ .¡\Z/Z0e,e)e/e0<[/[0[,Wn e1k
r–e
 2d*¡YnXd+d,„Z3d;d.d/„Z4d0d1„Z5d2d3„Z6d4d5„Z7d6d7„Z8d8d9„Z9dS)<a
Support code for building Python extensions on Windows.
 
    # NT stuff
    # 1. Make sure libpython<version>.a exists for gcc.  If not, build it.
    # 2. Force windows to use gcc (we're struggling with MSVC and g77 support)
    # 3. Force windows to use g77
 
éN)Úlog)Ú UnixCCompiler)Úget_build_version)ÚUnknownFileError)Úmsvc_runtime_libraryÚmsvc_runtime_versionÚmsvc_runtime_majorÚget_build_architecturecCstƒ}|dkrgS|gS)zBReplacement for outdated version of get_msvcr from cygwinccompilerN)r)Zmsvcr©r
úWd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\numpy/distutils/mingw32ccompiler.pyÚget_msvcr_replacement#sr z\[Ordinal/Name Pointer\] Tablez$^\s+\[([\s*[0-9]*)\] ([a-zA-Z0-9_]*)c@s2eZdZdZdZd dd„Zd dd„Zdd
d „ZdS)ÚMingw32CCompilerzH A modified MingW32 compiler compatible with an MSVC built Python.
 
    Zmingw32rcCs’tjj ||||¡tƒtƒ}tdd}|s2|r<| d¡tƒ}|rV| dd|¡tƒdkrt|j    ddd    d
d n|j    d d ddd dg|_
dS)NT)ÚdebugZNPY_MINGW_USE_CUSTOM_MSVCRZ__MSVCRT_VERSION__z0x%04iÚAMD64z#gcc -g -DDEBUG -DMS_WIN64 -O0 -Wallz7gcc -g -DDEBUG -DMS_WIN64 -O0 -Wall -Wstrict-prototypeszgcc -gzgcc -g -shared)ÚcompilerÚ compiler_soÚ
linker_exeÚ    linker_soz gcc -O2 -Wallz!gcc -O2 -Wall -Wstrict-prototypeszg++ z g++ -sharedzg++) Ú    distutilsÚcygwinccompilerÚCygwinCCompilerÚ__init__Úbuild_import_libraryÚbuild_msvcr_libraryZ define_macrorr    Úset_executablesÚ compiler_cxx)ÚselfÚverboseÚdry_runÚforceZ msvcr_successZmsvcr_dbg_successZ msvcr_versionr
r
r r5s6 ÿ
 
 
ûüzMingw32CCompiler.__init__NcCsZtƒ}|r|sg}| |¡||||||||d|    |
| | | f}tj}||d|jj…ŽdS)N)rÚappendrÚlinkÚ__code__Ú co_argcount)rZ target_descZobjectsZoutput_filenameÚ
output_dirÚ    librariesÚ library_dirsÚruntime_library_dirsÚexport_symbolsrZ extra_preargsZextra_postargsÚ
build_tempZ target_langZruntime_libraryÚargsÚfuncr
r
r r!ms.
ózMingw32CCompiler.linkÚc    CsÒ|dkr d}g}|D]¸}tj tj |¡¡\}}tj |¡\}}|rP|dd…}||jddgkrrtd||fƒ‚|r‚tj |¡}|dks’|dkr²| tj     ||||j
¡¡q| tj     |||j
¡¡q|S)Nr,éú.rcz.resz"unknown file type '%s' (from '%s')) ÚosÚpathÚsplitextÚnormcaseÚ
splitdriveZsrc_extensionsrÚbasenamer ÚjoinZ obj_extension)    rZsource_filenamesZ    strip_dirr$Z    obj_namesÚsrc_nameÚbaseÚextÚdrvr
r
r Úobject_filenames”s0 ÿÿ   ÿ ÿz!Mingw32CCompiler.object_filenames)rrr)NrNNNN)rr,)Ú__name__Ú
__module__Ú __qualname__Ú__doc__Ú compiler_typerr!r:r
r
r
r r .s ý
@ó
)ýr c
Cstjg}tjtjkr | tj¡dddg}g}|D]"}|D]}| tj ||¡¡q:q2dtjkrz| tj tjdd¡¡ttj    dd…ƒ\}}t
  ¡}|dkr²d|›|›d    }n |d
krÈd |›d }n
d |›}t d|ƒ|D]&}tj ||¡}    tj  |    ¡râ|    Sqâtd||fƒ‚dS)Nr,ÚlibÚbinZ
SYSTEMROOTZSystem32éÚCPythonÚpythonú.dllÚPyPyZlibpypyz-c.dllzUnknown platform zLooking for %sz%s not found in %s)ÚsysÚprefixÚ base_prefixr r/r0r5ÚenvironÚtupleÚ version_infoÚplatformÚpython_implementationÚprintÚexistsÚ
ValueError)
ÚstemsÚsub_dirsÚlib_dirsÚstemÚfolderÚ major_versionÚ minor_versionÚimplementationÚdllnameÚdllr
r
r Úfind_python_dll·s.  
 
 
 
r\cCst dd|g¡}| d¡S)Nz objdump.exez-pó
)Ú
subprocessÚ check_outputÚsplit)r[Ústr
r
r Ú
dump_tableÝsrbc        Cst|ƒ}tt|ƒƒD]}t || ¡¡rq8qtdƒ‚g}t|dt|ƒƒD]B}t || ¡¡}|rŒ| t    | 
d¡  ¡ƒ| 
d¡f¡qNq’qNt|ƒdkr¬t   d|¡t|dƒV}| dtj |¡¡| d¡| d    ¡| d
¡|D]}| d |d¡qðW5QRXd S) zŠGiven a dll file location,  get all its exported symbols and dump them
    into the given def file.
 
    The .def file will be overwrittenzSymbol table not foundr-rBrzNo symbols found in %sÚwzLIBRARY        %s
z,;CODE          PRELOAD MOVEABLE DISCARDABLE
z;DATA          PRELOAD SINGLE
z    
EXPORTS
z%s
N)rbÚrangeÚlenÚ_STARTÚmatchÚdecoderQÚ_TABLEr ÚintÚgroupÚstriprÚwarnÚopenÚwriter/r0r4)    r[ÚdfileÚdumpÚiZsymsÚjÚmÚdÚsr
r
r Ú generate_defás($  
 
 
rwcs4dddœtƒ‰‡fdd„}dd„}||ƒp2||ƒS)NÚamd64Úx86)rÚIntelcsdtj tj dd¡d¡}tj |¡s(dSt |¡D],\}}}||kr2ˆ|kr2tj ||¡Sq2dS)NZWINDIRz
C:\WINDOWSZwinsxs)r/r0r5rJÚgetrPÚwalk)Údll_nameZ winsxs_pathÚrootÚdirsÚfiles©Úarchr
r Ú_find_dll_in_winsxssÿ z%find_dll.<locals>._find_dll_in_winsxscSsLtjgtjd d¡D].}tj ||¡}tj |¡rtj |¡SqdS)NÚPATHú;)    rGrHr/rJr`r0r5rPÚabspath)r}r0Úfilepathr
r
r Ú_find_dll_in_paths z#find_dll.<locals>._find_dll_in_path)r    )r}rƒrˆr
rr Úfind_dllsÿÿ r‰Fc CstjdkrdStƒ}|dkr*t d¡dS|dkr@t d¡dStƒ}|rR|d7}d|}tj tj    d|¡}tj 
|¡rŒt d    |f¡d
S|d }t |ƒ}|s²t  d |¡dSd |}tj tj    d|¡}t  d||f¡t||ƒdd|d|g}    t |    ¡}
t |¡|
S)NÚntFz?Skip building import library: Runtime is not compiled with MSVCéPz=Skip building msvcr library: custom functionality not presentruzlib%s.aÚlibsz(Skip building msvcr library: "%s" existsTrEz*Cannot build msvcr library: "%s" not foundz    lib%s.defz&Building msvcr library: "%s" (from %s)Údlltoolú-dú-l)r/Únamerrrrr0r5rGrHÚisfiler‰rmÚinforwr^ÚcallÚremove) rZ    msvcr_verZ
msvcr_nameZout_nameÚout_fileZmsvcr_dll_nameÚdll_fileÚdef_nameÚdef_fileÚcmdÚretcoder
r
r rsH
 
 
 ÿÿÿ
 
 
rcCs@tjdkrdStƒ}|dkr"tƒS|dkr0tƒStd|ƒ‚dS)NrŠrrzzUnhandled arch %s)r/rr    Ú_build_import_library_amd64Ú_build_import_library_x86rQrr
r
r rVs
rc
Csèttjdd…ƒ\}}dddg}tjg}ttdƒrLtjtjkrL| tj¡n"ttdƒrntjtjkrn| tj¡dd    g}g}|D]:}|||f}|D]$}|D]}    | tj     
||    |¡¡qšq’q~|D]}
tj      |
¡r¾d
|
fSq¾d |d fS) zACheck if an import library for the Python runtime already exists.NrBzlibpython%d%d.azlibpython%d%d.dll.azlibpython%d.%d.dll.arIÚ real_prefixrŒr@TFr) rKrGrLrHÚhasattrrIr rr/r0r5r‘) rWrXÚpatternsrRrSÚ
candidatesÚpatÚfilenameZstem_dirrVÚfullnamer
r
r Ú_check_for_import_libbs*þ   r¤cCs„tƒ\}}|rt d|¡dStƒ}t d||f¡dttjdd…ƒ}tj     
tj d|¡}t ||ƒdd|d|g}t  |¡dS)    Nú)Skip building import library: "%s" existsz4Building import library (arch=AMD64): "%s" (from %s)úpython%d%d.defrBrŒrrŽr)r¤rrr\r’rKrGrLr/r0r5rHrwr^Ú
check_call)Ú
out_existsr•r–r—r˜r™r
r
r rݠs
 ÿ
r›c    Csvtƒ\}}|rt d|¡dSdttjdd…ƒ}tj tj    d|¡}tj 
|¡s´t tdƒrptj tj d|¡}n"t tdƒrŽtj tj d|¡}nd}tj 
|¡r¤|}nt d    |¡dSt d
|¡d d lm}d ttjdd…ƒ}tj tj    d|¡}|j|j|gdd}| |¡\}    }
t|dƒ} | |    |
|j| ¡W5QRXtƒ} dd| d|d|g} t | ¡}|rrt d¡dS)z; Build the import libraries for Mingw32-gcc on Windows
    r¥Nzpython%d%d.librBrŒrIrr,z+Cannot build import library: "%s" not foundz(Building import library (ARCH=x86): "%s"r)Úlib2defr¦F)Úshellrcrz    --dllnamez--defz --output-libz:Failed to build import library for gcc. Linking will fail.)r¤rrrKrGrLr/r0r5rHr‘ržrIrrmr’Únumpy.distutilsr©ZgetnmZ
DEFAULT_NMZparse_nmrnZ
output_defZ
DEF_HEADERr\r^r_)r¨r•Zlib_nameZlib_fileZbase_libr©r—r˜Z    nm_outputZdlistÚflistZfidr}r™Ústatusr
r
r rœšsP
 
 
 
ÿ ý
 
rœÚwin32z 8.0.50727.42Ú80z 9.0.21022.8Z90z10.0.30319.460Z100ÚCRT_ASSEMBLY_VERSIONz (\d+)\.(\d)z9Cannot import msvcrt: using manifest will not be possiblecCsZztt|d|ƒ}Wn&tk
r>td||fƒd‚YnXt d¡}||||dœS)zUGiven a major and minor version of the MSVCR, returns the
    corresponding XML file.é
z)Version %d,%d of MSVCRT not supported yetNaà       <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
          <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
            <security>
              <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
              </requestedPrivileges>
            </security>
          </trustInfo>
          <dependency>
            <dependentAssembly>
              <assemblyIdentity type="win32" name="Microsoft.VC%(maj)d%(min)d.CRT" version="%(fullver)s" processorArchitecture="*" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
            </dependentAssembly>
          </dependency>
        </assembly>)ÚfullverÚmajÚmin)Ú_MSVCRVER_TO_FULLVERÚstrÚKeyErrorrQÚtextwrapÚdedent)r³r´r²Útemplater
r
r Úmsvc_manifest_xmlósÿÿ
r»r[cCs4|dkrd}n|dkrd}n td|ƒ‚d||fS)aWReturn the rc file used to generate the res file which will be embedded
    as manifest for given manifest file name, of given type ('dll' or
    'exe').
 
    Parameters
    ----------
    name : str
            name of the manifest file to embed
    type : str {'dll', 'exe'}
            type of the binary which will embed the manifest
 
    r[rBZexer-zType %s not supportedz&#include "winuser.h"
%d RT_MANIFEST %s)rQ)rÚtypeZrctyper
r
r Ú manifest_rcs  þr½cCs.tƒ}|r*|t|ƒks*tdt|ƒ|fƒ‚dS)z6msver is the ms runtime version used for the MANIFEST.zKDiscrepancy between linked msvcr (%d) and the one about to be embedded (%d)N)rrjrQ)Úmsverr³r
r
r Ú!check_embedded_msvcr_match_linked+s 
þÿr¿cCs&tj | dgd¡¡}tj |¡dS)NZyoÚcr)r/r0r4Z_gen_temp_sourcefiler1)Úconfigr7r
r
r Úconfigtest_name7srÂcCst|ƒ}|jj}||dS)Nz    .manifest)rÂrZ exe_extension)rÁr~Zexextr
r
r Ú manifest_name;srÃcCst|ƒ}|dS)Nr.)rÂ)rÁr~r
r
r Úrc_nameAsrÄc    Csztƒ}|dk    rv|dkrvt|ƒt|ƒ d¡\}}tt|ƒt|ƒƒ}tt|ƒdƒ }|j     t|ƒ¡| 
|¡W5QRXdS)NéÚ.rc) Úget_build_msvc_versionr¿r¶r`r»rjrnrÃZ
temp_filesr ro)rÁr¾Zma_strZmi_strZmanxmlZmanr
r
r Úgenerate_manifestFsrÈ)F)r[):r>r/rMrGr^Úrer¸Znumpy.distutils.ccompilerÚnumpyr«rZdistutils.cygwinccompilerrZdistutils.unixccompilerrZdistutils.msvccompilerrrÇÚdistutils.errorsrZnumpy.distutils.misc_utilrrrr    r Úcompilerfrirrr r\rbrwr‰rrr¤r›rœrµÚmsvcrtÚgetattrZcrt_verrgÚgroupsr³r´Ú ImportErrorrmr»r½r¿rÂrÃrÄrÈr
r
r
r Ú<module>sb        
 

& 
; $B