# -*- bazel-starlark -*- # Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for nasm scandeps. - https://chromium.googlesource.com/chromium/deps/nasm gn - https://chromium.googlesource.com/chromium/deps/nasm/+/refs/heads/main/nasm_assemble.gni sample command line: command = python3 ../../build/gn_run_binary.py nasm -DPIC -felf64 -P ../../third_party/dav1d/config/linux/x64/config.asm -I../../third_party/dav1d/libdav1d/src// -I../../third_party/dav1d/config/linux/x64/ -I./ -I../../ -Igen/ -DSTACK_ALIGNMENT=16 -MD obj/third_party/dav1d/dav1d_asm/${source_name_part}.o.d -o obj/third_party/dav1d/dav1d_asm/${source_name_part}.o ${in} """ load("@builtin//struct.star", "module") load("@builtin//path.star", "path") def __scan_input(ctx, src, inc_dirs): inputs = [src] curdir = path.dir(src) include_directive_len = len("%include \"") for line in str(ctx.fs.read(src)).split("\n"): if not line.startswith("%include \""): continue fname = line[include_directive_len:] i = fname.index("\"") fname = fname[:i] for d in [curdir] + inc_dirs: pathname = path.join(d, fname) if ctx.fs.exists(pathname): inputs.extend(__scan_input(ctx, pathname, inc_dirs)) break return inputs def __scandeps(ctx, cmd): nasm_args = [] for i, arg in enumerate(cmd.args): if path.base(arg) == "nasm": nasm_args = cmd.args[i + 1:] break inc_dirs = [] skip = False flag = "" sources = [] for i, arg in enumerate(nasm_args): if flag == "-I": inc_dirs.append(ctx.fs.canonpath(arg)) flag = "" continue elif flag == "-P": sources.append(ctx.fs.canonpath(arg)) flag = "" continue elif skip: skip = False continue elif arg == "-o": skip = True continue elif arg == "-MD": skip = True continue elif arg == "-I": flag = arg continue elif arg == "-P": flag = arg continue elif arg.startswith("-I"): inc_dirs.append(ctx.fs.canonpath(arg[2:])) continue elif arg.startswith("-P"): sources.append(ctx.fs.canonpath(arg[2:])) continue elif arg.startswith("-"): continue sources.append(ctx.fs.canonpath(arg)) inputs = [] for src in sources: inputs.extend(__scan_input(ctx, src, inc_dirs)) return inputs nasm_scandeps = module( "nasm_scandeps", scandeps = __scandeps, )