#!/usr/bin/env python2.5 # # Armadillo File Manager # Copyright (c) 2010-2012, Robert Sesek # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or any later version. # import optparse import os import re import shutil import string import subprocess import sys import time ROOT = os.path.dirname(os.path.realpath(__file__)) SRC_PATH = os.path.join(ROOT, 'src') PROD_PATH = os.path.join(ROOT, 'frontend') FE_PATH = os.path.join(ROOT, 'frontend') CLOSURE_COMPILER = os.path.join(ROOT, 'closure-compiler.jar') VERSION_FILE = os.path.join(FE_PATH, 'version.js.proto') SOURCES_FE = [ 'jquery-1.7.1.js', 'utils.js', 'version.js', 'tv_renamer.js', 'path_control.js', 'actor.js', 'file.js', 'main.js', ] PRODUCT_NAME = 'armadillo' # The Golang version (hg id). BACK_END_COMPILER_VERSION = '920e9d1ffd1f (release-branch.go1) go1/release' def _CompileBackEnd(): args = [ 'go', 'build', '-v', '.' ] print ' ' + ' ' .join(args) handle = subprocess.Popen(args, stdout = sys.stdout, stderr = sys.stderr) handle.wait() def _StampVersion(options): print '=== Version Stamp ===' if os.path.exists(VERSION_FILE): gitcrement = subprocess.Popen([ 'gitcrement', 'next' ], stdout = subprocess.PIPE, cwd = ROOT) gitcrement.wait() build_stamp = gitcrement.stdout.read().strip() time_stamp = str(int(time.time())) fd = open(VERSION_FILE, 'a+') fd.seek(0) lines = fd.readlines() fd.seek(0) fd.truncate() for line in lines: line = re.sub(r'(BUILD =) ([0-9\.]+)', r'\1 ' + build_stamp, line) line = re.sub(r'(STAMP =) ([0-9]+)', r'\1 ' + time_stamp, line) fd.write(line) fd.close() print ' BUILD ' + build_stamp + ' @ ' + time_stamp if options.compile_fe: mfiles = subprocess.Popen([ 'git', 'ls-files', '-m' ], stdout = subprocess.PIPE, cwd = ROOT) mfiles.wait() versioned_stamp_file = string.replace(VERSION_FILE, '.proto', '') shutil.copy(VERSION_FILE, versioned_stamp_file) print ' COPY version.js.proto -> version.js' if not len(mfiles.stdout.readlines()): subprocess.Popen([ 'git', 'commit', '--author=Armadillo Build Script ', '-m', 'Stamp version.js @ ' + build_stamp + '.', versioned_stamp_file ], stdout = sys.stdout, stderr = sys.stderr).wait() def _CompileFrontEnd(options): # Version _StampVersion(options) # Compile JS. print '=== Compiling Front End ===' outfile = os.path.join(PROD_PATH, PRODUCT_NAME + '.js') if options.compile_fe: fe_sources = map(lambda f: '--js=' + os.path.join(FE_PATH, f), SOURCES_FE) args = [ 'java', '-jar', CLOSURE_COMPILER ] args.extend(fe_sources) args.extend(['--js_output_file', outfile, '--compilation_level', 'SIMPLE_OPTIMIZATIONS']) print ' ' + ' '.join(args) handle = subprocess.Popen(args, stdout = sys.stdout, stderr = sys.stderr) handle.wait() else: fd = open(outfile, 'w+') for fe_source in SOURCES_FE: fd2 = open(os.path.join(FE_PATH, fe_source), 'r') fd.write('// === ' + fe_source + '\n') fd.write(fd2.read()) fd2.close() fd.close() print ' DONE' def Main(): parser = optparse.OptionParser() parser.add_option('-c', '--closure_fe', action="store_true", dest="compile_fe", help="Run the Front End inputs through the Closure Compiler") parser.add_option('-b', '--back-end', action="store_true", dest="backend_only", help="Compiles only the back-end") parser.add_option('-f', '--front-end', action="store_true", dest="frontend_only", help="Compiles only the front-end") (options, args) = parser.parse_args() print '=== Starting Build ===' os.chdir(ROOT) if not options.frontend_only: _CompileBackEnd() if not options.backend_only: _CompileFrontEnd(options) if __name__ == '__main__': Main()