#!/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 public class * extends javax.microedition.midlet.MIDlet', 'allowaccessmodification', 'optimizationpasses 2', 'overloadaggressively', 'repackageclasses', 'dontnote', ] proguardConfigDebug = [ 'microedition', 'keep public class * extends javax.microedition.midlet.MIDlet', 'dontobfuscate', 'dontshrink', 'dontoptimize', ] proguardOther = [ 'dontusemixedcaseclassnames', 'printusage', 'printseeds', 'keep class UnitTest { static void main(java.lang.String[]); }', 'mergeallclasses', 'printmapping map.txt', ] proguardDir = os.environ.get('PROGUARD', '/home/preda/proguard') proguardCmd = 'java -jar %(proDir)s/lib/proguard.jar %(proConf)s -libraryjars %(libs)s -injars %(srcDir)s -outjar %(dstDir)s' def proguard(debug, strLibs, workDir): conf = proguardConfigDebug if debug else proguardConfigRelease if debug: conf.append('dontobfuscate') confStr = ' '.join(['-'+line for line in conf]) srcDir = path.join(workDir, 'class') dstDir = path.join(workDir, 'guard') try: shutil.rmtree(dstDir) except OSError: pass run(proguardCmd % dict(proDir=proguardDir, proConf=confStr, libs=strLibs, srcDir=srcDir, dstDir=dstDir)) wtkDir = os.environ.get('WTK', '/home/preda/WTK') 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 jarCmd = 'jar cfm %(jarFile)s %(manifest)s %(icon)s -C %(workDir)s/guard .' buildOptionsTmpl = """ package org.javia.lib; class BuildOptions { static final boolean LOG_ENABLED = %(logEnabled)s; } """ #%(baseDir)s/ :%(baseDir)s/ javaCmd = "javac -bootclasspath %(libs)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): srcs = [path.join(*(['src'] + midletClass.split('.')))+'.java'] strSrcs = ' '.join(srcs) run(javaCmd % dict(srcDir=srcDir, debug=('g' if debug else 'g:none'), libs=strLibs, dst=dstDir, srcs=strSrcs, baseDir=baseDir)) testCmd = "java -cp %(jar)s org.javia.lib.UnitTest" class Midlet(object): def __init__(self, cldc, midp, name, icon, cls, version, vendor, infoUrl, extralibs, fileName=None): self.cldc = cldc self.midp = midp self.name = name self.icon = icon self.cls = cls self.version = version self.vendor = vendor self.infoUrl = infoUrl self.extralibs = extralibs self.fileName = fileName or name.lower() #name.lower() self.manifest = self.genManifest() 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 genManifest(self): lines = [ ('MIDlet-1', '%s,/%s,%s' % (self.name, self.icon, self.cls)), ('MIDlet-Name', self.name), ('MIDlet-Vendor', self.vendor), ('MIDlet-Version', self.version), ('MIDlet-Info-URL', self.infoUrl), ('MicroEdition-Configuration', 'CLDC-%s' % self.cldc), ('MicroEdition-Profile', 'MIDP-%s' % self.midp), ] return linesToString(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 self.manifest + linesToString(lines) def jar(midlet, midletFile, workDir, outDir): manifestFile = path.join(workDir, 'MANIFEST.MF') writeFile(manifestFile, midlet.manifest) jarFile = path.join(outDir, '%s.jar' % midletFile) iconStr = "-C src %(icon)s"%dict(icon= midlet.icon if midlet.icon else "") run(jarCmd % dict(jarFile=jarFile, midletFile=midletFile, manifest=manifestFile, workDir=workDir, 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 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' 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) proguard(debug, self.strLibs, workDir) jarFile = self.jar(midletFile, workDir, outDir) self.jad(midletFile, outDir) #if debug: run(testCmd%dict(jar=jarFile))