diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..7c75ea0f5 --- /dev/null +++ b/.clang-format @@ -0,0 +1,70 @@ +--- +Language: Cpp +BasedOnStyle: LLVM + +# Indentation +IndentWidth: 4 # 4 spaces per indent +AccessModifierOffset: -4 +IndentAccessModifiers: false # Align access modifiers to braces +NamespaceIndentation: Inner # Indent namspace contents + +# Comments which match this regex will be unformatted (and therefore can be longer or have more whitespace than other comments) +CommentPragmas: '^\*\*' + + +# Alignment +AlignConsecutiveAssignments: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true + AlignCompound: true + PadOperators: true +AlignConsecutiveBitFields: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true +AlignConsecutiveDeclarations: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true + # For future versions of clang-format + # AlignFunctionDeclarations: false + # AlignFunctionPointers: false +AlignConsecutiveMacros: + Enabled: true + AcrossEmptyLines: false + AcrossComments: true + +# Newlines +ColumnLimit: 120 +BreakBeforeBraces: Allman # Braces on their own lines +SeparateDefinitionBlocks: Always # Separate definitions (functions etc.) with an empty line +AlwaysBreakTemplateDeclarations: true # Put template on their own lines +AllowShortBlocksOnASingleLine: Never +# On a newer version of clang-format, replace with BinPackArguments: OnePerLine +BinPackArguments: false # Don't allow multiple function arguments on the same line unless they all fit +BinPackParameters: false # Same but for parameters +PackConstructorInitializers: NextLine +AllowShortFunctionsOnASingleLine: None +BreakBeforeBinaryOperators: NonAssignment # Put binary operators after a line break, rather than before + +# Spaces +SpaceBeforeParens: ControlStatementsExceptControlMacros +SpaceAfterCStyleCast: true +PointerAlignment: Left + +# Includes +IncludeBlocks: Regroup # Regroup includes based on config +IncludeCategories: + - Regex: '(^"|\.hpp)' # 'local' includes + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '\/' # Library includes + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' # Everything else + Priority: 1 + SortPriority: 0 + CaseSensitive: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6f6916d15..a62f660c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -321,4 +321,14 @@ class Matrix // No, class is outside GridKit namespace { // matrix code }; +``` + +## Developer tooling + +### Auto-formatting + +To help enforce the above code style guidelines, we use autoformatting provided by [`clang-format`](https://clang.llvm.org/docs/ClangFormat.html), which is distributed as a part of `clang` and `llvm`. Pull-requests must be formatted using the version of `clang-format` distributed by the version of `llvm` required by development with Enzyme. + +VS Code users can use `clang-format` to automatically format their code by installing the [C/C++ Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) and using the `Format Document` command in the command palette with the file to be formatted open. As well, you can enabled the `editor.formatOnSave` option to auto-format any file when you save it. +Other users can use the [`git clang-format`](https://clang.llvm.org/docs/ClangFormat.html#git-integration) subcommand installed along with `clang-format` to auto-format all staged files. \ No newline at end of file diff --git a/README.md b/README.md index a4dd823a2..320e19a33 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ You should have all of the following installed before installing GridKit™ - [CMake](https://cmake.org/) >= 3.12 - C++ 17 compliant compiler +#### Developer Dependencies +- `clang-format`, which can be obtained through most linux distribution package managers, or through the [LLVM project](https://github.com/llvm/llvm-project) >= 15.0.0 + ### Installing GridKit™ uses CMake for build configuration. Per CMake best practices it is recommended