1 # Copyright 2013 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 """Writes C++ header/cc source files for embedding resources into C++.""" 6 7 import os 8 9 10 def WriteSource(base_name, 11 dir_from_src, 12 output_dir, 13 global_string_map): 14 """Writes C++ header/cc source files for the given map of string variables. 15 16 Args: 17 base_name: The basename of the file, without the extension. 18 dir_from_src: Path from src to the directory that will contain the file, 19 using forward slashes. 20 output_dir: Directory to output the sources to. 21 global_string_map: Map of variable names to their string values. These 22 variables will be available as globals. 23 """ 24 copyright = '\n'.join([ 25 '// Copyright 2013 The Chromium Authors. All rights reserved.', 26 '// Use of this source code is governed by a BSD-style license that ' 27 'can be', 28 '// found in the LICENSE file.']) 29 30 # Write header file. 31 externs = [] 32 for name in global_string_map.iterkeys(): 33 externs += ['extern const char %s[];' % name] 34 35 temp = '_'.join(dir_from_src.split('/') + [base_name]) 36 define = temp.upper() + '_H_' 37 header = '\n'.join([ 38 copyright, 39 '', 40 '#ifndef ' + define, 41 '#define ' + define, 42 '', 43 '\n'.join(externs), 44 '', 45 '#endif // ' + define]) 46 header += '\n' 47 48 with open(os.path.join(output_dir, base_name + '.h'), 'w') as f: 49 f.write(header) 50 51 # Write cc file. 52 def EscapeLine(line): 53 return line.replace('\\', '\\\\').replace('"', '\\"') 54 55 definitions = [] 56 for name, contents in global_string_map.iteritems(): 57 lines = [] 58 if '\n' not in contents: 59 lines = [' "%s"' % EscapeLine(contents)] 60 else: 61 for line in contents.split('\n'): 62 lines += [' "%s\\n"' % EscapeLine(line)] 63 definitions += ['const char %s[] =\n%s;' % (name, '\n'.join(lines))] 64 65 cc = '\n'.join([ 66 copyright, 67 '', 68 '#include "%s"' % (dir_from_src + '/' + base_name + '.h'), 69 '', 70 '\n'.join(definitions)]) 71 cc += '\n' 72 73 with open(os.path.join(output_dir, base_name + '.cc'), 'w') as f: 74 f.write(cc) 75