Commit graph zephyr/scripts
Author SHA1 Message Date
Anas Nashif
d5df454fb7 scripts: footprint: remove unused check
Remove unused check relying on legacy test definition files.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2026-05-14 21:53:09 +02:00
Anas Nashif
3d9db5f676 twister: tests: adapt to unified test definition file
Rename test fixture files from test_sample.yaml to test_data.yaml and
update all references across twister unit and blackbox tests to use
test_data.yaml.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2026-05-14 21:53:09 +02:00
Anas Nashif
adff5801ea ci: twister: adapt script for unified tests.yaml file
Update the CI test plan script to search for all supported test
definition filenames (tests.yaml, tests.yml, sample.yaml, testcase.yaml)
when detecting affected tests.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2026-05-14 21:53:09 +02:00
Anas Nashif
d921867822 west: support test files named tests.yaml
Update `west build -T` help text and `_parse_test_item()` to search for
tests.yaml and tests.yml before falling back to the legacy sample.yaml
and testcase.yaml files.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2026-05-14 21:53:09 +02:00
Anas Nashif
900df338bf twister: support unified test definition file
Now use tests.yaml or tests.yml as the test definition file, sample.yaml
and testcase.yaml are deprecated but will still work for a while while
we transition.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2026-05-14 21:53:09 +02:00
Mayur Salve
729110c12f arch: riscv: use TLS-based stack canary guard
This change enables per thread stack canary for RISC-V.

RISC-V GCC accesses the stack canary via a fixed offset from the
thread pointer (tp) when -mstack-protector-guard=tls is used. The
compiler emits code equivalent to:

  lw t0, 0(tp)   # load canary from tp+0

Additionally, tp is zeroed in arch_kernel_init() when TLS is enabled,
which means any C function called before thread setup completes (such
as z_early_rand_get or data_copy_xip_relocation) would fault trying
to access the canary.

Introduce STACK_CANARIES_TLS_PREPEND, which places the
.stack_chk.guard section at offset 0 of the TLS block, before .tdata
and .tbss. The compiler flags -mstack-protector-guard-reg=tp and
-mstack-protector-guard-offset=0 are passed so GCC generates the
correct canary access.

With STACK_CANARIES_TLS_PREPEND the per-thread TLS block layout is:

  tp --> +------------------+  offset 0
         | .stack_chk.guard |  (__stack_chk_guard)
         +------------------+
         | .tdata           |  (initialized TLS data)
         +------------------+
         | .tbss            |  (zero-initialized TLS data)
         +------------------+

The RISC-V reset path is extended to initialize tp before any C code
runs by allocating a TLS area on the boot stack and calling
arch_riscv_early_tls_stack_update(). Early boot functions that run
before tp is set up (z_early_rand_get, data_copy_xip_relocation) are
marked FUNC_NO_STACK_PROTECTOR to avoid canary access before tp is
valid.

Signed-off-by: Mayur Salve <msalve@qti.qualcomm.com>
2026-05-14 21:52:56 +02:00
Jamie McCrae
d4b044684f scripts: west_commands: runners: core: Add error for no SRAM node
Adds a value error if the node is not present

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
2026-05-13 10:40:47 +02:00
William Jeffreys
e91ec37fff scripts: runners: fix probe-rs gdb not handling SIGINT
As in PR #106778, using check_call to start up the gdb server doesn't
ignore SIGINT meaning it will exit the debug session without cleaning
up. Using check_call_ignore_sigint fixes the issue.

Signed-off-by: William Jeffreys <wjeffreys96@gmail.com>
2026-05-13 05:14:00 +02:00
Pieter De Gendt
1b0dcebb9b scripts: dts: tests: dtlib: Add tests for signed_aware to_num(s)
Make sure we cover different types of signed_aware parsing. Negative
literals like (-1) or a hex value like 0xFFFFFFFF should result in
different values.

Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-05-12 17:12:41 +02:00
Pieter De Gendt
17648dbeff scripts: dts: tests: dtlib: Add negative override tests
Validate that the signed cell offsets are cleared on override.

Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-05-12 17:12:41 +02:00
Pieter De Gendt
34ddd823c4 scripts: dts: Add negative int test
Add negative and negative-array properties to the test binding and
test DTS to verify that signed integer literals are correctly
propagated through edtlib as negative Python integers.

Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-05-12 17:12:41 +02:00
Pieter De Gendt
44518e7cbe scripts: dts: Allow signed int/array values
Track the byte offsets of cells parsed from negative literals
(e.g. (-1)) in a new _signed_cell_offsets set on Property. Expose
this via a signed_aware parameter on to_num() and to_nums(): when
True, each cell is interpreted as signed only if it was written as a
negative literal, leaving positive and hex values unsigned.

Update edtlib to pass signed_aware=True when reading "int" and "array"
typed properties so binding values reflect the sign as written in the DTS
source.

Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-05-12 17:12:41 +02:00
Hake Huang
4b25c9b617 twister: fix packaged sysbuild artifacts for west flash
Rework the sysbuild artifact relocation approach based on
reviewer feedback: instead of rewriting domains.yaml with
relative paths at package time, keep the original absolute
paths and rebase them transparently in Domains.from_file()
when the file has been moved to a different location.

This makes the fix generic - it works for any consumer of
Domains.from_file() (west flash, twister, pytest-twister-
harness), not just the --package-artifacts path.

Changes:
- domains.py: update from_file() to detect when build_dir
  stored in domains.yaml differs from the file's actual
  directory and rebase all domain paths accordingly.
  Remove the now-unused _resolve_build_dir() helper and
  get_domains_with_build_dirs_relative_to() method.
- runner.py: remove _sanitize_domains_file() and its call
  site; path fixup is now handled by Domains.from_file().
- test_domains.py: replace the mocked __init__ approach
  with end-to-end assertions; add a 'relocated artifacts'
  test case that exercises the new rebasing logic.
- test_runner.py: remove test_projectbuilder_sanitize_
  domains_file() and references to the deleted method.

Signed-off-by: Hake Huang <hake.huang@nxp.com>
2026-05-12 17:12:06 +02:00
Grzegorz Chwierut
86c3c6eead twister: add script harness for script execution to enable bsim
Introduce a Script harness base class to enable running
shell-script-based tests through Twister, primarily
targeting BabbleSim test scenarios. The class provides
subprocess execution, output streaming, and log handling
that Pytest, Ctest, and Bsim now share through inheritance.

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
2026-05-12 11:25:32 +02:00
Etienne Carriere
ac5f115bc8 twister: add dt_label_compat_enabled()
Add dt_label_compat_enabled() to filter targets that embed a node
label matching a target compatible string.

This helper function will be useful to consider zephyr,mapped-partition
compatible nodes that are now used instead of fixed-partition compatible
nodes for memory mapped flash partitions.

Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
2026-05-12 11:25:12 +02:00
Henrik Brix Andersen
a01e2e2b9a scripts: requirements: west: refresh pinned versions
Run the uv command to update the pinned version in requirements-west.txt.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
2026-05-12 09:14:52 +02:00
Henrik Brix Andersen
c0f2d92184 scripts: requirements: actions: refresh pinned versions
Run the uv command to update the pinned version in
requirements-actions.txt.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
2026-05-12 09:14:52 +02:00
Patryk Koscik
08d94c0d9d boards: luckfox: add initial support for pico_ultra
Add support for the Luckfox Pico Ultra W development board from
Shenzhen Luckfox Technology.

Signed-off-by: Patryk Koscik <koscikpatryk@gmail.com>
2026-05-11 21:01:54 -05:00
Jukka Rissanen
1a9df8323e scripts: build: Add script to generate shell aliases
The gen_shell_aliases.py is used to generate a file that can
be included to the shell to implement aliases support.

Assisted-by: Copilot:claude-sonnet-4.6
Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
2026-05-11 15:30:56 +01:00
Jun Lai
18362eb855 scripts: build: handle duplicate exports in llext exptab prep
Treat repeated exports of the same symbol/address pair as duplicates
rather than hash collisions when preparing the llext export table.

Log a warning and continue processing so valid duplicates do not
fail preparation.

Also raise a RuntimeError when preparation returns a non-zero status to
surface failures instead of silently continuing.

Signed-off-by: Jun Lai <jun.lai@dolby.com>
2026-05-11 15:30:50 +01:00
Jamie McCrae
aada3b2f73 scripts: west_commands: runners: core: Add dts SRAM support
Adds support for using the chosen SRAM node for getting the RAM
start address instead of having to rely on Kconfigs

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
2026-05-11 08:45:38 +02:00
Pieter De Gendt
56bae04ce3 scripts: build: gen_kobject_list: Dedup ULEB128 decoding
Create a helper function to decode ULEB128 and replace two hand-rolled
implementations.

Assisted-by: Claude:claude-sonnet-4.6
Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-05-08 11:27:20 +02:00
Pieter De Gendt
a28a405222 scripts: build: gen_kobject_list: Fix big endian decoding issue
Fixed big-endian address decoding in find_kobjects to use struct.unpack
with elf.little_endian.

Assisted-by: Claude:claude-sonnet-4.6
Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-05-08 11:27:20 +02:00
Guðni Már Gilbert
1fc3294526 scripts: dts: optimize generated edt.pickle.cmake
Instead of  writing one item for each set_target_properties()

set_target_properties(${DEVICETREE_TARGET} PROPERTIES <item1>)
set_target_properties(${DEVICETREE_TARGET} PROPERTIES <item2>)
...
set_target_properties(${DEVICETREE_TARGET} PROPERTIES <itemN>)

Write one set_target_properties which contains all items:

set_target_properties(${DEVICETREE_TARGET}
  PROPERTIES
    <item1>
    <item2>
    ...
    <itemN>
)

Later when edt.pickle.cmake is included in extensions.cmake
via include(${gen_dts_cmake_output})
CMake will process the file much faster.

Signed-off-by: Guðni Már Gilbert <gudni.m.g@gmail.com>
2026-05-06 07:08:57 +02:00
Luca Burelli
a97b5f221b llext-edk: capture full build properties for EDK export
The current implementation of the LLEXT EDK exports only a partial set
of compiler settings to the EDK build system, specifically only the ones
defined by the Zephyr core (the 'zephyr_interface' target). Extending
this to include application and module-specific settings (from the 'app'
target and its dependencies) is tricky, because:
- while evaluating the main CMakeLists.txt, the 'app' target is not
  fully configured yet, and
- using generator expressions is not possible due to CMake not allowing
  expansion of $<COMPILE_LANGUAGE:...> outside of a proper compile
  context.

To work around this, this change introduces a new CMake subdirectory
(misc/llext_edk) that creates a dummy target which imports the build
configuration from 'app', but overrides the C compile rules to simply
output the resulting properties (defines, include directories, flags)
to text files. The EDK generation script then reads those text files
to get the full set of build properties, and includes them in the EDK
tarball.

Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
2026-05-04 14:53:03 +02:00
Luca Burelli
b367b34bb9 llext-edk: (refact) filter flags in post-processing step
This changes the LLEXT EDK flag filtering to be done after the main
Zephyr build is completed. Instead of filtering the flags via genexes,
the full set is passed to the script along with the set of filters to be
applied, and the filter is applied later.

No functional change is intended.

Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
2026-05-04 14:53:03 +02:00
Adarsha Regmi
381e9fcfbb scripts: build: fix ULEB128 decoding in gen_kobject_list.py
The DW_OP_plus_uconst offset in DWARF location expressions is
ULEB128-encoded, but the script reads only a single byte. This
silently truncates offsets >= 128, registering kernel objects at
wrong addresses in the kobject hash table.

Clang triggers this because it emits DW_OP_addr + DW_OP_plus_uconst
for variables within structs, while GCC emits a direct DW_OP_addr.

Signed-off-by: Adarsha Regmi <aregmi@qti.qualcomm.com>
2026-05-04 09:02:24 +02:00
Guðni Már Gilbert
a1fa501630 scripts: build: skip API extends regex for non-candidate files
parse_syscalls.py scans thousands of headers and source files during a
pristine build. DEVICE_API_EXTENDS is only present in a few files, but the
new API inheritance handling ran api_extends_regex over every file body.

Assisted-by: Codex:gpt-5 hyperfine cProfile
Signed-off-by: Guðni Már Gilbert <gudni.m.g@gmail.com>
2026-05-01 16:21:10 -05:00
Grzegorz Chwierut
c4dbadaca9 twister: power-harness: Fix build_dir path
Fixes #105743

The build_dir path is not passed as a command-line argument but
through the YAML config file exchanged between Twister and the
pytest harness. Read build_dir from dut.device_config instead
of request.config.getoption.

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
2026-05-01 12:41:57 +01:00
Pieter De Gendt
c97a886a43 device: Introduce DEVICE_API_EXTENDS
Some device driver APIs embed and extend other ones (e.g. I3C extends I2C).
Introduce DEVICE_API_EXTENDS to declare parent-child relationships between
device API classes, and update DEVICE_API_IS to use a new _ext_end linker
symbol as the upper bound of its range check.

All device API entries are placed in a single output section
(device_api_area). Child class entries are placed after their parent's
entries using a depth-first walk, and an _ext_end symbol is emitted after
all descendants. This makes DEVICE_API_IS(parent_class, dev) return true
for devices with a child API, and naturally supports multi-level
inheritance.

Example linker output for parent i2c with child i3c:

SECTION_PROLOGUE(device_api_area, ,) {
 Z_LINK_ITERABLE(i2c_driver_api);
 Z_LINK_ITERABLE(i3c_driver_api);
 _i3c_driver_api_ext_end = .;
 _i2c_driver_api_ext_end = .;
}

Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
2026-04-30 14:00:16 -04:00
Grzegorz Chwierut
3557bdf8a4 twister: multidut: Add native_sim support for multi-DUT tests
Allow multi-DUT test scenarios to run on native_sim simulator.

For non-device handlers, create placeholder reserved_duts entries
using CompoundHardwareData so pytest harness can find DUT configs.
Multi-DUT on native_sim is only allowed when all required devices
use the same platform (no cross-platform multi-DUT in simulation).

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
2026-04-29 16:29:29 -04:00
Grzegorz Chwierut
1ea17fd1e6 twister: replace required_applications dict with dataclass
Replace plain dict usage for required_application elements with
a typed RequiredApplication dataclass for improved type safety

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
2026-04-29 16:29:29 -04:00
Grzegorz Chwierut
320a88ee1b twister: multidut: Support different app per required device
Add support for flashing a different application to a required
DUT in multi-DUT testing. When a required_device entry specifies
an 'application' field, twister matches it against the
required_applications build dirs and assigns the correct
build_dir to the reserved DUT before flashing.

Move the required applications readiness check from
process_tasks() into ProjectBuilder.process() at the 'run'
stage. This ensures that building is not blocked by the
required_applications mechanism. Mutual
dependencies between instances is also allowed.

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
2026-04-29 16:29:29 -04:00
Grzegorz Chwierut
3047951393 twister: Add support for reserving multiple DUTs
Main:
- Add HardwareReservationManager class and move DUT reservation
  logic from HardwareMap to improve separation of concerns
- Add 'required_devices' structure to testsuite YAML schema to
  define multiple device requirements for a test
- Add option to reserve multiple devices, filtered by platform
  and fixtures. Fixtures can have an extra parameter (after ':')
  that must match across the main DUT and required devices

Other:
- Add HarnessConfig dataclass to provide structured access to
  harness configuration data instead of raw dict access
- Change 'fixture' parameter in harness_config from string to
  list of strings for more flexibility when matching DUTs with
  multiple fixture requirements
- Move conversion of short platform names to full target names
  from hardware map into TestPlan module. This ensures platform
  names are resolved before test discovery
- Add unit tests for HardwareReservationManager
- Align existing tests with new dataclass structures

Signed-off-by: Grzegorz Chwierut <grzegorz.chwierut@nordicsemi.no>
2026-04-29 16:29:29 -04:00
Muhammed Asif P
dbee7f5510 scripts: west: add mplab ipe runner
- Runs MPLab IPE commandline utility to flash Microchip boards
- Flash support only, no debug.
- Adds mplab_ipe runner to tests.

Assisted-by: Claude:claude-sonnet-4-6 chat
Signed-off-by: Muhammed Asif P <asifp3104@gmail.com>
2026-04-29 09:59:21 +02:00
Aksel Skauge Mellbye
b8168a2026 scripts: west_commands: runners: Support mapped partitions
Defining code partitions using the zephyr,mapped-partitions
compatible is now possible, which means that
CONFIG_FLASH_LOAD_OFFSET is no longer set. Use the reg address
from devicetree when CONFIG_FLASH_USES_MAPPED_PARTITION is set
instead of relying on the Kconfig option.

Fixes: #107785

Signed-off-by: Aksel Skauge Mellbye <aksel.mellbye@silabs.com>
2026-04-28 22:07:24 +02:00
Micah Terhaar
bd4876663c scripts: fix gen_strerror_table.py
gen_strerror_table.py missed E2BIG (Arg list too long) because
the regex didn't include numbers in the ERRNO macro

Signed-off-by: Micah Terhaar <mterhaar@me.com>
2026-04-28 11:22:08 +02:00
Anas Nashif
d8be6befe0 ci: set Release area as a meta area
Add Release as meta area, where certain rules apply when assigning.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2026-04-28 00:27:40 +01:00
Marko Sagadin
11ddde73ec scripts: west_commands: runners: fix west rtt shell interaction
When the west rtt command is executed, two things happen:
- A GDB server is run.
- A telnet client (via sockets) is opened to connect to that server.

Previously, that telnet client was operating in the line mode in both
directions. That mode is perfectly fine for just presenting the captured
content (RTT data) to the stdout; however, it is not suitable for
interacting with the device via the shell subsystem. None of the
control commands, such as tab and arrow keys, were correctly passed down
to the device.

To solve that the telnet client had to be switched into the character
mode. For that two separate implementations were needed, one for the
Unix and one for Windows. That was solved with two different context
managers.

They both wrap the common logic: two threads, where one reads input
from the keyboard and sends it to the telnet client, and the other on
reads the data from the telnet client and prints it to the screen.

Signed-off-by: Marko Sagadin <marko.sagadin42@gmail.com>
2026-04-27 14:22:58 +02:00
Jordan Yates
f87cfbd69d scripts: ci: check_compliance: move UNDEF_KCONFIG_ALLOWLIST
Move the list of undefined Kconfig symbols to allow out of the python
script and into a dedicated file.

Signed-off-by: Jordan Yates <jordan@embeint.com>
2026-04-26 17:40:00 +02:00
Jordan Yates
b49bf3eae4 scripts: check_compliance: ignoring undef_within_kconfig
Allow warnings output by the `undef_within_kconfig` check to be
suppressed for individual symbols (list loaded from a file).

While ideally this situation should be avoided, in practice it is
sometimes unavoidable for modules that are intended to support being
imported from multiple manifest repos, or are trying to support multiple
zephyr versions.

Signed-off-by: Jordan Yates <jordan@embeint.com>
2026-04-26 17:40:00 +02:00
Jordan Yates
70538354db scripts: ci: check_compliance: extend UNDEF_KCONFIG_ALLOWLIST
Allow the symbols defined in `UNDEF_KCONFIG_ALLOWLIST` to be extended
at runtime by loading a list from a file, with the file specified as
an environment variable.

This allows the script to be used without modification by other repos
that have their own set of expected undefined symbols.

Signed-off-by: Jordan Yates <jordan@embeint.com>
2026-04-26 17:40:00 +02:00
Kenneth Nielsen
06ab8823d7 scripts/logging: Disable use of select on Windows
The live log parser has been modified, so that it will not use `select`
if running on Windows. This is necessary, since the `select` call is
not available on Windows.

Signed-off-by: Kenneth Nielsen <knns@demant.com>
2026-04-25 11:30:58 +02:00
Marc Herbert
33d897462e scripts: west_commands: runners: core.py: link to mypy 1.20 regression
Amend commit fb5346d743 ("scripts: west_commands: runners: core.py:
ignore sys.stdin type check") to confirm it is indeed a mypy regression
and add the URL of the corresponding issue in the mypy tracker.

Signed-off-by: Marc Herbert <Marc.Herbert@gmail.com>
2026-04-23 18:24:51 -04:00
Yiren Guo
dd105923a4 scripts: gen_relocate_app.py: fix indentation in empty relocation stubs
When no copy/zero relocation logic is generated, the script emits a
return statement in the generated relocation functions.

Add a tab before the fallback return so the generated code keeps
consistent function-body indentation style.

This is a formatting-only change and does not affect relocation
behavior.

Signed-off-by: Yiren Guo <guoyr_2013@hotmail.com>
2026-04-23 13:12:45 -04:00
Henrik Brix Andersen
5c9e9f33f2 scripts: requirements: actions: refresh pinned versions
Run the uv command to update the pinned version in
requirements-actions.txt.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
2026-04-23 08:17:34 -04:00
Henrik Brix Andersen
fb5346d743 scripts: west_commands: runners: core.py: ignore sys.stdin type check
Instruct mypy to ignore the type check on sys.stdin as it is given issues
with at least mypy==1.20.0.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
2026-04-23 08:17:34 -04:00
Reto Schneider
1a5e00f25b scripts: list_boards: Improve error when used in Twister
This causes Twister to be able to log errors found by list_boards.py,
instead of quitting silently.

Before:

 $ twister; echo $?
 INFO    - Using Ninja..
 INFO    - Zephyr version: v4.4.0-rc3-9-g2f8a724a4b31
 INFO    - Using 'zephyr/gnu' toolchain variant.
 1

Note that there is neither a warning nor an error printed.

After:

 $ twister; echo $?
 INFO    - Using Ninja..
 INFO    - Zephyr version: v4.4.0-rc3-10-gdb2f2b597c55
 INFO    - Using 'zephyr/gnu' toolchain variant.
 ERROR   - Malformed board YAML file: <censored>/board.yml
   {'name': 'censored', 'vendor': 'censored', 'socs': [{'name':
   'censored'}]} is not valid under any of the given schemas in $.board
 1

The change has been implemented so that when running list_boards.py
directly, the errors will be displayed with in the same style as before.

Signed-off-by: Reto Schneider <reto.schneider@husqvarnagroup.com>
2026-04-23 08:16:00 -04:00
Gustav Holmberg
668900e123 runners: Add support for IAR EWARM
Add support for debugging in IAR:s IDE Embedded Workbench. This is
combined with flashing with IAR:s tool CSpyBat in a single runner called
'iar'.

Co-authored-by: Ivar Bjerling <ivar@ivarbjerling.com>

Signed-off-by: Gustav Holmberg <gustav.holmberg@iar.com>
2026-04-23 07:08:04 -04:00
dependabot[bot]
3deeb463ff build(deps): bump lxml from 6.0.2 to 6.1.0 in /scripts
Bumps [lxml](https://github.com/lxml/lxml) from 6.0.2 to 6.1.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.2...lxml-6.1.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-version: 6.1.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-22 17:15:18 +02:00