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