* Add Android to resource files * Add Android to miscellaneous places * Add Android documentation * Docs cleanups * Add Android platform module; implement top-level structure and target Python installation * Implement setup_env and build_wheel * lru-dict build working * Alter prefix in sysconfigdata file; fix various issues with FLAGS variables * Implement Android testing * Add type annotations to _cross_venv * Revert Python 3.8 to pip 25.0.1 * Make test-sources required on Android * Add Android integration tests * Test cleanups * Add test of all available Python versions * Update test-sources and test-command behavior to match iOS * Documentation cleanups * Replace Builder class with a set of global functions * Rename "env" to "build_env" * Remove Chaquopy repository from default pip command line * Move native_platform to platforms module * Fix parse_config_settings Co-authored-by: Joe Rickerby <joerick@mac.com> * Add unit tests for parse_config_settings and arch_synonym * Make `shell_prepared` arguments keyword-only, and add tests for the commands that use it * Replace `importlib.util.spec_from_file_location` with `runpy.run_path` * Use python-build-standalone * Update Android Python * Enable KVM in Linux CI * Move KVM code to test_android.py * Use Java 17 on Azure * Install emulator if necessary before running -accel-check * Free up additional disk space on Linux runners * Add sudo * Skip emulator tests on CI platforms that don't support it * Download Android Python from Maven Central * Free up more disk space on Linux runners * fix: minor fixups Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * Set sysconfig._BASE_PREFIX to support sysconfig.get_path("include") * Get ANDROID_API_LEVEL from the build environment, not cibuildwheel's own environment * Correct relative path of test-sources * Pass a CMake toolchain file to the build * Add "repair" step which adds libc++ to the wheel when necessary * Add missing needs_emulator decorator * Provide useful error message if ANDROID_HOME is not set * Remove use of HOST environment variable * Update to Python 3.15.5 * Fix PyLint warnings, clarify comment * Group common arguments into a dataclass * Handle environment variables containing newlines * Discourage the use of `pytest` test commands without `python -m` * Use single quotes in user-visible messages * Improve testing documentation * Pass wheel filename to `log.build_end` * In GitHub Actions example, skip Android tests on macOS * Correct relative paths in `patchelf --set-rpath` * Clarify `test-sources` docs * Update to Python 3.13.5+20250722.214220 --------- Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> Co-authored-by: Joe Rickerby <joerick@mac.com> Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
109 lines
2.4 KiB
Python
109 lines
2.4 KiB
Python
import jinja2
|
|
|
|
from .base import TestProject
|
|
|
|
SPAM_C_TEMPLATE = r"""
|
|
#include <Python.h>
|
|
|
|
{{ spam_c_top_level_add }}
|
|
|
|
static PyObject *
|
|
spam_filter(PyObject *self, PyObject *args)
|
|
{
|
|
const char *content;
|
|
int sts;
|
|
|
|
if (!PyArg_ParseTuple(args, "s", &content))
|
|
return NULL;
|
|
|
|
// Spam should not be allowed through the filter.
|
|
sts = strcmp(content, "spam") != 0;
|
|
|
|
{{ spam_c_function_add | indent(4) }}
|
|
|
|
return PyLong_FromLong(sts);
|
|
}
|
|
|
|
/* Module initialization */
|
|
static PyMethodDef module_methods[] = {
|
|
{"filter", (PyCFunction)spam_filter, METH_VARARGS,
|
|
"Execute a shell command."},
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
PyMODINIT_FUNC PyInit_spam(void)
|
|
{
|
|
static struct PyModuleDef moduledef = {
|
|
PyModuleDef_HEAD_INIT, "spam", "Example module", -1, module_methods,
|
|
};
|
|
return PyModule_Create(&moduledef);
|
|
}
|
|
"""
|
|
|
|
SETUP_PY_TEMPLATE = r"""
|
|
import os
|
|
import sys
|
|
|
|
from setuptools import setup, Extension
|
|
|
|
{{ setup_py_add }}
|
|
|
|
libraries = []
|
|
# Emscripten fails if you pass -lc...
|
|
# See: https://github.com/emscripten-core/emscripten/issues/16680
|
|
if sys.platform.startswith('linux') and "emscripten" not in os.environ.get("_PYTHON_HOST_PLATFORM", ""):
|
|
libraries.extend(['m', 'c'])
|
|
|
|
|
|
setup(
|
|
ext_modules=[Extension(
|
|
'spam',
|
|
sources=['spam.c'],
|
|
libraries=libraries,
|
|
{{ setup_py_extension_args_add | indent(8) }}
|
|
)],
|
|
{{ setup_py_setup_args_add | indent(4) }}
|
|
)
|
|
"""
|
|
|
|
SETUP_CFG_TEMPLATE = r"""
|
|
[metadata]
|
|
name = spam
|
|
version = 0.1.0
|
|
|
|
{{ setup_cfg_add }}
|
|
"""
|
|
|
|
|
|
def new_c_project(
|
|
*,
|
|
spam_c_top_level_add: str = "",
|
|
spam_c_function_add: str = "",
|
|
setup_py_add: str = "",
|
|
setup_py_extension_args_add: str = "",
|
|
setup_py_setup_args_add: str = "",
|
|
setup_cfg_add: str = "",
|
|
) -> TestProject:
|
|
project = TestProject()
|
|
|
|
project.files.update(
|
|
{
|
|
"spam.c": jinja2.Template(SPAM_C_TEMPLATE),
|
|
"setup.py": jinja2.Template(SETUP_PY_TEMPLATE),
|
|
"setup.cfg": jinja2.Template(SETUP_CFG_TEMPLATE),
|
|
}
|
|
)
|
|
|
|
project.template_context.update(
|
|
{
|
|
"spam_c_top_level_add": spam_c_top_level_add,
|
|
"spam_c_function_add": spam_c_function_add,
|
|
"setup_py_add": setup_py_add,
|
|
"setup_py_extension_args_add": setup_py_extension_args_add,
|
|
"setup_py_setup_args_add": setup_py_setup_args_add,
|
|
"setup_cfg_add": setup_cfg_add,
|
|
}
|
|
)
|
|
|
|
return project
|