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.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +350 -0
- Cython/Build/Dependencies.py +1311 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +95 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3730 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +187 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15559 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4157 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10817 -0
- Cython/Compiler/Optimize.py +5293 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5857 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3070 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +144 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +21 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +591 -0
- Cython/Compiler/TypeSlots.py +1174 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +175 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +178 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +141 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +234 -0
- Cython/Includes/libc/time.pxd +52 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/condition_variable.pxd +322 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +387 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/numpy/math.pxd +150 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1039 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +210 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2308 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1836 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +926 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +915 -0
- Cython/Utility/ModuleSetupCode.c +3145 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1612 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +389 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0b1.dist-info/METADATA +292 -0
- cython-3.2.0b1.dist-info/RECORD +333 -0
- cython-3.2.0b1.dist-info/WHEEL +5 -0
- cython-3.2.0b1.dist-info/entry_points.txt +4 -0
- cython-3.2.0b1.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- 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
|