X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/a01113dcd0f39d5da295ef82785beff9ed86fe38..340931cb2e044a2141d11567dd0f782524e32994:/icuSources/data/buildtool/renderers/makefile.py diff --git a/icuSources/data/buildtool/renderers/makefile.py b/icuSources/data/buildtool/renderers/makefile.py deleted file mode 100644 index 9b2005b0..00000000 --- a/icuSources/data/buildtool/renderers/makefile.py +++ /dev/null @@ -1,245 +0,0 @@ -# Copyright (C) 2018 and later: Unicode, Inc. and others. -# License & terms of use: http://www.unicode.org/copyright.html - -# Python 2/3 Compatibility (ICU-20299) -# TODO(ICU-20301): Remove this. -from __future__ import print_function - -from . import * -from .. import * -from .. import utils -from ..request_types import * - -def get_gnumake_rules(build_dirs, requests, makefile_vars, **kwargs): - makefile_string = "" - - # Common Variables - common_vars = kwargs["common_vars"] - for key, value in sorted(makefile_vars.items()): - makefile_string += "{KEY} = {VALUE}\n".format( - KEY = key, - VALUE = value - ) - makefile_string += "\n" - - # Directories - dirs_timestamp_file = "{TMP_DIR}/dirs.timestamp".format(**common_vars) - makefile_string += "DIRS = {TIMESTAMP_FILE}\n\n".format( - TIMESTAMP_FILE = dirs_timestamp_file - ) - makefile_string += "{TIMESTAMP_FILE}:\n\t$(MKINSTALLDIRS) {ALL_DIRS}\n\techo timestamp > {TIMESTAMP_FILE}\n\n".format( - TIMESTAMP_FILE = dirs_timestamp_file, - ALL_DIRS = " ".join(build_dirs).format(**common_vars) - ) - - # Generate Rules - make_rules = [] - for request in requests: - make_rules += get_gnumake_rules_helper(request, **kwargs) - - # Main Commands - for rule in make_rules: - if isinstance(rule, MakeFilesVar): - makefile_string += "{NAME} = {FILE_LIST}\n\n".format( - NAME = rule.name, - FILE_LIST = files_to_makefile(rule.files, wrap = True, **kwargs), - ) - continue - - if isinstance(rule, MakeStringVar): - makefile_string += "define {NAME}\n{CONTENT}\nendef\nexport {NAME}\n\n".format( - NAME = rule.name, - CONTENT = rule.content - ) - continue - - assert isinstance(rule, MakeRule) - header_line = "{OUT_FILE}: {DEP_FILES} {DEP_LITERALS} | $(DIRS)".format( - OUT_FILE = files_to_makefile([rule.output_file], **kwargs), - DEP_FILES = files_to_makefile(rule.dep_files, wrap = True, **kwargs), - DEP_LITERALS = " ".join(rule.dep_literals) - ) - - if len(rule.cmds) == 0: - makefile_string += "%s\n\n" % header_line - continue - - makefile_string += "{HEADER_LINE}\n{RULE_LINES}\n\n".format( - HEADER_LINE = header_line, - RULE_LINES = "\n".join("\t%s" % cmd for cmd in rule.cmds) - ) - - return makefile_string - -def files_to_makefile(files, common_vars, wrap = False, **kwargs): - if len(files) == 0: - return "" - dirnames = [utils.dir_for(file).format(**common_vars) for file in files] - join_str = " \\\n\t\t" if wrap and len(files) > 2 else " " - if len(files) == 1: - return "%s/%s" % (dirnames[0], files[0].filename) - elif len(set(dirnames)) == 1: - return "$(addprefix %s/,%s)" % (dirnames[0], join_str.join(file.filename for file in files)) - else: - return join_str.join("%s/%s" % (d, f.filename) for d,f in zip(dirnames, files)) - -def get_gnumake_rules_helper(request, common_vars, **kwargs): - - if isinstance(request, PrintFileRequest): - var_name = "%s_CONTENT" % request.name.upper() - return [ - MakeStringVar( - name = var_name, - content = request.content - ), - MakeRule( - name = request.name, - dep_literals = [], - dep_files = [], - output_file = request.output_file, - cmds = [ - "echo \"$${VAR_NAME}\" > {MAKEFILENAME}".format( - VAR_NAME = var_name, - MAKEFILENAME = files_to_makefile([request.output_file], common_vars), - **common_vars - ) - ] - ) - ] - - - if isinstance(request, CopyRequest): - return [ - MakeRule( - name = request.name, - dep_literals = [], - dep_files = [request.input_file], - output_file = request.output_file, - cmds = ["cp %s %s" % ( - files_to_makefile([request.input_file], common_vars), - files_to_makefile([request.output_file], common_vars)) - ] - ) - ] - - if isinstance(request, VariableRequest): - return [ - MakeFilesVar( - name = request.name.upper(), - files = request.input_files - ) - ] - - if request.tool.name == "make": - cmd_template = "$(MAKE) {ARGS}" - elif request.tool.name == "gentest": - cmd_template = "$(INVOKE) $(GENTEST) {ARGS}" - else: - assert isinstance(request.tool, IcuTool) - cmd_template = "$(INVOKE) $(TOOLBINDIR)/{TOOL} {{ARGS}}".format( - TOOL = request.tool.name - ) - - if isinstance(request, SingleExecutionRequest): - cmd = utils.format_single_request_command(request, cmd_template, common_vars) - dep_files = request.all_input_files() - - if len(request.output_files) > 1: - # Special case for multiple output files: Makefile rules should have only one - # output file apiece. More information: - # https://www.gnu.org/software/automake/manual/html_node/Multiple-Outputs.html - timestamp_var_name = "%s_ALL" % request.name.upper() - timestamp_file = TmpFile("%s.timestamp" % request.name) - rules = [ - MakeFilesVar( - name = timestamp_var_name, - files = [timestamp_file] - ), - MakeRule( - name = "%s_all" % request.name, - dep_literals = [], - dep_files = dep_files, - output_file = timestamp_file, - cmds = [ - cmd, - "echo timestamp > {MAKEFILENAME}".format( - MAKEFILENAME = files_to_makefile([timestamp_file], common_vars) - ) - ] - ) - ] - for i, file in enumerate(request.output_files): - rules += [ - MakeRule( - name = "%s_%d" % (request.name, i), - dep_literals = ["$(%s)" % timestamp_var_name], - dep_files = [], - output_file = file, - cmds = [] - ) - ] - return rules - - elif len(dep_files) > 5: - # For nicer printing, for long input lists, use a helper variable. - dep_var_name = "%s_DEPS" % request.name.upper() - return [ - MakeFilesVar( - name = dep_var_name, - files = dep_files - ), - MakeRule( - name = request.name, - dep_literals = ["$(%s)" % dep_var_name], - dep_files = [], - output_file = request.output_files[0], - cmds = [cmd] - ) - ] - - else: - return [ - MakeRule( - name = request.name, - dep_literals = [], - dep_files = dep_files, - output_file = request.output_files[0], - cmds = [cmd] - ) - ] - - if isinstance(request, RepeatedExecutionRequest): - rules = [] - dep_literals = [] - # To keep from repeating the same dep files many times, make a variable. - if len(request.common_dep_files) > 0: - dep_var_name = "%s_DEPS" % request.name.upper() - dep_literals = ["$(%s)" % dep_var_name] - rules += [ - MakeFilesVar( - name = dep_var_name, - files = request.common_dep_files - ) - ] - # Add a rule for each individual file. - for loop_vars in utils.repeated_execution_request_looper(request): - (_, specific_dep_files, input_file, output_file) = loop_vars - name_suffix = input_file[input_file.filename.rfind("/")+1:input_file.filename.rfind(".")] - cmd = utils.format_repeated_request_command( - request, - cmd_template, - loop_vars, - common_vars - ) - rules += [ - MakeRule( - name = "%s_%s" % (request.name, name_suffix), - dep_literals = dep_literals, - dep_files = specific_dep_files + [input_file], - output_file = output_file, - cmds = [cmd] - ) - ] - return rules - - assert False