From 96dbed6d66658863f1e1c4a9b91b6257fce0d00e Mon Sep 17 00:00:00 2001 From: Kyle Lacy Date: Tue, 28 Jan 2025 21:09:35 -0800 Subject: [PATCH] Update Python to support both v3.12 and v3.13 builds (#216) --- packages/python/brioche.lock | 4 ++ packages/python/project.bri | 71 ++++++++++++++++++++++++++++++------ 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/packages/python/brioche.lock b/packages/python/brioche.lock index 89784f6..0fa063c 100644 --- a/packages/python/brioche.lock +++ b/packages/python/brioche.lock @@ -1,6 +1,10 @@ { "dependencies": {}, "downloads": { + "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tar.xz": { + "type": "sha256", + "value": "c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e" + }, "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tar.xz": { "type": "sha256", "value": "9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9" diff --git a/packages/python/project.bri b/packages/python/project.bri index 816f156..068f878 100644 --- a/packages/python/project.bri +++ b/packages/python/project.bri @@ -6,15 +6,53 @@ import sqlite from "sqlite"; export const project = { name: "python", version: "3.13.1", + extra: { + currentMinorVersion: "3.13", + minorVersions: { + "3.13": "3.13.1", + "3.12": "3.12.8", + }, + }, }; -const source = Brioche.download( - `https://www.python.org/ftp/python/${project.version}/Python-${project.version}.tar.xz`, -) - .unarchive("tar", "xz") - .peel(); +std.assert( + project.extra.currentMinorVersion in project.extra.minorVersions, + "Python package extra.currentVersion not found in extra.minorVersions", +); +std.assert( + Object.keys(project.extra.minorVersions).some((minorVersion) => + project.version.startsWith(`${minorVersion}.`), + ), + "Python package version not found in extra.minorVersions", +); + +type PythonVersion = keyof typeof project.extra.minorVersions; + +const sources: { [version: string]: std.Recipe } = { + "3.12": Brioche.download( + `https://www.python.org/ftp/python/${project.extra.minorVersions["3.12"]}/Python-${project.extra.minorVersions["3.12"]}.tar.xz`, + ), + "3.13": Brioche.download( + `https://www.python.org/ftp/python/${project.version}/Python-${project.version}.tar.xz`, + ), +} satisfies Record>; + +interface PythonOptions { + version?: PythonVersion; +} + +export default async function python(options: PythonOptions = {}) { + const { version = project.extra.currentMinorVersion } = options; + + // Get the Python source for the selected version + const source = sources[version]?.unarchive("tar", "xz").peel(); + std.assert( + source != null, + `Expected Python version ${JSON.stringify( + version, + )} to be one of ${JSON.stringify(Object.keys(sources))}`, + ); -export default async function python() { let python = std.runBash` export LD_LIBRARY_PATH="$LIBRARY_PATH" export PATH="$BRIOCHE_OUTPUT/bin\${PATH:+:$PATH}" @@ -107,11 +145,22 @@ export default async function python() { } export function test() { - return std.runBash` - python --version | tee -a "$BRIOCHE_OUTPUT" - pip --version | tee -a "$BRIOCHE_OUTPUT" - python-config --cflags --libs --ldflags | tee -a "$BRIOCHE_OUTPUT" - `.dependencies(python()); + const pythonVersions = Object.keys( + project.extra.minorVersions, + ) as PythonVersion[]; + + const tests = pythonVersions.map((version) => { + return std.runBash` + mkdir "$BRIOCHE_OUTPUT" + python --version | tee "$BRIOCHE_OUTPUT/python-version.txt" + pip --version | tee "$BRIOCHE_OUTPUT/pip-version.txt" + python-config --cflags --libs --ldflags | tee "$BRIOCHE_OUTPUT/python-config.txt" + ` + .dependencies(python({ version })) + .toDirectory(); + }); + + return std.merge(...tests); } async function fixShebangs(