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 subprocess 10*c8dee2aaSAndroid Build Coastguard Workerimport sys 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Workersksl_minify = sys.argv[1] 13*c8dee2aaSAndroid Build Coastguard WorkertargetDir = sys.argv[2] 14*c8dee2aaSAndroid Build Coastguard Workermodules = sys.argv[3:] 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker# sksl-minify uses the dependency list to ensure that minified names are unique at global scope. 17*c8dee2aaSAndroid Build Coastguard Workerdependencies = { 18*c8dee2aaSAndroid Build Coastguard Worker 'sksl_compute': ['sksl_gpu', 'sksl_shared'], 19*c8dee2aaSAndroid Build Coastguard Worker 'sksl_gpu': ['sksl_shared'], 20*c8dee2aaSAndroid Build Coastguard Worker 'sksl_frag': ['sksl_gpu', 'sksl_shared'], 21*c8dee2aaSAndroid Build Coastguard Worker 'sksl_vert': ['sksl_gpu', 'sksl_shared'], 22*c8dee2aaSAndroid Build Coastguard Worker 'sksl_graphite_frag': ['sksl_frag', 'sksl_gpu', 'sksl_shared'], 23*c8dee2aaSAndroid Build Coastguard Worker 'sksl_graphite_frag_es2': ['sksl_frag', 'sksl_gpu', 'sksl_shared'], 24*c8dee2aaSAndroid Build Coastguard Worker 'sksl_graphite_vert': ['sksl_vert', 'sksl_gpu', 'sksl_shared'], 25*c8dee2aaSAndroid Build Coastguard Worker 'sksl_graphite_vert_es2': ['sksl_vert', 'sksl_gpu', 'sksl_shared'], 26*c8dee2aaSAndroid Build Coastguard Worker 'sksl_public': ['sksl_shared'], 27*c8dee2aaSAndroid Build Coastguard Worker 'sksl_rt_shader': ['sksl_public', 'sksl_shared'], 28*c8dee2aaSAndroid Build Coastguard Worker 'sksl_shared': [], 29*c8dee2aaSAndroid Build Coastguard Worker} 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Workerfor module in modules: 32*c8dee2aaSAndroid Build Coastguard Worker try: 33*c8dee2aaSAndroid Build Coastguard Worker moduleDir, moduleName = os.path.split(os.path.splitext(module)[0]) 34*c8dee2aaSAndroid Build Coastguard Worker if not os.path.isdir(targetDir): 35*c8dee2aaSAndroid Build Coastguard Worker os.mkdir(targetDir) 36*c8dee2aaSAndroid Build Coastguard Worker target = os.path.join(targetDir, moduleName) 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker # Determine the program kind based on the module name. 39*c8dee2aaSAndroid Build Coastguard Worker if "_compute" in module: 40*c8dee2aaSAndroid Build Coastguard Worker programKind = "--compute" 41*c8dee2aaSAndroid Build Coastguard Worker elif "_vert" in module: 42*c8dee2aaSAndroid Build Coastguard Worker programKind = "--vert" 43*c8dee2aaSAndroid Build Coastguard Worker else: 44*c8dee2aaSAndroid Build Coastguard Worker programKind = "--frag" 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker # Assemble the module dependency list and call sksl-minify to recreate the module in its 47*c8dee2aaSAndroid Build Coastguard Worker # minified form. 48*c8dee2aaSAndroid Build Coastguard Worker moduleList = [module] 49*c8dee2aaSAndroid Build Coastguard Worker if moduleName not in dependencies: 50*c8dee2aaSAndroid Build Coastguard Worker print("### Error compiling " + moduleName + ": dependency list must be specified") 51*c8dee2aaSAndroid Build Coastguard Worker exit(1) 52*c8dee2aaSAndroid Build Coastguard Worker for dependent in dependencies[moduleName]: 53*c8dee2aaSAndroid Build Coastguard Worker moduleList.append(os.path.join(moduleDir, dependent) + ".sksl") 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker # Generate fully-optimized and minified module data (for release/optimize-for-size builds). 56*c8dee2aaSAndroid Build Coastguard Worker destPath = target + ".minified.sksl" 57*c8dee2aaSAndroid Build Coastguard Worker args = [sksl_minify, programKind, "--stringify", destPath] + moduleList 58*c8dee2aaSAndroid Build Coastguard Worker subprocess.check_output(args).decode('utf-8') 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker # Generate unoptimized module data (used in debug, for improved readability). 61*c8dee2aaSAndroid Build Coastguard Worker destPath = target + ".unoptimized.sksl" 62*c8dee2aaSAndroid Build Coastguard Worker args = [sksl_minify, programKind, "--unoptimized", "--stringify", destPath] + moduleList 63*c8dee2aaSAndroid Build Coastguard Worker subprocess.check_output(args).decode('utf-8') 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker except subprocess.CalledProcessError as err: 66*c8dee2aaSAndroid Build Coastguard Worker print("### Error compiling " + module + ":") 67*c8dee2aaSAndroid Build Coastguard Worker print(err.output) 68*c8dee2aaSAndroid Build Coastguard Worker exit(1) 69