#!/usr/bin/python import sys, os from os import path import shutil import glob baseDir = sys.path[0] os.chdir(baseDir) def cmdLineOptions(): return [s.lstrip('-') for s in sys.argv] proguardConfigRelease = [ 'microedition', 'keep,allowobfuscation,allowoptimization public class * extends org.javia.lib.midp.BasicMIDlet', 'allowaccessmodification', 'optimizationpasses 2', 'overloadaggressively', 'repackageclasses', 'dontusemixedcaseclassnames', 'printseeds', 'printmapping map.txt', 'adaptresourcefilecontents META-INF/MANIFEST.MF', 'applymapping tmp/mapping.txt', #'dontnote', ] proguardConfigDebug = [ 'microedition', 'keep public class * extends javax.microedition.midlet.MIDlet', 'dontobfuscate', 'dontshrink', 'dontoptimize', ] proguardOther = [ 'printusage', 'printseeds', 'keep class UnitTest { static void main(java.lang.String[]); }', 'mergeallclasses', 'printmapping map.txt', ] proguardDir = os.environ.get('PROGUARD_DIR') if not proguardDir: print "Set the environment variable PROGUARD_DIR" exit() wtkDir = os.environ.get('WTK_DIR') if not wtkDir: print "Set the environment variable WTK_DIR" exit() proguardCmd = 'java -jar %(proDir)s/lib/proguard.jar %(proConf)s -libraryjars %(libs)s %(injars)s -outjar %(dstDir)s' def libsToStr(libs): return ':'.join([path.join(wtkDir, 'lib', '%s.jar'%name) for name in libs]) def run(cmd): #print cmd parts = cmd.split() err = os.spawnvp(os.P_WAIT, parts[0], parts) assert not err, cmd def linesToString(lines): return ''.join(['%s: %s\n' % (key, value) for (key, value) in lines]) def writeFile(fileName, content): fo = open(fileName, 'w') fo.write(content) fo.close() def mkdir(*dirs): for path in dirs: try: os.makedirs(path) except OSError: pass buildOptionsTmpl = """ package org.javia.lib; class BuildOptions { static final boolean LOG_ENABLED = %(logEnabled)s; } """ #%(baseDir)s/ :%(baseDir)s/ javaCmd = "javac -bootclasspath %(libs)s %(optClassPath)s -sourcepath %(srcDir)s:src:lib -d %(dst)s -encoding utf-8 -source 1.4 -target 1.4 -%(debug)s %(srcs)s" def javac(midletClass, debug, strLibs, srcDir, dstDir, classpath): srcs = [path.join(*(['src'] + midletClass.split('.')))+'.java'] strSrcs = ' '.join(srcs) optClassPath = ('-cp ' + ':'.join(classpath)) if classpath else '' run(javaCmd % dict(srcDir=srcDir, debug=('g' if debug else 'g:none'), libs=strLibs, dst=dstDir, srcs=strSrcs, baseDir=baseDir, optClassPath=optClassPath)) testCmd = "java -cp %(jar)s org.javia.lib.UnitTest" jarCmd = 'jar cfm %(jarFile)s %(manifest)s %(icon)s -C %(classDir)s .' class Midlet(object): def __init__(self, cldc, midp, name, icon, cls, shortCls, version, vendor, infoUrl, classpath=[], extralibs=[], fileName=None): self.cldc = cldc self.midp = midp self.name = name self.icon = icon self.cls = cls self.shortCls = shortCls self.version = version self.vendor = vendor self.infoUrl = infoUrl self.extralibs = extralibs self.classpath = classpath self.fileName = fileName or name.lower() #name.lower() self.libs = ['cldcapi11' if cldc == '1.1' else 'cldcapi10', 'midpapi20' if midp == '2.0' else 'midpapi10'] self.libs += extralibs self.strLibs = libsToStr(self.libs) def getWorkDir(self, options, *subdirs): workDir = path.join(baseDir, 'tmp', self.version + ('-debug' if 'debug' in options else '')) workDir = path.join(workDir, *subdirs) mkdir(workDir) return workDir def commonLines(self): return [ ('MIDlet-Name', self.name), ('MIDlet-Vendor', self.vendor), ('MIDlet-Version', self.version), ('MIDlet-1', '%s,/%s,%s' % (self.name, self.icon, (self.cls if self.debug else self.shortCls))), ('MicroEdition-Configuration', 'CLDC-%s' % self.cldc), ('MicroEdition-Profile', 'MIDP-%s' % self.midp), ] def genManifest(self): lines = [ ('MIDlet-Info-URL', self.infoUrl), ] return linesToString(self.commonLines() + lines) # MIDlet-Install-Notify: http://menstral.net/install-notify # MIDlet-Delete-Notify: http://menstral.net/delete-notify def genJad(self, fileName, jarSize): lines = [ ('MIDlet-Jar-URL', '%s.jar' % fileName), ('MIDlet-Jar-Size', str(jarSize)), ] return linesToString(self.commonLines() + lines) def jar(self, midletFile, classDir, outDir): manifestFile = path.join(outDir, 'MANIFEST.MF') writeFile(manifestFile, self.manifest) jarFile = path.join(outDir, '%s.jar' % midletFile) iconStr = "-C src %(icon)s"%dict(icon= self.icon if self.icon else "") run(jarCmd % dict(jarFile=jarFile, manifest=manifestFile, classDir=classDir, icon=iconStr)) return jarFile def jad(midlet, midletFile, outDir): jarFile = path.join(outDir, '%s.jar' % midletFile) jadFile = path.join(outDir, '%s.jad' % midletFile) jarSize = os.stat(jarFile)[6] writeFile(jadFile, midlet.genJad(midletFile, jarSize)) def proguard(self, debug, outJar, classpath): conf = proguardConfigDebug if debug else proguardConfigRelease confStr = ' '.join(['-'+line for line in conf]) injars = '-injars ' + ':'.join(classpath) writeFile('tmp/mapping.txt', '%s -> %s:\n'%(self.cls, self.shortCls)) run(proguardCmd % dict(proDir=proguardDir, proConf=confStr, libs=self.strLibs, injars=injars, dstDir=outJar)) def build(self, options, midletFile=None, workDir=None): if 'help' in options: availableOptions = ['debug'] print 'Available options: ' print '\n'.join(availableOptions) return debug = 'debug' in options print ('Debug' if debug else 'Release') + ' build' self.debug = debug self.manifest = self.genManifest() outDir = path.join(baseDir, 'out', self.version+('-debug' if debug else '')) mkdir(outDir) if not midletFile: midletFile = self.fileName if not workDir: workDir = self.getWorkDir(options) srcDir = path.join(workDir, 'src') classDir = path.join(workDir, 'class') mkdir(path.join(srcDir, 'org/javia/lib'), classDir) buildOptions = buildOptionsTmpl%dict(logEnabled=('true' if debug else 'false')) writeFile(path.join(srcDir, 'org/javia/lib/BuildOptions.java'), buildOptions) javac(self.cls, debug, self.strLibs, srcDir, classDir, self.classpath) jarFile = self.jar(midletFile, classDir, workDir) self.proguard(debug, outDir+'/%s.jar'%midletFile, [jarFile] + self.classpath) self.jad(midletFile, outDir) #if debug: run(testCmd%dict(jar=jarFile))