Skip to content

Commit

Permalink
clangd enhancements. (qmk#23310)
Browse files Browse the repository at this point in the history
  • Loading branch information
tzarc authored and IvanJackson committed May 6, 2024
1 parent b8b9eb9 commit 771a2cb
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 5 deletions.
2 changes: 1 addition & 1 deletion .clangd
Original file line number Diff line number Diff line change
@@ -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
34 changes: 30 additions & 4 deletions lib/python/qmk/cli/generate/compilation_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -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++"):
Expand All @@ -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: ([^"]+)')
Expand Down Expand Up @@ -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'

Expand Down

0 comments on commit 771a2cb

Please sign in to comment.