1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2019 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker# 4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker# 8*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker# 10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker 16*6dbdd20aSAndroid Build Coastguard Worker# This writes headers for build flags. See the gen_buildflags target in 17*6dbdd20aSAndroid Build Coastguard Worker# /gn/BUILD.gn for usage. 18*6dbdd20aSAndroid Build Coastguard Worker# 19*6dbdd20aSAndroid Build Coastguard Worker# The parameters are passed in a response file so we don't have to worry 20*6dbdd20aSAndroid Build Coastguard Worker# about command line lengths. The name of the response file is passed on the 21*6dbdd20aSAndroid Build Coastguard Worker# command line. 22*6dbdd20aSAndroid Build Coastguard Worker# 23*6dbdd20aSAndroid Build Coastguard Worker# The format of the response file is: 24*6dbdd20aSAndroid Build Coastguard Worker# [--flags <list of one or more flag values>] 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Workerimport argparse 27*6dbdd20aSAndroid Build Coastguard Workerimport os 28*6dbdd20aSAndroid Build Coastguard Workerimport shlex 29*6dbdd20aSAndroid Build Coastguard Workerimport sys 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard WorkerCOPYRIGHT_HEADER = '''/* 32*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 33*6dbdd20aSAndroid Build Coastguard Worker * 34*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 35*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 36*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 37*6dbdd20aSAndroid Build Coastguard Worker * 38*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 39*6dbdd20aSAndroid Build Coastguard Worker * 40*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 41*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 42*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 43*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 44*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 45*6dbdd20aSAndroid Build Coastguard Worker */ 46*6dbdd20aSAndroid Build Coastguard Worker 47*6dbdd20aSAndroid Build Coastguard Worker''' 48*6dbdd20aSAndroid Build Coastguard Worker 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard Workerdef main(): 51*6dbdd20aSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 52*6dbdd20aSAndroid Build Coastguard Worker parser.add_argument('--rsp', help='Input response file containing the flags.') 53*6dbdd20aSAndroid Build Coastguard Worker parser.add_argument('--out', help='Output path of the generated header file.') 54*6dbdd20aSAndroid Build Coastguard Worker args = parser.parse_args() 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker flags = [] 57*6dbdd20aSAndroid Build Coastguard Worker with open(args.rsp, 'r') as def_file: 58*6dbdd20aSAndroid Build Coastguard Worker marker_seen = False 59*6dbdd20aSAndroid Build Coastguard Worker for flag in shlex.split(def_file.read()): 60*6dbdd20aSAndroid Build Coastguard Worker if not marker_seen: 61*6dbdd20aSAndroid Build Coastguard Worker marker_seen = flag == '--flags' 62*6dbdd20aSAndroid Build Coastguard Worker continue 63*6dbdd20aSAndroid Build Coastguard Worker key, value = flag.split('=', 1) 64*6dbdd20aSAndroid Build Coastguard Worker value = '1' if value == 'true' else '0' if value == 'false' else value 65*6dbdd20aSAndroid Build Coastguard Worker flags.append((key, value)) 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker guard = '%s_' % args.out.upper() 68*6dbdd20aSAndroid Build Coastguard Worker guard = guard.replace('/', '_').replace('\\', '_').replace('.', '_') \ 69*6dbdd20aSAndroid Build Coastguard Worker .replace('-', '_') 70*6dbdd20aSAndroid Build Coastguard Worker lines = [] 71*6dbdd20aSAndroid Build Coastguard Worker lines.append('// Generated by %s' % os.path.basename(__file__)) 72*6dbdd20aSAndroid Build Coastguard Worker lines.append('') 73*6dbdd20aSAndroid Build Coastguard Worker lines.append('// fix_include_guards: off') 74*6dbdd20aSAndroid Build Coastguard Worker lines.append('#ifndef %s' % guard) 75*6dbdd20aSAndroid Build Coastguard Worker lines.append('#define %s' % guard) 76*6dbdd20aSAndroid Build Coastguard Worker lines.append('') 77*6dbdd20aSAndroid Build Coastguard Worker lines.append('// clang-format off') 78*6dbdd20aSAndroid Build Coastguard Worker for kv in flags: 79*6dbdd20aSAndroid Build Coastguard Worker lines.append('#define PERFETTO_BUILDFLAG_DEFINE_%s() (%s)' % kv) 80*6dbdd20aSAndroid Build Coastguard Worker lines.append('') 81*6dbdd20aSAndroid Build Coastguard Worker lines.append('// clang-format on') 82*6dbdd20aSAndroid Build Coastguard Worker lines.append('#endif // %s' % guard) 83*6dbdd20aSAndroid Build Coastguard Worker lines.append('') 84*6dbdd20aSAndroid Build Coastguard Worker 85*6dbdd20aSAndroid Build Coastguard Worker with open(args.out, 'w', newline='\n') as out: 86*6dbdd20aSAndroid Build Coastguard Worker out.write(COPYRIGHT_HEADER) 87*6dbdd20aSAndroid Build Coastguard Worker out.write('\n'.join(lines)) 88*6dbdd20aSAndroid Build Coastguard Worker 89*6dbdd20aSAndroid Build Coastguard Worker 90*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__': 91*6dbdd20aSAndroid Build Coastguard Worker sys.exit(main()) 92