Re: Progress on getting Uncrustify working for EDK2?

Marvin Häuser

Good day,

+1, but while you're at it, can we have arguments not align to the function name...

Status = Test (

... but to the next natural indentation level?

Status = Test (

Basically no IDE I have seen supports EDK II's style, and I wouldn't be keen on writing known-broken style to then rely on Uncrustify to fix it.

I also have heard some controversy regarding casts off-list, where some prefer no spaces after casts to stress the evaluation order, and some prefer spaces to have clearer visuals (as a cast *ideally* would be something rare that requires good justification). Just throwing that out there.

For things unrelated to autoformat (so semi-offtopic) but still relevant to the coding spec:

1. Allow STATIC functions (if the debugging concerns are still relevant, there could be another level of indirection, like RELEASE_STATIC)?

2. Allow variable assignments on definition (basically non-static CONST variables are banned...)?

3. Allow variable declarations at any scope (I had some nasty shadowing bugs before, probably prohibit shadowing with warnings)?

4. Require that exactly all function declarations and all function definitions with no prior declaration must be documented (first direction is enforcing docs, second is prohibiting doc duplication, I've seen them go out-of-sync plenty of times)?

The latter bunch would not require any autoformat rules or reformatation of existing code, but would be target only new submissions in my opinion. Thoughts?

Thanks for your efforts!

Best regards,

Am 07.10.2021 um 12:48 schrieb Leif Lindholm:

Hi Michael,
Apologies, I've owed you a response (promised off-list) for a while
First, let me say I hugely appreciate this effort. Apart from aligning
the codebase(s), this will reduce manual reviewing effort
substantially, as well as cutting down on number of rework cycles for
Looking at the changes to (well, the comments in) uncrustify, this
seems to be constrained to:
- Newline after '(' for multi-line function calls.
- Dealing with "(("/"))" for DEBUG macros.
- Function pointer typedefs:
- typedef\nEFIAPI
- closing parentheses indentation
I don't think I've made any secret over the years that I am not a
massive fan of the EDK2 coding style in general. So I think for any
of its quirks that are substantial enough that they require not just
custom configuration but actual new function added to existing code
conformance tools, this would be an excellent point to sanitise the
coding style instead.
Taking these in order:
Newline after '('
I think we already reached a level of flexibility around this, where
we don't actually enforce this (or single argument per
line). Personally, I'd be happy to update the coding style as
required instead.
DEBUG macro parentheses
How does uncrustify treat DEBUG macros without this modification?
Do we start getting everything turned into multi-level indented
multi-line statements without this change?
Function pointer typedefs:
I don't see that function pointer typedefs need to rigidly follow the
same pattern as the declaration of functions implementing them. Could
we update the coding style (if needed) instead?
Best Regards,
On Mon, Aug 16, 2021 at 16:00:38 -0400, Michael Kubacki wrote:
The edk2 branch was created here:

We have a Project Mu fork with custom changes to the Uncrustify tool to help
comply with EDK II formatting here:

The latest information about the status and how to experiment with the
configuration file and the tool are in that fork:

That said, I have also finished a CI plugin to run Uncrustify that should be
ready soon to initially deploy in Project Mu. Before doing so, I am trying
to settle on an initial configuration file that less strictly but more
reliably formats the code than in the examples in those branches. For
example, remove heuristics that when run against the same set of code
multiple times can produce different results. An example would be a rule
that reformats code because it exceeds a specified column width on one run
but on the next run that reformatted code triggers a different rule to
further align the code and so on. At least initially, some rules might be
tweaked in a more conservative approach that can be tightened in the future.
Once this configuration file is ready, we will baseline Project Mu code as
an example and turn on the plugin. The CI plugin runs Uncrustify against
modified files and if there's any changes, indicating a formatting
deviation, the diff chunks are saved in a log so they can be viewed as a
build artifact.

I am making progress on the updated config file and I should be able to post
a "uncrustify_poc_3" branch soon with the results.

Regarding indentation, Marvin is right that Uncrustify cannot support edk2
indentation style out-of-box. Some changes are made in that fork to handle
the formatting. At this point, it can handle the indentation in the cases
I've seen. Uncrustify does potentially give us the ability to massively
deploy changes across the codebase in case a decision were made to change
the style.


On 8/16/2021 3:39 PM, Marvin Häuser wrote:
Hey Rebecca,

I think even Uncrustify has issues with the EDK II indentation style.
You might want to check the UEFI Talkbox Discord server, I had a brief
chat with Michael about it there. I don't think realistically any tool
supports EDK II's indentation style however, so I'd propose it is
changed. This could be for new submissions only, or actually the entire
codebase could be reformatted at once with a good tool setup. While this
screws with git blame, the (to my understanding) decided on CRLF -> LF
change does that anyway, so at least two evils could be dealt with in
one go really.

Best regards,

On 16/08/2021 21:34, Rebecca Cran wrote:

cc devel@ .

On 8/16/21 1:33 PM, Rebecca Cran wrote:

I noticed a message on Twitter about an idea of using Uncrustify
for EDK2 instead of the ECC tool, and came across

I was wondering if there's been any progress on it that I could
check out?

Michael Kubacki: in that message, you said:

"I'm planning to put up a branch that we can use as a reference
for a conversation around uncrustify in the next couple of

Did you end up creating that branch, and if so could you provide
a link to it please?

Rebecca Cran

Join { to automatically receive all group messages.