159 lines
6.5 KiB
Python
Executable File
159 lines
6.5 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
"""
|
|
Copyright (C) 2019-2021 Intel Corporation
|
|
|
|
SPDX-License-Identifier: MIT
|
|
|
|
"""
|
|
import argparse
|
|
import util
|
|
import generate_code
|
|
import os, sys
|
|
import time
|
|
import json
|
|
|
|
"""
|
|
helper for adding mutually-exclusive boolean arguments "--name" and "--skip-name"
|
|
"""
|
|
def add_argument(parser, name, help, default=False):
|
|
group = parser.add_mutually_exclusive_group(required=False)
|
|
group.add_argument("--" + name, dest=name, help="Enable "+help, action="store_true")
|
|
group.add_argument("--skip-" + name, dest=name, help="Skip "+help, action="store_false")
|
|
parser.set_defaults(**{name:default})
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser()
|
|
add_argument(parser, "lib", "generation of lib files.", True)
|
|
add_argument(parser, "loader", "generation of loader files.", True)
|
|
add_argument(parser, "layers", "generation of validation layer files.", True)
|
|
add_argument(parser, "drivers", "generation of null driver files.", True)
|
|
parser.add_argument("--debug", action='store_true', help="dump intermediate data to disk.")
|
|
parser.add_argument("--sections", type=list, default=None, help="Optional list of sections for which to generate source, default is all")
|
|
parser.add_argument("--ver", type=str, default="1.0", help="specification version to generate.")
|
|
parser.add_argument('--api-json', nargs='?', type=argparse.FileType('r'), default=sys.stdin, help="JSON file containing the API specification, by default read from stdin")
|
|
parser.add_argument("out_dir", type=str, help="Root of the loader repository.")
|
|
args = parser.parse_args()
|
|
|
|
input = json.loads(args.api_json.read())
|
|
|
|
start = time.time()
|
|
|
|
srcpath = os.path.join(args.out_dir, "source")
|
|
|
|
for idx, specs in enumerate(input['specs']):
|
|
config = input['configs'][idx]
|
|
if args.sections == None or config['name'] in args.sections:
|
|
if args.lib:
|
|
generate_code.generate_lib(srcpath, config['name'], config['namespace'], config['tags'], args.ver, specs, input['meta'])
|
|
if args.loader:
|
|
generate_code.generate_loader(srcpath, config['name'], config['namespace'], config['tags'], args.ver, specs, input['meta'])
|
|
if args.layers:
|
|
generate_code.generate_layers(srcpath, config['name'], config['namespace'], config['tags'], args.ver, specs, input['meta'])
|
|
if args.drivers:
|
|
generate_code.generate_drivers(srcpath, config['name'], config['namespace'], config['tags'], args.ver, specs, input['meta'])
|
|
|
|
def merge_header_files(input_files, output_file):
|
|
"""
|
|
Merges the unique content of multiple header files into a single output file.
|
|
|
|
Args:
|
|
input_files: A list of paths to the input header files.
|
|
output_file: The path to the output file.
|
|
"""
|
|
try:
|
|
unique_lines = set()
|
|
for infile_path in input_files:
|
|
try:
|
|
with open(infile_path, 'r') as infile:
|
|
inside_factory = False
|
|
for line in infile:
|
|
if '/// factories' in line:
|
|
inside_factory = True
|
|
continue
|
|
if '/// end factories' in line:
|
|
inside_factory = False
|
|
continue
|
|
if inside_factory:
|
|
unique_lines.add(line)
|
|
except FileNotFoundError:
|
|
print(f"Error: Input file not found: {infile_path}")
|
|
return
|
|
|
|
with open(output_file, 'w') as outfile:
|
|
for line in sorted(unique_lines):
|
|
outfile.write(line)
|
|
print(f"Successfully merged unique header file content into: {output_file}")
|
|
except Exception as e:
|
|
print(f"An error occurred: {e}")
|
|
|
|
header_files = [
|
|
'source/loader/ze_loader_internal_tmp.h',
|
|
'source/loader/zet_loader_internal_tmp.h',
|
|
'source/loader/zes_loader_internal_tmp.h'
|
|
]
|
|
output_file = 'source/loader/ze_loader_internal_factories.h'
|
|
merge_header_files(header_files, output_file)
|
|
def replace_factory_section(input_file, factory_file, output_file):
|
|
"""
|
|
Replaces the content between '/// factory' and '/// end factory' in the input file
|
|
with the content from the factory file and writes the result to the output file.
|
|
|
|
Args:
|
|
input_file: The path to the input file.
|
|
factory_file: The path to the factory file.
|
|
output_file: The path to the output file.
|
|
"""
|
|
try:
|
|
with open(input_file, 'r') as infile:
|
|
lines = infile.readlines()
|
|
|
|
with open(factory_file, 'r') as factory:
|
|
factory_lines = factory.readlines()
|
|
|
|
output_lines = []
|
|
inside_factory = False
|
|
|
|
for line in lines:
|
|
if '/// factories' in line:
|
|
inside_factory = True
|
|
output_lines.append(line)
|
|
output_lines.extend(factory_lines)
|
|
elif '/// end factories' in line:
|
|
inside_factory = False
|
|
if not inside_factory:
|
|
output_lines.append(line)
|
|
|
|
with open(output_file, 'w') as outfile:
|
|
outfile.writelines(output_lines)
|
|
|
|
print(f"Successfully replaced factory section in: {output_file}")
|
|
except Exception as e:
|
|
print(f"An error occurred: {e}")
|
|
|
|
input_file = 'source/loader/ze_loader_internal_tmp.h'
|
|
factory_file = 'source/loader/ze_loader_internal_factories.h'
|
|
output_file = 'source/loader/ze_loader_internal.h'
|
|
replace_factory_section(input_file, factory_file, output_file)
|
|
|
|
# Delete temporary and factory files
|
|
files_to_delete = [
|
|
'source/loader/ze_loader_internal_tmp.h',
|
|
'source/loader/zet_loader_internal_tmp.h',
|
|
'source/loader/zes_loader_internal_tmp.h',
|
|
'source/loader/ze_loader_internal_factories.h'
|
|
]
|
|
|
|
for file_path in files_to_delete:
|
|
try:
|
|
os.remove(file_path)
|
|
print(f"Deleted file: {file_path}")
|
|
except FileNotFoundError:
|
|
print(f"File not found, could not delete: {file_path}")
|
|
except Exception as e:
|
|
print(f"An error occurred while deleting {file_path}: {e}")
|
|
|
|
if args.debug:
|
|
util.makoFileListWrite("generated.json")
|
|
|
|
print("\nCompleted in %.1f seconds!"%(time.time() - start))
|