Conversation
<details><summary>Claude's draft</summary> Replace the GPL-licensed GNU readline host/build dependency with the BSD-licensed NetBSD libedit (conda-forge `libedit`) on unix, and pass `--with-readline=editline` to configure so CPython's readline module uses its libedit backend (editline/readline.h, -ledit). The test now asserts `readline.backend == "editline"` so a silent configure fallback (to GNU readline or to no readline module) fails the build instead of passing unnoticed. Resume this Claude session: ``` cd /home/mark/git/feedstock/python-feedstock claude --resume 6596da16-c7f8-423a-8123-3dde1ed72ef3 ``` </details>
…2026.09.22.09.39.50 Other tools: - conda-build 26.7.1 - rattler-build 0.75.0 - rattler-build-conda-compat 1.4.18
Contributor
|
Hi! This is the friendly automated conda-forge-linting service. I just wanted to let you know that I linted all conda-recipes in your PR ( I do have some suggestions for making it better though... For recipe/meta.yaml:
This message was generated by GitHub Actions workflow run https://github.com/conda-forge/conda-forge-webservices/actions/runs/35782722216. Examine the logs at this URL for more detail. |
conda-forge-admin
pushed a commit
to conda-forge/conda-forge-pinning-feedstock
that referenced
this pull request
Sep 22, 2026
<details><summary>Claude's draft</summary> libedit had no global pin, so each feedstock built against whatever libedit version was latest at build time. Pin it to '3.1', matching the x.x upper bound in libedit's run_exports (the date component changes on every release without an ABI break; soname has stayed libedit.so.0). This gives consistent host versions across feedstocks and a place to start a migration if a 3.2 / soname bump ever happens. No migration is needed now since all existing builds are 3.1. Motivated by conda-forge/python-feedstock#936, which switches python's readline module from GNU readline to libedit. Resume this Claude session: ``` cd /home/mark/git/feedstock/python-feedstock claude --resume 6596da16-c7f8-423a-8123-3dde1ed72ef3 ``` </details>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I would really love to revive this effort.
I don't think many of the original objections were right, and now that uv has shipped with libedit support, i feel like there is a strong precedence for this.
I'm waiting on conda-forge/libedit-feedstock#15 to mark this PR as ready for review
Claude's write-up
This depends on conda-forge/libedit-feedstock#15. conda-forge's current
libedit(3.1.20250104) re-sends signals withkill(0, signo), which signals the whole process group. With CPython on libedit, Ctrl-C then turns into an endlessKeyboardInterruptloop when python runs under another process such asuv run(astral-sh/uv#13919). #15 updates libedit to20260512, which callsraise(signo)instead. This PR stays in draft until that update is merged and published.Why reprioritize this now
#387 (open since 2020) asks for a way to use python without GPL-3 readline. Past discussion (#191, #192, #387, conda-forge/sqlite-feedstock#30) stalled because of concerns that libedit is "an incomplete readline clone". Since then, two major Python distributions have switched to libedit on Linux, not only macOS:
--with-readline=editlineunconditionally for python@3.11+ and depends on its own libedit on Linux (uses_from_macos "libedit", formula). The stated reason is licensing.Since 3.13 the default interactive REPL is
_pyrepl, which does its own line editing, history, completion and bracketed paste without readline or libedit (PEP 762). That reduces the user-visible risk.GNU readline has also caused problems of its own here: conda-forge/readline-feedstock#35 was conda's
libreadline.so.8shadowing the system copy and breaking the system/bin/sh. libedit's library islibedit.so.0, so it can't clash like that.Changes
recipe/meta.yaml:readline→libeditin host, and in build when cross-compiling (unix only).recipe/build_base.sh: add--with-readline=editline.recipe/run_test.py:assert readline.backend == "editline". Without it, a configure fallback to GNU readline or to no readline module would pass the tests.readlinepin drops out of.ci_support.libedithas no global pin, so itsrun_exports(>=3.1.x,<3.2) provides the bound.This uses NetBSD libedit (conda-forge
libedit,editline/readline.h,-ledit), which is what CPython's--with-readline=editlineexpects. It is not conda-forge'seditlinepackage, which is troglobit/editline. CPython doesn't support that one, and it lacks about 30 functionsModules/readline.cneeds.Local testing
linux_64_build_typereleasechannel_targetsconda-forge_mainfreethreadingnobuilt in docker withbuild-locally.py, against libedit20250104.checking how to link readline... edit.readline.cpython-315-x86_64-linux-gnu.solinkslibedit.so.0. Thepythonpackage depends onlibedit >=3.1.20250104,<3.2.0a0and no longer onreadline.Known behavior differences
These matter only when the readline backend is used:
PYTHON_BASIC_REPL, input that isn't a terminal,input(),pdb/cmd, thesqlite3CLI.~/.editrc, not~/.inputrc. Third-partyreadline.parse_and_bind("tab: complete")silently does nothing; the stdlib'ssite,cmd,pdbandsqlite3branch onreadline.backendand handle it._HiStOrY_V2_header,\040escapes). Existing GNU-format~/.python_historyfiles are unreadable in the basic REPL._pyreplreads both formats.set history-sizetest;get_begidx/get_endidxcount characters instead of bytes for non-ASCII input; Ctrl-C in Ctrl-R search needs three presses (CTRL+C/KeyboardInterrupt in editline not working properly on macOS REPL python/cpython#100610).TODO before leaving draft
20260512.readlinewithout declaring it need attention.