The embedded 40250 script layer needs its own interpreter on five platforms. 2.7 is end-of-life, so nothing can be fetched from the target SDKs and the source is vendored (official 2.7.18 tarball, trimmed to 25MB; Lib/ stays for step 3's python27.zip). cpython-2.7.18/CMakeLists.txt builds one `mtpython` static library from exactly the 133 objects the reference libpython2.7.a contains, off by default behind -DMTGODOT_EMBED_PYTHON=ON. The source list and the built-in module table (config/config.c, 39 entries) are shared; pyconfig.h is a probe result and is not, so each platform keeps its own under config/<platform>/, regenerated by tools/py_embed/gen_pyconfig.sh and checked against the shared table. Three vendor patches, documented in docs/THIRD-PARTY.md: configure/configure.ac learn arm64 on macOS, and posixmodule.c undefines the process-control calls it hard-defines past pyconfig.h when building for iOS. macOS (ctest python.embed: every builtin imports, codecs and pickle work off the vendored Lib/), Android arm64 and iOS arm64 build. Linux needs a Linux host and Windows needs a MinGW-vs-MSVC decision; both are noted for step 4. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
80 lines
1.5 KiB
C
80 lines
1.5 KiB
C
#include "Python.h"
|
|
|
|
#ifdef X87_DOUBLE_ROUNDING
|
|
/* On x86 platforms using an x87 FPU, this function is called from the
|
|
Py_FORCE_DOUBLE macro (defined in pymath.h) to force a floating-point
|
|
number out of an 80-bit x87 FPU register and into a 64-bit memory location,
|
|
thus rounding from extended precision to double precision. */
|
|
double _Py_force_double(double x)
|
|
{
|
|
volatile double y;
|
|
y = x;
|
|
return y;
|
|
}
|
|
#endif
|
|
|
|
#ifdef HAVE_GCC_ASM_FOR_X87
|
|
|
|
/* inline assembly for getting and setting the 387 FPU control word on
|
|
gcc/x86 */
|
|
|
|
unsigned short _Py_get_387controlword(void) {
|
|
unsigned short cw;
|
|
__asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
|
|
return cw;
|
|
}
|
|
|
|
void _Py_set_387controlword(unsigned short cw) {
|
|
__asm__ __volatile__ ("fldcw %0" : : "m" (cw));
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
#ifndef HAVE_HYPOT
|
|
double hypot(double x, double y)
|
|
{
|
|
double yx;
|
|
|
|
x = fabs(x);
|
|
y = fabs(y);
|
|
if (x < y) {
|
|
double temp = x;
|
|
x = y;
|
|
y = temp;
|
|
}
|
|
if (x == 0.)
|
|
return 0.;
|
|
else {
|
|
yx = y/x;
|
|
return x*sqrt(1.+yx*yx);
|
|
}
|
|
}
|
|
#endif /* HAVE_HYPOT */
|
|
|
|
#ifndef HAVE_COPYSIGN
|
|
double
|
|
copysign(double x, double y)
|
|
{
|
|
/* use atan2 to distinguish -0. from 0. */
|
|
if (y > 0. || (y == 0. && atan2(y, -1.) > 0.)) {
|
|
return fabs(x);
|
|
} else {
|
|
return -fabs(x);
|
|
}
|
|
}
|
|
#endif /* HAVE_COPYSIGN */
|
|
|
|
#ifndef HAVE_ROUND
|
|
double
|
|
round(double x)
|
|
{
|
|
double absx, y;
|
|
absx = fabs(x);
|
|
y = floor(absx);
|
|
if (absx - y >= 0.5)
|
|
y += 1.0;
|
|
return copysign(y, x);
|
|
}
|
|
#endif /* HAVE_ROUND */
|