Moved makefile target into LPCManager, from sam beremiz revision
authorEdouard Tisserant
Sun, 20 May 2012 14:57:52 +0200
changeset 1 4f6d393cb36e
parent 0 51f5a3138405
child 2 0c697b8fc443
Moved makefile target into LPCManager, from sam beremiz revision
.hgignore
LPCManager.py
LPCconnector/__init__.pyc
LPCtarget/XSD_toolchain_makefile
LPCtarget/__init__.py
LPCtarget/__init__.pyc
LPCtarget/toolchain_makefile.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Sun May 20 14:57:52 2012 +0200
@@ -0,0 +1,6 @@
+.project
+
+syntax: regexp
+^.*\.pyc$
+syntax: regexp
+^\.settings.*$
--- a/LPCManager.py	Sun May 20 11:29:35 2012 +0200
+++ b/LPCManager.py	Sun May 20 14:57:52 2012 +0200
@@ -76,6 +76,7 @@
 targets.targets["LPC"]={"xsd": path.join(_base_path, "LPCtarget", "XSD"),
                         "class": LPC_target,
                         "code": path.join(_base_path,"LPCtarget","plc_LPC_main.c")} 
+targets.toolchains["makefile"]= path.join(_base_path, "LPCtarget", "XSD_toolchain_makefile"),
 
 from util import opjimg
 from plcopen.structures import LOCATIONDATATYPES
Binary file LPCconnector/__init__.pyc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPCtarget/XSD_toolchain_makefile	Sun May 20 14:57:52 2012 +0200
@@ -0,0 +1,6 @@
+
+          <xsd:attribute name="BuildPath" type="xsd:string" use="optional" default=""/>
+          <xsd:attribute name="Command" type="xsd:string" use="optional" default="make -C"/>
+          <xsd:attribute name="Arguments" type="xsd:string" use="optional" default="BEREMIZSRC=%(src)s BEREMIZCFLAGS=%(cflags)s MD5=%(md5)s USE_BEREMIZ=1 FROM_BEREMIZ=1 --quiet"/>
+          <xsd:attribute name="Rule" type="xsd:string" use="optional" default="all"/>
+          
--- a/LPCtarget/__init__.py	Sun May 20 11:29:35 2012 +0200
+++ b/LPCtarget/__init__.py	Sun May 20 14:57:52 2012 +0200
@@ -1,6 +1,6 @@
 import os
 from subprocess import Popen,PIPE
-from targets.toolchain_makefile import toolchain_makefile
+from toolchain_makefile import toolchain_makefile
 import hashlib
 
 class LPC_target(toolchain_makefile):
Binary file LPCtarget/__init__.pyc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPCtarget/toolchain_makefile.py	Sun May 20 14:57:52 2012 +0200
@@ -0,0 +1,108 @@
+import os, re, operator
+from util.ProcessLogger import ProcessLogger
+import hashlib
+
+import time
+
+includes_re =  re.compile('\s*#include\s*["<]([^">]*)[">].*')
+
+class toolchain_makefile():
+    def __init__(self, CTRInstance):
+        self.CTRInstance = CTRInstance
+        self.md5key = None 
+        self.buildpath = None
+        self.SetBuildPath(self.CTRInstance._getBuildPath())
+
+    def SetBuildPath(self, buildpath):
+        if self.buildpath != buildpath:
+            self.buildpath = buildpath
+            self.md5key = None
+
+    def GetBinaryCode(self):
+        return None
+
+    def _GetMD5FileName(self):
+        return os.path.join(self.buildpath, "lastbuildPLC.md5")
+
+    def ResetBinaryCodeMD5(self):
+        self.md5key = None
+        try:
+            os.remove(self._GetMD5FileName())
+        except Exception, e:
+            pass
+
+    def GetBinaryCodeMD5(self):
+        if self.md5key is not None:
+            return self.md5key
+        else:
+            try:
+                return open(self._GetMD5FileName(), "r").read()
+            except IOError, e:
+                return None
+
+    def concat_deps(self, bn):
+        # read source
+        src = open(os.path.join(self.buildpath, bn),"r").read()
+        # update direct dependencies
+        deps = []
+        for l in src.splitlines():
+            res = includes_re.match(l)
+            if res is not None:
+                depfn = res.groups()[0]
+                if os.path.exists(os.path.join(self.buildpath, depfn)):
+                    #print bn + " depends on "+depfn
+                    deps.append(depfn)
+        # recurse through deps
+        # TODO detect cicular deps.
+        return reduce(operator.concat, map(self.concat_deps, deps), src)
+
+    def build(self):
+        srcfiles= []
+        cflags = []
+        wholesrcdata = "" 
+        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
+            # Get CFiles list to give it to makefile
+            for CFile, CFLAGS in CFilesAndCFLAGS:
+                CFileName = os.path.basename(CFile)
+                wholesrcdata += self.concat_deps(CFileName)
+                #wholesrcdata += open(CFile, "r").read()
+                srcfiles.append(CFileName)
+                if CFLAGS not in cflags:
+                    cflags.append(CFLAGS)
+                        
+        oldmd5 = self.md5key
+        self.md5key = hashlib.md5(wholesrcdata).hexdigest()
+        props = self.CTRInstance.GetProjectProperties()
+        self.md5key += '#'.join([props[key] for key in ['companyName',
+                                                        'projectName',
+                                                        'productName']])
+        self.md5key += '#' #+','.join(map(str,time.localtime()))
+        # Store new PLC filename based on md5 key
+        f = open(self._GetMD5FileName(), "w")
+        f.write(self.md5key)
+        f.close()
+
+        if oldmd5 != self.md5key :
+            beremizcommand = {"src": ' '.join(srcfiles),
+                              "cflags": ' '.join(cflags),
+                              "md5": '"'+self.md5key+'"'
+                             }
+            
+            target = self.CTRInstance.GetTarget().getcontent()["value"]
+            command = target.getCommand().split(' ') +\
+                      [target.getBuildPath()] +\
+                      [arg % beremizcommand for arg in target.getArguments().split(' ')] +\
+                      target.getRule().split(' ')
+            
+            # Call Makefile to build PLC code and link it with target specific code
+            status, result, err_result = ProcessLogger(self.CTRInstance.logger,
+                                                       command).spin()
+            if status :
+                self.md5key = None
+                self.CTRInstance.logger.write_error(_("C compilation failed.\n"))
+                return False
+            return True
+        else :
+            self.CTRInstance.logger.write(_("Source didn't change, no build.\n"))
+            return True
+