#!/usr/bin/env python # # Copyright 2020 Google LLC # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import os import subprocess import sys skslc = sys.argv[1] lang = sys.argv[2] settings = sys.argv[3] inputs = sys.argv[4:] def makeEmptyFile(path): try: open(path, 'wb').close() except OSError: pass def compile(skslc, input, target, extension): target += extension try: subprocess.check_output([skslc, input, target, settings], stderr=subprocess.STDOUT) return True except subprocess.CalledProcessError as err: with open(target, 'wb') as dst: dst.write("### Compilation failed:\n\n") dst.write("\n".join(err.output.splitlines())) dst.write("\n") return False if settings != "--settings" and settings != "--nosettings": sys.exit("### Expected --settings or --nosettings, got " + settings) for input in inputs: noExt, ext = os.path.splitext(input) head, tail = os.path.split(noExt) targetDir = os.path.join(head, "golden") if not os.path.isdir(targetDir): os.mkdir(targetDir) target = os.path.join(targetDir, tail) if settings == "--nosettings": target += "StandaloneSettings" if lang == "--fp": # First, compile the CPP. If we get an error, stop here. if compile(skslc, input, target, ".cpp"): # Next, compile the header. if compile(skslc, input, target, ".h"): # Both files built successfully. continue else: # The header generated an error; this counts as an overall failure for this test. # Blank out the passing CPP output since it's not relevant in a failure case. makeEmptyFile(target + ".cpp") else: # The CPP generated an error. We didn't actually generate a header at all, but Ninja # expects an output file to exist or it won't reach steady-state. makeEmptyFile(target + ".h") elif lang == "--glsl": compile(skslc, input, target, ".glsl") elif lang == "--metal": compile(skslc, input, target, ".metal") else: sys.exit("### Expected one of: --fp --glsl --metal, got " + lang)