Hi Simon,

On 5/4/26 2:16 PM, Simon Glass wrote:
Hi,

As you know, I maintain several tools which are part of the U-Boot tree.

Tom has previously suggested that it would be better to move patman
out of the U-Boot tree, e.g. to its own Github project. It is a
general tool which can be used with Linux and other
mailing-list/patchwork-based projects. I have never been keen on
taking on the extra effort required, but I've recently added more
features and am wondering whether now might be a good time to do this.


Even before b4 got released, I've never used patman, so I don't know what I'm missing out on but b4 has fixed all the gripes I had with git-format-patch+git-send-email so far.

What I can say though is that I cannot install the requirements for running tests on Fedora, for a few releases already, because patman is using an old pygit2 which doesn't compile with newer versions of libgit2.

Building wheels for collected packages: pygit2
  Building wheel for pygit2 (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for pygit2 (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [75 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/utils.py -> build/lib.linux-x86_64-cpython-314/pygit2
copying pygit2/submodules.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/settings.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/repository.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/remotes.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/refspec.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/references.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/packbuilder.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/legacyenums.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/index.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/filter.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/ffi.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/errors.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/enums.py -> build/lib.linux-x86_64-cpython-314/pygit2
copying pygit2/credentials.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/config.py -> build/lib.linux-x86_64-cpython-314/pygit2
copying pygit2/callbacks.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/branches.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/blob.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/blame.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/_run.py -> build/lib.linux-x86_64-cpython-314/pygit2
      copying pygit2/_build.py -> build/lib.linux-x86_64-cpython-314/pygit2
copying pygit2/__init__.py -> build/lib.linux-x86_64-cpython-314/pygit2 copying pygit2/_pygit2.pyi -> build/lib.linux-x86_64-cpython-314/pygit2
      creating build/lib.linux-x86_64-cpython-314/pygit2/decl
copying pygit2/decl/types.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/transport.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/submodule.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/strarray.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/stash.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/revert.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/repository.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/remote.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/refspec.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/proxy.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/pack.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/oid.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/net.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/merge.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/indexer.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/index.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/graph.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/errors.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/diff.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/describe.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/config.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/common.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/commit.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/clone.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/checkout.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/callbacks.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/buffer.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/blame.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl copying pygit2/decl/attr.h -> build/lib.linux-x86_64-cpython-314/pygit2/decl
      running build_ext
generating cffi module 'build/temp.linux-x86_64-cpython-314/pygit2._libgit2.c'
      creating build/temp.linux-x86_64-cpython-314
      building 'pygit2._pygit2' extension
creating build/temp.linux-x86_64-cpython-314/tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src gcc -fno-strict-overflow -Wsign-compare -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -fexceptions -fcf-protection -fexceptions -fcf-protection -fexceptions -fcf-protection -O3 -fPIC -I/usr/local/include -I/home/qschulz/work/upstream/u-boot/venv/include -I/usr/include/python3.14 -c /tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/blob.c -o build/temp.linux-x86_64-cpython-314/tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/blob.o In file included from /tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/diff.h:34, from /tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/blob.c:31: /tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/types.h:37:2: error: #error You need a compatible libgit2 version (1.7.x)
         37 | #error You need a compatible libgit2 version (1.7.x)
            |  ^~~~~
/tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/blob.c: In function ‘blob_filter_stream_write’: /tmp/pip-install-sg4tws_1/pygit2_dfcf87fabf704024a62ab6e9ec4033ed/src/blob.c:171:13: error: implicit declaration of function ‘git_error_set’; did you mean ‘git_error_last’? [-Wimplicit-function-declaration] 171 | git_error_set(GIT_ERROR_OS, "failed to put chunk to queue");
            |             ^~~~~~~~~~~~~
            |             git_error_last
      error: command '/usr/lib64/ccache/gcc' failed with exit code 1
      [end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for pygit2
Failed to build pygit2

and this essentially has requested I run the tests within the CI container, which I would prefer not to do if possible (I somehow managed to break my U-Boot local git repo once doing that).

Buildman is quite obviously designed specifically for U-Boot. I have
made some improvements recently (a large code refactor and distributed
builds). I would like to push those changes to mainline. Do people
think it should be in a separate tree somewhere?


I've only started to use buildman when I did tree-wide refactoring and needed to make sure I didn't break anything. It's however essential in CI. I don't think it's actively being developed at the moment (at least publicly in U-Boot ML) so maybe that's good enough?

Considering the changes made in your fork are as far as I could tell mostly developed by/with LLMs and that Tom has been pretty vocal against it, moving it outside of the U-Boot umbrella and thus lose "control" of what can or cannot be merged while still making use of it in U-Boot seems like something we may not want to do.

Binman was written with U-Boot in mind but supports other projects
(such as Zephyr). It is generic enough that it could be separated. The
impact would be harder code review.


Is Binman actually currently used outside of U-Boot? It's one thing to support building other projects but if those projects aren't actually using it, I'm not sure it's a strong argument (though, the fact it's in U-Boot tree could be a major obstacle for other projects to easily incorporate it in their process).

Considering binman is an essential piece of SW for some architectures (e.g. Rockchip), I don't know if it makes sense to separate it right now. At least I don't see an immediate need for splitting it.

We also have smaller things like qconfig (which I have substantially
rewritten to make it fast) and dtoc, which is very tailored to U-Boot.


I think qconfig is used every now and then by Tom and it was helpful to me when doing refactoring and symbol renaming. It's lacking a feature for me but saw your article on qconfig being rewritten in your fork so was wondering whether to look at it now or if it would make it to the U-Boot ML at some point.

The feature I've found myself really wanting is to filter configs based on a symbol and then print the value of some symbols.

E.g. I've wanted in https://lore.kernel.org/u-boot/[email protected]/ to know what was the value of CONFIG_SYS_RX_ETH_BUFFER when CONFIG_FSL_ENETC is enabled. Same for CONFIG_TI_K3_NAVSS_UDMA and CONFIG_SYS_RX_ETH_BUFFER.

I don't think qconfig is an essential tool for U-Boot and could probably live outside of U-Boot. I believe the feature of this tool would be useful for any project using Kconfig (Linux kernel, Zephyr, U-Boot, Barebox, etc...). It however depends on buildman and u-boot pylib today, so maybe it's unnecessary complexity to move it out of U-Boot for now (and also makes it unusable for other projects?). I don't think there's a hurry moving this one to a different place, it's not really bothering me to have it in-tree.

What do people think? Of all of these, patman would be the easiest to
move, with the least impact on existing workflows.


I think starting with patman would be nice :)

Cheers,
Quentin

Reply via email to