15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#!/usr/bin/python 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# found in the LICENSE file. 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import os 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import shutil 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import subprocess 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import sys 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import tempfile 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def rel_to_abs(rel_path): 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) script_path = os.path.dirname(os.path.abspath(__file__)) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return os.path.join(script_path, rel_path) 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)java_bin_path = os.getenv('JAVA_HOME', '') 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if java_bin_path: 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) java_bin_path = os.path.join(java_bin_path, 'bin') 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)main_class = 'org.chromium.closure.compiler.Runner' 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)jar_name = 'runner.jar' 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)src_dir = 'src' 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)closure_jar_relpath = os.path.join('..', 'compiler', 'compiler.jar') 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)src_path = rel_to_abs(src_dir) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def run_and_communicate(command, error_template): 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print >> sys.stderr, command 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) proc.communicate() 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if proc.returncode: 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print >> sys.stderr, error_template % proc.returncode 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.exit(proc.returncode) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def build_artifacts(): 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print 'Compiling...' 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) java_files = [] 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for root, dirs, files in sorted(os.walk(src_path)): 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for file_name in files: 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) java_files.append(os.path.join(root, file_name)) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bin_path = tempfile.mkdtemp() 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manifest_file = tempfile.NamedTemporaryFile(mode='wt', delete=False) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manifest_file.write('Class-Path: %s\n' % closure_jar_relpath) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manifest_file.close() 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) javac_path = os.path.join(java_bin_path, 'javac') 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) javac_command = '%s -d %s -cp %s %s' % ( 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) javac_path, bin_path, rel_to_abs(closure_jar_relpath), 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ' '.join(java_files)) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_and_communicate(javac_command, 'Error: javac returned %d') 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print 'Building jar...' 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) artifact_path = rel_to_abs(jar_name) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) jar_path = os.path.join(java_bin_path, 'jar') 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) jar_command = '%s cvfme %s %s %s -C %s .' % ( 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) jar_path, artifact_path, manifest_file.name, main_class, bin_path) 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) run_and_communicate(jar_command, 'Error: jar returned %d') 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) finally: 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) os.remove(manifest_file.name) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) shutil.rmtree(bin_path, True) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print 'Done.' 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def show_usage_and_die(): 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print 'usage: %s' % os.path.basename(__file__) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print 'Builds runner.jar from the %s directory contents' % src_dir 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.exit(1) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def main(): 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if len(sys.argv) > 1: 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) show_usage_and_die() 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) build_artifacts() 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if __name__ == '__main__': 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) main() 84