#!/usr/bin/env python
# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import subprocess
import sys
import pipes


def main():
    parser = argparse.ArgumentParser("Generate media driver dep file")
    parser.add_argument("depsfile")
    parser.add_argument("--input-dir", action='append')
    args = parser.parse_args()

    find_args = ["find"]
    find_args += args.input_dir
    find_args += ["-path", "*/.git", "-prune", "-o", "-type", "f", "-print"]

    files = subprocess.check_output(find_args)
    file_lines = files.splitlines()

    va_install_dir = "build-intel-media-driver/install"

    output_files = [
        "lib/libva.so.2", "lib/libva-magma.so.2", "lib/libigdgmm.so.11",
        "iHD_drv_video.so"
    ]

    debug_output_files = [x + ".debug " for x in output_files]

    with open(args.depsfile, "w") as depsfile:
        for output_file in output_files + debug_output_files:
            depsfile.write(os.path.join(va_install_dir, output_file) + ": ")
            depsfile.write(" ".join(x.replace(' ', '\\ ') for x in file_lines))
            depsfile.write("\n")
    return 0


if __name__ == "__main__":
    sys.exit(main())
