1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python 2*c8dee2aaSAndroid Build Coastguard Worker# 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2020 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 WorkerbatchCompile = True 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Workerskslc = sys.argv[1] 17*c8dee2aaSAndroid Build Coastguard Workerlang = sys.argv[2] 18*c8dee2aaSAndroid Build Coastguard Workersettings = sys.argv[3] 19*c8dee2aaSAndroid Build Coastguard Workerinput_root_dir = sys.argv[4] 20*c8dee2aaSAndroid Build Coastguard Workeroutput_root_dir = sys.argv[5] 21*c8dee2aaSAndroid Build Coastguard Worker# The last arg is a file containing a space seperated list of filenames 22*c8dee2aaSAndroid Build Coastguard Workerinput_file = sys.argv[6] 23*c8dee2aaSAndroid Build Coastguard Workerwith open(input_file, 'r') as reader: 24*c8dee2aaSAndroid Build Coastguard Worker inputs = shlex.split(reader.read()) 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Workerdef executeWorklist(input, worklist): 27*c8dee2aaSAndroid Build Coastguard Worker # Invoke skslc, passing in the worklist. 28*c8dee2aaSAndroid Build Coastguard Worker worklist.close() 29*c8dee2aaSAndroid Build Coastguard Worker try: 30*c8dee2aaSAndroid Build Coastguard Worker output = subprocess.check_output([ 31*c8dee2aaSAndroid Build Coastguard Worker skslc, worklist.name], stderr=subprocess.STDOUT).decode('utf-8', errors='ignore') 32*c8dee2aaSAndroid Build Coastguard Worker except subprocess.CalledProcessError as err: 33*c8dee2aaSAndroid Build Coastguard Worker if err.returncode != 1: 34*c8dee2aaSAndroid Build Coastguard Worker print("### " + input + " skslc error:\n") 35*c8dee2aaSAndroid Build Coastguard Worker #print("$ lldb out/Debug/skslc -- " + worklist.name + "\n\n") 36*c8dee2aaSAndroid Build Coastguard Worker print("\n".join(err.output.decode('utf-8', errors='ignore').splitlines())) 37*c8dee2aaSAndroid Build Coastguard Worker sys.exit(err.returncode) 38*c8dee2aaSAndroid Build Coastguard Worker pass # Compile errors (exit code 1) are expected and normal in test code 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker # Delete the worklist file now that execution is complete. 41*c8dee2aaSAndroid Build Coastguard Worker os.remove(worklist.name) 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Workerdef extensionForSpirvAsm(ext): 44*c8dee2aaSAndroid Build Coastguard Worker if (ext == '.compute'): 45*c8dee2aaSAndroid Build Coastguard Worker return '.comp' 46*c8dee2aaSAndroid Build Coastguard Worker return ext if (ext == '.frag' or ext == '.vert') else '.frag' 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Workerif settings != "--settings" and settings != "--nosettings": 49*c8dee2aaSAndroid Build Coastguard Worker sys.exit("### Expected --settings or --nosettings, got " + settings) 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Workerworklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w') 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker# Here we loop over the inputs and convert them into a worklist file for sksl-minify. 54*c8dee2aaSAndroid Build Coastguard Workerfor input in inputs: 55*c8dee2aaSAndroid Build Coastguard Worker # Derive the target path from the input filename and remove the extension so it can 56*c8dee2aaSAndroid Build Coastguard Worker # end with .minified.sksl 57*c8dee2aaSAndroid Build Coastguard Worker target = input.replace(input_root_dir, output_root_dir) 58*c8dee2aaSAndroid Build Coastguard Worker target = os.path.splitext(target)[0] 59*c8dee2aaSAndroid Build Coastguard Worker target_dir = os.path.dirname(target) 60*c8dee2aaSAndroid Build Coastguard Worker if not os.path.isdir(target_dir): 61*c8dee2aaSAndroid Build Coastguard Worker os.mkdir(target_dir) 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker noExt, ext = os.path.splitext(input) 64*c8dee2aaSAndroid Build Coastguard Worker head, tail = os.path.split(noExt) 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker if settings == "--nosettings": 67*c8dee2aaSAndroid Build Coastguard Worker target += "StandaloneSettings" 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker if lang == "--glsl": 70*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 71*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".glsl\n") 72*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 73*c8dee2aaSAndroid Build Coastguard Worker elif lang == "--metal": 74*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 75*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".metal\n") 76*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 77*c8dee2aaSAndroid Build Coastguard Worker elif lang == "--hlsl": 78*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 79*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".hlsl\n") 80*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 81*c8dee2aaSAndroid Build Coastguard Worker elif lang == "--spirv": 82*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 83*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".asm" + extensionForSpirvAsm(ext) + "\n") 84*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 85*c8dee2aaSAndroid Build Coastguard Worker elif lang == "--skrp": 86*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 87*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".skrp\n") 88*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 89*c8dee2aaSAndroid Build Coastguard Worker elif lang == "--stage": 90*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 91*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".stage\n") 92*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 93*c8dee2aaSAndroid Build Coastguard Worker elif lang == "--wgsl": 94*c8dee2aaSAndroid Build Coastguard Worker worklist.write(input + "\n") 95*c8dee2aaSAndroid Build Coastguard Worker worklist.write(target + ".wgsl\n") 96*c8dee2aaSAndroid Build Coastguard Worker worklist.write(settings + "\n\n") 97*c8dee2aaSAndroid Build Coastguard Worker else: 98*c8dee2aaSAndroid Build Coastguard Worker sys.exit("### Expected one of: --glsl --metal --hlsl --spirv --skrp " + 99*c8dee2aaSAndroid Build Coastguard Worker "--stage --wgsl, got " + lang) 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker # Compile items one at a time. 102*c8dee2aaSAndroid Build Coastguard Worker if not batchCompile: 103*c8dee2aaSAndroid Build Coastguard Worker executeWorklist(input, worklist) 104*c8dee2aaSAndroid Build Coastguard Worker worklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w') 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker# Compile everything all in one go. 107*c8dee2aaSAndroid Build Coastguard Workerif batchCompile: 108*c8dee2aaSAndroid Build Coastguard Worker executeWorklist("", worklist) 109*c8dee2aaSAndroid Build Coastguard Workerelse: 110*c8dee2aaSAndroid Build Coastguard Worker worklist.close() 111*c8dee2aaSAndroid Build Coastguard Worker os.remove(worklist.name) 112