xref: /aosp_15_r20/external/cronet/build/write_buildflag_header.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker# Copyright 2015 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker
6*6777b538SAndroid Build Coastguard Worker# This writes headers for build flags. See buildflag_header.gni for usage of
7*6777b538SAndroid Build Coastguard Worker# this system as a whole.
8*6777b538SAndroid Build Coastguard Worker#
9*6777b538SAndroid Build Coastguard Worker# The parameters are passed in a response file so we don't have to worry
10*6777b538SAndroid Build Coastguard Worker# about command line lengths. The name of the response file is passed on the
11*6777b538SAndroid Build Coastguard Worker# command line.
12*6777b538SAndroid Build Coastguard Worker#
13*6777b538SAndroid Build Coastguard Worker# The format of the response file is:
14*6777b538SAndroid Build Coastguard Worker#    [--flags <list of one or more flag values>]
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Workerimport optparse
17*6777b538SAndroid Build Coastguard Workerimport os
18*6777b538SAndroid Build Coastguard Workerimport re
19*6777b538SAndroid Build Coastguard Workerimport shlex
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Workerclass Options:
23*6777b538SAndroid Build Coastguard Worker  def __init__(self, output, rulename, header_guard, flags):
24*6777b538SAndroid Build Coastguard Worker    self.output = output
25*6777b538SAndroid Build Coastguard Worker    self.rulename = rulename
26*6777b538SAndroid Build Coastguard Worker    self.header_guard = header_guard
27*6777b538SAndroid Build Coastguard Worker    self.flags = flags
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Workerdef GetOptions():
31*6777b538SAndroid Build Coastguard Worker  parser = optparse.OptionParser()
32*6777b538SAndroid Build Coastguard Worker  parser.add_option('--output', help="Output header name inside --gen-dir.")
33*6777b538SAndroid Build Coastguard Worker  parser.add_option('--rulename',
34*6777b538SAndroid Build Coastguard Worker                    help="Helpful name of build rule for including in the " +
35*6777b538SAndroid Build Coastguard Worker                         "comment at the top of the file.")
36*6777b538SAndroid Build Coastguard Worker  parser.add_option('--gen-dir',
37*6777b538SAndroid Build Coastguard Worker                    help="Path to root of generated file directory tree.")
38*6777b538SAndroid Build Coastguard Worker  parser.add_option('--definitions',
39*6777b538SAndroid Build Coastguard Worker                    help="Name of the response file containing the flags.")
40*6777b538SAndroid Build Coastguard Worker  cmdline_options, cmdline_flags = parser.parse_args()
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker  # Compute a valid C++ header guard by replacing non valid chars with '_',
43*6777b538SAndroid Build Coastguard Worker  # upper-casing everything and prepending '_' if first symbol is digit.
44*6777b538SAndroid Build Coastguard Worker  header_guard = cmdline_options.output.upper()
45*6777b538SAndroid Build Coastguard Worker  if header_guard[0].isdigit():
46*6777b538SAndroid Build Coastguard Worker    header_guard = '_' + header_guard
47*6777b538SAndroid Build Coastguard Worker  header_guard = re.sub(r'[^\w]', '_', header_guard)
48*6777b538SAndroid Build Coastguard Worker  header_guard += '_'
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker  # The actual output file is inside the gen dir.
51*6777b538SAndroid Build Coastguard Worker  output = os.path.join(cmdline_options.gen_dir, cmdline_options.output)
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Worker  # Definition file in GYP is newline separated, in GN they are shell formatted.
54*6777b538SAndroid Build Coastguard Worker  # shlex can parse both of these.
55*6777b538SAndroid Build Coastguard Worker  with open(cmdline_options.definitions, 'r') as def_file:
56*6777b538SAndroid Build Coastguard Worker    defs = shlex.split(def_file.read())
57*6777b538SAndroid Build Coastguard Worker  flags_index = defs.index('--flags')
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker  # Everything after --flags are flags. true/false are remapped to 1/0,
60*6777b538SAndroid Build Coastguard Worker  # everything else is passed through.
61*6777b538SAndroid Build Coastguard Worker  flags = []
62*6777b538SAndroid Build Coastguard Worker  for flag in defs[flags_index + 1 :]:
63*6777b538SAndroid Build Coastguard Worker    equals_index = flag.index('=')
64*6777b538SAndroid Build Coastguard Worker    key = flag[:equals_index]
65*6777b538SAndroid Build Coastguard Worker    value = flag[equals_index + 1:]
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker    # Canonicalize and validate the value.
68*6777b538SAndroid Build Coastguard Worker    if value == 'true':
69*6777b538SAndroid Build Coastguard Worker      value = '1'
70*6777b538SAndroid Build Coastguard Worker    elif value == 'false':
71*6777b538SAndroid Build Coastguard Worker      value = '0'
72*6777b538SAndroid Build Coastguard Worker    flags.append((key, str(value)))
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker  return Options(output=output,
75*6777b538SAndroid Build Coastguard Worker                 rulename=cmdline_options.rulename,
76*6777b538SAndroid Build Coastguard Worker                 header_guard=header_guard,
77*6777b538SAndroid Build Coastguard Worker                 flags=flags)
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Workerdef WriteHeader(options):
81*6777b538SAndroid Build Coastguard Worker  with open(options.output, 'w') as output_file:
82*6777b538SAndroid Build Coastguard Worker    output_file.write("// Generated by build/write_buildflag_header.py\n")
83*6777b538SAndroid Build Coastguard Worker    if options.rulename:
84*6777b538SAndroid Build Coastguard Worker      output_file.write('// From "' + options.rulename + '"\n')
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker    output_file.write('\n#ifndef %s\n' % options.header_guard)
87*6777b538SAndroid Build Coastguard Worker    output_file.write('#define %s\n\n' % options.header_guard)
88*6777b538SAndroid Build Coastguard Worker    output_file.write('#include "build/buildflag.h" // IWYU pragma: export\n\n')
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker    for pair in options.flags:
91*6777b538SAndroid Build Coastguard Worker      output_file.write('#define BUILDFLAG_INTERNAL_%s() (%s)\n' % pair)
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker    output_file.write('\n#endif  // %s\n' % options.header_guard)
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Workeroptions = GetOptions()
97*6777b538SAndroid Build Coastguard WorkerWriteHeader(options)
98