Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix or disable clang format checks #937

Open
SaschaWillems opened this issue Feb 22, 2024 · 15 comments · May be fixed by #996
Open

Fix or disable clang format checks #937

SaschaWillems opened this issue Feb 22, 2024 · 15 comments · May be fixed by #996
Labels
build This is relevant to the build system urgent Need to resolve as soon as possible

Comments

@SaschaWillems
Copy link
Collaborator

As part of our CI we run clang-format to ensure that code is properly formatted. Sadly IDEs use different clang-format versions. Visual Stuido 2022 e.g. uses an newer version than we do. For people using MSVC 2022 (like me), this makes it pretty much impossible to write code that doesn't fail CI. We somehow need to do something about this urgently.

@SaschaWillems SaschaWillems added urgent Need to resolve as soon as possible build This is relevant to the build system labels Feb 22, 2024
@jherico
Copy link
Contributor

jherico commented Feb 25, 2024

You can explicitly tell MSVC which clang-format binary to use.

image

@SaschaWillems
Copy link
Collaborator Author

I'm aware of that option. But tbh. I'd prefer if we had a way where no changes to a IDE setup would be required. I don't want to adjust a global setting just for a single project.

@tomadamatkinson
Copy link
Collaborator

Does #939 help resolve this for you?

Out of the options we tried the only way we can fix this for MSVC out of the box is to update the clang format version in the CI. Which in turn will just break again in the futur when MSVC updates its dependencies

With #939 all users should have the same experience after installing pre-commit. It also will allow us to automate the copyright checks in the future too

@SaschaWillems
Copy link
Collaborator Author

Fixed via #939.

@SaschaWillems
Copy link
Collaborator Author

SaschaWillems commented Mar 21, 2024

Reopening again. I can't get one of my PRs to pass clang-format checks. Been trying for hours. See https://github.com/KhronosGroup/Vulkan-Samples/actions/runs/8381317875/job/22952552513?pr=887

The CI output is utterly useless. It's a gigantic one liner that tells you roughly where the problem is, but not not WHAT it actually is.

It's both infuriating and frustrating.

Can we add some way to forcefully skip this check?

I'm probably not smart enough, but for most of my PRs I spent more time fixing CI related things than actually working on the code.

@SaschaWillems SaschaWillems reopened this Mar 21, 2024
@SaschaWillems
Copy link
Collaborator Author

It's getting worse. So I downloaded LLVM and told VS to use clang-format from that instead (as in Bradley's screenshot). It did format a few things differently, and now I get even more clang format errors in the CI.

@bradgrantham-lunarg
Copy link

https://github.com/KhronosGroup/Vulkan-Samples/actions/runs/8381317875/workflow?pr=887
The CI output is utterly useless. It's a gigantic one liner that tells you roughly where the problem is, but not not WHAT it actually is.

It looks like either the output of clang-format (steps.clang-diff.outputs.changes) is being collected up word-wise into the variable or is being evaluated word-wise and thus collapsing whitespace.

Someone with good enough YAML-fu could take a look to see how this could be changed to output the diff verbatim. My YAML ability is non-existent and a quick search didn't reveal anything. Last people to touch that workflow file at that step are @charles-lunarg and @TomAtkinsonArm

@gpx1000
Copy link
Contributor

gpx1000 commented Mar 21, 2024

I've been thinking about this. Maybe a solution is instead of having the CI notice differences to have the CI save the changes to a new file and commit it back while failing the build, so all you have to do is sanity check that file, move it over to the offending one and then you'll pass CI?

That way at least there's a quick path towards solving the under-laying issue that clang-format isn't meant to have any backwards compatibility. The only real way is to have one clang-format version that the whole project uses; which doesn't bode well when people update their IDEs (something we want to encourage). The only other solution is to not enforce clang-format.

@tomadamatkinson
Copy link
Collaborator

Another alternative is just to add the nicely formatted log of the change file in the CI. In the worst case scenario you will be able to read and manually fix the discrepancies.

I ran pre-commit manually on Saschas PR and it seems to have fixed the files. I dropped a comment on that PR with an example command to run

The final alternative would be to bump our clang tooling to the latest supported by MSVC. Fairly easy to do. It may remove some barrier to entry

I do think that pre-commit is the most sensible solution as it pulls the correct versions and is IDE agnostic. But I am bias, I use this at work across multiple repositories and we practically automate all tests, lints, formats etc with it across multiple tech stacks (Web, native c++, unreal engine, go, I think there's some Java in there too but I stay clear from those repos)

Let me know if we want a version bump and I'll sort out the docker images

@gpx1000 gpx1000 linked a pull request Mar 21, 2024 that will close this issue
19 tasks
@gpx1000
Copy link
Contributor

gpx1000 commented Mar 21, 2024

Personally, I'd favor pre-commits as well. However, we have to think of maintainers as customers/end users. We can't mandate that everyone have a particular tool or setup if we want to maximize the number of people that can contribute to the project. So pre-commits are great for us on platforms that are setup for it, but less great for people who either have never used it or run into issues with it. Meeting them in the middle with a path to get out of hours of trying to get past CI seems like a good compromise.
What I did was create a very quick PR which allows the CI to save the artifact that is generated via the clang-format job. That way if you make a PR and it fails, you can download the diff and hopefully that will make it easier to work with. Might have to reformat the diff so it's easier to consume, or just save off the new files and let those be downloaded? But goal is to meet people in the middle so when they have a build issue we're at least doing a small step to give them a quick path out of the issue. Just download the artifact run patch and continue on.

@bradgrantham-lunarg
Copy link

We have clang-format in https://github.com/LunarG/gfxreconstruct CI GH Actions and I regularly cut-and-paste the diff reported in our CI (e.g. https://github.com/LunarG/gfxreconstruct/actions/runs/8354729132/job/22868539456) as a patch to fix clang-format on my machine. It's lazy, but in the absence of a readily-reproducible clang-format that works everywhere it does the job. I like #996, and even better because it's a downloadable artifact.

I agree something that just reformats it on the way in or provides an actionable commit is preferable.

@jherico
Copy link
Contributor

jherico commented Mar 21, 2024

If the problem is that some people have a different version of Clang on their system, wouldn't it be simpler to just include an additional script (or an additional command line option for the existing script) that will use a docker container to execute the correct clang-format version against the files?

I don't think it's an unreasonable ask to say "You have to have either LLVM version 15 or Docker as part of local setup to develop for this repo" .

@gpx1000
Copy link
Contributor

gpx1000 commented Mar 22, 2024

It's not unreasonable to say that version X of clang-format is in use on the developer machine. Nor is it unreasonable to say that we have a dockerfile which they could install/use. Nor is it unreasonable to say that there's pre-commit scripting support.
However, in the unlikely event those don't get used, it's not a bad thing for us to provide a path out of having this issue. I personally don't use either pre-commit nor the dockerfile as I primarily do my dev in CLion, which supports using pre-commit, or any version of clang-format directly. However, every now and again even I run into problems; not that I claim to be a competent programmer; I think it's a small thing to offer another path towards getting people to work with our repo.

Also, something else to bare in mind. This project is meant to be able to work on platforms that might not even have support for LLVM.

@jherico
Copy link
Contributor

jherico commented Mar 22, 2024

I don't mean to suggest that we shouldn't do any particular improvement that's been suggested. Simply that providing the option of using a container based clang-format might be an easy to accomplish way to solve the original problem.

This project is meant to be able to work on platforms that might not even have support for LLVM.

Do you mean "work" in the sense of "people can build and run the examples" or in the sense of "people are actively writing code and submitting PRs"? Because I assume that the issue of LLVM availability is really only a concern to the latter. Most of my experience developing on platforms with sparse options for tooling have been embedded stuff that ultimately requires some kind of host system to work with, but I haven't spent a lot of time working on GPU stuff beyond the desktop environment.

@gpx1000
Copy link
Contributor

gpx1000 commented Mar 23, 2024

The way I think of it is, if Vulkan can work on a given platform, then it'd be nice if samples could work on that same platform.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
build This is relevant to the build system urgent Need to resolve as soon as possible
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants