#!/usr/bin/env python3
# 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.
"""Wrapper around clang for nocompile tests.

The actual test functionality is largely implemented by clang itself. The
wrapper script exists for two purposes:
- generating an empty object file, so that nocompile GN targets can masquerade
  as source sets.
- generating a depfile on Windows. Normally, ninja parses /showIncludes output;
  unfortunately, this only works for compiler tools, not customm GN actions.
"""

import argparse
import pathlib
import os
import subprocess
import sys

sys.path.append(
    os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'build'))
import action_helpers


def main():
    parser = argparse.ArgumentParser(prog=sys.argv[0])
    parser.add_argument('--generate-depfile', action='store_true')
    parser.add_argument('compiler')
    parser.add_argument('source_path')
    parser.add_argument('obj_path')
    parser.add_argument('depfile_path')
    parser.add_argument('compiler_options', nargs=argparse.REMAINDER)

    args = parser.parse_args()

    compiler_args = [
        args.compiler,
    ]
    compiler_args += args.compiler_options
    compiler_args += [
        '-c',
        args.source_path,
    ]

    result = subprocess.run(compiler_args, stdout=subprocess.PIPE)

    if result.returncode == 0:
        pathlib.Path(args.obj_path).touch()
        if args.generate_depfile:
            # /showIncludes format:
            # Note: including file: third_party/libc++/src/include/stdio.h
            # Note: including file:  third_party/libc++/src/include/__config
            # Note: including file:   buildtools/third_party/libc++/__config_site
            # Note: including file: third_party/libc++/src/include/stdint.h

            # The prefix is locale-sensitive, but in practice, everything in the
            # Chrome build assumes the prefix is fixed.
            INCLUDE_PREFIX = 'Note: including file: '
            includes = map(
                lambda x: os.path.relpath(x[len(INCLUDE_PREFIX):].strip()),
                filter(
                    lambda x: x.startswith(INCLUDE_PREFIX),
                    result.stdout.decode('utf-8').splitlines(),
                ),
            )

            action_helpers.write_depfile(args.depfile_path, args.obj_path,
                                         includes)
    sys.exit(result.returncode)


if __name__ == '__main__':
    main()
