Cython 3.2.0b1__cp39-abi3-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +350 -0
  4. Cython/Build/Dependencies.py +1311 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +95 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +984 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.pxd +149 -0
  26. Cython/Compiler/Code.py +3730 -0
  27. Cython/Compiler/Code.pyd +0 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +187 -0
  30. Cython/Compiler/Dataclass.py +864 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +297 -0
  33. Cython/Compiler/ExprNodes.py +15559 -0
  34. Cython/Compiler/FlowControl.pxd +97 -0
  35. Cython/Compiler/FlowControl.py +1451 -0
  36. Cython/Compiler/FlowControl.pyd +0 -0
  37. Cython/Compiler/FusedNode.py +971 -0
  38. Cython/Compiler/FusedNode.pyd +0 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +421 -0
  42. Cython/Compiler/LineTable.py +114 -0
  43. Cython/Compiler/LineTable.pyd +0 -0
  44. Cython/Compiler/Main.py +857 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +905 -0
  47. Cython/Compiler/ModuleNode.py +4157 -0
  48. Cython/Compiler/Naming.py +363 -0
  49. Cython/Compiler/Nodes.py +10817 -0
  50. Cython/Compiler/Optimize.py +5293 -0
  51. Cython/Compiler/Options.py +843 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4638 -0
  54. Cython/Compiler/Parsing.pxd +9 -0
  55. Cython/Compiler/Parsing.py +4775 -0
  56. Cython/Compiler/Parsing.pyd +0 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5857 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.pxd +48 -0
  61. Cython/Compiler/Scanning.py +701 -0
  62. Cython/Compiler/Scanning.pyd +0 -0
  63. Cython/Compiler/StringEncoding.py +298 -0
  64. Cython/Compiler/Symtab.py +3070 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  68. Cython/Compiler/Tests/TestCode.py +144 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +134 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +21 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +75 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +591 -0
  86. Cython/Compiler/TypeSlots.py +1174 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +389 -0
  89. Cython/Compiler/UtilityCode.py +344 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.pxd +53 -0
  92. Cython/Compiler/Visitor.py +861 -0
  93. Cython/Compiler/Visitor.pyd +0 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +175 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +275 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +178 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +187 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +47 -0
  130. Cython/Includes/cpython/function.pxd +65 -0
  131. Cython/Includes/cpython/genobject.pxd +25 -0
  132. Cython/Includes/cpython/getargs.pxd +12 -0
  133. Cython/Includes/cpython/instance.pxd +25 -0
  134. Cython/Includes/cpython/iterator.pxd +36 -0
  135. Cython/Includes/cpython/iterobject.pxd +24 -0
  136. Cython/Includes/cpython/list.pxd +92 -0
  137. Cython/Includes/cpython/long.pxd +149 -0
  138. Cython/Includes/cpython/longintrepr.pxd +14 -0
  139. Cython/Includes/cpython/mapping.pxd +63 -0
  140. Cython/Includes/cpython/marshal.pxd +66 -0
  141. Cython/Includes/cpython/mem.pxd +120 -0
  142. Cython/Includes/cpython/memoryview.pxd +50 -0
  143. Cython/Includes/cpython/method.pxd +49 -0
  144. Cython/Includes/cpython/module.pxd +208 -0
  145. Cython/Includes/cpython/number.pxd +258 -0
  146. Cython/Includes/cpython/object.pxd +433 -0
  147. Cython/Includes/cpython/pycapsule.pxd +143 -0
  148. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  149. Cython/Includes/cpython/pyport.pxd +8 -0
  150. Cython/Includes/cpython/pystate.pxd +95 -0
  151. Cython/Includes/cpython/pythread.pxd +53 -0
  152. Cython/Includes/cpython/ref.pxd +141 -0
  153. Cython/Includes/cpython/sequence.pxd +134 -0
  154. Cython/Includes/cpython/set.pxd +119 -0
  155. Cython/Includes/cpython/slice.pxd +70 -0
  156. Cython/Includes/cpython/time.pxd +129 -0
  157. Cython/Includes/cpython/tuple.pxd +72 -0
  158. Cython/Includes/cpython/type.pxd +53 -0
  159. Cython/Includes/cpython/unicode.pxd +639 -0
  160. Cython/Includes/cpython/version.pxd +32 -0
  161. Cython/Includes/cpython/weakref.pxd +78 -0
  162. Cython/Includes/libc/__init__.pxd +1 -0
  163. Cython/Includes/libc/complex.pxd +35 -0
  164. Cython/Includes/libc/errno.pxd +127 -0
  165. Cython/Includes/libc/float.pxd +43 -0
  166. Cython/Includes/libc/limits.pxd +28 -0
  167. Cython/Includes/libc/locale.pxd +46 -0
  168. Cython/Includes/libc/math.pxd +209 -0
  169. Cython/Includes/libc/setjmp.pxd +10 -0
  170. Cython/Includes/libc/signal.pxd +64 -0
  171. Cython/Includes/libc/stddef.pxd +9 -0
  172. Cython/Includes/libc/stdint.pxd +105 -0
  173. Cython/Includes/libc/stdio.pxd +80 -0
  174. Cython/Includes/libc/stdlib.pxd +72 -0
  175. Cython/Includes/libc/string.pxd +50 -0
  176. Cython/Includes/libc/threads.pxd +234 -0
  177. Cython/Includes/libc/time.pxd +52 -0
  178. Cython/Includes/libcpp/__init__.pxd +4 -0
  179. Cython/Includes/libcpp/algorithm.pxd +320 -0
  180. Cython/Includes/libcpp/any.pxd +16 -0
  181. Cython/Includes/libcpp/atomic.pxd +59 -0
  182. Cython/Includes/libcpp/barrier.pxd +22 -0
  183. Cython/Includes/libcpp/bit.pxd +29 -0
  184. Cython/Includes/libcpp/cast.pxd +12 -0
  185. Cython/Includes/libcpp/cmath.pxd +518 -0
  186. Cython/Includes/libcpp/complex.pxd +106 -0
  187. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  188. Cython/Includes/libcpp/deque.pxd +165 -0
  189. Cython/Includes/libcpp/exception.pxd +86 -0
  190. Cython/Includes/libcpp/execution.pxd +15 -0
  191. Cython/Includes/libcpp/forward_list.pxd +63 -0
  192. Cython/Includes/libcpp/functional.pxd +26 -0
  193. Cython/Includes/libcpp/future.pxd +103 -0
  194. Cython/Includes/libcpp/iterator.pxd +34 -0
  195. Cython/Includes/libcpp/latch.pxd +17 -0
  196. Cython/Includes/libcpp/limits.pxd +61 -0
  197. Cython/Includes/libcpp/list.pxd +117 -0
  198. Cython/Includes/libcpp/map.pxd +252 -0
  199. Cython/Includes/libcpp/memory.pxd +115 -0
  200. Cython/Includes/libcpp/mutex.pxd +387 -0
  201. Cython/Includes/libcpp/numbers.pxd +15 -0
  202. Cython/Includes/libcpp/numeric.pxd +131 -0
  203. Cython/Includes/libcpp/optional.pxd +34 -0
  204. Cython/Includes/libcpp/pair.pxd +1 -0
  205. Cython/Includes/libcpp/queue.pxd +25 -0
  206. Cython/Includes/libcpp/random.pxd +166 -0
  207. Cython/Includes/libcpp/semaphore.pxd +43 -0
  208. Cython/Includes/libcpp/set.pxd +228 -0
  209. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  210. Cython/Includes/libcpp/span.pxd +87 -0
  211. Cython/Includes/libcpp/stack.pxd +11 -0
  212. Cython/Includes/libcpp/stop_token.pxd +117 -0
  213. Cython/Includes/libcpp/string.pxd +355 -0
  214. Cython/Includes/libcpp/string_view.pxd +183 -0
  215. Cython/Includes/libcpp/typeindex.pxd +15 -0
  216. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  217. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  218. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  219. Cython/Includes/libcpp/utility.pxd +30 -0
  220. Cython/Includes/libcpp/vector.pxd +186 -0
  221. Cython/Includes/numpy/math.pxd +150 -0
  222. Cython/Includes/openmp.pxd +50 -0
  223. Cython/Includes/posix/__init__.pxd +1 -0
  224. Cython/Includes/posix/dlfcn.pxd +14 -0
  225. Cython/Includes/posix/fcntl.pxd +86 -0
  226. Cython/Includes/posix/ioctl.pxd +4 -0
  227. Cython/Includes/posix/mman.pxd +101 -0
  228. Cython/Includes/posix/resource.pxd +57 -0
  229. Cython/Includes/posix/select.pxd +21 -0
  230. Cython/Includes/posix/signal.pxd +73 -0
  231. Cython/Includes/posix/stat.pxd +98 -0
  232. Cython/Includes/posix/stdio.pxd +37 -0
  233. Cython/Includes/posix/stdlib.pxd +29 -0
  234. Cython/Includes/posix/strings.pxd +9 -0
  235. Cython/Includes/posix/time.pxd +71 -0
  236. Cython/Includes/posix/types.pxd +30 -0
  237. Cython/Includes/posix/uio.pxd +26 -0
  238. Cython/Includes/posix/unistd.pxd +271 -0
  239. Cython/Includes/posix/wait.pxd +38 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/Actions.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/DFA.pyd +0 -0
  246. Cython/Plex/Errors.py +48 -0
  247. Cython/Plex/Lexicons.py +178 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Machines.pyd +0 -0
  251. Cython/Plex/Regexps.py +535 -0
  252. Cython/Plex/Scanners.pxd +45 -0
  253. Cython/Plex/Scanners.py +328 -0
  254. Cython/Plex/Scanners.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/Transitions.pyd +0 -0
  258. Cython/Plex/__init__.py +34 -0
  259. Cython/Runtime/__init__.py +1 -0
  260. Cython/Runtime/refnanny.pyd +0 -0
  261. Cython/Runtime/refnanny.pyx +237 -0
  262. Cython/Shadow.py +690 -0
  263. Cython/Shadow.pyi +521 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/StringIOTree.pyd +0 -0
  266. Cython/Tempita/__init__.py +4 -0
  267. Cython/Tempita/_looper.py +154 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/Tempita/_tempita.pyd +0 -0
  270. Cython/TestUtils.py +422 -0
  271. Cython/Tests/TestCodeWriter.py +128 -0
  272. Cython/Tests/TestCythonUtils.py +202 -0
  273. Cython/Tests/TestJediTyper.py +223 -0
  274. Cython/Tests/TestShadow.py +114 -0
  275. Cython/Tests/TestStringIOTree.py +67 -0
  276. Cython/Tests/TestTestUtils.py +90 -0
  277. Cython/Tests/__init__.py +1 -0
  278. Cython/Tests/xmlrunner.py +390 -0
  279. Cython/Utility/AsyncGen.c +1039 -0
  280. Cython/Utility/Buffer.c +865 -0
  281. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  282. Cython/Utility/Builtins.c +810 -0
  283. Cython/Utility/CConvert.pyx +134 -0
  284. Cython/Utility/CMath.c +104 -0
  285. Cython/Utility/CommonStructures.c +210 -0
  286. Cython/Utility/Complex.c +378 -0
  287. Cython/Utility/Coroutine.c +2308 -0
  288. Cython/Utility/CpdefEnums.pyx +103 -0
  289. Cython/Utility/CppConvert.pyx +282 -0
  290. Cython/Utility/CppSupport.cpp +151 -0
  291. Cython/Utility/CythonFunction.c +1836 -0
  292. Cython/Utility/Dataclasses.c +101 -0
  293. Cython/Utility/Embed.c +121 -0
  294. Cython/Utility/Exceptions.c +1016 -0
  295. Cython/Utility/ExtensionTypes.c +996 -0
  296. Cython/Utility/FunctionArguments.c +1043 -0
  297. Cython/Utility/FusedFunction.pyx +44 -0
  298. Cython/Utility/ImportExport.c +926 -0
  299. Cython/Utility/MemoryView.pxd +188 -0
  300. Cython/Utility/MemoryView.pyx +1482 -0
  301. Cython/Utility/MemoryView_C.c +915 -0
  302. Cython/Utility/ModuleSetupCode.c +3145 -0
  303. Cython/Utility/NumpyImportArray.c +46 -0
  304. Cython/Utility/ObjectHandling.c +3273 -0
  305. Cython/Utility/Optimize.c +1612 -0
  306. Cython/Utility/Overflow.c +384 -0
  307. Cython/Utility/Printing.c +86 -0
  308. Cython/Utility/Profile.c +732 -0
  309. Cython/Utility/StringTools.c +1379 -0
  310. Cython/Utility/Synchronization.c +389 -0
  311. Cython/Utility/TString.c +356 -0
  312. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  313. Cython/Utility/TestCythonScope.pyx +75 -0
  314. Cython/Utility/TestUtilityLoader.c +12 -0
  315. Cython/Utility/TypeConversion.c +1385 -0
  316. Cython/Utility/UFuncs.pyx +50 -0
  317. Cython/Utility/UFuncs_C.c +89 -0
  318. Cython/Utility/__init__.py +28 -0
  319. Cython/Utility/arrayarray.h +167 -0
  320. Cython/Utils.py +687 -0
  321. Cython/Utils.pyd +0 -0
  322. Cython/__init__.py +10 -0
  323. Cython/__init__.pyi +7 -0
  324. Cython/py.typed +0 -0
  325. cython-3.2.0b1.dist-info/METADATA +292 -0
  326. cython-3.2.0b1.dist-info/RECORD +333 -0
  327. cython-3.2.0b1.dist-info/WHEEL +5 -0
  328. cython-3.2.0b1.dist-info/entry_points.txt +4 -0
  329. cython-3.2.0b1.dist-info/top_level.txt +3 -0
  330. cython.py +29 -0
  331. pyximport/__init__.py +4 -0
  332. pyximport/pyxbuild.py +160 -0
  333. pyximport/pyximport.py +482 -0
@@ -0,0 +1,169 @@
1
+ """
2
+ Compile a Python script into an executable that embeds CPython.
3
+ Requires CPython to be built as a shared library ('libpythonX.Y').
4
+
5
+ Basic usage:
6
+
7
+ python -m Cython.Build.BuildExecutable [ARGS] somefile.py
8
+ """
9
+
10
+
11
+ DEBUG = True
12
+
13
+ import sys
14
+ import os
15
+ if sys.version_info < (3, 9):
16
+ from distutils import sysconfig as _sysconfig
17
+
18
+ class sysconfig:
19
+
20
+ @staticmethod
21
+ def get_path(name):
22
+ assert name == 'include'
23
+ return _sysconfig.get_python_inc()
24
+
25
+ get_config_var = staticmethod(_sysconfig.get_config_var)
26
+ else:
27
+ # sysconfig can be trusted from cpython >= 3.8.7
28
+ import sysconfig
29
+
30
+
31
+ def get_config_var(name, default=''):
32
+ return sysconfig.get_config_var(name) or default
33
+
34
+ INCDIR = sysconfig.get_path('include')
35
+ LIBDIR1 = get_config_var('LIBDIR')
36
+ LIBDIR2 = get_config_var('LIBPL')
37
+ PYLIB = get_config_var('LIBRARY')
38
+ PYLIB_DYN = get_config_var('LDLIBRARY')
39
+ if PYLIB_DYN == PYLIB:
40
+ # no shared library
41
+ PYLIB_DYN = ''
42
+ else:
43
+ PYLIB_DYN = os.path.splitext(PYLIB_DYN[3:])[0] # 'lib(XYZ).so' -> XYZ
44
+
45
+ CC = get_config_var('CC', os.environ.get('CC', ''))
46
+ CFLAGS = get_config_var('CFLAGS') + ' ' + os.environ.get('CFLAGS', '')
47
+ LINKCC = get_config_var('LINKCC', os.environ.get('LINKCC', CC))
48
+ LINKFORSHARED = get_config_var('LINKFORSHARED')
49
+ LIBS = get_config_var('LIBS')
50
+ SYSLIBS = get_config_var('SYSLIBS')
51
+ EXE_EXT = sysconfig.get_config_var('EXE')
52
+
53
+
54
+ def _debug(msg, *args):
55
+ if DEBUG:
56
+ if args:
57
+ msg = msg % args
58
+ sys.stderr.write(msg + '\n')
59
+
60
+
61
+ def dump_config():
62
+ _debug('INCDIR: %s', INCDIR)
63
+ _debug('LIBDIR1: %s', LIBDIR1)
64
+ _debug('LIBDIR2: %s', LIBDIR2)
65
+ _debug('PYLIB: %s', PYLIB)
66
+ _debug('PYLIB_DYN: %s', PYLIB_DYN)
67
+ _debug('CC: %s', CC)
68
+ _debug('CFLAGS: %s', CFLAGS)
69
+ _debug('LINKCC: %s', LINKCC)
70
+ _debug('LINKFORSHARED: %s', LINKFORSHARED)
71
+ _debug('LIBS: %s', LIBS)
72
+ _debug('SYSLIBS: %s', SYSLIBS)
73
+ _debug('EXE_EXT: %s', EXE_EXT)
74
+
75
+
76
+ def _parse_args(args):
77
+ cy_args = []
78
+ last_arg = None
79
+ for i, arg in enumerate(args):
80
+ if arg.startswith('-'):
81
+ cy_args.append(arg)
82
+ elif last_arg in ('-X', '--directive'):
83
+ cy_args.append(arg)
84
+ else:
85
+ input_file = arg
86
+ args = args[i+1:]
87
+ break
88
+ last_arg = arg
89
+ else:
90
+ raise ValueError('no input file provided')
91
+
92
+ return input_file, cy_args, args
93
+
94
+
95
+ def runcmd(cmd, shell=True):
96
+ if shell:
97
+ cmd = ' '.join(cmd)
98
+ _debug(cmd)
99
+ else:
100
+ _debug(' '.join(cmd))
101
+
102
+ import subprocess
103
+ returncode = subprocess.call(cmd, shell=shell)
104
+
105
+ if returncode:
106
+ sys.exit(returncode)
107
+
108
+
109
+ def clink(basename):
110
+ runcmd([LINKCC, '-o', basename + EXE_EXT, basename+'.o', '-L'+LIBDIR1, '-L'+LIBDIR2]
111
+ + [PYLIB_DYN and ('-l'+PYLIB_DYN) or os.path.join(LIBDIR1, PYLIB)]
112
+ + LIBS.split() + SYSLIBS.split() + LINKFORSHARED.split())
113
+
114
+
115
+ def ccompile(basename):
116
+ runcmd([CC, '-c', '-o', basename+'.o', basename+'.c', '-I' + INCDIR] + CFLAGS.split())
117
+
118
+
119
+ def cycompile(input_file, options=()):
120
+ from ..Compiler import Version, CmdLine, Main
121
+ options, sources = CmdLine.parse_command_line(list(options or ()) + ['--embed', input_file])
122
+ _debug('Using Cython %s to compile %s', Version.version, input_file)
123
+ result = Main.compile(sources, options)
124
+ if result.num_errors > 0:
125
+ sys.exit(1)
126
+
127
+
128
+ def exec_file(program_name, args=()):
129
+ runcmd([os.path.abspath(program_name)] + list(args), shell=False)
130
+
131
+
132
+ def build(input_file, compiler_args=(), force=False):
133
+ """
134
+ Build an executable program from a Cython module.
135
+
136
+ Returns the name of the executable file.
137
+ """
138
+ basename = os.path.splitext(input_file)[0]
139
+ exe_file = basename + EXE_EXT
140
+ if not force and os.path.abspath(exe_file) == os.path.abspath(input_file):
141
+ raise ValueError("Input and output file names are the same, refusing to overwrite")
142
+ if (not force and os.path.exists(exe_file) and os.path.exists(input_file)
143
+ and os.path.getmtime(input_file) <= os.path.getmtime(exe_file)):
144
+ _debug("File is up to date, not regenerating %s", exe_file)
145
+ return exe_file
146
+ cycompile(input_file, compiler_args)
147
+ ccompile(basename)
148
+ clink(basename)
149
+ return exe_file
150
+
151
+
152
+ def build_and_run(args):
153
+ """
154
+ Build an executable program from a Cython module and run it.
155
+
156
+ Arguments after the module name will be passed verbatimly to the program.
157
+ """
158
+ program_name, args = _build(args)
159
+ exec_file(program_name, args)
160
+
161
+
162
+ def _build(args):
163
+ input_file, cy_args, args = _parse_args(args)
164
+ program_name = build(input_file, cy_args)
165
+ return program_name, args
166
+
167
+
168
+ if __name__ == '__main__':
169
+ _build(sys.argv[1:])
Cython/Build/Cache.py ADDED
@@ -0,0 +1,199 @@
1
+ from dataclasses import dataclass
2
+ import sys
3
+ import os
4
+ import hashlib
5
+ import shutil
6
+ import subprocess
7
+ from ..Utils import safe_makedirs, cached_function
8
+ import zipfile
9
+ from .. import __version__
10
+
11
+ try:
12
+ import zlib
13
+
14
+ zipfile_compression_mode = zipfile.ZIP_DEFLATED
15
+ except ImportError:
16
+ zipfile_compression_mode = zipfile.ZIP_STORED
17
+
18
+ try:
19
+ import gzip
20
+
21
+ gzip_open = gzip.open
22
+ gzip_ext = ".gz"
23
+ except ImportError:
24
+ gzip_open = open
25
+ gzip_ext = ""
26
+
27
+ zip_ext = ".zip"
28
+
29
+ MAX_CACHE_SIZE = 1024 * 1024 * 100
30
+
31
+ join_path = cached_function(os.path.join)
32
+
33
+
34
+ @cached_function
35
+ def file_hash(filename):
36
+ path = os.path.normpath(filename)
37
+ prefix = ("%d:%s" % (len(path), path)).encode("UTF-8")
38
+ m = hashlib.sha256(prefix)
39
+ with open(path, "rb") as f:
40
+ data = f.read(65000)
41
+ while data:
42
+ m.update(data)
43
+ data = f.read(65000)
44
+ return m.hexdigest()
45
+
46
+
47
+ @cached_function
48
+ def get_cython_cache_dir():
49
+ r"""
50
+ Return the base directory containing Cython's caches.
51
+
52
+ Priority:
53
+
54
+ 1. CYTHON_CACHE_DIR
55
+ 2. (OS X): ~/Library/Caches/Cython
56
+ (posix not OS X): XDG_CACHE_HOME/cython if XDG_CACHE_HOME defined
57
+ 3. ~/.cython
58
+
59
+ """
60
+ if "CYTHON_CACHE_DIR" in os.environ:
61
+ return os.environ["CYTHON_CACHE_DIR"]
62
+
63
+ parent = None
64
+ if os.name == "posix":
65
+ if sys.platform == "darwin":
66
+ parent = os.path.expanduser("~/Library/Caches")
67
+ else:
68
+ # this could fallback on ~/.cache
69
+ parent = os.environ.get("XDG_CACHE_HOME")
70
+
71
+ if parent and os.path.isdir(parent):
72
+ return join_path(parent, "cython")
73
+
74
+ # last fallback: ~/.cython
75
+ return os.path.expanduser(join_path("~", ".cython"))
76
+
77
+
78
+ @dataclass
79
+ class FingerprintFlags:
80
+ language: str = "c"
81
+ py_limited_api: bool = False
82
+ np_pythran: bool = False
83
+
84
+ def get_fingerprint(self):
85
+ return str((self.language, self.py_limited_api, self.np_pythran))
86
+
87
+
88
+ class Cache:
89
+ def __init__(self, path, cache_size=None):
90
+ if path is None:
91
+ self.path = join_path(get_cython_cache_dir(), "compiler")
92
+ else:
93
+ self.path = path
94
+ self.cache_size = cache_size if cache_size is not None else MAX_CACHE_SIZE
95
+ if not os.path.exists(self.path):
96
+ os.makedirs(self.path)
97
+
98
+ def transitive_fingerprint(
99
+ self, filename, dependencies, compilation_options, flags=FingerprintFlags()
100
+ ):
101
+ r"""
102
+ Return a fingerprint of a cython file that is about to be cythonized.
103
+
104
+ Fingerprints are looked up in future compilations. If the fingerprint
105
+ is found, the cythonization can be skipped. The fingerprint must
106
+ incorporate everything that has an influence on the generated code.
107
+ """
108
+ try:
109
+ m = hashlib.sha256(__version__.encode("UTF-8"))
110
+ m.update(file_hash(filename).encode("UTF-8"))
111
+ for x in sorted(dependencies):
112
+ if os.path.splitext(x)[1] not in (".c", ".cpp", ".h"):
113
+ m.update(file_hash(x).encode("UTF-8"))
114
+ # Include the module attributes that change the compilation result
115
+ # in the fingerprint. We do not iterate over module.__dict__ and
116
+ # include almost everything here as users might extend Extension
117
+ # with arbitrary (random) attributes that would lead to cache
118
+ # misses.
119
+ m.update(flags.get_fingerprint().encode("UTF-8"))
120
+ m.update(compilation_options.get_fingerprint().encode("UTF-8"))
121
+ return m.hexdigest()
122
+ except OSError:
123
+ return None
124
+
125
+ def fingerprint_file(self, cfile, fingerprint, ext):
126
+ return (
127
+ join_path(self.path, "%s-%s" % (os.path.basename(cfile), fingerprint)) + ext
128
+ )
129
+
130
+ def lookup_cache(self, c_file, fingerprint):
131
+ # Cython-generated c files are highly compressible.
132
+ # (E.g. a compression ratio of about 10 for Sage).
133
+ if not os.path.exists(self.path):
134
+ safe_makedirs(self.path)
135
+ gz_fingerprint_file = self.fingerprint_file(c_file, fingerprint, gzip_ext)
136
+ if os.path.exists(gz_fingerprint_file):
137
+ return gz_fingerprint_file
138
+ zip_fingerprint_file = self.fingerprint_file(c_file, fingerprint, zip_ext)
139
+ if os.path.exists(zip_fingerprint_file):
140
+ return zip_fingerprint_file
141
+ return None
142
+
143
+ def load_from_cache(self, c_file, cached):
144
+ ext = os.path.splitext(cached)[1]
145
+ if ext == gzip_ext:
146
+ os.utime(cached, None)
147
+ with gzip_open(cached, "rb") as g:
148
+ with open(c_file, "wb") as f:
149
+ shutil.copyfileobj(g, f)
150
+ elif ext == zip_ext:
151
+ os.utime(cached, None)
152
+ dirname = os.path.dirname(c_file)
153
+ with zipfile.ZipFile(cached) as z:
154
+ for artifact in z.namelist():
155
+ z.extract(artifact, join_path(dirname, artifact))
156
+ else:
157
+ raise ValueError(f"Unsupported cache file extension: {ext}")
158
+
159
+ def store_to_cache(self, c_file, fingerprint, compilation_result):
160
+ artifacts = compilation_result.get_generated_source_files()
161
+ if len(artifacts) == 1:
162
+ fingerprint_file = self.fingerprint_file(c_file, fingerprint, gzip_ext)
163
+ with open(c_file, "rb") as f:
164
+ with gzip_open(fingerprint_file + ".tmp", "wb") as g:
165
+ shutil.copyfileobj(f, g)
166
+ else:
167
+ fingerprint_file = self.fingerprint_file(c_file, fingerprint, zip_ext)
168
+ with zipfile.ZipFile(
169
+ fingerprint_file + ".tmp", "w", zipfile_compression_mode
170
+ ) as zip:
171
+ for artifact in artifacts:
172
+ zip.write(artifact, os.path.basename(artifact))
173
+ os.rename(fingerprint_file + ".tmp", fingerprint_file)
174
+
175
+ def cleanup_cache(self, ratio=0.85):
176
+ try:
177
+ completed_process = subprocess.run(
178
+ ["du", "-s", "-k", os.path.abspath(self.path)], stdout=subprocess.PIPE
179
+ )
180
+ stdout = completed_process.stdout
181
+ if completed_process.returncode == 0:
182
+ total_size = 1024 * int(stdout.strip().split()[0])
183
+ if total_size < self.cache_size:
184
+ return
185
+ except (OSError, ValueError):
186
+ pass
187
+ total_size = 0
188
+ all = []
189
+ for file in os.listdir(self.path):
190
+ path = join_path(self.path, file)
191
+ s = os.stat(path)
192
+ total_size += s.st_size
193
+ all.append((s.st_atime, s.st_size, path))
194
+ if total_size > self.cache_size:
195
+ for time, size, file in reversed(sorted(all)):
196
+ os.unlink(file)
197
+ total_size -= size
198
+ if total_size < self.cache_size * ratio:
199
+ break