6b6b28e065
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@18 260f80e4-7a28-3924-810f-c04153c831b5
205 lines
6.8 KiB
Python
205 lines
6.8 KiB
Python
# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
|
|
# This python script compiles a set of java files and puts them all into a
|
|
# single .jar file.
|
|
|
|
import os
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
from optparse import OptionParser
|
|
|
|
# Filters out all arguments until the next '--' argument
|
|
# occurs.
|
|
def ListArgCallback(option, opt_str, value, parser):
|
|
if value is None:
|
|
value = []
|
|
|
|
for arg in parser.rargs:
|
|
if arg[:2].startswith('--'):
|
|
break
|
|
value.append(arg)
|
|
|
|
del parser.rargs[:len(value)]
|
|
setattr(parser.values, option.dest, value)
|
|
|
|
|
|
# Compiles all the java source files in srcDir.
|
|
def javaCompile(javac, srcDirectories, srcList, classpath,
|
|
classOutputDir, buildConfig, javacArgs,
|
|
sources):
|
|
# Check & prepare directories.
|
|
for srcDir in srcDirectories:
|
|
if not os.path.exists(srcDir):
|
|
sys.stderr.write('source directory not found: ' + srcDir + '\n')
|
|
return False
|
|
|
|
if os.path.exists(classOutputDir):
|
|
shutil.rmtree(classOutputDir)
|
|
os.makedirs(classOutputDir)
|
|
|
|
# Find all java files and write them in a temp file.
|
|
(tempFileDescriptor, javaFilesTempFileName) = tempfile.mkstemp()
|
|
javaFilesTempFile = os.fdopen(tempFileDescriptor, "w")
|
|
try:
|
|
if srcDirectories:
|
|
def findJavaFiles(arg, dirName, names):
|
|
for fileName in names:
|
|
(base, ext) = os.path.splitext(fileName)
|
|
if ext == '.java':
|
|
javaFilesTempFile.write(os.path.join(dirName, fileName) + '\n')
|
|
for srcDir in srcDirectories:
|
|
os.path.walk(srcDir, findJavaFiles, None)
|
|
|
|
if srcList:
|
|
f = open(srcList, 'r')
|
|
for line in f:
|
|
javaFilesTempFile.write(os.path.abspath(line))
|
|
f.close()
|
|
|
|
javaFilesTempFile.flush()
|
|
javaFilesTempFile.close()
|
|
|
|
# Prepare javac command.
|
|
command = [javac]
|
|
|
|
# Use a large enough heap to be able to compile all of the classes in one
|
|
# big compilation step.
|
|
command.append('-J-Xmx256m')
|
|
|
|
if buildConfig == 'Debug':
|
|
command.append('-g')
|
|
|
|
if srcDirectories:
|
|
command.append('-sourcepath')
|
|
command.append(os.pathsep.join(srcDirectories))
|
|
|
|
if classpath:
|
|
command.append('-classpath')
|
|
command.append(os.pathsep.join(classpath))
|
|
|
|
command.append('-d')
|
|
command.append(classOutputDir)
|
|
|
|
if srcDirectories or srcList:
|
|
command.append('@' + javaFilesTempFileName)
|
|
|
|
command = command + javacArgs
|
|
|
|
abs_sources = [os.path.abspath(source) for source in sources]
|
|
|
|
command = [' '.join(command)] + abs_sources
|
|
|
|
# Compile.
|
|
sys.stdout.write(' \\\n '.join(command) + '\n')
|
|
if os.system(' '.join(command)):
|
|
sys.stderr.write('java compilation failed\n')
|
|
return False
|
|
return True
|
|
finally:
|
|
os.remove(javaFilesTempFileName)
|
|
|
|
def copyProperties(propertyFiles, classOutputDir):
|
|
for file in propertyFiles:
|
|
if not os.path.isfile(file):
|
|
sys.stderr.write('property file not found: ' + file + '\n')
|
|
return False
|
|
|
|
if not os.path.exists(classOutputDir):
|
|
sys.stderr.write('classes dir not found: ' + classOutputDir + '\n')
|
|
return False
|
|
|
|
if propertyFiles == []:
|
|
return True
|
|
|
|
command = ['cp'] + propertyFiles + [classOutputDir]
|
|
commandStr = ' '.join(command)
|
|
sys.stdout.write(commandStr + '\n')
|
|
if os.system(commandStr):
|
|
sys.stderr.write('property file copy failed\n')
|
|
return False
|
|
return True
|
|
|
|
def createJar(classOutputDir, jarFileName):
|
|
if not os.path.exists(classOutputDir):
|
|
sys.stderr.write('classes dir not found: ' + classOutputDir + '\n')
|
|
return False
|
|
|
|
command = ['jar', 'cf', jarFileName, '-C', classOutputDir, '.']
|
|
commandStr = ' '.join(command)
|
|
sys.stdout.write(commandStr + '\n')
|
|
if os.system(commandStr):
|
|
sys.stderr.write('jar creation failed\n')
|
|
return False
|
|
return True
|
|
|
|
|
|
def main(args):
|
|
try:
|
|
# Parse input.
|
|
parser = OptionParser()
|
|
parser.add_option("--javac", default="javac",
|
|
action="store", type="string",
|
|
help="location of javac command")
|
|
parser.add_option("--sourceDir", dest="sourceDirs", default=[],
|
|
action="callback", callback=ListArgCallback,
|
|
help="specify a list of directories to look for " +
|
|
".java files to compile")
|
|
parser.add_option("--sources", dest="sources", default=[],
|
|
action="callback", callback=ListArgCallback,
|
|
help="specify a list of source files to compile")
|
|
parser.add_option("--sourceList", dest="sourceList",
|
|
action="store", type="string",
|
|
help="specify the file that contains the list of Java source files")
|
|
parser.add_option("--classpath", dest="classpath", default=[],
|
|
action="append", type="string",
|
|
help="specify referenced jar files")
|
|
parser.add_option("--classesDir",
|
|
action="store", type="string",
|
|
help="location of intermediate .class files")
|
|
parser.add_option("--jarFileName",
|
|
action="store", type="string",
|
|
help="name of the output jar file")
|
|
parser.add_option("--buildConfig",
|
|
action="store", type="string", default='Release',
|
|
help="Debug or Release")
|
|
parser.add_option("--javacArgs", dest="javacArgs", default=[],
|
|
action="callback", callback=ListArgCallback,
|
|
help="remaining args are passed directly to javac")
|
|
parser.add_option("--propertyFiles", dest="propertyFiles", default=[],
|
|
action="callback", callback=ListArgCallback,
|
|
help="specify a list of property files to copy")
|
|
|
|
(options, args) = parser.parse_args()
|
|
if not options.classesDir:
|
|
sys.stderr.write('--classesDir not specified\n')
|
|
return -1
|
|
if not options.jarFileName:
|
|
sys.stderr.write('--jarFileName not specified\n')
|
|
return -1
|
|
if len(options.sourceDirs) > 0 and options.sourceList:
|
|
sys.stderr.write("--sourceDir and --sourceList cannot be both specified");
|
|
return -1
|
|
|
|
# Compile and put into .jar file.
|
|
if not javaCompile(options.javac, options.sourceDirs,
|
|
options.sourceList, options.classpath,
|
|
options.classesDir, options.buildConfig,
|
|
options.javacArgs, options.sources):
|
|
return -1
|
|
if not copyProperties(options.propertyFiles, options.classesDir):
|
|
return -1
|
|
if not createJar(options.classesDir, options.jarFileName):
|
|
return -1
|
|
|
|
return 0
|
|
except Exception, inst:
|
|
sys.stderr.write('compile_java.py exception\n')
|
|
sys.stderr.write(str(inst))
|
|
return -1
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv))
|