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