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