7Generates shim headers that mirror the directory structure of bundled headers,
8but just forward to the system ones.
10This allows seamless compilation against system headers with no changes
21#if defined(OFFICIAL_BUILD)
22#error shim headers must not be used in official builds!
28 parser = optparse.OptionParser()
29 parser.add_option(
'--headers-root', action=
'append')
30 parser.add_option(
'--define', action=
'append')
31 parser.add_option(
'--output-directory')
32 parser.add_option(
'--prefix', default=
'')
33 parser.add_option(
'--use-include-next', action=
'store_true')
34 parser.add_option(
'--outputs', action=
'store_true')
35 parser.add_option(
'--generate', action=
'store_true')
37 options, args = parser.parse_args(argv)
39 if not options.headers_root:
40 parser.error(
'Missing --headers-root parameter.')
41 if not options.output_directory:
42 parser.error(
'Missing --output-directory parameter.')
44 parser.error(
'Missing arguments - header file names.')
46 source_tree_root = os.path.abspath(
47 os.path.join(os.path.dirname(__file__),
'..'))
49 for root
in options.headers_root:
50 target_directory = os.path.join(
51 options.output_directory,
52 os.path.relpath(root, source_tree_root))
53 if options.generate
and not os.path.exists(target_directory):
54 os.makedirs(target_directory)
56 for header_spec
in args:
57 if ';' in header_spec:
60 include_after) = header_spec.split(
';', 2)
62 header_filename = header_spec
66 yield os.path.join(target_directory, header_filename)
68 header_path = os.path.join(target_directory, header_filename)
69 header_dir = os.path.dirname(header_path)
70 if not os.path.exists(header_dir):
71 os.makedirs(header_dir)
72 with open(header_path,
'w')
as f:
73 f.write(SHIM_TEMPLATE)
76 for define
in options.define:
77 key, value = define.split(
'=', 1)
80 f.write(
'#pragma push_macro("%s")\n' % key)
81 f.write(
'#undef %s\n' % key)
82 f.write(
'#define %s %s\n' % (key, value))
85 for header
in include_before.split(
':'):
86 f.write(
'#include %s\n' % header)
88 include_target = options.prefix + header_filename
89 if options.use_include_next:
90 f.write(
'#include_next <%s>\n' % include_target)
92 f.write(
'#include <%s>\n' % include_target)
95 for header
in include_after.split(
':'):
96 f.write(
'#include %s\n' % header)
99 for define
in options.define:
100 key, value = define.split(
'=', 1)
103 f.write(
'#pragma pop_macro("%s")\n' % key)
110if __name__ ==
'__main__':
static SkString join(const CommandLineFlags::StringArray &)