build/buildutils/javacpp.py
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build/buildutils/javacpp.py	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,217 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#! /usr/bin/python
+
+import sys
+import traceback
+import os
+import os.path
+import sys
+import subprocess
+import shutil
+import re
+import types
+import zipfile
+
+from os.path import abspath
+
+"""
+#ifdef __JAVA_API_ENHANCEMENTS_SECURITY
+#if defined (CHAPI_SUPPORT)
+#ifdef __JAVA_API_ENHANCEMENTS_SECURITY
+#ifdef RD_JAVA_VOLUME_CONTROL
+#ifdef BLUETOOTH11
+#ifdef BLUETOOTH10
+#ifdef MIDP20BUILD
+#ifdef TESTBUILD
+#ifdef LCDUI_DEBUG
+#ifdef TRACE_GRAPHICS
+#ifdef GRAPHICS_BUFFER_DRAWPIXELS
+#ifndef XDEBUG
+#ifdef DEBUG
+#ifdef RD_JAVA_OMA_DRM_V2
+#ifdef _APIEXT_SECURITY_
+#ifdef BLUETOOTH_MASTER_SUPPORT
+#ifdef RD_JAVA_VMPORT_LAYER_IN_USE
+#ifdef RD_JAVA_LC
+
+
+"""
+
+def main():
+    try:
+        source = sys.argv[1]
+        destination = sys.argv[2]
+        print "source = "+source+", destination = "+destination
+        javaCpp(source, destination)
+    except:
+        print "Error during javaCpp "
+        traceback.print_exc()
+        sys.exit(-1)
+
+
+def javaCpp(sourceDirs, destinationDir):
+
+    # Find all .java-files to preprocess. If any two or more files represent
+    # the same class, discard the ones specified first using jsourcetree.
+    dirs = sourceDirs.strip().split(":")
+    #dirs = ["/s60/mw/java/javalegacy/j2me/components/lcduib/src/epoc/classes",
+    #        "/s60/mw/java/javaextensions/supplements/nokialcdui/javasrc"
+    #       ]
+    allJavas = {}
+    for d in dirs:
+        # Get all .java-files under sourcetree
+        print "DIR = "+d
+        javas = getJavaFiles(d)
+
+        for file in javas:
+            allJavas[file] = os.path.abspath(os.path.join(d, file))
+
+    for file in allJavas.keys():
+        # File name for preprocessed Java file
+        cppFile = os.path.join(destinationDir, file)
+
+        # File name to original Java file
+        javaFile = allJavas[file]
+
+        if not uptodate(javaFile, cppFile):
+            doCpp(javaFile, cppFile)
+
+
+def getJavaFiles(javasDir):
+    startDir = os.path.abspath(javasDir)
+
+    files = []
+    suffix = ".java"
+
+    def callBack(arg, dirname, files):
+        # Remove startDir-part from dirname
+        dirname = dirname[len(startDir) + 1:]
+        for file in files:
+            if file.endswith(suffix):
+                # replace '\' with '/' and strip the class name.
+                res = os.path.join(dirname, file)
+                arg.append(res)
+            
+    os.path.walk(startDir, callBack, files)
+    
+    return files
+
+
+def doCpp(
+        srcFile, 
+        dstFile):
+
+    macros = [
+              'JDEBUG(aMessage)=',
+              'JDEBUG_STATIC(aMessage)=',
+              'JPRINT(aMessage)=',
+              'JASSERT(aAssertion)=',
+              'JASSERT_STATIC(aAssertion)=',
+              'JASSERT_TXT(aAssertion,aMessage)=',
+              'JASSERT_TXT_STATIC(aAssertion,aMessage)=',
+              'JSOURCEDEBUG(aSourceCode)=',
+              'RD_JAVA_OMJ',
+              'RD_JAVA_OMA_DRM_V2',
+              'RD_JAVA_VOLUME_CONTROL'
+              ]
+
+    if not os.path.exists(dstFile):
+        makeDirs(dstFile, isFile = True)
+
+    # Use cpp defined on environment CPPCMD, as the cpp/gcc varies between symsee, abld, sbs, 
+    # linux, ...
+    if "CPPCMD" in os.environ:
+        cmd = os.environ["CPPCMD"]
+
+    else:
+        cmd = " ".join([
+            'gcc',                      # Generic GCC
+            '-E',                       # Preprocess only
+            '-undef',                   # Do not predefine any macros
+            '-P',                       # Do not generate #line directives
+            '-x', 'assembler-with-cpp', # Language as C++
+            '-w',                       # No warnings
+            '-traditional-cpp'])        # Use traditional precompilation
+
+    cmd = cmd + " " + " ".join(
+        ["-D" + m for m in macros] +
+        [srcFile, "-o", dstFile])
+
+    doExecute(cmd)
+
+def doExecute(
+        cmd, 
+        *args, 
+        **kwd):
+    """Any arguments are passed directly to subprocess.call(). """
+
+
+    # Construct string to be displayed on screen
+    """
+    msg = ""
+    if kwd.has_key('cwd'):
+        msg = "[" + kwd['cwd'] + "] "
+    if type(cmd) == types.StringType:
+        msg += cmd
+    elif type(cmd) == types.ListType:    
+        msg += " ".join(cmd)   
+    else:
+        raise Error, "Invalid type %s for cmd argument" % type(cmd)
+    sys.stderr.write("cmd = %s\n" % msg)
+    """
+    kwd['args'] = cmd    
+
+    process = subprocess.Popen(*args, **kwd)
+    return
+
+def uptodate(source, target):
+
+    if not os.path.exists(target):
+        return False
+
+    try:
+        fileTimeSrc = os.path.getmtime(source)
+        fileTimeDst = os.path.getmtime(target)
+        if fileTimeSrc > fileTimeDst :
+            result = False
+        else:
+            result = True
+        
+    except:
+        # One or more files don't exist
+        result = False
+
+    return result
+
+def makeDirs(directory, isFile = False):
+    """ Creates a directory if it doesn't exist. 
+
+    Doesn't do anything if the directory already exists. 
+
+    If isFile is True, the last element of the directory path is assumed to be
+    a file and is discarded from the path to be created. """
+
+    if isFile:
+        directory = os.path.dirname(directory)
+
+    try:
+        os.makedirs(directory)
+    except:
+        pass
+
+if __name__ == "__main__":
+    main()