Revision: 3894
Author: janne.t.harkonen
Date: Tue Aug 24 23:23:55 2010
Log: Added jar creation possibility
http://code.google.com/p/robotframework/source/detail?r=3894
Modified:
/trunk/package.py
=======================================
--- /trunk/package.py Mon May 31 05:33:39 2010
+++ /trunk/package.py Tue Aug 24 23:23:55 2010
@@ -23,6 +23,7 @@
- wininst : create Windows installer
- all : create both packages
- version : update only version information in 'src/robot/version.py'
+ - jar : create stand-alone jar file containing RF and Jython
'version_number' must be a version number in format '2.x(.y)', 'trunk' or
'keep'. With 'keep', version information is not updated.
@@ -32,6 +33,9 @@
'version_number' is 'trunk', 'release_tag' is automatically assigned to the
current date.
+When creating the jar distribution, jython.jar must be placed in 'ext-lib'
+directory, under the project root.
+
This script uses 'setup.py' internally. Distribution packages are created
under 'dist' directory, which is deleted initially. Depending on your
system,
you may need to run this script with administrative rights (e.g.
with 'sudo').
@@ -49,12 +53,17 @@
import shutil
import re
import time
+import subprocess
+import zipfile
ROOT_PATH = os.path.dirname(__file__)
DIST_PATH = os.path.join(ROOT_PATH, 'dist')
BUILD_PATH = os.path.join(ROOT_PATH, 'build')
ROBOT_PATH = os.path.join(ROOT_PATH, 'src', 'robot')
+JAVA_SRC_ROOT = os.path.join(ROOT_PATH, 'src', 'java')
+JAVA_PKG = ('org', 'robotframework')
+JYTHON_JAR = os.path.join(ROOT_PATH, 'ext-lib', 'jython.jar')
SETUP_PATH = os.path.join(ROOT_PATH, 'setup.py')
VERSION_PATH = os.path.join(ROBOT_PATH, 'version.py')
VERSIONS = [re.compile('^2\.\d+(\.\d+)?$'), 'trunk', 'keep']
@@ -76,7 +85,7 @@
def get_full_version(who=''):
interpreter = sys.platform.startswith('java') and 'Jython'
or 'Python'
syversion = sys.version.split()[0]
- vers = '%%s %%s (%%s %%s on %%s)' %% (who, get_version(), interpreter,
+ vers = '%%s %%s (%%s %%s on %%s)' %% (who, get_version(), interpreter,
syversion, sys.platform)
return vers.strip()
@@ -89,7 +98,7 @@
_clean()
_create_sdist()
_announce()
-
+
def wininst(*version_info):
version(*version_info)
_clean()
@@ -113,7 +122,7 @@
_update_version(version_number, '%d%02d%02d' %
time.localtime()[:3])
else:
_update_version(version_number, _verify_version(release_tag,
RELEASES))
-
+
def _verify_version(given, valid):
for item in valid:
if given == item or (hasattr(item, 'search') and
item.search(given)):
@@ -131,7 +140,7 @@
sys.path.insert(0, ROBOT_PATH)
from version import get_version
print 'Keeping version %s' % get_version()
-
+
def _clean():
print 'Cleaning up...'
for path in [DIST_PATH, BUILD_PATH]:
@@ -144,14 +153,14 @@
print 'Windows installer was not created.'
return False
return True
-
+
def _create_sdist():
_create('sdist', 'source distribution')
def _create_wininst():
_create('bdist_wininst', 'Windows installer')
if os.sep != '\\':
- print 'Warning: Windows installers created on other platforms may
not'
+ print 'Warning: Windows installers created on other platforms may
not'
print 'be exactly identical to ones created in Windows.'
def _create(command, name):
@@ -167,6 +176,56 @@
for path in os.listdir(DIST_PATH):
print os.path.abspath(os.path.join(DIST_PATH, path))
+def jar():
+ _check_jython()
+ _compile_java_classes()
+ _create_jar()
+
+def _check_jython():
+ if not os.path.isfile(JYTHON_JAR):
+ raise ValueError()
+
+def _compile_java_classes():
+ source_path = os.path.join(JAVA_SRC_ROOT, *JAVA_PKG)
+ source_files = [ os.path.join(source_path, f) for f
+ in os.listdir(source_path) if f.endswith('java')]
+ print 'Compiling %d source files' % len(source_files)
+ subprocess.call(['javac', '-cp', JYTHON_JAR] + source_files)
+
+def _create_jar():
+ tmpdir = _create_tmpdir()
+ _copy_files_to(tmpdir)
+ _fill_jar_from(tmpdir)
+
+def _create_tmpdir():
+ tmpdir = os.path.join(ROOT_PATH, 'tmp-jar-dir')
+ if os.path.exists(tmpdir):
+ shutil.rmtree(tmpdir)
+ os.mkdir(tmpdir)
+ return tmpdir
+
+def _copy_files_to(tmpdir):
+ for srcdir, todir in [(ROBOT_PATH,
os.path.join(tmpdir, 'Lib', 'robot')),
+ (os.path.join(JAVA_SRC_ROOT, *JAVA_PKG),
os.path.join(tmpdir, 'org', 'robotframework')),
+ (os.path.join(JAVA_SRC_ROOT, 'META-INF'),
os.path.join(tmpdir, 'META-INF'))]:
+ shutil.copytree(srcdir, todir)
+
+def _fill_jar_from(tmpdir):
+ jar_path = os.path.join(DIST_PATH, 'robot.jar')
+ shutil.copyfile(JYTHON_JAR, jar_path)
+ jar = zipfile.ZipFile(jar_path, 'a')
+ os.chdir(tmpdir) # this is the easiest way to avoid 'tmp-jar-dir' in
paths copied to jar
+ for dirname in ('Lib', 'org', 'META-INF'):
+ _copy_files_to_jar(dirname, jar)
+ jar.close()
+
+def _copy_files_to_jar(dirname, jar):
+ for root, _, files in os.walk(dirname):
+ for name in files:
+ path = os.path.join(root, name)
+ print 'Adding %s to jar' % path
+ jar.write(path)
+
if __name__ == '__main__':
try: