From 28b8b578b055bf76b28f47f9fd02db351cacfa09 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 20 Sep 2021 14:15:07 +1000 Subject: [PATCH] compiledb: query include paths from gcc directly. (#14462) * Query include paths from gcc directly. * Change to -isystem * qmk format-python * tests --- .../qmk/cli/generate/compilation_database.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py index 2748d96e7a..602635270c 100755 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -1,7 +1,6 @@ """Creates a compilation database for the given keyboard build. """ -import itertools import json import os import re @@ -24,6 +23,16 @@ def system_libs(binary: str) -> List[Path]: """ 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++"): + result = cli.run([binary, '-E', '-Wp,-v', '-'], capture_output=True, check=True, input='\n') + paths = [] + for line in result.stderr.splitlines(): + if line.startswith(" "): + paths.append(Path(line.strip()).resolve()) + return paths + return list(Path(bin_path).resolve().parent.parent.glob("*/include")) if bin_path else [] @@ -55,7 +64,8 @@ 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) - args += ['-I%s' % s for s in system_libs(args[0])] + for s in system_libs(args[0]): + args += ['-isystem', '%s' % s] new_cmd = ' '.join(shlex.quote(s) for s in args if s != '-mno-thumb-interwork') records.append({"directory": str(QMK_FIRMWARE.resolve()), "command": new_cmd, "file": this_file}) state = 'start'