aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Brassel <[email protected]>2024-05-02 20:08:41 +1000
committerGitHub <[email protected]>2024-05-02 20:08:41 +1000
commit9a4f39b7388745b6e395710e020cce8835f0d781 (patch)
treeb73f0b7b18e83efae6249a216d27e03a814c0a6b
parent29a4e5c50b9cc828ea0a14a7c2cbe8d309a19079 (diff)
downloadqmk_firmware-9a4f39b7388745b6e395710e020cce8835f0d781.tar.gz
qmk_firmware-9a4f39b7388745b6e395710e020cce8835f0d781.zip
clangd enhancements. (#23310)
-rw-r--r--.clangd2
-rwxr-xr-xlib/python/qmk/cli/generate/compilation_database.py34
2 files changed, 31 insertions, 5 deletions
diff --git a/.clangd b/.clangd
index 2be2d817fc..6133ae7229 100644
--- a/.clangd
+++ b/.clangd
@@ -1,4 +1,4 @@
CompileFlags:
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
- Remove: [-W*, -mcall-prologues]
+ Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues]
Compiler: clang
diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py
index a2190fee66..b9c716bf0c 100755
--- a/lib/python/qmk/cli/generate/compilation_database.py
+++ b/lib/python/qmk/cli/generate/compilation_database.py
@@ -25,7 +25,6 @@ def system_libs(binary: str) -> List[Path]:
"""Find the system include directory that the given build tool uses.
"""
cli.log.debug("searching for system library directory for binary: %s", binary)
- bin_path = shutil.which(binary)
# Actually query xxxxxx-gcc to find its include paths.
if binary.endswith("gcc") or binary.endswith("g++"):
@@ -37,7 +36,31 @@ def system_libs(binary: str) -> List[Path]:
paths.append(Path(line.strip()).resolve())
return paths
- return list(Path(bin_path).resolve().parent.parent.glob("*/include")) if bin_path else []
+ return list(Path(binary).resolve().parent.parent.glob("*/include")) if binary else []
+
+
+@lru_cache(maxsize=10)
+def cpu_defines(binary: str, compiler_args: str) -> List[str]:
+ cli.log.debug("gathering definitions for compilation: %s %s", binary, compiler_args)
+ if binary.endswith("gcc") or binary.endswith("g++"):
+ invocation = [binary, '-dM', '-E']
+ if binary.endswith("gcc"):
+ invocation.extend(['-x', 'c'])
+ elif binary.endswith("g++"):
+ invocation.extend(['-x', 'c++'])
+ compiler_args = shlex.split(compiler_args)
+ invocation.extend(compiler_args)
+ invocation.append('-')
+ result = cli.run(invocation, capture_output=True, check=True, stdin=None, input='\n')
+ define_args = []
+ for line in result.stdout.splitlines():
+ line_args = line.split(' ', 2)
+ if len(line_args) == 3 and line_args[0] == '#define':
+ define_args.append(f'-D{line_args[1]}={line_args[2]}')
+ elif len(line_args) == 2 and line_args[0] == '#define':
+ define_args.append(f'-D{line_args[1]}')
+ return list(sorted(set(define_args)))
+ return []
file_re = re.compile(r'printf "Compiling: ([^"]+)')
@@ -68,9 +91,12 @@ def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]:
# we have a hit!
this_cmd = m.group(1)
args = shlex.split(this_cmd)
- for s in system_libs(args[0]):
+ binary = shutil.which(args[0])
+ compiler_args = set(filter(lambda x: x.startswith('-m') or x.startswith('-f'), args))
+ for s in system_libs(binary):
args += ['-isystem', '%s' % s]
- new_cmd = ' '.join(shlex.quote(s) for s in args if s != '-mno-thumb-interwork')
+ args.extend(cpu_defines(binary, ' '.join(shlex.quote(s) for s in compiler_args)))
+ new_cmd = ' '.join(shlex.quote(s) for s in args)
records.append({"directory": str(QMK_FIRMWARE.resolve()), "command": new_cmd, "file": this_file})
state = 'start'