Re: [PATCH] gen_compile_commands: honor the build directory for modules

From: Nick Desaulniers

Date: Thu Oct 15 2026 - 12:42:24 EST


On Thu, Oct 15, 2026 at 6:58 AM vngocvan <vngocvan@xxxxxxxxx> wrote:
>
> When invoked from outside the build tree with -d and a modules.order
> argument, the script opens .mod files relative to the current directory
> instead of the specified build directory. This can fail with
> FileNotFoundError or collect commands from unrelated artifacts in the
> current directory.
>
> Pass the build directory to cmdfiles_for_modorder() and resolve both
> the .mod files and their associated .cmd files relative to it. Absolute
> paths continue to work, and the output location is unchanged.
>
> Fixes: ecca4fea1ede ("gen_compile_commands: support *.o, *.a, modules.order in positional argument")
> Signed-off-by: vngocvan <vngocvan@xxxxxxxxx>
> ---
> scripts/clang-tools/gen_compile_commands.py | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/clang-tools/gen_compile_commands.py b/scripts/clang-tools/gen_compile_commands.py
> index 8d14b81efd73..149135f85f19 100755
> --- a/scripts/clang-tools/gen_compile_commands.py
> +++ b/scripts/clang-tools/gen_compile_commands.py
> @@ -124,7 +124,7 @@ def cmdfiles_for_a(archive, ar):
> yield to_cmdfile(obj)
>
>
> -def cmdfiles_for_modorder(modorder):
> +def cmdfiles_for_modorder(modorder, root_directory):
> """Generate the iterator of .cmd files associated with the modules.order.
>
> Parse the given modules.order, and yield every .cmd file used to build the
> @@ -132,6 +132,7 @@ def cmdfiles_for_modorder(modorder):
>
> Args:
> modorder: The modules.order file to parse
> + root_directory: The directory where the objects were built
>
> Yields:
> The path to every .cmd file found
> @@ -142,11 +143,11 @@ def cmdfiles_for_modorder(modorder):
> base, ext = os.path.splitext(obj)
> if ext != '.o':
> sys.exit('{}: module path must end with .o'.format(obj))
> - mod = base + '.mod'
> + mod = os.path.join(root_directory, base + '.mod')
> # Read from *.mod, to get a list of objects that compose the module.
> with open(mod) as m:
> for mod_line in m:
> - yield to_cmdfile(mod_line.rstrip())
> + yield os.path.join(root_directory, to_cmdfile(mod_line.rstrip()))

Thanks for the patch. Can we avoid os.path in favor of Path from
Pathlib? Here and throughout.

>
>
> def process_line(root_directory, command_prefix, file_path):
> @@ -206,7 +207,7 @@ def main():
> elif path.endswith('.a'):
> cmdfiles = cmdfiles_for_a(path, ar)
> elif path.endswith('modules.order'):
> - cmdfiles = cmdfiles_for_modorder(path)
> + cmdfiles = cmdfiles_for_modorder(path, directory)
> else:
> sys.exit('{}: unknown file type'.format(path))
>
>
> base-commit: 0fcb05b72344f40806cbe810de8872f1698bf053
> --
> 2.56.0
>


--
Thanks,
~Nick Desaulniers