File: wrapper.py

package info (click to toggle)
chromium 138.0.7204.157-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,864 kB
  • sloc: cpp: 34,936,859; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,967; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (73 lines) | stat: -rwxr-xr-x 2,336 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/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()