Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d930e12
pixi builds for free-threading and tsan
crusaderky Dec 17, 2025
57d45b9
Rename to tsan-free-threading
crusaderky Jan 2, 2026
5ff29b4
Add libclang_rt hack
crusaderky Jan 2, 2026
9a2a896
Add troubleshooting for tsan
crusaderky Jan 2, 2026
97979e0
Add python_abi output and refactor
isuruf Jan 8, 2026
456503b
fix typo
isuruf Jan 8, 2026
c46f283
Use single recipe.yaml duplicated across directories
isuruf Jan 9, 2026
d1a38c1
use symlinks
isuruf Jan 9, 2026
57715f5
remove generate.sh
isuruf Jan 9, 2026
8243c20
Merge remote-tracking branch 'origin/main' into tsan
crusaderky Jan 12, 2026
12da3b8
Fix
crusaderky Jan 14, 2026
bfa4da3
Merge remote-tracking branch 'upstream/main' into tsan
crusaderky Jan 14, 2026
1a4106f
Fix tsan
crusaderky Jan 14, 2026
2402f77
switch ABI tag for asan/tsan
crusaderky Jan 14, 2026
56f4403
git cleanup 1/2
crusaderky Jan 14, 2026
546dcc0
git cleanup 2/2
crusaderky Jan 14, 2026
cd4cd26
README
crusaderky Jan 15, 2026
f028ded
Merge remote-tracking branch 'upstream/main' into tsan
crusaderky Jan 15, 2026
a86d345
Use libcompiler-rt and remove hack
isuruf Jan 19, 2026
0aa5872
use at least macos 10.12
isuruf Jan 20, 2026
62b7d1c
Merge remote-tracking branch 'upstream/main' into tsan
crusaderky Jan 21, 2026
ad6c740
Use libcompiler-rt and remove hack
isuruf Jan 19, 2026
fd6ca6d
note
crusaderky Jan 21, 2026
abae5a5
Fix CPPFLAGS too
isuruf Jan 21, 2026
a3f59cc
Merge remote-tracking branch 'upstream/main' into tsan
crusaderky Jan 22, 2026
fd87e84
Merge remote-tracking branch 'upstream/main' into tsan
crusaderky Jan 22, 2026
2649286
Update Tools/pixi-packages/README.md
crusaderky Jan 22, 2026
0e98a4a
Update platforms
crusaderky Jan 22, 2026
4f49228
Merge remote-tracking branch 'isuruf/libcompiler-rt' into tsan
crusaderky Jan 22, 2026
7b8f9d3
Merge branch 'main' into tsan
crusaderky Jan 22, 2026
1ae77a5
Revert "Use libcompiler-rt and remove hack"
crusaderky Jan 22, 2026
cddc933
Revert "Update Tools/pixi-packages/README.md"
crusaderky Jan 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 35 additions & 12 deletions Tools/pixi-packages/README.md
Original file line number Diff line number Diff line change
@@ -1,36 +1,59 @@
# CPython Pixi packages

This directory contains definitions for [Pixi packages](https://pixi.sh/latest/reference/pixi_manifest/#the-package-section)
which can be built from the CPython source code.
This directory contains definitions for [Pixi
packages](https://pixi.sh/latest/reference/pixi_manifest/#the-package-section) which can
be built from the CPython source code.

Downstream developers can make use of these packages by adding them as Git dependencies in a
[Pixi workspace](https://pixi.sh/latest/first_workspace/), like:
Downstream developers can make use of these packages by adding them as Git dependencies
in a [Pixi workspace](https://pixi.sh/latest/first_workspace/), like:

```toml
[dependencies]
python = { git = "https://github.com/python/cpython", subdirectory = "Tools/pixi-packages/asan" }
python.git = "https://github.com/python/cpython"
python.subdirectory = "Tools/pixi-packages/asan"
```

This is particularly useful when developers need to build CPython from source
(for example, for an ASan-instrumented build), as it does not require any manual
(for example, for an ASan or TSan-instrumented build), as it does not require any manual
clone or build steps. Instead, Pixi will automatically handle both the build
and installation of the package.

Each package definition is contained in a subdirectory, but they share the build script
`build.sh` in this directory. Currently defined package variants:

- `default`
- `asan`: ASan-instrumented build with `PYTHON_ASAN=1`
- `freethreading`
- `asan`: ASan-instrumented build
- `tsan-freethreading`: TSan-instrumented free-threading build

## Maintenance

- Keep the `version` fields in each `recipe.yaml` up to date with the Python version
- Keep the dependency requirements up to date in each `recipe.yaml`
- Keep the `abi_tag` and `version` fields in each `variants.yaml` up to date with the
Python version
- Update `build.sh` for any breaking changes in the `configure` and `make` workflow

## Opportunities for future improvement

- More package variants (such as TSan, UBSan)
- More package variants (such as UBSan)
- Support for Windows
- Using a single `pixi.toml` and `recipe.yaml` for all package variants is blocked on https://github.com/prefix-dev/pixi/issues/4599
- A workaround can be removed from the build script once https://github.com/prefix-dev/rattler-build/issues/2012 is resolved
- Using a single `pixi.toml` and `recipe.yaml` for all package variants is blocked on
[pixi-build-backends#532](https://github.com/prefix-dev/pixi-build-backends/pull/532)
and [pixi#5248](https://github.com/prefix-dev/pixi/issues/5248)
- A workaround can be removed from the build script once
[rattler-build#2012](https://github.com/prefix-dev/rattler-build/issues/2012) is
resolved

## Troubleshooting

TSan builds may crash on Linux with
```
FATAL: ThreadSanitizer: unexpected memory mapping 0x7977bd072000-0x7977bd500000
```
To fix it, try reducing `mmap_rnd_bits`:

```bash
$ sudo sysctl vm.mmap_rnd_bits
vm.mmap_rnd_bits = 32 # too high for TSan
$ sudo sysctl vm.mmap_rnd_bits=28 # reduce it
vm.mmap_rnd_bits = 28
```
8 changes: 0 additions & 8 deletions Tools/pixi-packages/asan/pixi.toml

This file was deleted.

1 change: 1 addition & 0 deletions Tools/pixi-packages/asan/pixi.toml
63 changes: 0 additions & 63 deletions Tools/pixi-packages/asan/recipe.yaml

This file was deleted.

1 change: 1 addition & 0 deletions Tools/pixi-packages/asan/recipe.yaml
6 changes: 6 additions & 0 deletions Tools/pixi-packages/asan/variants.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
variant:
- asan
abi_tag:
- asan_cp315
version:
- 3.15
37 changes: 29 additions & 8 deletions Tools/pixi-packages/build.sh
Original file line number Diff line number Diff line change
@@ -1,17 +1,36 @@
#!/bin/bash

if [[ "${PYTHON_VARIANT}" == "asan" ]]; then
echo "BUILD TYPE: ASAN"
BUILD_DIR="../build_asan"
echo "PYTHON_VARIANT: ${PYTHON_VARIANT}"

if [[ "${PYTHON_VARIANT}" == "freethreading" ]]; then
CONFIGURE_EXTRA="--disable-gil"
elif [[ "${PYTHON_VARIANT}" == "asan" ]]; then
CONFIGURE_EXTRA="--with-address-sanitizer"
export PYTHON_ASAN="1"
export ASAN_OPTIONS="strict_init_order=true"
else
echo "BUILD TYPE: DEFAULT"
BUILD_DIR="../build"
elif [[ "${PYTHON_VARIANT}" == "tsan-freethreading" ]]; then
CONFIGURE_EXTRA="--disable-gil --with-thread-sanitizer"
export TSAN_OPTIONS="suppressions=${SRC_DIR}/Tools/tsan/suppressions_free_threading.txt"
elif [[ "${PYTHON_VARIANT}" == "default" ]]; then
CONFIGURE_EXTRA=""
else
echo "Unknown PYTHON_VARIANT: ${PYTHON_VARIANT}"
exit 1
fi

# rattler-build by default set a target of 10.9
# override it to at least 10.12
case ${MACOSX_DEPLOYMENT_TARGET:-10.12} in
10.12|10.13|10.14|10.15|10.16)
;;
10.*)
export CPPFLAGS=${CPPFLAGS/-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}/-mmacosx-version-min=10.12}
export MACOSX_DEPLOYMENT_TARGET=10.12
;;
*)
;;
esac

BUILD_DIR="../build_${PYTHON_VARIANT}"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"

Expand All @@ -23,6 +42,7 @@ else
--oldincludedir="${BUILD_PREFIX}/${HOST}/sysroot/usr/include" \
--enable-shared \
--srcdir="${SRC_DIR}" \
--with-system-expat \
${CONFIGURE_EXTRA}
fi

Expand All @@ -33,5 +53,6 @@ ln -sf "${PREFIX}/bin/python3" "${PREFIX}/bin/python"

# https://github.com/prefix-dev/rattler-build/issues/2012
if [[ ${OSTYPE} == "darwin"* ]]; then
cp "${BUILD_PREFIX}/lib/clang/21/lib/darwin/libclang_rt.asan_osx_dynamic.dylib" "${PREFIX}/lib/libclang_rt.asan_osx_dynamic.dylib"
cp "${BUILD_PREFIX}/lib/clang/21/lib/darwin/libclang_rt.asan_osx_dynamic.dylib" "${PREFIX}/lib/"
cp "${BUILD_PREFIX}/lib/clang/21/lib/darwin/libclang_rt.tsan_osx_dynamic.dylib" "${PREFIX}/lib/"
fi
2 changes: 1 addition & 1 deletion Tools/pixi-packages/default/pixi.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[workspace]
channels = ["https://prefix.dev/conda-forge"]
platforms = ["osx-arm64", "linux-64"]
platforms = ["linux-64", "linux-aarch64", "osx-64", "osx-arm64"]
preview = ["pixi-build"]

[package.build.backend]
Expand Down
119 changes: 73 additions & 46 deletions Tools/pixi-packages/default/recipe.yaml
Original file line number Diff line number Diff line change
@@ -1,59 +1,86 @@
context:
# Keep up to date
version: "3.15"
freethreading_tag: ${{ "t" if "freethreading" in variant else "" }}

package:
recipe:
name: python
version: ${{ version }}

source:
- path: ../../..

build:
files:
exclude:
- "*.o"
script:
file: ../build.sh
outputs:
- package:
name: python_abi
version: ${{ version }}
build:
string: "0_${{ abi_tag }}"
requirements:
run_constraints:
- python ${{ version }}.* *_${{ abi_tag }}

# derived from https://github.com/conda-forge/python-feedstock/blob/main/recipe/meta.yaml
requirements:
- package:
name: python
version: ${{ version }}
build:
- ${{ compiler('c') }}
- ${{ compiler('cxx') }}
- make
- pkg-config
# configure script looks for llvm-ar for lto
- if: osx
then:
- llvm-tools
- if: linux
then:
- ld_impl_${{ target_platform }}
- binutils_impl_${{ target_platform }}
- clang-19
- llvm-tools-19

host:
- bzip2
- sqlite
- liblzma-devel
- zlib
- zstd
- openssl
- readline
- tk
# These two are just to get the headers needed for tk.h, but is unused
- xorg-libx11
- xorg-xorgproto
- ncurses
- libffi
- if: linux
then:
- ld_impl_${{ target_platform }}
- libuuid
- libmpdec-devel
- expat
string: "0_${{ abi_tag }}"
files:
exclude:
- "*.o"
script:
file: ../build.sh
env:
PYTHON_VARIANT: ${{ variant }}
python:
site_packages_path: "lib/python${{ version }}${{ freethreading_tag }}/site-packages"

# derived from https://github.com/conda-forge/python-feedstock/blob/main/recipe/meta.yaml
requirements:
build:
- ${{ compiler('c') }}
- ${{ compiler('cxx') }}
# Note that we are not using stdlib arguments which means the packages
# are built for the build settings and are not relocatable to a different
# machine that has a older system version. (eg: macOS/glibc version)
- make
- pkg-config
# configure script looks for llvm-ar for lto
- if: osx
then:
- llvm-tools

host:
- bzip2
- sqlite
- liblzma-devel
- zlib
- zstd
- openssl
- readline
- tk
# These two are just to get the headers needed for tk.h, but is unused
- xorg-libx11
- xorg-xorgproto
- ncurses
- libffi
- if: linux
then:
- libuuid
- libmpdec-devel
- expat
- if: c_compiler == "gcc" and "san" in variant
then:
- libsanitizer

ignore_run_exports:
from_package:
- xorg-libx11
- xorg-xorgproto

run_exports:
noarch:
- python
weak:
- python_abi ${{ version }}.* *_${{ abi_tag }}

about:
homepage: https://www.python.org/
Expand Down
6 changes: 6 additions & 0 deletions Tools/pixi-packages/default/variants.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
variant:
- default
abi_tag:
- cp315
version:
- 3.15
1 change: 1 addition & 0 deletions Tools/pixi-packages/freethreading/pixi.toml
1 change: 1 addition & 0 deletions Tools/pixi-packages/freethreading/recipe.yaml
6 changes: 6 additions & 0 deletions Tools/pixi-packages/freethreading/variants.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
variant:
- freethreading
abi_tag:
- cp315t
version:
- 3.15
1 change: 1 addition & 0 deletions Tools/pixi-packages/tsan-freethreading/pixi.toml
1 change: 1 addition & 0 deletions Tools/pixi-packages/tsan-freethreading/recipe.yaml
6 changes: 6 additions & 0 deletions Tools/pixi-packages/tsan-freethreading/variants.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
variant:
- tsan-freethreading
abi_tag:
- tsan_cp315t
version:
- 3.15
Loading