xref: /aosp_15_r20/external/google-fruit/extras/benchmark/makefile_generator.py (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
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