mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 23:21:15 +00:00 
			
		
		
		
	
		
			
	
	
		
			96 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""Functions used to generate source files during build time
							 | 
						||
| 
								 | 
							
								All such functions are invoked in a subprocess on Windows to prevent build flakiness.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								from io import StringIO
							 | 
						||
| 
								 | 
							
								from platform_methods import subprocess_main
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def parse_template(inherits, source, delimiter):
							 | 
						||
| 
								 | 
							
								    script_template = {
							 | 
						||
| 
								 | 
							
								        "inherits": inherits,
							 | 
						||
| 
								 | 
							
								        "name": "",
							 | 
						||
| 
								 | 
							
								        "description": "",
							 | 
						||
| 
								 | 
							
								        "version": "",
							 | 
						||
| 
								 | 
							
								        "script": "",
							 | 
						||
| 
								 | 
							
								        "space-indent": "4",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    meta_prefix = delimiter + " meta-"
							 | 
						||
| 
								 | 
							
								    meta = ["name", "description", "version", "space-indent"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with open(source) as f:
							 | 
						||
| 
								 | 
							
								        lines = f.readlines()
							 | 
						||
| 
								 | 
							
								        for line in lines:
							 | 
						||
| 
								 | 
							
								            if line.startswith(meta_prefix):
							 | 
						||
| 
								 | 
							
								                line = line[len(meta_prefix) :]
							 | 
						||
| 
								 | 
							
								                for m in meta:
							 | 
						||
| 
								 | 
							
								                    if line.startswith(m):
							 | 
						||
| 
								 | 
							
								                        strip_lenght = len(m) + 1
							 | 
						||
| 
								 | 
							
								                        script_template[m] = line[strip_lenght:].strip()
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                script_template["script"] += line
							 | 
						||
| 
								 | 
							
								        if script_template["space-indent"] != "":
							 | 
						||
| 
								 | 
							
								            indent = " " * int(script_template["space-indent"])
							 | 
						||
| 
								 | 
							
								            script_template["script"] = script_template["script"].replace(indent, "_TS_")
							 | 
						||
| 
								 | 
							
								        if script_template["name"] == "":
							 | 
						||
| 
								 | 
							
								            script_template["name"] = os.path.splitext(os.path.basename(source))[0].replace("_", " ").title()
							 | 
						||
| 
								 | 
							
								        script_template["script"] = (
							 | 
						||
| 
								 | 
							
								            script_template["script"].replace('"', '\\"').lstrip().replace("\n", "\\n").replace("\t", "_TS_")
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        return (
							 | 
						||
| 
								 | 
							
								            '{ String("'
							 | 
						||
| 
								 | 
							
								            + script_template["inherits"]
							 | 
						||
| 
								 | 
							
								            + '"), String("'
							 | 
						||
| 
								 | 
							
								            + script_template["name"]
							 | 
						||
| 
								 | 
							
								            + '"),  String("'
							 | 
						||
| 
								 | 
							
								            + script_template["description"]
							 | 
						||
| 
								 | 
							
								            + '"),  String("'
							 | 
						||
| 
								 | 
							
								            + script_template["script"]
							 | 
						||
| 
								 | 
							
								            + '")'
							 | 
						||
| 
								 | 
							
								            + " },\n"
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def make_templates(target, source, env):
							 | 
						||
| 
								 | 
							
								    dst = target[0]
							 | 
						||
| 
								 | 
							
								    s = StringIO()
							 | 
						||
| 
								 | 
							
								    s.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n\n")
							 | 
						||
| 
								 | 
							
								    s.write("#ifndef _CODE_TEMPLATES_H\n")
							 | 
						||
| 
								 | 
							
								    s.write("#define _CODE_TEMPLATES_H\n\n")
							 | 
						||
| 
								 | 
							
								    s.write('#include "core/object/object.h"\n')
							 | 
						||
| 
								 | 
							
								    s.write('#include "core/object/script_language.h"\n')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    delimiter = "#"  # GDScript single line comment delimiter by default.
							 | 
						||
| 
								 | 
							
								    if source:
							 | 
						||
| 
								 | 
							
								        ext = os.path.splitext(source[0])[1]
							 | 
						||
| 
								 | 
							
								        if ext == ".cs":
							 | 
						||
| 
								 | 
							
								            delimiter = "//"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    parsed_template_string = ""
							 | 
						||
| 
								 | 
							
								    number_of_templates = 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for filepath in source:
							 | 
						||
| 
								 | 
							
								        node_name = os.path.basename(os.path.dirname(filepath))
							 | 
						||
| 
								 | 
							
								        parsed_template = parse_template(node_name, filepath, delimiter)
							 | 
						||
| 
								 | 
							
								        parsed_template_string += "\t" + parsed_template
							 | 
						||
| 
								 | 
							
								        number_of_templates += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    s.write("\nstatic const int TEMPLATES_ARRAY_SIZE = " + str(number_of_templates) + ";\n")
							 | 
						||
| 
								 | 
							
								    s.write("\nstatic const struct ScriptLanguage::ScriptTemplate TEMPLATES[" + str(number_of_templates) + "] = {\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    s.write(parsed_template_string)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    s.write("};\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    s.write("\n#endif\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with open(dst, "w") as f:
							 | 
						||
| 
								 | 
							
								        f.write(s.getvalue())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    s.close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								    subprocess_main(globals())
							 |