From d3d8d07905b7a57728f77949ffa4574d2f3375e5 Mon Sep 17 00:00:00 2001 From: BlackMark Date: Sun, 9 Aug 2026 16:49:01 +0200 Subject: [PATCH] editor: clangd and cmake work from a committed vscode workspace The three files libavr's consumers carry, in the vendored shape: this repo rides as a submodule (wateralarm), so .clangd names no database -- the checkout that is opened as a folder names build/atmega328p-generated in .vscode/settings.json -- and holds the stand-ins clang needs for GCC's AVR dialect plus the removals for the codegen flags the loader TUs carry and clang has no spelling for (-fira-algorithm, -fno-split-wide-types, -fno-tree-ter, -fno-ivopts). The libavr pin advances to the editor-audit fixes. The preset builds green from the pin and clangd reports zero errors on pureboot.cpp. Co-Authored-By: Claude Fable 5 --- .clangd | 37 +++++++++++++++++++++++++++++++++++++ .vscode/extensions.json | 6 ++++++ .vscode/settings.json | 37 +++++++++++++++++++++++++++++++++++++ libavr | 2 +- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 .clangd create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..af31006 --- /dev/null +++ b/.clangd @@ -0,0 +1,37 @@ +# Editor accommodations for the second frontend. No compilation database is +# named here: this repo rides as a submodule in its consumers, and this file +# travels with it — a consumer's own database then covers these sources, with +# that project's loader flags. The checkout that is opened as a folder names +# its build tree in .vscode/settings.json instead. +CompileFlags: + Add: + # clang has no 24-bit integer and GCC's are keywords, not macros, so the + # editor needs a stand-in for avr::uint24_t. The next width up is the only + # one available — clang rejects _BitInt(24) on this target. + - -D__uint24=unsigned long + - -D__int24=long + # clangd forwards the driver's system includes but not its own header + # directory, so resolves to avr-libc's, which still gates the + # limit and constant macros on the C++98 opt-in. + - -D__STDC_LIMIT_MACROS + - -D__STDC_CONSTANT_MACROS + # isr::emit spells a vector number into [[gnu::signal(N)]], which clang + # rejects rather than ignores — enough of them in one TU to reach the + # default limit of 19 inside the headers and truncate the parse. + - -ferror-limit=0 + Remove: + # Codegen shaping the loader TUs carry and clang has no spelling for. + - -fira-algorithm=* + - -fno-split-wide-types + - -fno-tree-ter + - -fno-ivopts + # The build promotes warnings for the compiler that has to be right about + # them; in the editor the flag paints a second frontend's opinions in the + # colour reserved for things that do not compile. + - -Werror +Diagnostics: + Suppress: + # clang's AVR `signal` attribute takes no arguments and it knows none of + # progmem, naked or OS_main. A misspelling is what the build is for. + - attribute_wrong_number_arguments + - unknown-attributes diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..b8c5a5b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "llvm-vs-code-extensions.vscode-clangd", + "ms-vscode.cmake-tools" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ee9ab88 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,37 @@ +{ + // clangd is the language server; the cpptools engine would parse every file + // a second time and disagree, since nothing tells it about a cross + // compiler. + "C_Cpp.intelliSenseEngine": "disabled", + + // --query-driver lets clangd ask the cross compiler for its own system + // includes and target. The database is named here rather than in .clangd + // because that file travels with the driver into a consumer's submodule, + // where a build tree of this repo's own need not exist. + "clangd.arguments": [ + "--compile-commands-dir=${workspaceFolder}/build/atmega328p-generated", + "--query-driver=**avr-g++*", + "--header-insertion=never" + ], + + // The presets are the build interface; the toolchain file inside the + // libavr submodule is the one place the compiler is chosen. The submodule + // carries no local/toolchain for it to discover, so the prefix is named + // here, for the window that opens this folder. + "cmake.useCMakePresets": "always", + "cmake.environment": { + "LIBAVR_TOOLCHAIN": "D:/dev/libavr/local/toolchain/avr-gcc-16.1.0-mingw" + }, + "cmake.configureOnOpen": true, + "cmake.options.statusBarVisibility": "compact", + + "files.watcherExclude": { + "**/build/**": true, + "**/libavr/**": true + }, + + "files.associations": { + ".clangd": "yaml", + ".clang-format": "yaml" + } +} diff --git a/libavr b/libavr index 26109e1..07a0c40 160000 --- a/libavr +++ b/libavr @@ -1 +1 @@ -Subproject commit 26109e172be4ab5cf17c9efb8c7e36d1f1caa485 +Subproject commit 07a0c4023564eb4bd72e33ff84399105390716e9