Cython 3.1.3__cp314-cp314-win_amd64.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 +323 -0
  4. Cython/Build/Dependencies.py +1315 -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 +76 -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 +811 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +326 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +948 -0
  24. Cython/Compiler/CmdLine.py +259 -0
  25. Cython/Compiler/Code.cp314-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +148 -0
  27. Cython/Compiler/Code.py +3375 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +187 -0
  30. Cython/Compiler/Dataclass.py +868 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +295 -0
  33. Cython/Compiler/ExprNodes.py +15295 -0
  34. Cython/Compiler/FlowControl.cp314-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +97 -0
  36. Cython/Compiler/FlowControl.py +1455 -0
  37. Cython/Compiler/FusedNode.cp314-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +1003 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +348 -0
  42. Cython/Compiler/LineTable.cp314-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +853 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +927 -0
  47. Cython/Compiler/ModuleNode.py +4039 -0
  48. Cython/Compiler/Naming.py +374 -0
  49. Cython/Compiler/Nodes.py +10822 -0
  50. Cython/Compiler/Optimize.py +5256 -0
  51. Cython/Compiler/Options.py +835 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4523 -0
  54. Cython/Compiler/Parsing.cp314-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4789 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5775 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp314-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +40 -0
  62. Cython/Compiler/Scanning.py +577 -0
  63. Cython/Compiler/StringEncoding.py +349 -0
  64. Cython/Compiler/Symtab.py +3072 -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 +86 -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 +33 -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 +584 -0
  86. Cython/Compiler/TypeSlots.py +1181 -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.cp314-win_amd64.pyd +0 -0
  92. Cython/Compiler/Visitor.pxd +53 -0
  93. Cython/Compiler/Visitor.py +861 -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 +174 -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 +67 -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 +84 -0
  177. Cython/Includes/libc/time.pxd +51 -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/deque.pxd +165 -0
  188. Cython/Includes/libcpp/exception.pxd +86 -0
  189. Cython/Includes/libcpp/execution.pxd +15 -0
  190. Cython/Includes/libcpp/forward_list.pxd +63 -0
  191. Cython/Includes/libcpp/functional.pxd +26 -0
  192. Cython/Includes/libcpp/future.pxd +103 -0
  193. Cython/Includes/libcpp/iterator.pxd +34 -0
  194. Cython/Includes/libcpp/latch.pxd +17 -0
  195. Cython/Includes/libcpp/limits.pxd +61 -0
  196. Cython/Includes/libcpp/list.pxd +117 -0
  197. Cython/Includes/libcpp/map.pxd +252 -0
  198. Cython/Includes/libcpp/memory.pxd +115 -0
  199. Cython/Includes/libcpp/mutex.pxd +130 -0
  200. Cython/Includes/libcpp/numbers.pxd +15 -0
  201. Cython/Includes/libcpp/numeric.pxd +131 -0
  202. Cython/Includes/libcpp/optional.pxd +34 -0
  203. Cython/Includes/libcpp/pair.pxd +1 -0
  204. Cython/Includes/libcpp/queue.pxd +25 -0
  205. Cython/Includes/libcpp/random.pxd +166 -0
  206. Cython/Includes/libcpp/semaphore.pxd +44 -0
  207. Cython/Includes/libcpp/set.pxd +228 -0
  208. Cython/Includes/libcpp/shared_mutex.pxd +72 -0
  209. Cython/Includes/libcpp/span.pxd +87 -0
  210. Cython/Includes/libcpp/stack.pxd +11 -0
  211. Cython/Includes/libcpp/stop_token.pxd +105 -0
  212. Cython/Includes/libcpp/string.pxd +355 -0
  213. Cython/Includes/libcpp/string_view.pxd +181 -0
  214. Cython/Includes/libcpp/typeindex.pxd +15 -0
  215. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  216. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  217. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  218. Cython/Includes/libcpp/utility.pxd +30 -0
  219. Cython/Includes/libcpp/vector.pxd +186 -0
  220. Cython/Includes/numpy/math.pxd +150 -0
  221. Cython/Includes/openmp.pxd +50 -0
  222. Cython/Includes/posix/__init__.pxd +1 -0
  223. Cython/Includes/posix/dlfcn.pxd +14 -0
  224. Cython/Includes/posix/fcntl.pxd +86 -0
  225. Cython/Includes/posix/ioctl.pxd +4 -0
  226. Cython/Includes/posix/mman.pxd +101 -0
  227. Cython/Includes/posix/resource.pxd +57 -0
  228. Cython/Includes/posix/select.pxd +21 -0
  229. Cython/Includes/posix/signal.pxd +73 -0
  230. Cython/Includes/posix/stat.pxd +98 -0
  231. Cython/Includes/posix/stdio.pxd +37 -0
  232. Cython/Includes/posix/stdlib.pxd +29 -0
  233. Cython/Includes/posix/strings.pxd +9 -0
  234. Cython/Includes/posix/time.pxd +71 -0
  235. Cython/Includes/posix/types.pxd +30 -0
  236. Cython/Includes/posix/uio.pxd +26 -0
  237. Cython/Includes/posix/unistd.pxd +271 -0
  238. Cython/Includes/posix/wait.pxd +38 -0
  239. Cython/Plex/Actions.cp314-win_amd64.pyd +0 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/DFA.cp314-win_amd64.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/Errors.py +48 -0
  246. Cython/Plex/Lexicons.py +178 -0
  247. Cython/Plex/Machines.cp314-win_amd64.pyd +0 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Regexps.py +539 -0
  251. Cython/Plex/Scanners.cp314-win_amd64.pyd +0 -0
  252. Cython/Plex/Scanners.pxd +46 -0
  253. Cython/Plex/Scanners.py +361 -0
  254. Cython/Plex/Transitions.cp314-win_amd64.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/__init__.py +34 -0
  258. Cython/Runtime/__init__.py +1 -0
  259. Cython/Runtime/refnanny.cp314-win_amd64.pyd +0 -0
  260. Cython/Runtime/refnanny.pyx +237 -0
  261. Cython/Shadow.py +690 -0
  262. Cython/Shadow.pyi +521 -0
  263. Cython/StringIOTree.cp314-win_amd64.pyd +0 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/Tempita/__init__.py +4 -0
  266. Cython/Tempita/_looper.py +154 -0
  267. Cython/Tempita/_tempita.cp314-win_amd64.pyd +0 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/TestUtils.py +410 -0
  270. Cython/Tests/TestCodeWriter.py +128 -0
  271. Cython/Tests/TestCythonUtils.py +202 -0
  272. Cython/Tests/TestJediTyper.py +223 -0
  273. Cython/Tests/TestShadow.py +114 -0
  274. Cython/Tests/TestStringIOTree.py +67 -0
  275. Cython/Tests/TestTestUtils.py +90 -0
  276. Cython/Tests/__init__.py +1 -0
  277. Cython/Tests/xmlrunner.py +390 -0
  278. Cython/Utility/AsyncGen.c +1005 -0
  279. Cython/Utility/Buffer.c +875 -0
  280. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  281. Cython/Utility/Builtins.c +776 -0
  282. Cython/Utility/CConvert.pyx +134 -0
  283. Cython/Utility/CMath.c +104 -0
  284. Cython/Utility/CommonStructures.c +201 -0
  285. Cython/Utility/Complex.c +378 -0
  286. Cython/Utility/Coroutine.c +2220 -0
  287. Cython/Utility/CpdefEnums.pyx +103 -0
  288. Cython/Utility/CppConvert.pyx +279 -0
  289. Cython/Utility/CppSupport.cpp +143 -0
  290. Cython/Utility/CythonFunction.c +1805 -0
  291. Cython/Utility/Dataclasses.c +185 -0
  292. Cython/Utility/Dataclasses.py +112 -0
  293. Cython/Utility/Embed.c +125 -0
  294. Cython/Utility/Exceptions.c +1012 -0
  295. Cython/Utility/ExtensionTypes.c +842 -0
  296. Cython/Utility/FunctionArguments.c +971 -0
  297. Cython/Utility/ImportExport.c +989 -0
  298. Cython/Utility/MemoryView.pxd +187 -0
  299. Cython/Utility/MemoryView.pyx +1481 -0
  300. Cython/Utility/MemoryView_C.c +889 -0
  301. Cython/Utility/ModuleSetupCode.c +3039 -0
  302. Cython/Utility/NumpyImportArray.c +46 -0
  303. Cython/Utility/ObjectHandling.c +3367 -0
  304. Cython/Utility/Optimize.c +1589 -0
  305. Cython/Utility/Overflow.c +412 -0
  306. Cython/Utility/Printing.c +86 -0
  307. Cython/Utility/Profile.c +721 -0
  308. Cython/Utility/StringTools.c +1277 -0
  309. Cython/Utility/Synchronization.c +355 -0
  310. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  311. Cython/Utility/TestCythonScope.pyx +75 -0
  312. Cython/Utility/TestUtilityLoader.c +12 -0
  313. Cython/Utility/TypeConversion.c +1286 -0
  314. Cython/Utility/UFuncs.pyx +50 -0
  315. Cython/Utility/UFuncs_C.c +89 -0
  316. Cython/Utility/__init__.py +28 -0
  317. Cython/Utility/arrayarray.h +148 -0
  318. Cython/Utils.cp314-win_amd64.pyd +0 -0
  319. Cython/Utils.py +687 -0
  320. Cython/__init__.py +10 -0
  321. Cython/__init__.pyi +7 -0
  322. Cython/py.typed +0 -0
  323. cython-3.1.3.dist-info/METADATA +111 -0
  324. cython-3.1.3.dist-info/RECORD +333 -0
  325. cython-3.1.3.dist-info/WHEEL +5 -0
  326. cython-3.1.3.dist-info/entry_points.txt +4 -0
  327. cython-3.1.3.dist-info/licenses/COPYING.txt +19 -0
  328. cython-3.1.3.dist-info/licenses/LICENSE.txt +176 -0
  329. cython-3.1.3.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
@@ -0,0 +1,323 @@
1
+ import os
2
+ import shutil
3
+ import tempfile
4
+ from collections import defaultdict
5
+
6
+ from .Dependencies import cythonize, extended_iglob
7
+ from ..Utils import is_package_dir
8
+ from ..Compiler import Options
9
+
10
+ try:
11
+ import multiprocessing
12
+ parallel_compiles = int(multiprocessing.cpu_count() * 1.5)
13
+ except ImportError:
14
+ multiprocessing = None
15
+ parallel_compiles = 0
16
+
17
+
18
+ class _FakePool:
19
+ def map_async(self, func, args):
20
+ for _ in map(func, args):
21
+ pass
22
+
23
+ def close(self):
24
+ pass
25
+
26
+ def terminate(self):
27
+ pass
28
+
29
+ def join(self):
30
+ pass
31
+
32
+
33
+ def find_package_base(path):
34
+ base_dir, package_path = os.path.split(path)
35
+ while is_package_dir(base_dir):
36
+ base_dir, parent = os.path.split(base_dir)
37
+ package_path = '%s/%s' % (parent, package_path)
38
+ return base_dir, package_path
39
+
40
+
41
+ def cython_compile(path_pattern, options) -> dict:
42
+ all_paths = map(os.path.abspath, extended_iglob(path_pattern))
43
+ ext_modules_by_basedir = _cython_compile_files(all_paths, options)
44
+ _build(list(ext_modules_by_basedir.items()), options.parallel)
45
+
46
+
47
+ def _cython_compile_files(all_paths, options) -> dict:
48
+ ext_modules_to_build = defaultdict(list)
49
+
50
+ for path in all_paths:
51
+ if options.build_inplace:
52
+ base_dir = path
53
+ while not os.path.isdir(base_dir) or is_package_dir(base_dir):
54
+ base_dir = os.path.dirname(base_dir)
55
+ else:
56
+ base_dir = None
57
+
58
+ if os.path.isdir(path):
59
+ # recursively compiling a package
60
+ paths = [os.path.join(path, '**', '*.{py,pyx}')]
61
+ else:
62
+ # assume it's a file(-like thing)
63
+ paths = [path]
64
+
65
+ ext_modules = cythonize(
66
+ paths,
67
+ nthreads=options.parallel,
68
+ exclude_failures=options.keep_going,
69
+ exclude=options.excludes,
70
+ compiler_directives=options.directives,
71
+ compile_time_env=options.compile_time_env,
72
+ force=options.force,
73
+ quiet=options.quiet,
74
+ depfile=options.depfile,
75
+ language=options.language,
76
+ **options.options)
77
+
78
+ if ext_modules and options.build:
79
+ ext_modules_to_build[base_dir].extend(ext_modules)
80
+
81
+ return dict(ext_modules_to_build)
82
+
83
+
84
+ def _build(ext_modules, parallel):
85
+ modcount = sum(len(modules) for _, modules in ext_modules)
86
+ if not modcount:
87
+ return
88
+ if modcount == 1 or parallel < 2:
89
+ run_distutils(ext_modules[0])
90
+ return
91
+
92
+ try:
93
+ pool = multiprocessing.Pool(parallel)
94
+ except OSError:
95
+ pool = _FakePool()
96
+ try:
97
+ pool.map_async(run_distutils, [
98
+ (base_dir, [ext]) for base_dir, modules in ext_modules for ext in modules])
99
+ except:
100
+ pool.terminate()
101
+ raise
102
+ else:
103
+ pool.close()
104
+ pool.join()
105
+
106
+
107
+ def run_distutils(args):
108
+ try:
109
+ from distutils.core import setup
110
+ except ImportError:
111
+ try:
112
+ from setuptools import setup
113
+ except ImportError:
114
+ raise ImportError("'distutils' is not available. Please install 'setuptools' for binary builds.")
115
+
116
+ base_dir, ext_modules = args
117
+ script_args = ['build_ext', '-i']
118
+ cwd = os.getcwd()
119
+ temp_dir = None
120
+ try:
121
+ if base_dir:
122
+ os.chdir(base_dir)
123
+ temp_dir = tempfile.mkdtemp(dir=base_dir)
124
+ script_args.extend(['--build-temp', temp_dir])
125
+ setup(
126
+ script_name='setup.py',
127
+ script_args=script_args,
128
+ ext_modules=ext_modules,
129
+ )
130
+ finally:
131
+ if base_dir:
132
+ os.chdir(cwd)
133
+ if temp_dir and os.path.isdir(temp_dir):
134
+ shutil.rmtree(temp_dir)
135
+
136
+
137
+ def benchmark(code, setup_code=None, import_module=None, directives=None):
138
+ from Cython.Build.Inline import cymeit
139
+
140
+ timings, number = cymeit(code, setup_code, import_module, directives, repeat=9)
141
+
142
+ # Based on 'timeit.main()' in CPython 3.13.
143
+ units = {"nsec": 1e-9, "usec": 1e-6, "msec": 1e-3, "sec": 1.0}
144
+ scales = [(scale, unit) for unit, scale in reversed(units.items())] # biggest first
145
+
146
+ def format_time(t):
147
+ for scale, unit in scales:
148
+ if t >= scale:
149
+ break
150
+ else:
151
+ raise RuntimeError("Timing is below nanoseconds: {t:f}")
152
+ return f"{t / scale :.3f} {unit}"
153
+
154
+ timings.sort()
155
+ assert len(timings) & 1 == 1 # odd number of timings, for median position
156
+ fastest, median, slowest = timings[0], timings[len(timings) // 2], timings[-1]
157
+
158
+ print(f"{number} loops, best of {len(timings)}: {format_time(fastest)} per loop (median: {format_time(median)})")
159
+
160
+ if slowest > fastest * 4:
161
+ print(
162
+ "The timings are likely unreliable. "
163
+ f"The worst time ({format_time(slowest)}) was more than four times "
164
+ f"slower than the best time ({format_time(fastest)}).")
165
+
166
+
167
+ def create_args_parser():
168
+ from argparse import ArgumentParser, RawDescriptionHelpFormatter
169
+ from ..Compiler.CmdLine import ParseDirectivesAction, ParseOptionsAction, ParseCompileTimeEnvAction
170
+
171
+ parser = ArgumentParser(
172
+ formatter_class=RawDescriptionHelpFormatter,
173
+ epilog="""\
174
+ Environment variables:
175
+ CYTHON_FORCE_REGEN: if set to 1, forces cythonize to regenerate the output files regardless
176
+ of modification times and changes.
177
+ CYTHON_CACHE_DIR: the base directory containing Cython's caches.
178
+ Environment variables accepted by setuptools are supported to configure the C compiler and build:
179
+ https://setuptools.pypa.io/en/latest/userguide/ext_modules.html#compiler-and-linker-options"""
180
+ )
181
+
182
+ parser.add_argument('-X', '--directive', metavar='NAME=VALUE,...',
183
+ dest='directives', default={}, type=str,
184
+ action=ParseDirectivesAction,
185
+ help='set a compiler directive')
186
+ parser.add_argument('-E', '--compile-time-env', metavar='NAME=VALUE,...',
187
+ dest='compile_time_env', default={}, type=str,
188
+ action=ParseCompileTimeEnvAction,
189
+ help='set a compile time environment variable')
190
+ parser.add_argument('-s', '--option', metavar='NAME=VALUE',
191
+ dest='options', default={}, type=str,
192
+ action=ParseOptionsAction,
193
+ help='set a cythonize option')
194
+ parser.add_argument('-2', dest='language_level', action='store_const', const=2, default=None,
195
+ help='use Python 2 syntax mode by default')
196
+ parser.add_argument('-3', dest='language_level', action='store_const', const=3,
197
+ help='use Python 3 syntax mode by default')
198
+ parser.add_argument('--3str', dest='language_level', action='store_const', const=3,
199
+ help='use Python 3 syntax mode by default (deprecated alias for -3)')
200
+ parser.add_argument('-+', '--cplus', dest='language', action='store_const', const='c++', default=None,
201
+ help='Compile as C++ rather than C')
202
+ parser.add_argument('-a', '--annotate', action='store_const', const='default', dest='annotate',
203
+ help='Produce a colorized HTML version of the source.')
204
+ parser.add_argument('--annotate-fullc', action='store_const', const='fullc', dest='annotate',
205
+ help='Produce a colorized HTML version of the source '
206
+ 'which includes entire generated C/C++-code.')
207
+ parser.add_argument('-x', '--exclude', metavar='PATTERN', dest='excludes',
208
+ action='append', default=[],
209
+ help='exclude certain file patterns from the compilation')
210
+
211
+ parser.add_argument('-b', '--build', dest='build', action='store_true', default=None,
212
+ help='build extension modules using distutils/setuptools')
213
+ parser.add_argument('-i', '--inplace', dest='build_inplace', action='store_true', default=None,
214
+ help='build extension modules in place using distutils/setuptools (implies -b)')
215
+
216
+ parser.add_argument('--timeit', dest='benchmark', metavar="CODESTRING", type=str, default=None,
217
+ help="build in place, then compile+run CODESTRING as benchmark in first module's namespace (implies -i)")
218
+ parser.add_argument('--setup', dest='benchmark_setup', metavar="CODESTRING", type=str, default=None,
219
+ help="use CODESTRING as pre-benchmark setup code for --bench")
220
+
221
+ parser.add_argument('-j', '--parallel', dest='parallel', metavar='N',
222
+ type=int, default=parallel_compiles,
223
+ help=f'run builds in N parallel jobs (default: {parallel_compiles or 1})')
224
+ parser.add_argument('-f', '--force', dest='force', action='store_true', default=None,
225
+ help='force recompilation')
226
+ parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', default=None,
227
+ help='be less verbose during compilation')
228
+
229
+ parser.add_argument('--lenient', dest='lenient', action='store_true', default=None,
230
+ help='increase Python compatibility by ignoring some compile time errors')
231
+ parser.add_argument('-k', '--keep-going', dest='keep_going', action='store_true', default=None,
232
+ help='compile as much as possible, ignore compilation failures')
233
+ parser.add_argument('--no-docstrings', dest='no_docstrings', action='store_true', default=None,
234
+ help='strip docstrings')
235
+ parser.add_argument('-M', '--depfile', action='store_true', help='produce depfiles for the sources')
236
+ parser.add_argument('sources', nargs='*')
237
+ return parser
238
+
239
+
240
+ def parse_args_raw(parser, args):
241
+ options, unknown = parser.parse_known_args(args)
242
+ sources = options.sources
243
+ # if positional arguments were interspersed
244
+ # some of them are in unknown
245
+ for option in unknown:
246
+ if option.startswith('-'):
247
+ parser.error("unknown option "+option)
248
+ else:
249
+ sources.append(option)
250
+ del options.sources
251
+ return (options, sources)
252
+
253
+
254
+ def parse_args(args):
255
+ parser = create_args_parser()
256
+ options, args = parse_args_raw(parser, args)
257
+
258
+ if options.benchmark is not None:
259
+ options.build_inplace = True
260
+ elif not args:
261
+ parser.error("no source files provided")
262
+
263
+ if options.build_inplace:
264
+ options.build = True
265
+ if multiprocessing is None:
266
+ options.parallel = 0
267
+ if options.language_level:
268
+ assert options.language_level in (2, 3, '3str')
269
+ options.options['language_level'] = options.language_level
270
+
271
+ if options.lenient:
272
+ # increase Python compatibility by ignoring compile time errors
273
+ Options.error_on_unknown_names = False
274
+ Options.error_on_uninitialized = False
275
+
276
+ if options.annotate:
277
+ Options.annotate = options.annotate
278
+
279
+ if options.no_docstrings:
280
+ Options.docstrings = False
281
+
282
+ return options, args
283
+
284
+
285
+ def main(args=None):
286
+ options, paths = parse_args(args)
287
+
288
+ all_paths = []
289
+ for path in paths:
290
+ expanded_path = [os.path.abspath(p) for p in extended_iglob(path)]
291
+ if not expanded_path:
292
+ import sys
293
+ print("{}: No such file or directory: '{}'".format(sys.argv[0], path), file=sys.stderr)
294
+ sys.exit(1)
295
+ all_paths.extend(expanded_path)
296
+
297
+ ext_modules_by_basedir = _cython_compile_files(all_paths, options)
298
+
299
+ if ext_modules_by_basedir and options.build:
300
+ _build(list(ext_modules_by_basedir.items()), options.parallel)
301
+
302
+ if options.benchmark is not None:
303
+ base_dir = import_module = None
304
+ if ext_modules_by_basedir:
305
+ base_dir, first_extensions = ext_modules_by_basedir.popitem()
306
+ if first_extensions:
307
+ import_module = first_extensions[0].name
308
+
309
+ import sys
310
+ if base_dir is not None:
311
+ sys.path.insert(0, base_dir)
312
+
313
+ benchmark(
314
+ options.benchmark, options.benchmark_setup,
315
+ import_module=import_module,
316
+ )
317
+
318
+ if base_dir is not None:
319
+ sys.path.remove(base_dir)
320
+
321
+
322
+ if __name__ == '__main__':
323
+ main()