1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python 2*c8dee2aaSAndroid Build Coastguard Worker# 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2022 Google LLC 4*c8dee2aaSAndroid Build Coastguard Worker# 5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Workerimport os 9*c8dee2aaSAndroid Build Coastguard Workerimport shlex 10*c8dee2aaSAndroid Build Coastguard Workerimport subprocess 11*c8dee2aaSAndroid Build Coastguard Workerimport sys 12*c8dee2aaSAndroid Build Coastguard Workerimport tempfile 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard WorkerbatchMinify = False 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Workersksl_minify = sys.argv[1] 17*c8dee2aaSAndroid Build Coastguard Workershared_module = sys.argv[2] 18*c8dee2aaSAndroid Build Coastguard Workerpublic_module = sys.argv[3] 19*c8dee2aaSAndroid Build Coastguard Workerrt_shader_module = sys.argv[4] 20*c8dee2aaSAndroid Build Coastguard Workerinput_root_dir = sys.argv[5] 21*c8dee2aaSAndroid Build Coastguard Workeroutput_root_dir = sys.argv[6] 22*c8dee2aaSAndroid Build Coastguard Worker# The last arg is a file containing a space seperated list of filenames 23*c8dee2aaSAndroid Build Coastguard Workerinput_file = sys.argv[7] 24*c8dee2aaSAndroid Build Coastguard Workerwith open(input_file, 'r') as reader: 25*c8dee2aaSAndroid Build Coastguard Worker all_inputs = shlex.split(reader.read()) 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Workerinputs = [] 28*c8dee2aaSAndroid Build Coastguard Workerfor file in all_inputs: 29*c8dee2aaSAndroid Build Coastguard Worker if (file.endswith(".rts") or file.endswith(".privrts") or file.endswith(".rtcf") or 30*c8dee2aaSAndroid Build Coastguard Worker file.endswith(".rtb") or file.endswith(".mfrag") or file.endswith(".mvert")): 31*c8dee2aaSAndroid Build Coastguard Worker inputs.append(file) 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Workerdef executeWorklist(input, worklist): 34*c8dee2aaSAndroid Build Coastguard Worker # Invoke sksl-minify, passing in the worklist. 35*c8dee2aaSAndroid Build Coastguard Worker worklist.close() 36*c8dee2aaSAndroid Build Coastguard Worker try: 37*c8dee2aaSAndroid Build Coastguard Worker output = subprocess.check_output([ 38*c8dee2aaSAndroid Build Coastguard Worker sksl_minify, worklist.name], stderr=subprocess.STDOUT).decode('utf-8', errors='ignore') 39*c8dee2aaSAndroid Build Coastguard Worker except subprocess.CalledProcessError as err: 40*c8dee2aaSAndroid Build Coastguard Worker if err.returncode != 1: 41*c8dee2aaSAndroid Build Coastguard Worker print("### " + input + " sksl-minify error:\n") 42*c8dee2aaSAndroid Build Coastguard Worker print("\n".join(err.output.decode('utf-8', errors='ignore').splitlines())) 43*c8dee2aaSAndroid Build Coastguard Worker sys.exit(err.returncode) 44*c8dee2aaSAndroid Build Coastguard Worker pass # Compile errors (exit code 1) are expected and normal in test code 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker # Delete the worklist file now that execution is complete. 47*c8dee2aaSAndroid Build Coastguard Worker os.remove(worklist.name) 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Workerworklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w') 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker# Here we loop over the inputs and convert them into a worklist file for sksl-minify. 52*c8dee2aaSAndroid Build Coastguard Workerfor input in inputs: 53*c8dee2aaSAndroid Build Coastguard Worker # Derive the target path from the input filename and remove the extension so it can 54*c8dee2aaSAndroid Build Coastguard Worker # end with .minified.sksl 55*c8dee2aaSAndroid Build Coastguard Worker target = input.replace(input_root_dir, output_root_dir) 56*c8dee2aaSAndroid Build Coastguard Worker target = os.path.splitext(target)[0] 57*c8dee2aaSAndroid Build Coastguard Worker target_dir = os.path.dirname(target) 58*c8dee2aaSAndroid Build Coastguard Worker if not os.path.isdir(target_dir): 59*c8dee2aaSAndroid Build Coastguard Worker os.mkdir(target_dir) 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker noExt, ext = os.path.splitext(input) 62*c8dee2aaSAndroid Build Coastguard Worker head, tail = os.path.split(noExt) 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker if ext == '.rts': 65*c8dee2aaSAndroid Build Coastguard Worker worklist.write("--shader\n") 66*c8dee2aaSAndroid Build Coastguard Worker elif ext == '.privrts': 67*c8dee2aaSAndroid Build Coastguard Worker worklist.write("--privshader\n") 68*c8dee2aaSAndroid Build Coastguard Worker elif ext == '.rtcf': 69*c8dee2aaSAndroid Build Coastguard Worker worklist.write("--colorfilter\n") 70*c8dee2aaSAndroid Build Coastguard Worker elif ext == '.rtb': 71*c8dee2aaSAndroid Build Coastguard Worker worklist.write("--blender\n") 72*c8dee2aaSAndroid Build Coastguard Worker elif ext == '.mfrag': 73*c8dee2aaSAndroid Build Coastguard Worker worklist.write("--meshfrag\n") 74*c8dee2aaSAndroid Build Coastguard Worker elif ext == '.mvert': 75*c8dee2aaSAndroid Build Coastguard Worker worklist.write("--meshvert\n") 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".minified.sksl\n") 78*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 79*c8dee2aaSAndroid Build Coastguard Worker if ext == '.privrts': 80*c8dee2aaSAndroid Build Coastguard Worker worklist.write(rt_shader_module + "\n") 81*c8dee2aaSAndroid Build Coastguard Worker worklist.write(public_module + "\n") 82*c8dee2aaSAndroid Build Coastguard Worker worklist.write(shared_module + "\n\n") 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker # Compile items one at a time. 85*c8dee2aaSAndroid Build Coastguard Worker if not batchMinify: 86*c8dee2aaSAndroid Build Coastguard Worker executeWorklist(input, worklist) 87*c8dee2aaSAndroid Build Coastguard Worker worklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w') 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker# Compile everything all in one go. 90*c8dee2aaSAndroid Build Coastguard Workerif batchMinify: 91*c8dee2aaSAndroid Build Coastguard Worker executeWorklist("", worklist) 92*c8dee2aaSAndroid Build Coastguard Workerelse: 93*c8dee2aaSAndroid Build Coastguard Worker worklist.close() 94*c8dee2aaSAndroid Build Coastguard Worker os.remove(worklist.name) 95