Skip to content

cxx_python_extension references python_toolchain.extension_linker_flags, but system_python_toolchain does not define it #840

Open
@ArjunZ786

Description

Summary

When using the built-in cxx_python_extension rule and the default system_python_toolchain, Buck2 fails during analysis because the rule references a field (extension_linker_flags) that the standard Python toolchain does not define. This leads to a type error (NoneType vs. list) whenever cxx_python_extension tries to read extension_linker_flags.

Steps to reproduce

Create a minimal BUCK2 project with a simple cxx_python_extension target and the default “system” Python toolchain:


cxx_python_extension(
    name = "my_python_extension",
    module_name = "my_python_extension",
    srcs = ["my_extension.cpp"],
    headers = ["my_extension.h"],
    deps = [],
    visibility = ["PUBLIC"],
)

In toolchains//BUCK (or wherever the system python toolchain is declared), define:


system_python_toolchain(
    name = "python",
    # no ex
tension_linker_flags param, just the defaults
)

Run buck2 build //path/to:my_python_extension.
Observed behavior

Buck2 fails with an error similar to:

Value `None` of type `NoneType` does not match the type annotation `list` for argument `extra_link_flags`
--> prelude/python/cxx_python_extension.bzl:XXX
It points to python_toolchain.extension_linker_flags being None when cxx_python_extension tries to assign it to extra_link_flags.

If we try to fix this by passing extension_linker_flags = [] into system_python_toolchain, Buck2 immediately complains:

Found extension_linker_flags extra named parameter(s) for call to system_python_toolchain
indicating that system_python_toolchain does not accept or define that parameter.

Expected behavior

According to Buck2’s documentation, a simple cxx_python_extension target should “just work” out of the box with no special configuration. The rule’s reference to extension_linker_flags should either:

Be optional (and default to an empty list) if not defined in the Python toolchain, or
Be included as a recognized parameter in system_python_toolchain.
Additional context

Buck2 version: (please fill in or “latest stable at time of writing”).
Platform: e.g. Ubuntu 22.04, macOS 13.x, etc.
The mismatch between cxx_python_extension.bzl (which uses python_toolchain.extension_linker_flags) and system_python_toolchain (which does not define that field) breaks the default usage scenario.
Workarounds include creating a custom Python toolchain that defines extension_linker_flags, or patching cxx_python_extension to default to an empty list if the field is None.
Proposed fix

Option A: Update cxx_python_extension to handle None gracefully, e.g.:
extra_link_flags = python_toolchain.extension_linker_flags or []
Option B: Modify system_python_toolchain so it always provides (or allows specifying) extension_linker_flags, defaulting to [].
Option C: Remove or conditionally skip the code that references extension_linker_flags if it’s not set.
Thank you for taking a look at this!

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions