)]}'
{
  "commit": "cdfa93ea7994cfcb1f45e579efb645fb65b84cd4",
  "tree": "62ed967d28623cf97714c80cb948aab555a8ce7c",
  "parents": [
    "3b48bf81263526f28a41f07176859397033c2160"
  ],
  "author": {
    "name": "Nicholas Junge",
    "email": "nicholas.junge@web.de",
    "time": "Sun Sep 21 21:27:56 2025 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Sep 21 19:27:56 2025 +0000"
  },
  "message": "feat(toolchains): ABI3 Python headers target (#3274)\n\nUntil now, we silently link extensions with both stable and unstable ABI\nlibs,\nwith the latter taking precedence in symbol resolution, because it\nappears first\nin the linker command AND, crucially, contains all CPython symbols\npresent in\nthe stable ABI library, thus overriding them. This has the effect that\nstable\nABI extensions on Windows are usable only with the Python distribution\nthat they\nwere built on.\n\nTo fix, a separate ABI3 header target is introduced, and should be used\nfor C++\nextensions on Windows if stable ABI builds are requested.\n\nIdea as formulated by `@dgrunwald-qt` in\nhttps://github.com/nicholasjng/nanobind-bazel/issues/72#issuecomment-3249959583.\n\nThis is motivated by\nhttps://github.com/nicholasjng/nanobind-bazel/issues/72.\n\nThis change shifts stable ABI selection on Windows to the extension\ndeveloper, where\nit has arguably always been (they had to set the `Py_LIMITED_API`\nmacro).\n\nAn upside of this approach is that with a separate target, the question\n\"stable ABI\nor not\" can be decided on an extension-by-extension basis, giving\nmaximum flexibility\nto developers. This should not influence the wheel platform target,\nbecause a wheel\nis marked ABI3 if and only if all of its extensions are marked as ABI3.\n\n---------\n\nCo-authored-by: Richard Levasseur \u003crlevasseur@google.com\u003e\nCo-authored-by: Richard Levasseur \u003crichardlev@gmail.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3d5219c2bca5578854c34af4f3bee2361a7c7cbd",
      "old_mode": 33188,
      "old_path": "AGENTS.md",
      "new_id": "671b85c6bde74ea6e94643111ff8b483a9225989",
      "new_mode": 33188,
      "new_path": "AGENTS.md"
    },
    {
      "type": "modify",
      "old_id": "7e5598afcf6fb0db1f04391a0f164e966e2d5170",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "02f1df6ae0798e9ce9e8e936a7bbf5e34aec78e7",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "82c59343beb8a2a157b13601e8a6e1e0eb8c0baa",
      "old_mode": 33188,
      "old_path": "docs/api/rules_python/python/cc/index.md",
      "new_id": "2f4e3ae17153383024959de144fe51d9b2e69289",
      "new_mode": 33188,
      "new_path": "docs/api/rules_python/python/cc/index.md"
    },
    {
      "type": "modify",
      "old_id": "f830febc8129be09bf0574124c6e3b8805180d00",
      "old_mode": 33188,
      "old_path": "docs/howto/python-headers.md",
      "new_id": "fa8c2cece5bfde7c65378b7586631e568051a36e",
      "new_mode": 33188,
      "new_path": "docs/howto/python-headers.md"
    },
    {
      "type": "modify",
      "old_id": "2bcb31bfc24a58f1159ddd36bc6c7507fb293f28",
      "old_mode": 33188,
      "old_path": "docs/pyproject.toml",
      "new_id": "9a089df59cb3a36e085d10e08b91b493d97dd738",
      "new_mode": 33188,
      "new_path": "docs/pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "cda477cd9b171abb0b4d742ac56b77284ef7775e",
      "old_mode": 33188,
      "old_path": "docs/requirements.txt",
      "new_id": "5929e737858162b751c51eda4965dc7353a8a7b0",
      "new_mode": 33188,
      "new_path": "docs/requirements.txt"
    },
    {
      "type": "modify",
      "old_id": "f4e4aeb00f1f2ad22dbe07d065ed971191b2cb51",
      "old_mode": 33188,
      "old_path": "python/cc/BUILD.bazel",
      "new_id": "f7686c41f600f48449c3df851a0b8252695216f2",
      "new_mode": 33188,
      "new_path": "python/cc/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "e3d1ffdf61a965f018a780a54778577b8d92be5e",
      "old_mode": 33188,
      "old_path": "python/features.bzl",
      "new_id": "21ff588dca309ebabd0a79dcc1318fdc98e56fb6",
      "new_mode": 33188,
      "new_path": "python/features.bzl"
    },
    {
      "type": "modify",
      "old_id": "5e2043c0c57264d07295f101828bf434c3b01afb",
      "old_mode": 33188,
      "old_path": "python/private/BUILD.bazel",
      "new_id": "0c8ccdea994f0ae8a70d565627de67658255102f",
      "new_mode": 33188,
      "new_path": "python/private/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8f4fb468a4a492211cfe64965757f8f034458e8f",
      "new_mode": 33188,
      "new_path": "python/private/cc/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "217904c22ff769c40064c6f33ec604025d138403",
      "old_mode": 33188,
      "old_path": "python/private/current_py_cc_headers.bzl",
      "new_id": "ef646317a6c723238e3d0669a4c152700707cbc7",
      "new_mode": 33188,
      "new_path": "python/private/current_py_cc_headers.bzl"
    },
    {
      "type": "modify",
      "old_id": "a35cd6bae32f0307526a849fa17e727b6e0b794a",
      "old_mode": 33188,
      "old_path": "python/private/hermetic_runtime_repo_setup.bzl",
      "new_id": "a35ce8ae7dafcb33602732e2290fe0002b51a5b4",
      "new_mode": 33188,
      "new_path": "python/private/hermetic_runtime_repo_setup.bzl"
    },
    {
      "type": "modify",
      "old_id": "5d3a781152c7914542e43be6eebad3af1abf6ff7",
      "old_mode": 33188,
      "old_path": "python/private/local_runtime_repo_setup.bzl",
      "new_id": "6cff1aea437ed3de2dd84321aa0e61af42f20ed7",
      "new_mode": 33188,
      "new_path": "python/private/local_runtime_repo_setup.bzl"
    },
    {
      "type": "modify",
      "old_id": "c5cdbd9d849bd77f69fb84a6ff005d5fcf6bee1c",
      "old_mode": 33188,
      "old_path": "python/private/py_cc_toolchain_info.bzl",
      "new_id": "8cb3680b59d0e8eb34a99fbd4efa1f8163af5f58",
      "new_mode": 33188,
      "new_path": "python/private/py_cc_toolchain_info.bzl"
    },
    {
      "type": "modify",
      "old_id": "8adf73c25f2493022bc83516860abfedd4071f88",
      "old_mode": 33188,
      "old_path": "python/private/py_cc_toolchain_rule.bzl",
      "new_id": "b5c997ea6e32d7a6c7f9f1d93772868105ef3fda",
      "new_mode": 33188,
      "new_path": "python/private/py_cc_toolchain_rule.bzl"
    },
    {
      "type": "modify",
      "old_id": "1956ad5e95e5f0a9d3c17313ac3382c9faad5693",
      "old_mode": 33188,
      "old_path": "python/private/runtime_env_toolchain.bzl",
      "new_id": "de74900750666858c00dffd2287150522db3be89",
      "new_mode": 33188,
      "new_path": "python/private/runtime_env_toolchain.bzl"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3883e23638c53cda2aab1f59216d233f8a5288a6",
      "new_mode": 33188,
      "new_path": "python/private/visibility.bzl"
    },
    {
      "type": "modify",
      "old_id": "e2d6a1b521beabdbe72b4cade3aee8eae5eb8a15",
      "old_mode": 33188,
      "old_path": "tests/cc/current_py_cc_headers/BUILD.bazel",
      "new_id": "21723b59c4b7767adef5b35b6cdd838958a961a0",
      "new_mode": 33188,
      "new_path": "tests/cc/current_py_cc_headers/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6c337653b1391282ff5d2fbf134fa2fb69368c61",
      "new_mode": 33188,
      "new_path": "tests/cc/current_py_cc_headers/abi3_headers_linkage_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0211dbbfc66d3e8566132ebd7ff13dc6795f991d",
      "new_mode": 33188,
      "new_path": "tests/cc/current_py_cc_headers/bin_abi3.cc"
    },
    {
      "type": "modify",
      "old_id": "818f7ff092e78ec2234926559eeb43c22158e66d",
      "old_mode": 33188,
      "old_path": "tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl",
      "new_id": "f52d93e75f8d1cfebcae181e41e62d5311836f22",
      "new_mode": 33188,
      "new_path": "tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl"
    },
    {
      "type": "modify",
      "old_id": "9269553a3f74128957f78e8fb60e6a595551163a",
      "old_mode": 33188,
      "old_path": "tests/cc/current_py_cc_libs/BUILD.bazel",
      "new_id": "6b4e80fc6a9e98979f91fba40239940052646144",
      "new_mode": 33188,
      "new_path": "tests/cc/current_py_cc_libs/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "ba8e089cbb2c599e102228841fe8e4a6040058d3",
      "old_mode": 33188,
      "old_path": "tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl",
      "new_id": "975f0d56b522d8c366690e6388120115b2be1658",
      "new_mode": 33188,
      "new_path": "tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl"
    },
    {
      "type": "modify",
      "old_id": "afa88dc8368fbb457a96d495c8166ed11d06729e",
      "old_mode": 33188,
      "old_path": "tests/support/cc_toolchains/BUILD.bazel",
      "new_id": "1c1a714626662e522b3ff68dcbb0f32738a46226",
      "new_mode": 33188,
      "new_path": "tests/support/cc_toolchains/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "tests/support/cc_toolchains/py_abi3_header.h"
    },
    {
      "type": "modify",
      "old_id": "4d3647c53e3671516ae1da18a0bdd7e87a5c6d9e",
      "old_mode": 33188,
      "old_path": "tests/support/py_cc_toolchain_info_subject.bzl",
      "new_id": "3820e04e900693365235d9391e2a273466930176",
      "new_mode": 33188,
      "new_path": "tests/support/py_cc_toolchain_info_subject.bzl"
    }
  ]
}
