> On Oct 7, 2021, at 1:43 PM, Marvin Häuser <mhaeu...@posteo.de> wrote: > > Hey Mike, > Hey Andrew, > > I'll just reply to both mails at once :) > > On 07/10/2021 19:36, Andrew Fish wrote: >> >> >>> On Oct 7, 2021, at 1:19 PM, Michael D Kinney <michael.d.kin...@intel.com> >>> wrote: >>> >>> Hi Marvin, >>> >>> Some comments below. >>> >>> Mike >>> >>>> -----Original Message----- >>>> From:devel@edk2.groups.io<devel@edk2.groups.io> On Behalf Of Marvin Häuser >>>> Sent: Thursday, October 7, 2021 11:31 AM >>>> To: Leif Lindholm >>>> <l...@nuviainc.com>;devel@edk2.groups.io;mikub...@linux.microsoft.com >>>> Cc:rebe...@nuviainc.com; Michael Kubacki <michael.kuba...@microsoft.com>; >>>> Bret Barkelew <bret.barke...@microsoft.com>; >>>> Kinney, Michael D <michael.d.kin...@intel.com> >>>> Subject: Re: [edk2-devel] Progress on getting Uncrustify working for EDK2? >>>> >>>> Good day, >>>> >>>> +1, but while you're at it, can we have arguments not align to the >>>> function name... >>>> >>>> Status = Test ( >>>> a >>>> ); >>>> >>>> ... but to the next natural indentation level? >>>> >>>> Status = Test ( >>>> a >>>> ); >>>> >>>> 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)? >>> >>> Debugging concerns are no longer relevant. The suggestion in the BZ below >>> is to remove the STATIC macro and allow EDK II sources to add 'static' >>> to any functions it makes sense to use on. >>> >>> https://bugzilla.tianocore.org/show_bug.cgi?id=1766 > > Thanks! I'd keep STATIC actually just for the sake of not doing no-op changes > that do not really do anything and for consistency with CONST, but whatever > works really. > >>> >>>> >>>> 2. Allow variable assignments on definition (basically non-static CONST >>>> variables are banned...)? >>> >>> Are referring to use of pre-initialized CONST variables declared within >>> a function? I think Bret brought this topic up when implementing some >>> unit tests and the suggestion to pass ECCC was to promote them to >>> pre-initialized CONST global variables. > > Yes. > >>> >>> The challenges we have seen in the past with pre-initialized variables >>> within >>> a function is that they can cause compilers to inject use of memcpy() calls, >>> especially if the variable being initialized on the stack is a structure. >>> These cause build breaks today. >> >> This issue is independent of CONST. I’m not sure a coding style tool is >> smart enough to catch this generically? You need an understanding of C types >> to know if the local variable assignment is going to trigger a memcpy(). >> >> What I’ve seen in the real world is the firmware compiles with -Os or LTO to >> fit int he ROM for DEBUG and RELEASE, and the optimizer optimizes away the >> call to memcpy. Then if you try to build NOOPT (or over ride the compiler >> flags on an individual driver/lib) you fail to link as only the NOOPT build >> injects the memcpy. > > +1 > >> >> Thus I think the best way to enforce this rule is to compile a project >> NOOPT. I’m trying to remember are there flags to built to tell it to compile >> and skip the FD construction? Maybe we should advocate platforms add a NOOPT >> build target that just compiles the code, but does not create the FD? > > I know there were stability concerns with intrinsics in the past, but > memcpy() is in the standard, and the rest remained stable to my knowledge. > Maybe it's time to fix the issues at the root? Works for us: > https://github.com/acidanthera/OpenCorePkg/tree/master/Library/OcCompilerIntrinsicsLib > > <https://github.com/acidanthera/OpenCorePkg/tree/master/Library/OcCompilerIntrinsicsLib> >
Marvin, Good point. This would make the rule moot. So maybe just removing the requirement would be the easiest long term fix. Other embedded projects I know of do this too, and as you point out the compilers keep these APIs standard for folks the provide their own runtimes. Thanks, Andrew Fish > Best regards, > Marvin > >> >> Thanks, >> >> Andrew Fish >> >>> >>>> >>>> 3. Allow variable declarations at any scope (I had some nasty shadowing >>>> bugs before, probably prohibit shadowing with warnings)? >>> >>> By shadowing do you mean the declaration of the same variable name in >>> multiple scoped within the same function? >>> >>>> >>>> 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)? >>> >>> I agree that this can reduce duplication and sync issues. The uncrustify >>> tool being discussed here could not help clean this up or enforce this >>> type of rule. It is a good topic, but may need to be split out into its >>> own thread. >>> >>>> >>>> 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, >>>> Marvin >>>> >>>> >>>> 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 >>>>> now. >>>>> >>>>> 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 >>>>> developers. >>>>> >>>>> 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, >>>>> >>>>> Leif >>>>> >>>>> On Mon, Aug 16, 2021 at 16:00:38 -0400, Michael Kubacki wrote: >>>>>> The edk2 branch was created here: >>>>>> https://github.com/makubacki/edk2/tree/uncrustify_poc_2 >>>>>> >>>>>> We have a Project Mu fork with custom changes to the Uncrustify tool to >>>>>> help >>>>>> comply with EDK II formatting here: >>>>>> https://dev.azure.com/projectmu/_git/Uncrustify >>>>>> >>>>>> The latest information about the status and how to experiment with the >>>>>> configuration file and the tool are in that fork: >>>> https://dev.azure.com/projectmu/Uncrustify/_wiki/wikis/Uncrustify.wiki/1/Project-Mu-(EDK-II)-Fork-Readme >>>>>> >>>>>> 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. >>>>>> >>>>>> Thanks, >>>>>> Michael >>>>>> >>>>>> 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, >>>>>>> Marvin >>>>>>> >>>>>>> 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 https://www.mail- >>>> archive.com/search?l=devel@edk2.groups.io&q=subject:%22Re%5C%3A+%5C%5Bedk2%5C- >>>> devel%5C%5D+TianoCore+Community+Meeting+Minutes+%5C-+2%5C%2F4%22&o=newest&f=1 >>>>>>>>> . >>>>>>>>> >>>>>>>>> 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 >>>>>>>>> weeks." >>>>>>>>> >>>>>>>>> >>>>>>>>> Did you end up creating that branch, and if so could you provide >>>>>>>>> a link to it please? >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Rebecca Cran >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>> -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#81613): https://edk2.groups.io/g/devel/message/81613 Mute This Topic: https://groups.io/mt/84932137/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-