xref: /aosp_15_r20/external/cronet/build/android/gyp/gcc_preprocess.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker#
3*6777b538SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors
4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerimport argparse
8*6777b538SAndroid Build Coastguard Workerimport os
9*6777b538SAndroid Build Coastguard Workerimport posixpath
10*6777b538SAndroid Build Coastguard Workerimport re
11*6777b538SAndroid Build Coastguard Workerimport sys
12*6777b538SAndroid Build Coastguard Workerimport zipfile
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workerfrom util import build_utils
15*6777b538SAndroid Build Coastguard Workerimport action_helpers  # build_utils adds //build to sys.path.
16*6777b538SAndroid Build Coastguard Workerimport zip_helpers
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerdef _ParsePackageName(data):
20*6777b538SAndroid Build Coastguard Worker  m = re.match(r'^\s*package\s+(.*?)\s*;', data, re.MULTILINE)
21*6777b538SAndroid Build Coastguard Worker  return m.group(1) if m else ''
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Workerdef main(args):
25*6777b538SAndroid Build Coastguard Worker  args = build_utils.ExpandFileArgs(args)
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
28*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--include-dirs', help='GN list of include directories.')
29*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--output', help='Path for .srcjar.')
30*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--define',
31*6777b538SAndroid Build Coastguard Worker                      action='append',
32*6777b538SAndroid Build Coastguard Worker                      dest='defines',
33*6777b538SAndroid Build Coastguard Worker                      help='List of -D args')
34*6777b538SAndroid Build Coastguard Worker  parser.add_argument('templates', nargs='+', help='Template files.')
35*6777b538SAndroid Build Coastguard Worker  options = parser.parse_args(args)
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker  options.defines = action_helpers.parse_gn_list(options.defines)
38*6777b538SAndroid Build Coastguard Worker  options.include_dirs = action_helpers.parse_gn_list(options.include_dirs)
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker  gcc_cmd = [
41*6777b538SAndroid Build Coastguard Worker      'gcc',
42*6777b538SAndroid Build Coastguard Worker      '-E',  # stop after preprocessing.
43*6777b538SAndroid Build Coastguard Worker      '-DANDROID',  # Specify ANDROID define for pre-processor.
44*6777b538SAndroid Build Coastguard Worker      '-x',
45*6777b538SAndroid Build Coastguard Worker      'c-header',  # treat sources as C header files
46*6777b538SAndroid Build Coastguard Worker      '-P',  # disable line markers, i.e. '#line 309'
47*6777b538SAndroid Build Coastguard Worker  ]
48*6777b538SAndroid Build Coastguard Worker  gcc_cmd.extend('-D' + x for x in options.defines)
49*6777b538SAndroid Build Coastguard Worker  gcc_cmd.extend('-I' + x for x in options.include_dirs)
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker  with action_helpers.atomic_output(options.output) as f:
52*6777b538SAndroid Build Coastguard Worker    with zipfile.ZipFile(f, 'w') as z:
53*6777b538SAndroid Build Coastguard Worker      for template in options.templates:
54*6777b538SAndroid Build Coastguard Worker        data = build_utils.CheckOutput(gcc_cmd + [template])
55*6777b538SAndroid Build Coastguard Worker        package_name = _ParsePackageName(data)
56*6777b538SAndroid Build Coastguard Worker        if not package_name:
57*6777b538SAndroid Build Coastguard Worker          raise Exception('Could not find java package of ' + template)
58*6777b538SAndroid Build Coastguard Worker        zip_path = posixpath.join(
59*6777b538SAndroid Build Coastguard Worker            package_name.replace('.', '/'),
60*6777b538SAndroid Build Coastguard Worker            os.path.splitext(os.path.basename(template))[0]) + '.java'
61*6777b538SAndroid Build Coastguard Worker        zip_helpers.add_to_zip_hermetic(z, zip_path, data=data)
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
65*6777b538SAndroid Build Coastguard Worker  main(sys.argv[1:])
66