1*a65addddSAndroid Build Coastguard Worker# Copyright 2016 Google Inc. All Rights Reserved. 2*a65addddSAndroid Build Coastguard Worker# 3*a65addddSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*a65addddSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*a65addddSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*a65addddSAndroid Build Coastguard Worker# 7*a65addddSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*a65addddSAndroid Build Coastguard Worker# 9*a65addddSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*a65addddSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS-IS" BASIS, 11*a65addddSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*a65addddSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*a65addddSAndroid Build Coastguard Worker# limitations under the License. 14*a65addddSAndroid Build Coastguard Workerfrom typing import List 15*a65addddSAndroid Build Coastguard Worker 16*a65addddSAndroid Build Coastguard Worker 17*a65addddSAndroid Build Coastguard Workerdef generate_makefile(cpp_files: List[str], executable_name: str, compile_command: str, link_command: str, link_command_suffix: str): 18*a65addddSAndroid Build Coastguard Worker assert executable_name + '.cpp' in cpp_files, '%s.cpp in %s' % (executable_name, cpp_files) 19*a65addddSAndroid Build Coastguard Worker 20*a65addddSAndroid Build Coastguard Worker link_rule_template = """ 21*a65addddSAndroid Build Coastguard Worker{executable_name}: {object_files} 22*a65addddSAndroid Build Coastguard Worker\t{link_command} {object_files} -o {executable_name} {link_command_suffix} 23*a65addddSAndroid Build Coastguard Worker 24*a65addddSAndroid Build Coastguard Worker{executable_name}_ram.txt: {object_files_ram_txt} 25*a65addddSAndroid Build Coastguard Worker\t(cat {object_files_ram_txt}; /bin/time -v {link_command} {object_files} -o {executable_name}.tmp {link_command_suffix} 2>&1 | fgrep 'Maximum resident set size' | sed 's|.*: ||') >{executable_name}_ram.txt 26*a65addddSAndroid Build Coastguard Worker""" 27*a65addddSAndroid Build Coastguard Worker compile_rule_template = """ 28*a65addddSAndroid Build Coastguard Worker{name}.o: {name}.cpp 29*a65addddSAndroid Build Coastguard Worker\t{compile_command} -c {name}.cpp -o {name}.o 30*a65addddSAndroid Build Coastguard Worker 31*a65addddSAndroid Build Coastguard Worker{name}.o_ram.txt: {name}.cpp 32*a65addddSAndroid Build Coastguard Worker\t/bin/time -v {compile_command} -c {name}.cpp -o {name}.o 2>&1 | fgrep 'Maximum resident set size' | sed 's|.*: ||' >{name}.o_ram.txt 33*a65addddSAndroid Build Coastguard Worker""" 34*a65addddSAndroid Build Coastguard Worker 35*a65addddSAndroid Build Coastguard Worker clean_rule_template = """ 36*a65addddSAndroid Build Coastguard Workerclean: 37*a65addddSAndroid Build Coastguard Worker\trm -f {object_files} {dep_files} {executable_name} {executable_name}_ram.txt {object_files_ram_txt} 38*a65addddSAndroid Build Coastguard Worker""" 39*a65addddSAndroid Build Coastguard Worker 40*a65addddSAndroid Build Coastguard Worker dep_file_deps = """ 41*a65addddSAndroid Build Coastguard Worker%.d: ; 42*a65addddSAndroid Build Coastguard Worker""" 43*a65addddSAndroid Build Coastguard Worker 44*a65addddSAndroid Build Coastguard Worker dep_files_includes_template = """ 45*a65addddSAndroid Build Coastguard Workerinclude {dep_files} 46*a65addddSAndroid Build Coastguard Worker""" 47*a65addddSAndroid Build Coastguard Worker 48*a65addddSAndroid Build Coastguard Worker compile_rules = [] 49*a65addddSAndroid Build Coastguard Worker object_files = [] 50*a65addddSAndroid Build Coastguard Worker object_files_ram_txt = [] 51*a65addddSAndroid Build Coastguard Worker dep_files = [] 52*a65addddSAndroid Build Coastguard Worker for cpp_file in cpp_files: 53*a65addddSAndroid Build Coastguard Worker assert cpp_file.endswith('.cpp') 54*a65addddSAndroid Build Coastguard Worker source = cpp_file[:-len('.cpp')] 55*a65addddSAndroid Build Coastguard Worker 56*a65addddSAndroid Build Coastguard Worker compile_rule = compile_rule_template.format( 57*a65addddSAndroid Build Coastguard Worker name=source, 58*a65addddSAndroid Build Coastguard Worker compile_command=compile_command) 59*a65addddSAndroid Build Coastguard Worker compile_rules.append(compile_rule) 60*a65addddSAndroid Build Coastguard Worker object_files.append('%s.o' % source) 61*a65addddSAndroid Build Coastguard Worker object_files_ram_txt.append('%s.o_ram.txt' % source) 62*a65addddSAndroid Build Coastguard Worker dep_files.append('%s.d' % source) 63*a65addddSAndroid Build Coastguard Worker 64*a65addddSAndroid Build Coastguard Worker link_rule = link_rule_template.format( 65*a65addddSAndroid Build Coastguard Worker object_files=' '.join(object_files), 66*a65addddSAndroid Build Coastguard Worker object_files_ram_txt=' '.join(object_files_ram_txt), 67*a65addddSAndroid Build Coastguard Worker link_command=link_command, 68*a65addddSAndroid Build Coastguard Worker link_command_suffix=link_command_suffix, 69*a65addddSAndroid Build Coastguard Worker executable_name=executable_name) 70*a65addddSAndroid Build Coastguard Worker 71*a65addddSAndroid Build Coastguard Worker clean_rule = clean_rule_template.format( 72*a65addddSAndroid Build Coastguard Worker object_files=' '.join(object_files), 73*a65addddSAndroid Build Coastguard Worker object_files_ram_txt=' '.join(object_files_ram_txt), 74*a65addddSAndroid Build Coastguard Worker executable_name=executable_name, 75*a65addddSAndroid Build Coastguard Worker dep_files=' '.join(dep_files)) 76*a65addddSAndroid Build Coastguard Worker 77*a65addddSAndroid Build Coastguard Worker dep_files_includes = dep_files_includes_template.format(dep_files=' '.join(dep_files)) 78*a65addddSAndroid Build Coastguard Worker 79*a65addddSAndroid Build Coastguard Worker # We put the link rule first so that it's the default Make target. 80*a65addddSAndroid Build Coastguard Worker return link_rule + ''.join(compile_rules) + clean_rule + dep_file_deps + dep_files_includes 81