1*4bdc9457SAndroid Build Coastguard Worker#!/usr/bin/env python 2*4bdc9457SAndroid Build Coastguard Worker# Copyright 2019 Google LLC 3*4bdc9457SAndroid Build Coastguard Worker# 4*4bdc9457SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 5*4bdc9457SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 6*4bdc9457SAndroid Build Coastguard Worker 7*4bdc9457SAndroid Build Coastguard Workerimport argparse 8*4bdc9457SAndroid Build Coastguard Workerimport codecs 9*4bdc9457SAndroid Build Coastguard Workerimport math 10*4bdc9457SAndroid Build Coastguard Workerimport os 11*4bdc9457SAndroid Build Coastguard Workerimport re 12*4bdc9457SAndroid Build Coastguard Workerimport sys 13*4bdc9457SAndroid Build Coastguard Workerimport yaml 14*4bdc9457SAndroid Build Coastguard Worker 15*4bdc9457SAndroid Build Coastguard Worker 16*4bdc9457SAndroid Build Coastguard WorkerROOT_DIR = os.path.dirname(os.path.abspath(__file__)) 17*4bdc9457SAndroid Build Coastguard Worker 18*4bdc9457SAndroid Build Coastguard Worker 19*4bdc9457SAndroid Build Coastguard Workerparser = argparse.ArgumentParser( 20*4bdc9457SAndroid Build Coastguard Worker description='Amalgamation utility for microkernels') 21*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("-s", "--set", metavar="SET", required=True, 22*4bdc9457SAndroid Build Coastguard Worker help="List of microkernel filenames in the BUILD file") 23*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("-o", "--output", metavar="FILE", required=True, 24*4bdc9457SAndroid Build Coastguard Worker help='Output (C source) file') 25*4bdc9457SAndroid Build Coastguard Worker 26*4bdc9457SAndroid Build Coastguard Worker 27*4bdc9457SAndroid Build Coastguard Workerdef main(args): 28*4bdc9457SAndroid Build Coastguard Worker options = parser.parse_args(args) 29*4bdc9457SAndroid Build Coastguard Worker 30*4bdc9457SAndroid Build Coastguard Worker build_path = os.path.join(ROOT_DIR, "..", "BUILD") 31*4bdc9457SAndroid Build Coastguard Worker 32*4bdc9457SAndroid Build Coastguard Worker with codecs.open(build_path, "r", encoding="utf-8") as build_file: 33*4bdc9457SAndroid Build Coastguard Worker build_text = build_file.read() 34*4bdc9457SAndroid Build Coastguard Worker 35*4bdc9457SAndroid Build Coastguard Worker pattern = r"\b" + options.set + r"\b\s*=\s*\[" 36*4bdc9457SAndroid Build Coastguard Worker match = re.search(pattern, build_text) 37*4bdc9457SAndroid Build Coastguard Worker if not match: 38*4bdc9457SAndroid Build Coastguard Worker raise ValueError( 39*4bdc9457SAndroid Build Coastguard Worker "Failed to find file set %s (regex \"%s\") inside the BUILD file" % 40*4bdc9457SAndroid Build Coastguard Worker (options.set, pattern)) 41*4bdc9457SAndroid Build Coastguard Worker 42*4bdc9457SAndroid Build Coastguard Worker start_pos = match.end() 43*4bdc9457SAndroid Build Coastguard Worker end_pos = build_text.find("]", start_pos) 44*4bdc9457SAndroid Build Coastguard Worker 45*4bdc9457SAndroid Build Coastguard Worker fileset = [filename.strip()[1:-1] for filename in 46*4bdc9457SAndroid Build Coastguard Worker build_text[start_pos:end_pos].split(",")] 47*4bdc9457SAndroid Build Coastguard Worker 48*4bdc9457SAndroid Build Coastguard Worker amalgam_lines = list() 49*4bdc9457SAndroid Build Coastguard Worker amalgam_includes = set() 50*4bdc9457SAndroid Build Coastguard Worker for filename in sorted(fileset): 51*4bdc9457SAndroid Build Coastguard Worker if not filename: 52*4bdc9457SAndroid Build Coastguard Worker continue 53*4bdc9457SAndroid Build Coastguard Worker 54*4bdc9457SAndroid Build Coastguard Worker filepath = os.path.join(ROOT_DIR, "..", filename) 55*4bdc9457SAndroid Build Coastguard Worker with codecs.open(filepath, "r", encoding="utf-8") as file: 56*4bdc9457SAndroid Build Coastguard Worker filelines = file.read().splitlines() 57*4bdc9457SAndroid Build Coastguard Worker 58*4bdc9457SAndroid Build Coastguard Worker consumed_license = False 59*4bdc9457SAndroid Build Coastguard Worker consumed_includes = False 60*4bdc9457SAndroid Build Coastguard Worker for line in filelines: 61*4bdc9457SAndroid Build Coastguard Worker if line.startswith("//"): 62*4bdc9457SAndroid Build Coastguard Worker if not consumed_license: 63*4bdc9457SAndroid Build Coastguard Worker # Skip and generate a standard license header for amalgamated file 64*4bdc9457SAndroid Build Coastguard Worker continue 65*4bdc9457SAndroid Build Coastguard Worker elif line.lstrip().startswith("#"): 66*4bdc9457SAndroid Build Coastguard Worker if not consumed_includes: 67*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.add(line) 68*4bdc9457SAndroid Build Coastguard Worker continue 69*4bdc9457SAndroid Build Coastguard Worker consumed_license = True 70*4bdc9457SAndroid Build Coastguard Worker elif not line: 71*4bdc9457SAndroid Build Coastguard Worker if not consumed_includes: 72*4bdc9457SAndroid Build Coastguard Worker # Skip empty lines until end of headers 73*4bdc9457SAndroid Build Coastguard Worker continue 74*4bdc9457SAndroid Build Coastguard Worker else: 75*4bdc9457SAndroid Build Coastguard Worker consumed_license = True 76*4bdc9457SAndroid Build Coastguard Worker consumed_includes = True 77*4bdc9457SAndroid Build Coastguard Worker 78*4bdc9457SAndroid Build Coastguard Worker amalgam_lines.append(line) 79*4bdc9457SAndroid Build Coastguard Worker 80*4bdc9457SAndroid Build Coastguard Worker amalgam_lines.append("") 81*4bdc9457SAndroid Build Coastguard Worker 82*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.discard("#include <emmintrin.h>") 83*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.discard("#include <immintrin.h>") 84*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.discard("#include <nmmintrin.h>") 85*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.discard("#include <smmintrin.h>") 86*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.discard("#include <tmmintrin.h>") 87*4bdc9457SAndroid Build Coastguard Worker amalgam_includes.discard("#include <xmmintrin.h>") 88*4bdc9457SAndroid Build Coastguard Worker 89*4bdc9457SAndroid Build Coastguard Worker amalgam_text = """\ 90*4bdc9457SAndroid Build Coastguard Worker// Copyright 2021 Google LLC 91*4bdc9457SAndroid Build Coastguard Worker// 92*4bdc9457SAndroid Build Coastguard Worker// This source code is licensed under the BSD-style license found in the 93*4bdc9457SAndroid Build Coastguard Worker// LICENSE file in the root directory of this source tree. 94*4bdc9457SAndroid Build Coastguard Worker 95*4bdc9457SAndroid Build Coastguard Worker""" 96*4bdc9457SAndroid Build Coastguard Worker 97*4bdc9457SAndroid Build Coastguard Worker amalgam_text += "\n".join(sorted(inc for inc in amalgam_includes if 98*4bdc9457SAndroid Build Coastguard Worker not inc.startswith("#include <xnnpack/"))) 99*4bdc9457SAndroid Build Coastguard Worker amalgam_text += "\n\n#include <immintrin.h>\n\n" 100*4bdc9457SAndroid Build Coastguard Worker amalgam_text += "\n".join(sorted(inc for inc in amalgam_includes if 101*4bdc9457SAndroid Build Coastguard Worker inc.startswith("#include <xnnpack/"))) 102*4bdc9457SAndroid Build Coastguard Worker amalgam_text += "\n\n\n" 103*4bdc9457SAndroid Build Coastguard Worker amalgam_text += "\n".join(amalgam_lines) 104*4bdc9457SAndroid Build Coastguard Worker 105*4bdc9457SAndroid Build Coastguard Worker 106*4bdc9457SAndroid Build Coastguard Worker 107*4bdc9457SAndroid Build Coastguard Worker txt_changed = True 108*4bdc9457SAndroid Build Coastguard Worker if os.path.exists(options.output): 109*4bdc9457SAndroid Build Coastguard Worker with open(options.output, "r", encoding="utf-8") as amalgam_file: 110*4bdc9457SAndroid Build Coastguard Worker txt_changed = amalgam_file.read() != amalgam_text 111*4bdc9457SAndroid Build Coastguard Worker 112*4bdc9457SAndroid Build Coastguard Worker if txt_changed: 113*4bdc9457SAndroid Build Coastguard Worker with open(options.output, "w", encoding="utf-8") as amalgam_file: 114*4bdc9457SAndroid Build Coastguard Worker amalgam_file.write(amalgam_text) 115*4bdc9457SAndroid Build Coastguard Worker 116*4bdc9457SAndroid Build Coastguard Worker 117*4bdc9457SAndroid Build Coastguard Workerif __name__ == "__main__": 118*4bdc9457SAndroid Build Coastguard Worker main(sys.argv[1:]) 119