zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
U
O±dÖfã*@s®ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl mZddlmZddlZddlmZeƒZgZdd„Ze e¡ddd    d
d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0g*ZGd1d2„d2ƒZd3d.„Zd4d5„Zd6d„Zd7d8„Zdd9d:„Zd;d%„Z džd<d„Z!d=d$„Z"d>d?„Z#d@dA„Z$dŸdDd)„Z%d dEdF„Z&dGd„Z'e'ƒr¬e(ddHdIdJdKdLdMdNdOdP    Z)d¡dRdS„Z*n
d¢dTdS„Z*dUdV„Z+dWd„Z,dXd„Z-dYd„Z.dZd„Z/d[d„Z0e1e1d\œd]d„Z2d^d„Z3d_d`„Z4dadb„Z5dcdd„Z6e 7deej8¡j9Z:e 7dfej8¡j9Z;e 7dgej8¡j9Z<e 7dhej8¡j9Z=didj„Z>dkd'„Z?dld„Z@dmd&„ZAdndo„ZBdpd(„ZCdqd*„ZDdrd„ZEdsd„ZFdtd„ZGdudv„ZHdwdx„ZIdydz„ZJd{d„ZKd|d„ZLd}d~„ZMdd€„ZNdd„ZOd‚d„ZPdƒd „ZQd£d„d…„ZRd†d!„ZSd‡d"„ZTd¤dˆd#„ZUGd‰d„dƒZVifdŠd „ZWd‹d„ZXdŒd„ZYd¥dŽd-„ZZd¦dd,„Z[dd‘„Z\d§d’d    „Z]d“d
„Z^d”d „Z_d•d „Z`d–d—„Zad˜d+„Zbd™dšhZcd›d/„Zddœd0„ZedS)¨éN)Úlocal)Úreduce)ÚDistutilsErrorc    Cs:tdk    r6tD](}zt |¡Wq tk
r2Yq Xq dS©N)Ú_tmpdirsÚshutilÚrmtreeÚOSError)Úd©r úPd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\numpy/distutils/misc_util.pyÚclean_up_temporary_directorys r Ú ConfigurationÚget_numpy_include_dirsÚdefault_config_dictÚ dict_appendÚ
appendpathÚgenerate_config_pyÚget_cmdÚallpathÚ get_mathlibsÚterminal_has_colorsÚred_textÚ
green_textÚ yellow_textÚ    blue_textÚ    cyan_textÚ    cyg2win32Úmingw32Ú all_stringsÚ has_f_sourcesÚhas_cxx_sourcesÚfilter_sourcesÚget_dependenciesÚis_local_src_dirÚget_ext_source_filesÚget_script_filesÚget_lib_source_filesÚget_data_filesÚdot_joinÚ    get_frameÚ
minrelpathÚnjoinÚ is_sequenceÚ    is_stringÚas_listÚgpathsÚ get_languageÚget_build_architectureÚget_infoÚ get_pkg_infoÚget_num_build_jobsÚsanitize_cxx_flagsÚexec_mod_from_locationc@seZdZdZdd„ZdS)ÚInstallableLibaÏ
    Container to hold information on an installable library.
 
    Parameters
    ----------
    name : str
        Name of the installed library.
    build_info : dict
        Dictionary holding build information.
    target_dir : str
        Absolute path specifying where to install the library.
 
    See Also
    --------
    Configuration.add_installed_library
 
    Notes
    -----
    The three parameters are stored as attributes with the same names.
 
    cCs||_||_||_dSr)ÚnameÚ
build_infoÚ
target_dir)Úselfr9r:r;r r r Ú__init__FszInstallableLib.__init__N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__r=r r r r r80sr8cCsÊddlm}ztt d¡ƒ}Wntk
r:t ¡}YnXt|dƒ}t    tj
  d|¡ƒ}|ƒ}|dkrj|St |  d¡ddƒt |  d¡ddƒt |  d    ¡ddƒf}td
d „|Dƒƒr´|Std d „|DƒƒSdS) aÁ
    Get number of parallel build jobs set by the --parallel command line
    argument of setup.py
    If the command did not receive a setting the environment variable
    NPY_NUM_BUILD_JOBS is checked. If that is unset, return the number of
    processors on the system, with a maximum of 8 (to prevent
    overloading the system if there a lot of CPUs).
 
    Returns
    -------
    out : int
        number of parallel jobs that can be run
 
    r©Úget_distributionéZNPY_NUM_BUILD_JOBSNÚbuildÚparallelÚ    build_extÚ
build_clibcss|]}|dkVqdSrr ©Ú.0Úxr r r Ú    <genexpr>ksz%get_num_build_jobs.<locals>.<genexpr>css|]}|dk    r|VqdSrr rIr r r rLns)Únumpy.distutils.corerCÚlenÚosZsched_getaffinityÚAttributeErrorÚmultiprocessingÚ    cpu_countÚminÚintÚenvironÚgetÚgetattrÚget_command_objÚallÚmax)rCrRZenvjobsÚdistZcmdattrr r r r5Ls" 
þcCs^ddl}|jdtddt|ƒ}tt|ƒƒD],}||}d|kr,|ddkr,d|||<q,|S)    z8Quote list of arguments.
 
    .. deprecated:: 1.22.
    rNz"quote_args" is deprecated.é©Ú
stacklevelú z"'z"%s")ÚwarningsÚwarnÚDeprecationWarningÚlistÚrangerN)Úargsr`ÚiÚar r r Ú
quote_argspsÿrhcCs| d¡}tjj|ŽS)zDConvert a /-separated pathname to one using the OS's path separator.ú/)ÚsplitrOÚpathÚjoin)r9rjr r r rs
cCs tj tj |¡¡}tj tj |¡¡}t|ƒt|ƒkr<|S||krHdS||dt|ƒ…krœ|t|ƒtjfksˆtt||t|ƒfƒƒ‚|t|ƒdd…}|S)z$Return path relative to parent_path.ÚNé)rOrkÚrealpathÚabspathrNÚsepÚAssertionErrorÚrepr)rkÚ parent_pathÚpdZapathr r r Úrel_path†s,rvcCs¨z(td|j|jƒ}tj tj |¡¡}Wndtk
rŒtd|j|jƒ}t|ƒt    j
|}t |dƒr|tj tj |j ¡¡}n tj d¡}YnX|dk    r t ||ƒ}|p¦dS)z¥Return path of the module given a frame object from the call stack.
 
    Returned path is relative to parent_path when given,
    otherwise it is absolute path.
    Ú__file__r>Ú.N)ÚevalÚ    f_globalsÚf_localsrOrkÚdirnamerpÚ    NameErrorÚ
__import__ÚsysÚmodulesÚhasattrrwrv)ÚframertZ caller_filer
Z caller_nameÚmodr r r Úget_path_from_frame”s
 
 
r„cGszg}|D]2}t|ƒr$| t|Ž¡qt|ƒs0t‚| |¡q|}|sJd}n tjj|Ž}tjjdkrr|     dtjj¡}t
|ƒS)a2Join two or more pathname components +
    - convert a /-separated pathname to one using the OS's path separator.
    - resolve `..` and `.` from path.
 
    Either passing n arguments as in njoin('a','b'), or a sequence
    of n names as in njoin(['a','b']) is handled, or a mixture of such arguments.
    rmri) r-Úappendr,r.rrrOrkrlrqÚreplacer+)rkÚpathsÚpZjoinedr r r r,²s    c        Cs´|dk    rtj |d¡}n@tƒ}|D]&}tj |d¡}tj |¡r"|}qXq"td|fƒ‚t|ƒJ}g}d}|D]6}| |¡rn|t|ƒd…     ¡}|rn| 
|  d¡¡qnW5QRX|S)z/Return the MATHLIB line from numpyconfig.h
    Nz_numpyconfig.hz1_numpyconfig.h not found in numpy include dirs %rz#define MATHLIBú,) rOrkrlrÚexistsrÚopenÚ
startswithrNÚstripÚextendrj)    rkÚ config_fileÚdirsÚfnÚfidZmathlibsÚsÚlineÚvaluer r r rÍs( ÿ
 
cCsÐt|ƒs |Sd|kr|S| tj¡}|rZz| dd¡}Wntk
rPYqZYnX||=q$d}|r¼z| d|¡}Wntk
rŠYq¼YnX||ddkr¦|d7}q^||=||d=d}q^|sÄdStj |¡S)z$Resolve `..` and '.' from path.
    rxrnz..rm)r.rjrOrqÚindexÚ
ValueErrorrl)rkÚlrfÚjr r r r+ès0 
 
 
cCstt |¡ƒS)z}sorts output of python glob for https://bugs.python.org/issue30461
    to allow extensions to have reproducible build results)ÚsortedÚglob)Zfileglobr r r Ú sorted_globsrœcCsJt|ƒsttt|ƒƒƒ‚g}t|ƒr0tt|ƒƒ‚|D]}t|ƒrd|ksTd|krªt|ƒ}tt||ƒƒ}|rz| |¡n.|rŠ| |¡n|r˜| |¡t    d||fƒnft||ƒ}t
j   |¡rÌ| |¡nDt
j   |¡rä| |¡n|rò| |¡t
j   |¡s:t    d||fƒq4t|ƒr0| t |||ƒ¡q4| |¡q4dd„|DƒS)NÚ*ú?z#could not resolve pattern in %r: %rznon-existing path in %r: %rcSsg|] }t|ƒ‘qSr )r+©rJrˆr r r Ú
<listcomp>-sz_fix_paths.<locals>.<listcomp>)r-rrrsÚtyper.rœr,rŽr…ÚprintrOrkrŠÚ
_fix_paths)r‡Ú
local_pathÚinclude_non_existingZ    new_pathsÚnrˆÚp2Zn2r r r r£
s@
 
 
ÿ
 
ÿ
 r£rmTcCst|ƒr|f}t|||ƒS)z:Apply glob to paths and prepend local_path if needed.
    )r.r£)r‡r¤r¥r r r r0/scCsLttdƒs t ¡t_t tj¡tj||tj|d\}}t     |d¡}||fS)NÚtempdir)ÚsuffixÚprefixÚdirÚtextÚw)
rÚ_tdataÚtempfileÚmkdtempr¨rr…ÚmkstemprOÚfdopen)r©rªr¬r’r9Úfor r r Úmake_temp_file6s
 
 ý
 r´cCsÄtjdkrdtjkrdSttjdƒrÀtj ¡rÀz|ddl}| ¡|     d¡dkr¨|     d¡dkr¨| 
d¡dk    rx| 
d¡dk    s¢| 
d    ¡dk    r”| 
d
¡dk    s¢| 
d ¡dk    r¨Wd SWnt k
r¾YnXdS) NÚcygwinZ    USE_COLORrÚisattyÚcolorsÚpairsZsetfZsetbZsetafZsetabZscprn) rÚplatformrOrUrÚstdoutr¶ÚcursesZ    setuptermZtigetnumZtigetstrÚ    Exception)r»r r r rCs.     ÿ þ ý ü û ú
rnr\éééééé    )    ZblackÚredÚgreenÚyellowÚblueZmagentaÚcyanZwhiteÚdefaultFcCs|g}|r| d¡|r8dt | ¡d¡}| t|ƒ¡|r^dt | ¡d¡}| t|ƒ¡|rtdd |¡|fS|SdS)NÚ1éré(rÁz [%sm%sú;)r…Ú _colour_codesrVÚlowerÚstrrl)r“ÚfgÚbgZboldÚseqZfgcodeZbgcoder r r Ú colour_textas
rÓcCs|Srr )r“rÐrÑr r r rÓpscCs
t|dƒS)NrÈ©rÓ©r“r r r Ú default_textssrÖcCs
t|dƒS)NrÃrÔrÕr r r ruscCs
t|dƒS)NrÄrÔrÕr r r rwscCs
t|dƒS)NrÅrÔrÕr r r ryscCs
t|dƒS)NrÇrÔrÕr r r r{scCs
t|dƒS)NrÆrÔrÕr r r r}s)rkÚreturncCs"tjdkr|Stjdd|gddS)a(Convert a path from Cygwin-native to Windows-native.
 
    Uses the cygpath utility (part of the Base install) to do the
    actual conversion.  Falls back to returning the original path if
    this fails.
 
    Handles the default ``/cygdrive`` mount prefix as well as the
    ``/proc/cygdrive`` portable prefix, custom cygdrive prefixes such
    as ``/`` or ``/mnt``, and absolute paths such as ``/usr/src/`` or
    ``/home/username``
 
    Parameters
    ----------
    path : str
       The path to convert
 
    Returns
    -------
    converted_path : str
        The converted path
 
    Notes
    -----
    Documentation for cygpath utility:
    https://cygwin.com/cygwin-ug-net/cygpath.html
    Documentation for the C function it wraps:
    https://cygwin.com/cygwin-api/func-cygwin-conv-path.html
 
    rµz/usr/bin/cygpathz    --windowsT)r¬)rr¹Ú
subprocessÚ check_output)rkr r r r‚s 
ÿcCs:tjdkr6tj dd¡dkr dStj dd¡dkr6dSdS)    z0Return true when using mingw32 environment.
    Úwin32ZOSTYPErmZmsysTZMSYSTEMZMINGW32F)rr¹rOrUrVr r r r r§s 
cCs8tj d¡}|dkr0ttj|d|d…ƒ}nd}|S)zGReturn version of MSVC runtime library, as defined by __MSC_VER__ macrozMSC v.éÿÿÿÿrÀé
N)rÚversionÚfindrT)Zmsc_posZmsc_verr r r Úmsvc_runtime_version±s
 rßcCs,tƒ}|r$|dkrd|Sd|SndSdS)zFReturn name of MSVC runtime library if Python was built with MSVC >= 7éŒzmsvcr%iz vcruntime%iN)Úmsvc_runtime_major)Úverr r r Úmsvc_runtime_libraryºs 
rãcCs dddddddœ tƒd¡}|S)    zFReturn major version of MSVC runtime coded like get_build_msvc_versionéFéGéPéZédrà)iiixiÜi@ilN)rVrß)Úmajorr r r ráÅsûúráz.*\.(cpp|cxx|cc)\Zz.*\.(f90|f95|f77|for|ftn|f)\Zz.*\.(f90|f95)\Zz\s*module\s*(?P<name>[\w_]+)c    CsTt|ƒs gSg}t|dƒ0}|D]$}t|ƒ}|r | d¡}| |¡q W5QRX|S)zRReturn a list of Fortran f90 module names that
    given source file defines.
    Úrr9)Ú f90_ext_matchr‹Úf90_module_name_matchÚgroupr…)Úsourcer€Úfr”Úmr9r r r Ú_get_f90_modules×s 
rñcCs
t|tƒSr)Ú
isinstancerÏrÕr r r r.çscCs|D]}t|ƒsdSqdS)z4Return True if all items in lst are string objects. FT©r.)ÚlstÚitemr r r rêscCs4t|ƒr dSz t|ƒWntk
r.YdSXdS)NFT)r.rNr¼©rÒr r r r-ñs cCst|ƒod|kpd|kS)NrržrórÕr r r Úis_glob_patternúsr÷cCst|ƒrt|ƒS|gSdSr)r-rcrör r r r/ýscCs:d}|D],}t|tƒrt|ƒr(d}q6qt|ƒrd}q|S)z2Determine language value (c,f77,f90) from sources NÚf90Úf77)ròrÏrëÚfortran_ext_match)ÚsourcesÚlanguagerîr r r r1s
cCs|D]}t|ƒrdSqdS)z.Return True if sources contains Fortran files TF)rú©rûrîr r r r scCs|D]}t|ƒrdSqdS)z*Return True if sources contains C++ files TF)Ú cxx_ext_matchrýr r r r!scCspg}g}g}g}|D]N}t|ƒrDt|ƒ}|r8| |¡qb| |¡qt|ƒrX| |¡q| |¡q||||fS)ztReturn four lists of filenames containing
    C, C++, Fortran, and Fortran 90 module sources,
    respectively.
    )rúrñr…rþ)rûZ    c_sourcesZ cxx_sourcesZ    f_sourcesZfmodule_sourcesrîr€r r r r"s    cCs.g}|D] }ttj |d¡ƒ}| |¡q|S)Nz*.h)rœrOrkrlrŽ)Zdirectory_listÚheadersr
Úheadr r r Ú _get_headers5s
 rcCsDg}|D]6}tj |¡}|ddkr|d|kr| |d¡q|S)Nrrm)rOrkrjr…)Zlist_of_sourcesZdirecsrïr
r r r Ú_get_directories=s  rcCs6d}|d |¡7}|d |¡7}|d |¡d7}|S)zb
    Return commandline representation used to determine if a file needs
    to be recompiled
    z commandline: r_Ú
©rl)Zcc_argsZextra_postargsZpp_optsZcmdliner r r Ú_commandline_dep_stringFs
rcCs tt|ƒƒSr)rr)rûr r r r#RscCsˆt|ƒs dStj |¡}tj t ¡|g¡}|t|ƒd… tj¡}|r\|ds\|dd…}|rp|ddkrpdStj     |¡}tj 
|¡S)z1Return true if directory is local directory.
    FNrrnrE) r.rOrkrpÚ commonprefixÚgetcwdrNrjrqrlÚisdir)Ú    directoryZabs_dirÚcZnew_dirr r r r$Vs    c#svddddœ‰t d¡}tj|ddD]L\}}}‡fdd„|Dƒ}||dd…<|D]}| |¡sPtj ||¡VqPq$dS)Nrn)ÚCVSú.svnrEú(?:[~#]|\.py[co]|\.o)$T©Útopdowncsg|]}|ˆkr|‘qSr r ©rJr
©Úpruned_directoriesr r r isz(general_source_files.<locals>.<listcomp>)ÚreÚcompilerOÚwalkÚsearchrkrl)Útop_pathÚprune_file_patÚdirpathÚdirnamesÚ    filenamesÚprunedrïr rr Úgeneral_source_fileses 
 
rc
#sþdddg‰t d¡‰tj|ddD]–\}}}‡fdd„|Dƒ}||d    d    …<|D]h}tj ||¡‰tˆ|ƒ}g}t ˆ¡D]2}tj ˆ|¡}    tj |    ¡rxˆ     |    ¡sx| 
|    ¡qx||fVqNq"|‰tˆ|ƒ}‡‡fd
d„t ˆ¡Dƒ}d d„|Dƒ}||fVd    S) zJReturn a directory name relative to top_path and
    files contained.
    r r rEr Trcsg|]}|ˆkr|‘qSr r rrr r r vsz4general_source_directories_files.<locals>.<listcomp>Ncs$g|]}ˆ |¡stj ˆ|¡‘qSr )rrOrkrl©rJrï)Údpathrr r r ƒs
ÿcSsg|]}tj |¡r|‘qSr )rOrkÚisfilerr r r r …s ) rrrOrrkrlrvÚlistdirr rr…)
rrrrrr
ÚrpathÚfilesrïr‘r )rrrr Ú general_source_directories_filesos&
 
 
 
r$cCsng}dd„|jDƒ}| |¡| t|ƒ¡|jD]6}t|ƒrR| tt|ƒƒ¡q2tj     |¡r2| 
|¡q2|S)NcSsg|]}t|ƒr|‘qSr ró©rJÚ_mr r r r Œsz(get_ext_source_files.<locals>.<listcomp>) rûrŽr#Údependsr$rcrrOrkr r…)Úextrrûr
r r r r%‰s
 
  cCsdd„|Dƒ}|S)NcSsg|]}t|ƒr|‘qSr rór%r r r r —sz$get_script_files.<locals>.<listcomp>r )Úscriptsr r r r&–scCsŠg}|d dg¡}dd„|Dƒ}| |¡| t|ƒ¡|d dg¡}|D]6}t|ƒrn| tt|ƒƒ¡qNtj |¡rN|     |¡qN|S)NrnrûcSsg|]}t|ƒr|‘qSr rór%r r r r sz(get_lib_source_files.<locals>.<listcomp>r')
rVrŽr#r$rcrrOrkr r…)Úlibrrûr'r
r r r r'šs
  cCs€tj ¡}| dd¡}|s|tj d¡s2tj d¡r8d}nDtj d¡rJd}n2tj d¡r\d    }n d
|kr|| d | d
¡dd ¡}|S) aøReturn the correct file extension for shared libraries.
 
    Parameters
    ----------
    is_python_ext : bool, optional
        Whether the shared library is a Python extension.  Default is False.
 
    Returns
    -------
    so_ext : str
        The shared library extension.
 
    Notes
    -----
    For Python shared libs, `so_ext` will typically be '.so' on Linux and OS X,
    and '.pyd' on Windows.  For Python >= 3.2 `so_ext` has a tag prepended on
    POSIX systems according to PEP 3149.
 
    Ú
EXT_SUFFIXrmÚlinuxZ gnukfreebsdz.soÚdarwinz.dylibÚwinz.dllÚSOABIrxrn)Ú    distutilsÚ    sysconfigÚget_config_varsrVrr¹rŒr†)Z is_python_extZconfvarsZso_extr r r Úget_shared_lib_extension¨s
 
ÿ  r3cCsˆt|ƒr|gS|d}g}|D]d}t|dƒr.qt|ƒrJ| tt|ƒƒ¡qt|ƒrvtj |¡rj|     |¡q‚t
d|ƒqt t |ƒƒ‚q|S)NrnÚ__call__zNot existing data file:) r.rr$rŽrcrrOrkr r…r¢Ú    TypeErrorrs)Údatarûrr“r r r r(Ós
   cGsd dd„|Dƒ¡S)NrxcSsg|] }|r|‘qSr r )rJrgr r r r çszdot_join.<locals>.<listcomp>r)rer r r r)æscCsTzt |d¡WStk
rNt ¡dj}t|dƒD]
}|j}q:|YSXdS)z:Return frame object from call stack with given level.
    rnr\N)rÚ    _getframerPÚexc_infoÚtb_framerdÚf_back)Úlevelr‚Ú_r r r r*ésc
@s~eZdZddddddddd    d
g
Zd d gZd dgZgZdadd„Zdd„Zdd„Z    dd„Z
dd„Z dd„Z dbdd„Z dcd d!„Zddd"d#„Zded%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Zdfd=d>„Zdgd?d@„ZdAdB„ZdCdD„ZdEdF„Z dGdH„Z!dIdJ„Z"dKdL„Z#dMdN„Z$dOdP„Z%dQdR„Z&dSdT„Z'dhdUdV„Z(didXdY„Z)djdZd[„Z*dkd]d^„Z+d_d`„Z,dS)lrÚpackagesÚ ext_modulesÚ
data_filesÚ include_dirsÚ    librariesrÿr)Ú
py_modulesÚinstalled_librariesÚ define_macrosÚ package_dirÚinstalled_pkg_configr9rÝNrnúsetup.pyc    Ks˜t||ƒ|_d|_t|ƒ}t||ƒ|_|dkr:|j}d|_|dkrJ|j}n tj t    |j|ƒ¡rjt    |j|ƒ}tj |pvd¡sˆt
d|fƒ‚||_ ||_ tjj |j d¡Ž|_|jdd…|_|jdd…|_|jD]&}    t | |    g¡¡}
t||    t|
ƒƒqÐ|jD]"}    t | |    i¡¡}
t||    |
ƒqþ|j|j} |jdd…|_| ¡D]h}    |    | krXqF||    } t||    | ƒt| tƒr†|j |    ¡n&t| tƒr |j |    ¡n |j |    ¡qFtj t    |dƒ¡rÞ|j  |j¡||j!|j<tddddd|_"d} t#dd    ƒD]f}z t|ƒ}Wnt
k
r,YqfYnXzt$d
|j%|j&ƒ} WqfWnt'k
r`YnXqþt| |j(ƒrŽ| j"d rŽ|j)f| j"Ž||_*dS) a˜Construct configuration instance of a package.
 
        package_name -- name of the package
                        Ex.: 'distutils'
        parent_name  -- name of the parent package
                        Ex.: 'numpy'
        top_path     -- directory of the toplevel package
                        Ex.: the directory where the numpy package source sits
        package_path -- directory of package. Will be computed by magic from the
                        directory of the caller module if not specified
                        Ex.: the directory where numpy.distutils is
        caller_level -- frame level to caller namespace, internal parameter.
        Nrmrxz%r is not a directoryú __init__.pyF)Úignore_setup_xxx_pyÚassume_default_configurationÚdelegate_options_to_subpackagesÚquietrnr½r<rK)+r)r9rÝr*r„r¤rOrkrr,r—rÚ package_pathrlrjÚpath_in_packageÚ
_list_keysÚ    list_keysÚ
_dict_keysÚ    dict_keysÚcopyrVÚsetattrr/Ú _extra_keysÚ
extra_keysÚkeysròrcr…ÚdictrŠr=rEÚoptionsrdryrzr{r}Ú    __class__Ú set_optionsÚ
setup_name)r<Ú package_nameÚ parent_namerrMÚ caller_levelr\ÚattrsZ caller_framer¦ÚvÚ
known_keysrgZcaller_instancerfrïr r r r=sx   
 
 
    ü  
 zConfiguration.__init__cCsB| ¡i}|j|j|j}|D]}t||ƒ}|r"|||<q"|S)zâ
        Return a dictionary compatible with the keyword arguments of distutils
        setup function.
 
        Examples
        --------
        >>> setup(**config.todict())                           #doctest: +SKIP
        )Ú_optimize_data_filesrPrRrVrW)r<r
rbr¦rgr r r Útodictbs
 
 
zConfiguration.todictcCs|jdst|ƒdS)NrL)rYr¢©r<Úmessager r r Úinfous
zConfiguration.infocCstj d|f¡dS)Nz Warning: %s
)rÚstderrÚwriterer r r rayszConfiguration.warncKs8| ¡D]*\}}||jkr&||j|<qtd|ƒ‚qdS)zå
        Configure Configuration instance.
 
        The following options are available:
         - ignore_setup_xxx_py
         - assume_default_configuration
         - delegate_options_to_subpackages
         - quiet
 
        zUnknown option: N)ÚitemsrYr—)r<rYÚkeyr•r r r r[|s 
 zConfiguration.set_optionscCsddlm}|ƒS)z2Return the distutils distribution object for self.rrB)rMrC)r<rCr r r rCs zConfiguration.get_distributionc Cs¢| d¡}t|jg|ƒ}dd„t|ƒDƒ}g}|D]h}tj t|dƒ¡sLq4d| tj¡kr^q4d | tj¡t    |ƒ d…¡}    |j
|    ||dd}
|  |
¡q4|S)NrxcSsg|]}tj |¡r|‘qSr )rOrkrr%r r r r —s z:Configuration._wildcard_get_subpackage.<locals>.<listcomp>rHrErn©r^r_) rjr,r¤rœrOrkr rqrlrNÚget_subpackagerŽ) r<Úsubpackage_namer^r_r˜Úsubpackage_pathrÚ config_listr
r¦r
r r r Ú_wildcard_get_subpackage’s 
 þ z&Configuration._wildcard_get_subpackagec Cstj dtj |¡¡zîtj tj |¡¡d}t|j||ƒ}t    d 
|  d¡¡|ƒ}t |dƒs|j dsv| d|¡t|||j||dd}    nFt|g|  d¡dd    …Ž}
|
f} |jjjdkrÌ| |jf} |j| Ž}    |    jt||ƒkr| d
t||ƒ|    jf¡W5tjd=X|    S) Nrr<rxÚ configurationrJzCAssuming default configuration (%s does not define configuration())rn©r_rÛz*Subpackage %r configuration returned as %r)rrkÚinsertrOr|ÚsplitextÚbasenamer)r9r7rlrjrrYrarrrrÚ__code__Ú co_argcount) r<Úsetup_pyrnror^r_r\r¦Z setup_moduleÚconfigZpnrer r r Ú _get_configuration_from_setup_py¥s:ÿ
 
þþ 
ÿ
 
z.Configuration._get_configuration_from_setup_pycCsV|dkr$|dkrtdƒ‚tj |¡}| d¡}|dkrRd|krR|j|||ddSd|ksltt|||fƒƒ‚|dkr†t|j    g|ƒ}n&t|g|dd…ƒ}| 
|g¡d}t||j ƒ}|j d    sÜtj  |¡sÜt|d
|ƒ}tj  |¡s*|j d s| d tj |¡|f¡t|||j||dd}n|j|||||dd}|rN|gSgSdS) aReturn list of subpackage configurations.
 
        Parameters
        ----------
        subpackage_name : str or None
            Name of the subpackage to get the configuration. '*' in
            subpackage_name is handled as a wildcard.
        subpackage_path : str
            If None, then the path is assumed to be the local path plus the
            subpackage_name. If a setup.py file is not found in the
            subpackage_path, then a default configuration is used.
        parent_name : str
            Parent name.
        Nz;either subpackage_name or subpackage_path must be specifiedrxrrnrsrÛrrIz setup_%s.pyrJzEAssuming default configuration (%s/{setup_%s,setup}.py was not found))r—rOrkrvrjrqrrrsr,r¤r‡r\rYr rar|rrr{)r<rnror^r_r˜ryrzr r r rmÆsVÿ 
þ 
 ÿ þþûzConfiguration.get_subpackageFc    Cs²|r
d}n|j}|j|||dd}|s0| d¡|D]Z}|}t|tƒrN| ¡}t|tƒshttt    |ƒƒƒ‚| 
d|  d¡|jf¡|j f|Žq4|  ¡}|dk    r®| d|¡dS)aAdd a sub-package to the current Configuration instance.
 
        This is useful in a setup.py script for adding sub-packages to a
        package.
 
        Parameters
        ----------
        subpackage_name : str
            name of the subpackage
        subpackage_path : str
            if given, the subpackage path such as the subpackage is in
            subpackage_path / subpackage_name. If None,the subpackage is
            assumed to be located in the local path / subpackage_name.
        standalone : bool
        Nr\rlz0No configuration returned, assuming unavailable.z Appending %s configuration to %sr9zTdistutils distribution has been initialized, it may be too late to add a subpackage )r9rmraròrrdrXrrrsr¡rgrVrrC)    r<rnroÚ
standaloner^rprzr
r[r r r Úadd_subpackages.þ
 
ÿÿzConfiguration.add_subpackagec
s¨t|ƒr|\‰}nd‰t|ƒr6‡‡fdd„|DƒdSt|ƒsLtd|fƒ‚ˆdkr„tj |¡rvˆ tj |¡|f¡Sˆ ||f¡Sˆj|dd}t    |ƒrt    ˆƒrt
ˆƒ  tj ¡}|  ¡ttt|ƒdƒƒ}|  ¡|D]}||sÞ||=qÞ|D]}tj |¡std|ƒqöt|ˆjƒ}|  tj ¡}|  ¡g}    d    }|D]z}
t    |
ƒr~|t|ƒkrntd
ˆ|fƒ‚|     ||¡n4|
||ks¨tt|
|||ˆ||fƒƒ‚|     |
¡|d7}qB||d…rވ d ||f¡|      ¡ˆ tj  |    ¡|f¡qön|D]}ˆ ˆ|f¡qdSt    ˆƒr4ttˆƒƒ‚ˆ ¡} | dk    rZ| jdk    rZ| j} nˆj} |D]>}tt|ƒƒD]*\} }tj ˆjˆ| ¡}|  ||f¡qtqddS) a†Recursively add files under data_path to data_files list.
 
        Recursively add files under data_path to the list of data_files to be
        installed (and distributed). The data_path can be either a relative
        path-name, or an absolute path-name, or a 2-tuple where the first
        argument shows where in the install directory the data directory
        should be installed to.
 
        Parameters
        ----------
        data_path : seq or str
            Argument can be either
 
                * 2-sequence (<datadir suffix>, <path to data directory>)
                * path to data directory where python datadir suffix defaults
                  to package dir.
 
        Notes
        -----
        Rules for installation paths::
 
            foo/bar -> (foo/bar, foo/bar) -> parent/foo/bar
            (gun, foo/bar) -> parent/gun
            foo/* -> (foo/a, foo/a), (foo/b, foo/b) -> parent/foo/a, parent/foo/b
            (gun, foo/*) -> (gun, foo/a), (gun, foo/b) -> gun
            (gun/*, foo/*) -> parent/gun/a, parent/gun/b
            /foo/bar -> (bar, /foo/bar) -> parent/bar
            (gun, /foo/bar) -> parent/gun
            (fun/*/gun/*, sun/foo/bar) -> parent/fun/foo/gun/bar
 
        Examples
        --------
        For example suppose the source directory contains fun/foo.dat and
        fun/bar/car.dat:
 
        >>> self.add_data_dir('fun')                       #doctest: +SKIP
        >>> self.add_data_dir(('sun', 'fun'))              #doctest: +SKIP
        >>> self.add_data_dir(('gun', '/full/path/to/fun'))#doctest: +SKIP
 
        Will install data-files to the locations::
 
            <package install directory>/
              fun/
                foo.dat
                bar/
                  car.dat
              sun/
                foo.dat
                bar/
                  car.dat
              gun/
                foo.dat
                car.dat
 
        Ncsg|]}ˆ ˆ|f¡‘qSr )Ú add_data_dirrŸ©r
r<r r r ksz.Configuration.add_data_dir.<locals>.<listcomp>znot a string: %rF©r¥rnzNot a directory, skippingrzcannot fill pattern %r with %rz,mismatch of pattern_list=%s and path_list=%s)r-r.r5rOrkÚisabsr~rvr‡r÷rrjrqÚreversercrdrNrr¢rvr¤r—r…rrrsrarlrCr?r$rN)r<Z    data_pathr‡Ú pattern_listZrlrfrkr"Ú    path_listÚ target_listr“r[r?Úd1rïÚ target_pathr rr r~.sv8
 
 
 
 
 
ÿ*
 ÿzConfiguration.add_data_dircCs^i}|jD]2\}}||kr$tƒ||<|D]}|| |¡q(q
dd„| ¡Dƒ|jdd…<dS)NcSsg|]\}}|t|ƒf‘qSr )rc)rJrˆr#r r r r ®sz6Configuration._optimize_data_files.<locals>.<listcomp>)r?ÚsetÚaddrj)r<Z    data_dictrˆr#rïr r r rc§s
z"Configuration._optimize_data_filescGs(t|ƒdkr$|D]}| |¡qdSt|ƒdks4t‚t|dƒrN|d\}}nd}t|ƒr`|}nLt|ƒrœt|ƒdkr~|d}q¬|D]}| ||f¡q‚dSnttt|ƒƒƒ‚|dkrôt|dƒrÄd}nt    j
  |¡rÖd}n t    j
  |¡}| ||f¡dS|j |dd}t|ƒrÄt|ƒr²| t    j¡}| ¡|D]€}| t    j¡}| ¡| ¡g}    d}
|D]2} t| ƒr€|     ||
¡|
d7}
n
|     | ¡qZ|     ¡| t    j |    ¡|f¡q.n| ||f¡dSt|ƒrÞtt||fƒƒ‚| ¡} | dk    r| jdk    r| j} n|j} |  t    j
 |j|¡|f¡dS)aéAdd data files to configuration data_files.
 
        Parameters
        ----------
        files : sequence
            Argument(s) can be either
 
                * 2-sequence (<datadir prefix>,<path to data file(s)>)
                * paths to data files where python datadir prefix defaults
                  to package dir.
 
        Notes
        -----
        The form of each element of the files sequence is very flexible
        allowing many combinations of where to get the files from the package
        and where they should ultimately be installed on the system. The most
        basic usage is for an element of the files argument sequence to be a
        simple filename. This will cause that file from the local path to be
        installed to the installation path of the self.name package (package
        path). The file argument can also be a relative path in which case the
        entire relative path will be installed into the package directory.
        Finally, the file can be an absolute path name in which case the file
        will be found at the absolute path name but installed to the package
        path.
 
        This basic behavior can be augmented by passing a 2-tuple in as the
        file argument. The first element of the tuple should specify the
        relative path (under the package install directory) where the
        remaining sequence of files should be installed to (it has nothing to
        do with the file-names in the source distribution). The second element
        of the tuple is the sequence of files that should be installed. The
        files in this sequence can be filenames, relative paths, or absolute
        paths. For absolute paths the file will be installed in the top-level
        package installation directory (regardless of the first argument).
        Filenames and relative path names will be installed in the package
        install directory under the path name given as the first element of
        the tuple.
 
        Rules for installation paths:
 
          #. file.txt -> (., file.txt)-> parent/file.txt
          #. foo/file.txt -> (foo, foo/file.txt) -> parent/foo/file.txt
          #. /foo/bar/file.txt -> (., /foo/bar/file.txt) -> parent/file.txt
          #. ``*``.txt -> parent/a.txt, parent/b.txt
          #. foo/``*``.txt`` -> parent/foo/a.txt, parent/foo/b.txt
          #. ``*/*.txt`` -> (``*``, ``*``/``*``.txt) -> parent/c/a.txt, parent/d/b.txt
          #. (sun, file.txt) -> parent/sun/file.txt
          #. (sun, bar/file.txt) -> parent/sun/file.txt
          #. (sun, /foo/bar/file.txt) -> parent/sun/file.txt
          #. (sun, ``*``.txt) -> parent/sun/a.txt, parent/sun/b.txt
          #. (sun, bar/``*``.txt) -> parent/sun/a.txt, parent/sun/b.txt
          #. (sun/``*``, ``*``/``*``.txt) -> parent/sun/c/a.txt, parent/d/b.txt
 
        An additional feature is that the path to a data-file can actually be
        a function that takes no arguments and returns the actual path(s) to
        the data-files. This is useful when the data files are generated while
        building the package.
 
        Examples
        --------
        Add files to the list of data_files to be included with the package.
 
            >>> self.add_data_files('foo.dat',
            ...     ('fun', ['gun.dat', 'nun/pun.dat', '/tmp/sun.dat']),
            ...     'bar/cat.dat',
            ...     '/full/path/to/can.dat')                   #doctest: +SKIP
 
        will install these data files to::
 
            <package install directory>/
             foo.dat
             fun/
               gun.dat
               nun/
                 pun.dat
             sun.dat
             bar/
               car.dat
             can.dat
 
        where <package install directory> is the package (or sub-package)
        directory such as '/usr/lib/python2.4/site-packages/mypackage' ('C:
        \Python2.4 \Lib \site-packages \mypackage') or
        '/usr/lib/python2.4/site- packages/mypackage/mysubpackage' ('C:
        \Python2.4 \Lib \site-packages \mypackage \mysubpackage').
        rnNrr4rmFr€)rNÚadd_data_filesrrr-r.r5rsr¡rrOrkrr|r‡r÷rjrqr‚Úpopr…rlrCr?rN)r<r#rïr
Zfilepatr‡rƒrkr„r…rfr“r[r?r r r rаsfX    
 
 
 
 
 
zConfiguration.add_data_filescCs>| ¡}|dk    r.t|dƒs g|_|j |¡n |j |¡dS)zðAdd define macros to configuration
 
        Add the given sequence of macro name and value duples to the beginning
        of the define_macros list This list will be visible to all extension
        modules of the current package.
        NrD)rCrrDrŽ)r<Úmacrosr[r r r Úadd_define_macrosIs 
zConfiguration.add_define_macroscGsH| |¡}| ¡}|dk    r8|jdkr*g|_|j |¡n |j |¡dS)zçAdd paths to configuration include directories.
 
        Add the given sequence of paths to the beginning of the include_dirs
        list. This list will be visible to all extension modules of the
        current package.
        N)r‡rCr@rŽ)r<r‡r@r[r r r Úadd_include_dirsYs
 
zConfiguration.add_include_dirscs´g‰|D]l‰tˆƒr0‡‡fdd„ˆ ˆ¡DƒqtˆttfƒrJtˆƒdkrVttˆƒƒ‚‡‡fdd„ˆ ˆd¡Dƒqˆ ¡}|dk    r¤|j    dkr–g|_    |j     
ˆ¡n ˆj     
ˆ¡dS)aÃAdd installable headers to configuration.
 
        Add the given sequence of files to the beginning of the headers list.
        By default, headers will be installed under <python-
        include>/<self.name.replace('.','/')>/ directory. If an item of files
        is a tuple, then its first argument specifies the actual installation
        location relative to the <python-include> path.
 
        Parameters
        ----------
        files : str or seq
            Argument(s) can be either:
 
                * 2-sequence (<includedir suffix>,<path to header file(s)>)
                * path(s) to header file(s) where python includedir suffix will
                  default to package name.
        csg|]}ˆ ˆj|f¡‘qSr )r…r9rŸ)rÿr<r r r ~sz-Configuration.add_headers.<locals>.<listcomp>r\csg|]}ˆ ˆd|f¡‘qS©r)r…rŸ)rÿrkr r r ‚srnN) r.r‡ròÚtuplercrNr5rsrCrÿrŽ)r<r#r[r )rÿrkr<r Ú add_headersis  
zConfiguration.add_headerscOs| dd¡}t||j|dS)a«Apply glob to paths and prepend local_path if needed.
 
        Applies glob.glob(...) to each path in the sequence (if needed) and
        pre-pends the local_path if needed. Because this is called on all
        source lists, this allows wildcard characters to be specified in lists
        of sources for extension modules and libraries and scripts and allows
        path-names be relative to the source directory.
 
        r¥T)r¤r¥)rVr0r¤)r<r‡Úkwsr¥r r r r‡‹s
 
þzConfiguration.pathscCs4| ¡D]&}||}|dkr| |¡}|||<qdS)N)rûr'r@Ú library_dirsZ module_dirsÚ extra_objects)rWr‡)r<ÚkwÚkraZnew_vr r r Ú_fix_paths_dictšs
 
zConfiguration._fix_paths_dictcKsät |¡}t|j|ƒ|d<||d<d|krt|d}|d=t|tƒrH|g}|D]&}t|tƒsftt|ƒƒ‚t|f|ŽqL| |¡|     dg¡}g}g|d<|D]Ü}    t|    t
ƒr¶| |    d¡d|    krl|      dd¡\}
} t j  t|j| ƒ¡} t j  | ¡rl|jd| dd    } t| tƒr|  ¡} d
d „|      dg¡DƒD]<} |   d d¡d }||
kr,|  dd¡t|f| Žqšq,qš| |    ¡qš||d|d<|j|     dg¡|d<d dlm}|f|Ž}|j |¡| ¡}|dk    rà| d|¡|S)a»Add extension to configuration.
 
        Create and add an Extension instance to the ext_modules list. This
        method also takes the following optional keyword arguments that are
        passed on to the Extension constructor.
 
        Parameters
        ----------
        name : str
            name of the extension
        sources : seq
            list of the sources. The list of sources may contain functions
            (called source generators) which must take an extension instance
            and a build directory as inputs and return a source file or list of
            source files or None. If None is returned then no sources are
            generated. If the Extension instance has no sources after
            processing all source generators, then no extension module is
            built.
        include_dirs :
        define_macros :
        undef_macros :
        library_dirs :
        libraries :
        runtime_library_dirs :
        extra_objects :
        extra_compile_args :
        extra_link_args :
        extra_f77_compile_args :
        extra_f90_compile_args :
        export_symbols :
        swig_opts :
        depends :
            The depends list contains paths to files or directories that the
            sources of the extension module depend on. If any path in the
            depends list is newer than the extension module, then the module
            will be rebuilt.
        language :
        f2py_options :
        module_dirs :
        extra_info : dict or list
            dict or list of dict of keywords to be appended to keywords.
 
        Notes
        -----
        The self.paths(...) method is applied to all lists that may contain
        paths.
        r9rûÚ
extra_inforArnú@Nr\rscSsg|] }|d‘qSrr )rJr˜r r r r òsz/Configuration.add_extension.<locals>.<listcomp>Z__OF__rrD©Ú    ExtensionzTdistutils distribution has been initialized, it may be too late to add an extension )rSr)r9ròrXrrrsrr—rVrrjrOrkrpr,r¤rrmrrdr‹r…rDrMr›r>rCra)r<r9rûr•Zext_argsr˜rgrAZlibnamesÚlibnameÚlnameZlpathr
r˜Zllnamer›r(r[r r r Ú add_extension¢s^0
 
 
 
 
ÿ 
   ÿ 
 
ÿzConfiguration.add_extensioncKs2| ||d|¡| ¡}|dk    r.| d|¡dS)aÒ
        Add library to configuration.
 
        Parameters
        ----------
        name : str
            Name of the extension.
        sources : sequence
            List of the sources. The list of sources may contain functions
            (called source generators) which must take an extension instance
            and a build directory as inputs and return a source file or list of
            source files or None. If None is returned then no sources are
            generated. If the Extension instance has no sources after
            processing all source generators, then no extension module is
            built.
        build_info : dict, optional
            The following keys are allowed:
 
                * depends
                * macros
                * include_dirs
                * extra_compiler_args
                * extra_f77_compile_args
                * extra_f90_compile_args
                * f2py_options
                * language
 
        NzQdistutils distribution has been initialized, it may be too late to add a library )Ú _add_libraryrCra)r<r9rûr:r[r r r Ú add_library    s ÿzConfiguration.add_librarycCs@t |¡}||d<d|kr"g|d<| |¡|j ||f¡dS)z\Common implementation for add_library and add_installed_library. Do
        not use directlyrûr'N)rSr—rAr…©r<r9rûÚ install_dirr:r r r rŸ-s 
 
zConfiguration._add_librarycCs@|si}tj |j|¡}| ||||¡|j t|||ƒ¡dS)aQ
        Similar to add_library, but the specified library is installed.
 
        Most C libraries used with `distutils` are only used to build python
        extensions, but libraries built through this method will be installed
        so that they can be reused by third-party packages.
 
        Parameters
        ----------
        name : str
            Name of the installed library.
        sources : sequence
            List of the library's source files. See `add_library` for details.
        install_dir : str
            Path to install the library, relative to the current sub-package.
        build_info : dict, optional
            The following keys are allowed:
 
                * depends
                * macros
                * include_dirs
                * extra_compiler_args
                * extra_f77_compile_args
                * extra_f90_compile_args
                * f2py_options
                * language
 
        Returns
        -------
        None
 
        See Also
        --------
        add_library, add_npy_pkg_config, get_info
 
        Notes
        -----
        The best way to encode the options required to link against the specified
        C libraries is to use a "libname.ini" file, and use `get_info` to
        retrieve the required options (see `add_npy_pkg_config` for more
        information).
 
        N)rOrkrlrMrŸrCr…r8r¡r r r Úadd_installed_library=s
,z#Configuration.add_installed_librarycCsZ|dkr i}tj |j|¡}|j|jkrB|j|j |||f¡n|||fg|j|j<dS)a 
        Generate and install a npy-pkg config file from a template.
 
        The config file generated from `template` is installed in the
        given install directory, using `subst_dict` for variable substitution.
 
        Parameters
        ----------
        template : str
            The path of the template, relatively to the current package path.
        install_dir : str
            Where to install the npy-pkg config file, relatively to the current
            package path.
        subst_dict : dict, optional
            If given, any string of the form ``@key@`` will be replaced by
            ``subst_dict[key]`` in the template file when installed. The install
            prefix is always available through the variable ``@prefix@``, since the
            install prefix is not easy to get reliably from setup.py.
 
        See also
        --------
        add_installed_library, get_info
 
        Notes
        -----
        This works for both standard installs and in-place builds, i.e. the
        ``@prefix@`` refer to the source directory for in-place builds.
 
        Examples
        --------
        ::
 
            config.add_npy_pkg_config('foo.ini.in', 'lib', {'foo': bar})
 
        Assuming the foo.ini.in file has the following content::
 
            [meta]
            Name=@foo@
            Version=1.0
            Description=dummy description
 
            [default]
            Cflags=-I@prefix@/include
            Libs=
 
        The generated file will have the following content::
 
            [meta]
            Name=bar
            Version=1.0
            Description=dummy description
 
            [default]
            Cflags=-Iprefix_dir/include
            Libs=
 
        and will be installed as foo.ini in the 'lib' subpath.
 
        When cross-compiling with numpy distutils, it might be necessary to
        use modified npy-pkg-config files.  Using the default/generated files
        will link with the host libraries (i.e. libnpymath.a).  For
        cross-compilation you of-course need to link with target libraries,
        while using the host Python installation.
 
        You can copy out the numpy/core/lib/npy-pkg-config directory, add a
        pkgdir value to the .ini files and set NPY_PKG_CONFIG_PATH environment
        variable to point to the directory with the modified npy-pkg-config
        files.
 
        Example npymath.ini modified for cross-compilation::
 
            [meta]
            Name=npymath
            Description=Portable, core math library implementing C99 standard
            Version=0.1
 
            [variables]
            pkgname=numpy.core
            pkgdir=/build/arm-linux-gnueabi/sysroot/usr/lib/python3.7/site-packages/numpy/core
            prefix=${pkgdir}
            libdir=${prefix}/lib
            includedir=${prefix}/include
 
            [default]
            Libs=-L${libdir} -lnpymath
            Cflags=-I${includedir}
            Requires=mlib
 
            [msvc]
            Libs=/LIBPATH:${libdir} npymath.lib
            Cflags=/INCLUDE:${includedir}
            Requires=mlib
 
        N)rOrkrlrMr9rFr…)r<Útemplater¢Z
subst_dictr r r Úadd_npy_pkg_configps_ ÿÿz Configuration.add_npy_pkg_configcGsH| |¡}| ¡}|dk    r8|jdkr*g|_|j |¡n |j |¡dS)zµAdd scripts to configuration.
 
        Add the sequence of files to the beginning of the scripts list.
        Scripts will be installed under the <prefix>/bin/ directory.
 
        N)r‡rCr)rŽ)r<r#r)r[r r r Ú add_scriptsÛs
 
zConfiguration.add_scriptsc
Ks|jD] }t||ƒ}| | |g¡¡q|jD] }t||ƒ}| | |i¡¡q.|j|j|j}| ¡D]ª}||krÒt||dƒ}|r”|||kr”qj| d|||| dd¡f¡t    ||||ƒ|j 
|¡qj||jkrü|  d|t||ƒ||f¡qj||krqjt d|ƒ‚qjdS)Nz"Inheriting attribute %r=%r from %rr9ržz*Ignoring attempt to set %r (from %r to %r)zDon't know about key=%r) rPrWrŽrVrRÚupdaterVrWrarTr…rgr—)r<rXrkrgrbr r r rës0
 
 
 
  ÿ
ÿ
zConfiguration.dict_appendcCsvddlm}|j|j|j}d}|d|jd7}| ¡|D](}t||dƒ}|r@|d|||ƒf7}q@|d7}|S)Nr)Úpformatz<-----
zConfiguration of z:
z%s = %s
z----->)Úpprintr¨rPrRrVr9ÚsortrW)r<r¨rbr“r–rgr r r Ú__str__s  zConfiguration.__str__cCsJtdƒ}| ¡d|_d|_tj d¡}|rFtj d|g¡}|tjd<|S)zF
        Returns the numpy.distutils config command instance.
        rzrÚPATHrx)    rÚensure_finalizedZ dump_sourceZnoisyrOrUrVÚpathseprl)r<ÚcmdÚold_pathrkr r r Úget_config_cmds 
zConfiguration.get_config_cmdcCstdƒ}| ¡|jS)zh
        Return a path to a temporary directory where temporary files should be
        placed.
        rE)rr­Ú
build_temp)r<r¯r r r Úget_build_temp_dirsz Configuration.get_build_temp_dircCsd}| ¡}|j|dd}|S)aSCheck for availability of Fortran 77 compiler.
 
        Use it inside source generating function to ensure that
        setup distribution instance has been initialized.
 
        Notes
        -----
        True if a Fortran 77 compiler is available (because a simple Fortran 77
        code was able to be compiled successfully).
        ú/
        subroutine simple
        end
        rù©Úlang©r±Z try_compile©r<Zsimple_fortran_subroutineZ
config_cmdÚflagr r r Ú    have_f77c(s zConfiguration.have_f77ccCsd}| ¡}|j|dd}|S)aRCheck for availability of Fortran 90 compiler.
 
        Use it inside source generating function to ensure that
        setup distribution instance has been initialized.
 
        Notes
        -----
        True if a Fortran 90 compiler is available (because a simple Fortran
        90 code was able to be compiled successfully)
        r´rørµr·r¸r r r Ú    have_f90c;s zConfiguration.have_f90ccCsft|ƒr$|\}}t||j|jdn>ddlm}t||ƒsFtt|ƒƒ‚|j     |j¡|j     |j¡dS)zEAppend libraries, include_dirs to extension or library item.
        )rAr@rršN)
r-rrAr@rMr›ròrrrsrŽ)r<ZextlibZlib_namer:r›r r r Ú    append_toNsþ zConfiguration.append_toc    Csúztjdg|d}Wntjtfk
r.Yn Xt d|¡}|rNt| d¡ƒStj    dkrtt
j   dd¡rtt |dd    ƒ}n t |d
d    ƒ}t
j |¡röt|ƒ}| ¡}W5QRX|dd …d krØt d |¡}|röt| d¡ƒSnt d|¡}|röt| d¡ƒSdS)z+Return path's SVN revision number.
        Z
svnversion©Úcwdó(?P<revision>\d+)ÚrevisionrÚZSVN_ASP_DOT_NET_HACKNZ_svnÚentriesr r¿z<?xmlzrevision="(?P<revision>\d+)"zdir[\n\r]+(?P<revision>\d+))rØrÙÚCalledProcessErrorr    rÚmatchrTrírr¹rOrUrVr,rkr r‹Úreadr)r<rkÚoutputrðrÁrïZfstrr r r Ú_get_svn_revision\s*   
  zConfiguration._get_svn_revisionc
Csztjdddg|d}Wntjtfk
r2Yn Xt d|¡}|rRt| d¡ƒSt|ddƒ}t|dd    ƒ}t    j
  |¡rd
}t |ƒ}|  ¡ ¡}W5QRXi}    t |d ƒ^}|D]R}
|
 ¡d
d …\} } | |krÔ| }z t| ƒ} Wntk
røYq°YnX| |    | <q°W5QRX|     |¡Sd
S) z1Return path's Mercurial revision number.
        ÚhgZidentifyz--numr½r¿rÀz.hgÚbranchz branch.cacheNrêr\)rØrÙrÂr    rrÃrTrír,rOrkr r‹rÄrrjr—rV) r<rkrÅrðZ    branch_fnZbranch_cache_fnZbranch0rïZ    revision0Z
branch_mapr”Zbranch1Z    revision1r r r Ú_get_hg_revisionys:ÿ
 
 
 
zConfiguration._get_hg_revisionc CsÊt|ddƒ}|dk    r|S|dkr@d|j d¡ddddd    g}n|g}|dkrjdd
|j d¡dd g}n|g}|D]}t|j|ƒ}tj |¡rtd }tj tj     |¡¡d }    t
|j|    ƒ}
zt d  |
 d¡¡|ƒ} Wn6t k
r
} z| t| ƒ¡d} W5d} ~ XYnX| dkrqt|D]"} t| | dƒ}|dk    rq@qz|  ¡d}Wntk
rfYnX|dk    rtqxqt|dk    rŒ||_|S| |j¡}|dkr®| |j¡}|dk    rÆt|ƒ}||_|S)a¹Try to get version string of a package.
 
        Return a version string of the current package or None if the version
        information could not be detected.
 
        Notes
        -----
        This method scans files named
        __version__.py, <packagename>_version.py, version.py, and
        __svn_version__.py for string variables version, __version__, and
        <packagename>_version, until a version number is found.
        rÝNz__version__.pyrxrÛz _version.pyz
version.pyú__svn_version__.pyú__hg_version__.pyÚ __version__Ú_version)z.pyÚUrnrr<)rWr9rjr,r¤rOrkr rurvr)r7rlÚ ImportErrorrarÏÚ get_versionsrPrÝrÆrÉ)r<Z version_fileZversion_variablerÝr#Z version_varsrïr‘rgr9r¦Zversion_moduleÚergrÀr r r Ú get_versionŸsj üþ
   ÿ
 
 
 
 
 
zConfiguration.get_versionTcsVtˆjdƒ‰ˆ ˆj¡‰tj ˆ¡s,ˆdkr0dS‡‡‡‡fdd„}ˆ d|ƒf¡dS)aAppends a data function to the data_files list that will generate
        __svn_version__.py file to the current package directory.
 
        Generate package __svn_version__.py file from SVN revision number,
        it will be removed after python exits but will be available
        when sdist, etc commands are executed.
 
        Notes
        -----
        If __svn_version__.py existed before, nothing is done.
 
        This is
        intended for working with source directories that are in an SVN
        repository.
        rÊNc    sltj ˆ¡sJtˆƒ}ˆ dˆ|f¡tˆdƒ}| d|¡W5QRXˆˆjf‡fdd„    }t |¡ˆS)NúCreating %s (version=%r)r­ú version = %r
cspˆrlzt |¡|d|ƒWntk
r2YnXz"t |d¡|d|dƒWntk
rjYnXdS©Nzremoved r
©rOÚremover    ©rïrˆ©Údeleter r Úrm_files
zSConfiguration.make_svn_version_py.<locals>.generate_svn_version_py.<locals>.rm_file©    rOrkr rÏrgr‹riÚatexitÚregister©rÝrïrÛ©rÚrÀr<Útargetr r Úgenerate_svn_version_pys  
zBConfiguration.make_svn_version_py.<locals>.generate_svn_version_pyrm)r,r¤rÆrOrkr rŠ)r<rÚrâr ràr Úmake_svn_version_pyës   z!Configuration.make_svn_version_pycsVtˆjdƒ‰ˆ ˆj¡‰tj ˆ¡s,ˆdkr0dS‡‡‡‡fdd„}ˆ d|ƒf¡dS)aAppends a data function to the data_files list that will generate
        __hg_version__.py file to the current package directory.
 
        Generate package __hg_version__.py file from Mercurial revision,
        it will be removed after python exits but will be available
        when sdist, etc commands are executed.
 
        Notes
        -----
        If __hg_version__.py existed before, nothing is done.
 
        This is intended for working with source directories that are
        in an Mercurial repository.
        rËNc    sltj ˆ¡sJtˆƒ}ˆ dˆ|f¡tˆdƒ}| d|¡W5QRXˆˆjf‡fdd„    }t |¡ˆS)NrÓr­rÔcspˆrlzt |¡|d|ƒWntk
r2YnXz"t |d¡|d|dƒWntk
rjYnXdSrÕrÖrØrÙr r rÛ/s
zQConfiguration.make_hg_version_py.<locals>.generate_hg_version_py.<locals>.rm_filerÜrßràr r Úgenerate_hg_version_py(s  
z@Configuration.make_hg_version_py.<locals>.generate_hg_version_pyrm)r,r¤rÉrOrkr rŠ)r<rÚrär ràr Úmake_hg_version_pys   z Configuration.make_hg_version_pyÚ
__config__cCs|j |j|tf¡dS)zÉGenerate package __config__.py file containing system_info
        information used during building the package.
 
        This file is installed to the
        package installation directory.
 
        N)rBr…r9r)r<r9r r r Úmake_config_py<szConfiguration.make_config_pycGs2ddlm}m}i}|D]}||f||ƒŽq|S)z¥Get resources information.
 
        Return information (from system_info.get_info) for all of the names in
        the argument list in a single dictionary.
        rn)r3r)Ú system_infor3r)r<Únamesr3rZ    info_dictrgr r r r3Fs
zConfiguration.get_info)NNNNrnrG)rn)rn)NNrn)NF)N)N)NN)T)T)ræ)-r>r?r@rOrQrUÚnumpy_include_dirsr=rdrgrar[rCrqr{rmr}r~rcrŠrrŽr‘r‡r—ržr rŸr£r¥r¦rr«r±r³rºr»r¼rÆrÉrÒrãrårçr3r r r r r÷s~þú
aþ
"ý
>þ
+y    "g$
3
k     &
L
)
(
 
cCsN||krFddl}|jj}|dkr4ddlm}|dƒ‚| |¡}|||<||S)Nr)ÚDistutilsInternalErrorz+setup distribution instance not initialized)Údistutils.coreÚcoreÚ_setup_distributionÚdistutils.errorsrërX)ZcmdnameÚ_cacher0r[rër¯r r r rSs ÿ
cCs(tjdd…}|s$ddl}| ¡g}|S)Nr)rrêÚnumpyZ get_include)r@rñr r r r_s
 
cCsDtj d¡}|dk    r|Stj d¡}tj tj |j    ¡ddd¡}|S)a³Return the path where to find the npy-pkg-config directory.
 
    If the NPY_PKG_CONFIG_PATH environment variable is set, the value of that
    is returned.  Otherwise, a path inside the location of the numpy module is
    returned.
 
    The NPY_PKG_CONFIG_PATH can be useful when cross-compiling, maintaining
    customized npy-pkg-config .ini files for the cross-compilation
    environment, and using them when cross-compiling.
 
    ZNPY_PKG_CONFIG_PATHNrñrír*znpy-pkg-config)
rOrUrVÚ    importlibÚutilÚ    find_specrkrlr|Úorigin)r
Úspecr r r Úget_npy_pkg_dirhs  ÿr÷cCs0ddlm}|r| tƒ¡ntƒg}|||ƒS)aø
    Return library info for the given package.
 
    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 additional directories where to look
        for npy-pkg-config files. Those directories are searched prior to the
        NumPy directory.
 
    Returns
    -------
    pkginfo : class instance
        The `LibraryInfo` instance containing the build information.
 
    Raises
    ------
    PkgNotFound
        If the package is not found.
 
    See Also
    --------
    Configuration.add_npy_pkg_config, Configuration.add_installed_library,
    get_info
 
    r)Ú read_config)Únumpy.distutils.npy_pkg_configrør…r÷)Úpkgnamerrør r r r4|s
 cCsfddlm}t||ƒ}|| ¡ƒ}|| ¡ƒ ¡D]\}}|| |¡q2|d|d<|d=|d=|S)a9
    Return an info dict for a given C library.
 
    The info dict contains the necessary options to use the C library.
 
    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 additional directories where to look
        for npy-pkg-config files. Those directories are searched prior to the
        NumPy directory.
 
    Returns
    -------
    info : dict
        The dictionary with build information.
 
    Raises
    ------
    PkgNotFound
        If the package is not found.
 
    See Also
    --------
    Configuration.add_npy_pkg_config, Configuration.add_installed_library,
    get_pkg_info
 
    Examples
    --------
    To get the necessary information for the npymath library from NumPy:
 
    >>> npymath_info = np.distutils.misc_util.get_info('npymath')
    >>> npymath_info                                    #doctest: +SKIP
    {'define_macros': [], 'libraries': ['npymath'], 'library_dirs':
    ['.../numpy/core/lib'], 'include_dirs': ['.../numpy/core/include']}
 
    This info dict can then be used as input to a `Configuration` instance::
 
      config.add_extension('foo', sources=['foo.c'], extra_info=npymath_info)
 
    r)Ú parse_flagsrŒrDZignored)rùrûr4ÚcflagsZlibsrjrŽ)rúrrûÚpkg_inforgr–rar r r r3¢s- 
  cCs0ddl}z |jWdStk
r*YdSXdS)NrTF)ÚbuiltinsZ__NUMPY_SETUP__rP)rþr r r Úis_bootstrappingÞs rÿcCs:ddl}|jd||||||fddt|||ƒ}| ¡S)zqReturn a configuration dictionary for usage in
    configuration() function defined in file setup_<name>.py.
    rNzXUse Configuration(%r,%r,top_path=%r) instead of deprecated default_config_dict(%r,%r,%r)r\r])r`rarrd)r9r^r¤r`r
r r r rêsÿþü cKsR| ¡D]D\}}||krD||}t|tƒr4|||<qL|| |¡q|||<qdSr)rjròrÏrŽ)r
r’r–raÚovr r r røs
 
cCs,tjjdkr,| dtjj¡}| dtjj¡}d}tj |¡rtj |¡d}tj tj |¡¡d}tj |¡\}}tj ||g¡}tj |dt    |ƒ…|t    |ƒd…¡|ksÚtj |dt    |ƒ…|t    |ƒd…¡|krætj 
|¡}|t    |ƒd…}tj |¡r|dd…}n|}tj  t |||ƒ¡S)Nrirmrrn) rOrkrqr†rÚ
splitdriverprrlrNr|Únormpathr,)rªrkÚdriveZ    absprefixZ    pathdriver
Úsubpathr r r r    s$ *(ÿ c    Cs¸ddlm}ddlm}|tj |¡ƒt|dƒ|}| dtj     t
j d¡¡| d¡| d¡| t   d¡¡|j ¡D]\}}| d    ||f¡q~| t   d
¡¡W5QRX|S) zÅGenerate config.py file containing system_info information
    used during building the package.
 
    Usage:
        config['py_modules'].append((packagename, '__config__',generate_config_py))
    r)rè)Úmkpathr­z'# This file is generated by numpy's %s
zH# It contains system_info results at the time of building this package.
z__all__ = ["get_info","show"]
 
a
            import os
            import sys
 
            extra_dll_dir = os.path.join(os.path.dirname(__file__), '.libs')
 
            if sys.platform == 'win32' and os.path.isdir(extra_dll_dir):
                os.add_dll_directory(extra_dll_dir)
 
            z%s=%r
a}
            def get_info(name):
                g = globals()
                return g.get(name, g.get(name + "_info", {}))
 
            def show():
                """
                Show libraries in the system on which NumPy was built.
 
                Print information about various resources (libraries, library
                directories, include directories, etc.) in the system on which
                NumPy was built.
 
                See Also
                --------
                get_include : Returns the directory containing NumPy C
                              header files.
 
                Notes
                -----
                1. Classes specifying the information to be printed are defined
                   in the `numpy.distutils.system_info` module.
 
                   Information may include:
 
                   * ``language``: language used to write the libraries (mostly
                     C or f77)
                   * ``libraries``: names of libraries found in the system
                   * ``library_dirs``: directories containing the libraries
                   * ``include_dirs``: directories containing library header files
                   * ``src_dirs``: directories containing library source files
                   * ``define_macros``: preprocessor macros used by
                     ``distutils.setup``
                   * ``baseline``: minimum CPU features required
                   * ``found``: dispatched features supported in the system
                   * ``not found``: dispatched features that are not supported
                     in the system
 
                2. NumPy BLAS/LAPACK Installation Notes
 
                   Installing a numpy wheel (``pip install numpy`` or force it
                   via ``pip install numpy --only-binary :numpy: numpy``) includes
                   an OpenBLAS implementation of the BLAS and LAPACK linear algebra
                   APIs. In this case, ``library_dirs`` reports the original build
                   time configuration as compiled with gcc/gfortran; at run time
                   the OpenBLAS library is in
                   ``site-packages/numpy.libs/`` (linux), or
                   ``site-packages/numpy/.dylibs/`` (macOS), or
                   ``site-packages/numpy/.libs/`` (windows).
 
                   Installing numpy from source
                   (``pip install numpy --no-binary numpy``) searches for BLAS and
                   LAPACK dynamic link libraries at build time as influenced by
                   environment variables NPY_BLAS_LIBS, NPY_CBLAS_LIBS, and
                   NPY_LAPACK_LIBS; or NPY_BLAS_ORDER and NPY_LAPACK_ORDER;
                   or the optional file ``~/.numpy-site.cfg``.
                   NumPy remembers those locations and expects to load the same
                   libraries at run-time.
                   In NumPy 1.21+ on macOS, 'accelerate' (Apple's Accelerate BLAS
                   library) is in the default build-time search order after
                   'openblas'.
 
                Examples
                --------
                >>> import numpy as np
                >>> np.show_config()
                blas_opt_info:
                    language = c
                    define_macros = [('HAVE_CBLAS', None)]
                    libraries = ['openblas', 'openblas']
                    library_dirs = ['/usr/local/lib']
                """
                from numpy.core._multiarray_umath import (
                    __cpu_features__, __cpu_baseline__, __cpu_dispatch__
                )
                for name,info_dict in globals().items():
                    if name[0] == "_" or type(info_dict) is not type({}): continue
                    print(name + ":")
                    if not info_dict:
                        print("  NOT AVAILABLE")
                    for k,v in info_dict.items():
                        v = str(v)
                        if k == "sources" and len(v) > 200:
                            v = v[:60] + " ...\n... " + v[-60:]
                        print("    %s = %s" % (k,v))
 
                features_found, features_not_found = [], []
                for feature in __cpu_dispatch__:
                    if __cpu_features__[feature]:
                        features_found.append(feature)
                    else:
                        features_not_found.append(feature)
 
                print("Supported SIMD extensions in this NumPy install:")
                print("    baseline = %s" % (','.join(__cpu_baseline__)))
                print("    found = %s" % (','.join(features_found)))
                print("    not found = %s" % (','.join(features_not_found)))
 
                    )Znumpy.distutils.system_inforèÚdistutils.dir_utilrrOrkr|r‹rirvrÚargvÚtextwrapÚdedentZ saved_resultsrj)rárèrrïr–rfr r r r    s   
 
 dcCs|jdkstd|jƒ‚|jS)zdReturn version major and minor of compiler instance if it is
    MSVC, raise an exception otherwise.Zmsvcz"Compiler instance is not msvc (%s))Ú compiler_typer—Z_MSVCCompiler__version)Úcompilerr r r Ú msvc_version›    s
 
ÿr cCsddlm}|ƒS)Nr©r2)Zdistutils.msvccompilerr2r r r r r2£    s z%-Werror=implicit-function-declarationz-std=c99cCsdd„|DƒS)z=
    Some flags are valid for C but not C++. Prune them.
    cSsg|]}|tkr|‘qSr )Ú_cxx_ignore_flags)rJr¹r r r r ±    sz&sanitize_cxx_flags.<locals>.<listcomp>r )Zcxxflagsr r r r6­    scCs*tj ||¡}tj |¡}|j |¡|S)z°
    Use importlib machinery to import a module `modname` from the file
    `modfile`. Depending on the `spec.loader`, the module may not be
    registered in sys.modules.
    )ròróÚspec_from_file_locationÚmodule_from_specÚloaderÚ exec_module)ÚmodnameZmodfileröZfoor r r r7´    s  )N)N)rmT)rmrmT)NNF)NN)F)r)N)N)NNN)frOrrrSr›rÝr¯rØrrQrZimportlib.utilròÚ    threadingrZtlocalÚ    functoolsrr0rïrr®rr rÞÚ__all__r8r5rhrrvr„r,rr+rœr£r0r´rrXrÍrÓrÖrrrrrrÏrrrßrãrárÚIrÃrþrúrërìrñr.rr-r÷r/r1r r!r"rrrr#r$rr$r%r&r'r3r(r)r*rrrr÷r4r3rÿrrrrr r2rr6r7r r r r Ú<module>s,   
ô$
 
%
 
 
ÿ 
%
               
 
+
f     
&
<