mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-09-20 06:31:55 +00:00
fbt, vscode: tweaks for cdb generation for clangd (#3680)
* fbt, vscode: tweaks for cdb generation for clangd * .clangd: updated config * vscode: disabled auto header insertion for clangd * .clangd: updated config, ignoring format warnings * Add sublime text project * vscode: enabled clang-tidy for clangd * clangd: strict include checks for sources only Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
83e4bcc35a
commit
c93d164785
8 changed files with 64 additions and 13 deletions
13
.clangd
Normal file
13
.clangd
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -Wno-unknown-warning-option
|
||||||
|
- -Wno-format
|
||||||
|
Remove:
|
||||||
|
- -mword-relocations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If:
|
||||||
|
PathMatch: .*\.h
|
||||||
|
Diagnostics:
|
||||||
|
UnusedIncludes: None
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -12,6 +12,9 @@ compile_commands.json
|
||||||
# JetBrains IDEs
|
# JetBrains IDEs
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
# Sublime Text
|
||||||
|
.sublime-project.sublime-workspace
|
||||||
|
|
||||||
# Python VirtEnvironments
|
# Python VirtEnvironments
|
||||||
.env
|
.env
|
||||||
.venv
|
.venv
|
||||||
|
|
21
.sublime-project
vendored
Normal file
21
.sublime-project
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"folders":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"path": ".",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"LSP": {
|
||||||
|
"clangd": {
|
||||||
|
"initializationOptions": {
|
||||||
|
"clangd.compile-commands-dir": "build/latest",
|
||||||
|
"clangd.header-insertion": null,
|
||||||
|
"clangd.query-driver": "**",
|
||||||
|
"clangd.clang-tidy": true,
|
||||||
|
},
|
||||||
|
"enabled": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
4
.vscode/example/settings.json
vendored
4
.vscode/example/settings.json
vendored
|
@ -19,6 +19,8 @@
|
||||||
"clangd.arguments": [
|
"clangd.arguments": [
|
||||||
// We might be able to tighten this a bit more to only include the correct toolchain.
|
// We might be able to tighten this a bit more to only include the correct toolchain.
|
||||||
"--query-driver=**",
|
"--query-driver=**",
|
||||||
"--compile-commands-dir=${workspaceFolder}/build/latest"
|
"--compile-commands-dir=${workspaceFolder}/build/latest",
|
||||||
|
"--clang-tidy",
|
||||||
|
"--header-insertion=never"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -20,6 +20,7 @@ env = ENV.Clone(
|
||||||
"fbt_resources",
|
"fbt_resources",
|
||||||
],
|
],
|
||||||
COMPILATIONDB_USE_ABSPATH=False,
|
COMPILATIONDB_USE_ABSPATH=False,
|
||||||
|
COMPILATIONDB_USE_BINARY_ABSPATH=True,
|
||||||
BUILD_DIR=fw_build_meta["build_dir"],
|
BUILD_DIR=fw_build_meta["build_dir"],
|
||||||
IS_BASE_FIRMWARE=fw_build_meta["type"] == "firmware",
|
IS_BASE_FIRMWARE=fw_build_meta["type"] == "firmware",
|
||||||
FW_FLAVOR=fw_build_meta["flavor"],
|
FW_FLAVOR=fw_build_meta["flavor"],
|
||||||
|
|
|
@ -12,3 +12,4 @@ def generate(env):
|
||||||
env["LINK"] = env["CXX"]
|
env["LINK"] = env["CXX"]
|
||||||
env["CXX_NOCACHE"] = env["CXX"]
|
env["CXX_NOCACHE"] = env["CXX"]
|
||||||
env["CXX"] = "$CCACHE $CXX_NOCACHE"
|
env["CXX"] = "$CCACHE $CXX_NOCACHE"
|
||||||
|
env.AppendUnique(COMPILATIONDB_OMIT_BINARIES=["ccache"])
|
||||||
|
|
|
@ -32,7 +32,7 @@ which is the name that most clang tools search for by default.
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import itertools
|
import itertools
|
||||||
import json
|
import json
|
||||||
from shlex import quote
|
from shlex import join, split
|
||||||
|
|
||||||
import SCons
|
import SCons
|
||||||
from SCons.Tool.asm import ASPPSuffixes, ASSuffixes
|
from SCons.Tool.asm import ASPPSuffixes, ASSuffixes
|
||||||
|
@ -108,6 +108,10 @@ def make_emit_compilation_DB_entry(comstr):
|
||||||
return emit_compilation_db_entry
|
return emit_compilation_db_entry
|
||||||
|
|
||||||
|
|
||||||
|
def __is_value_true(value):
|
||||||
|
return value in [True, 1, "True", "true"]
|
||||||
|
|
||||||
|
|
||||||
def compilation_db_entry_action(target, source, env, **kw):
|
def compilation_db_entry_action(target, source, env, **kw):
|
||||||
"""
|
"""
|
||||||
Create a dictionary with evaluated command line, target, source
|
Create a dictionary with evaluated command line, target, source
|
||||||
|
@ -126,16 +130,19 @@ def compilation_db_entry_action(target, source, env, **kw):
|
||||||
env=env["__COMPILATIONDB_ENV"],
|
env=env["__COMPILATIONDB_ENV"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# We assume first non-space character is the executable
|
cmdline = split(command)
|
||||||
executable = command.split(" ", 1)[0]
|
binaries_to_omit = env["COMPILATIONDB_OMIT_BINARIES"]
|
||||||
if not (tool_path := _TOOL_PATH_CACHE.get(executable, None)):
|
while (executable := cmdline[0]) in binaries_to_omit:
|
||||||
tool_path = env.WhereIs(executable) or executable
|
cmdline.pop(0)
|
||||||
_TOOL_PATH_CACHE[executable] = tool_path
|
|
||||||
# If there are spaces in the executable path, we need to quote it
|
if __is_value_true(env["COMPILATIONDB_USE_BINARY_ABSPATH"]):
|
||||||
if " " in tool_path:
|
if not (tool_path := _TOOL_PATH_CACHE.get(executable, None)):
|
||||||
tool_path = quote(tool_path)
|
tool_path = env.WhereIs(executable) or executable
|
||||||
# Replacing the executable with the full path
|
_TOOL_PATH_CACHE[executable] = tool_path
|
||||||
command = tool_path + command[len(executable) :]
|
# Replacing the executable with the full path
|
||||||
|
executable = tool_path
|
||||||
|
|
||||||
|
command = join((executable, *cmdline[1:]))
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
"directory": env.Dir("#").abspath,
|
"directory": env.Dir("#").abspath,
|
||||||
|
@ -150,7 +157,7 @@ def compilation_db_entry_action(target, source, env, **kw):
|
||||||
def write_compilation_db(target, source, env):
|
def write_compilation_db(target, source, env):
|
||||||
entries = []
|
entries = []
|
||||||
|
|
||||||
use_abspath = env["COMPILATIONDB_USE_ABSPATH"] in [True, 1, "True", "true"]
|
use_abspath = __is_value_true(env["COMPILATIONDB_USE_ABSPATH"])
|
||||||
use_path_filter = env.subst("$COMPILATIONDB_PATH_FILTER")
|
use_path_filter = env.subst("$COMPILATIONDB_PATH_FILTER")
|
||||||
use_srcpath_filter = env.subst("$COMPILATIONDB_SRCPATH_FILTER")
|
use_srcpath_filter = env.subst("$COMPILATIONDB_SRCPATH_FILTER")
|
||||||
|
|
||||||
|
@ -225,6 +232,8 @@ def generate(env, **kwargs):
|
||||||
COMPILATIONDB_USE_ABSPATH=False,
|
COMPILATIONDB_USE_ABSPATH=False,
|
||||||
COMPILATIONDB_PATH_FILTER="",
|
COMPILATIONDB_PATH_FILTER="",
|
||||||
COMPILATIONDB_SRCPATH_FILTER="",
|
COMPILATIONDB_SRCPATH_FILTER="",
|
||||||
|
COMPILATIONDB_OMIT_BINARIES=[],
|
||||||
|
COMPILATIONDB_USE_BINARY_ABSPATH=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
components_by_suffix = itertools.chain(
|
components_by_suffix = itertools.chain(
|
||||||
|
|
|
@ -102,6 +102,7 @@ env = core_env.Clone(
|
||||||
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
||||||
).version,
|
).version,
|
||||||
APPCHECK_COMSTR="\tAPPCHK\t${SOURCE}\n\t\tTarget: ${TARGET_HW}, API: ${UFBT_API_VERSION}",
|
APPCHECK_COMSTR="\tAPPCHK\t${SOURCE}\n\t\tTarget: ${TARGET_HW}, API: ${UFBT_API_VERSION}",
|
||||||
|
COMPILATIONDB_USE_BINARY_ABSPATH=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
wrap_tempfile(env, "LINKCOM")
|
wrap_tempfile(env, "LINKCOM")
|
||||||
|
|
Loading…
Reference in a new issue