# -*- 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,
)