File: gn_helper.py

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,122,156 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (91 lines) | stat: -rw-r--r-- 3,263 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Copyright 2024 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This provides an easy way to access args.gn."""

import os
import re
import sys


def _find_root(output_dir):
    curdir = output_dir
    while True:
        if os.path.exists(os.path.join(curdir, ".gn")):
            return curdir
        nextdir = os.path.join(curdir, "..")
        if os.path.abspath(curdir) == os.path.abspath(nextdir):
            raise Exception(
                'Could not find checkout in any parent of the current path.')
        curdir = nextdir


def _gn_lines(output_dir, path):
    """
    Generator function that returns args.gn lines one at a time, following
    import directives as needed.
    """
    import_re = re.compile(r'\s*import\("(.*)"\)')
    with open(path, encoding="utf-8") as f:
        for line in f:
            match = import_re.match(line)
            if match:
                raw_import_path = match.groups()[0]
                if raw_import_path[:2] == "//":
                    import_path = os.path.normpath(
                        os.path.join(_find_root(output_dir),
                                     raw_import_path[2:]))
                elif raw_import_path.startswith('/'):
                    # GN uses "/"-prefix as absolute path,
                    # https://gn.googlesource.com/gn/+/main/docs/reference.md#labels
                    # e.g.
                    #  /usr/local/foo:bar
                    #  /C:/Program Files/MyLibs:bar
                    # but Win32's absolute path doesn't have "/"-prefix.
                    if sys.platform.startswith('win32'):
                        import_path = raw_import_path[1:]
                    else:
                        import_path = raw_import_path
                    if not os.path.isabs(import_path):
                        raise Exception('Wrong absolute path for import %s' %
                                        raw_import_path)
                else:
                    if os.path.isabs(raw_import_path):
                        raise Execption(
                            'Absolute path "%s" should start with "/" in GN' %
                            raw_import_path)
                    import_path = os.path.normpath(
                        os.path.join(os.path.dirname(path), raw_import_path))
                yield from _gn_lines(output_dir, import_path)
            else:
                yield line


def _path(output_dir):
    return os.path.join(output_dir, "args.gn")


def exists(output_dir):
    """Checks args.gn exists in output_dir."""
    return os.path.exists(_path(output_dir))


def lines(output_dir):
    """Generator of args.gn lines. comment is removed."""
    if not exists(output_dir):
        return
    for line in _gn_lines(output_dir, _path(output_dir)):
        line_without_comment = line.split("#")[0]
        yield line_without_comment


_gn_arg_pattern = re.compile(r"(^|\s*)([^=\s]*)\s*=\s*(\S*)\s*$")


def args(output_dir):
    """Generator of args.gn's key,value pair."""
    for line in lines(output_dir):
        m = _gn_arg_pattern.match(line)
        if not m:
            continue
        yield (m.group(2), m.group(3))