Flutter Engine
The Flutter Engine
find_headers.py
Go to the documentation of this file.
1#!/usr/bin/env python
2#
3# Copyright 2016 Google Inc.
4#
5# Use of this source code is governed by a BSD-style license that can be
6# found in the LICENSE file.
7
8from __future__ import print_function
9
10import collections
11import json
12import os
13import subprocess
14import sys
15
16# Finds all public sources in include directories then write them to skia.h.
17
18# Also write skia.h.deps, which Ninja uses to track dependencies. It's the
19# very same mechanism Ninja uses to know which .h files affect which .cpp files.
20
21gn = sys.argv[1]
22absolute_source = sys.argv[2]
23skia_h = sys.argv[3]
24include_dirs = sys.argv[4:]
25
26absolute_source = os.path.normpath(absolute_source)
27
28include_dirs = [os.path.join(os.path.normpath(include_dir), '')
29 for include_dir in include_dirs]
30include_dirs.sort(key=len, reverse=True)
31
32gn_desc_cmd = [gn, 'desc', '.', '--root=%s' % absolute_source, '--format=json',
33 '*']
34
35desc_json_txt = ''
36try:
37 desc_json_txt = subprocess.check_output(gn_desc_cmd).decode('utf-8')
38except subprocess.CalledProcessError as e:
39 print(e.output.decode('utf-8'))
40 raise
41
42if desc_json_txt.startswith('WARNING'):
43 print('\ngn generated a warning when we asked for JSON output.',
44 'To see the warning, run this command from the out_dir:',
45 '(you may need to quote the * argument)\n',
46 ' '.join(gn_desc_cmd),
47 '\n', sep='\n')
48 sys.exit(-1)
49
50desc_json = {}
51try:
52 desc_json = json.loads(desc_json_txt)
53except ValueError:
54 print(desc_json_txt)
55 raise
56
57sources = set()
58
59for target in desc_json.values():
60 # We'll use `public` headers if they're listed, or pull them from `sources`
61 # if not. GN sneaks in a default "public": "*" into the JSON if you don't
62 # set one explicitly.
63 search_list = target.get('public')
64 if search_list == '*':
65 search_list = target.get('sources', [])
66
67 for name in search_list:
68 sources.add(os.path.join(absolute_source, os.path.normpath(name[2:])))
69
70Header = collections.namedtuple('Header', ['absolute', 'include'])
71headers = {}
72for source in sources:
73 source_as_include = [os.path.relpath(source, absolute_source)
74 for include_dir in include_dirs
75 if source.startswith(include_dir)]
76 if not source_as_include:
77 continue
78 statinfo = os.stat(source)
79 key = str(statinfo.st_ino) + ':' + str(statinfo.st_dev)
80 # On Windows os.stat st_ino is 0 until 3.3.4 and st_dev is 0 until 3.4.0.
81 if key == '0:0':
82 key = source
83 include_path = source_as_include[0]
84 if key not in headers or len(include_path) < len(headers[key].include):
85 headers[key] = Header(source, include_path)
86
87headers = sorted(headers.values(), key=lambda x: x.include)
88
89with open(skia_h, 'w') as f:
90 f.write('// skia.h generated by GN.\n')
91 f.write('#ifndef skia_h_DEFINED\n')
92 f.write('#define skia_h_DEFINED\n')
93 for header in headers:
94 f.write('#include "' + header.include + '"\n')
95 f.write('#endif//skia_h_DEFINED\n')
96
97with open(skia_h + '.deps', 'w') as f:
98 f.write(skia_h + ':')
99 for header in headers:
100 f.write(' ' + header.absolute)
101 f.write(' build.ninja.d')
102 f.write('\n')
103
104# Temporary: during development this file wrote skia.h.d, not skia.h.deps,
105# and I think we have some bad versions of those files laying around.
106if os.path.exists(skia_h + '.d'):
107 os.remove(skia_h + '.d')
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not set
Definition: switches.h:76
def print(*args, **kwargs)
Definition: run_tests.py:49
static DecodeResult decode(std::string path)
Definition: png_codec.cpp:124
static SkString join(const CommandLineFlags::StringArray &)
Definition: skpbench.cpp:741