xref: /aosp_15_r20/external/cronet/build/config/siso/nasm_scandeps.star (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1# -*- bazel-starlark -*-
2# Copyright 2023 The Chromium Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""Siso configuration for nasm scandeps.
6
7- https://chromium.googlesource.com/chromium/deps/nasm
8
9gn
10- https://chromium.googlesource.com/chromium/deps/nasm/+/refs/heads/main/nasm_assemble.gni
11
12sample command line:
13  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}
14
15"""
16
17load("@builtin//struct.star", "module")
18load("@builtin//path.star", "path")
19
20def __scan_input(ctx, src, inc_dirs):
21    inputs = [src]
22    curdir = path.dir(src)
23    include_directive_len = len("%include \"")
24    for line in str(ctx.fs.read(src)).split("\n"):
25        if not line.startswith("%include \""):
26            continue
27        fname = line[include_directive_len:]
28        i = fname.index("\"")
29        fname = fname[:i]
30        for d in [curdir] + inc_dirs:
31            pathname = path.join(d, fname)
32            if ctx.fs.exists(pathname):
33                inputs.extend(__scan_input(ctx, pathname, inc_dirs))
34                break
35    return inputs
36
37def __scandeps(ctx, cmd):
38    nasm_args = []
39    for i, arg in enumerate(cmd.args):
40        if path.base(arg) == "nasm":
41            nasm_args = cmd.args[i + 1:]
42            break
43    inc_dirs = []
44    skip = False
45    flag = ""
46    sources = []
47    for i, arg in enumerate(nasm_args):
48        if flag == "-I":
49            inc_dirs.append(ctx.fs.canonpath(arg))
50            flag = ""
51            continue
52        elif flag == "-P":
53            sources.append(ctx.fs.canonpath(arg))
54            flag = ""
55            continue
56        elif skip:
57            skip = False
58            continue
59        elif arg == "-o":
60            skip = True
61            continue
62        elif arg == "-MD":
63            skip = True
64            continue
65        elif arg == "-I":
66            flag = arg
67            continue
68        elif arg == "-P":
69            flag = arg
70            continue
71        elif arg.startswith("-I"):
72            inc_dirs.append(ctx.fs.canonpath(arg[2:]))
73            continue
74        elif arg.startswith("-P"):
75            sources.append(ctx.fs.canonpath(arg[2:]))
76            continue
77        elif arg.startswith("-"):
78            continue
79        sources.append(ctx.fs.canonpath(arg))
80    inputs = []
81    for src in sources:
82        inputs.extend(__scan_input(ctx, src, inc_dirs))
83    return inputs
84
85nasm_scandeps = module(
86    "nasm_scandeps",
87    scandeps = __scandeps,
88)
89