# HG changeset patch
# User Edouard Tisserant
# Date 1390212259 -3600
# Node ID 435965ca8b6367668e56feb4ddc6df6ed187c998
# Parent 31c63a6248e1e28a107f7d299ec8f0c64066bfb4
Re-introduced toolchain_makefile.py. This time, it comes with a 'Generic' target, and a 'genericmake' example
diff -r 31c63a6248e1 -r 435965ca8b63 ProjectController.py
--- a/ProjectController.py Sun Jan 19 22:39:25 2014 +0100
+++ b/ProjectController.py Mon Jan 20 11:04:19 2014 +0100
@@ -665,7 +665,7 @@
# Keep track of generated C files for later use by self.CTNGenerate_C
self.PLCGeneratedCFiles = C_files
# compute CFLAGS for plc
- self.plcCFLAGS = "\"-I"+self.ieclib_path+"\""
+ self.plcCFLAGS = "-I"+self.ieclib_path
return True
def GetBuilder(self):
diff -r 31c63a6248e1 -r 435965ca8b63 targets/Generic/XSD
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/Generic/XSD Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,6 @@
+
+
+
+ %(toolchain_makefile)s
+
+
diff -r 31c63a6248e1 -r 435965ca8b63 targets/Generic/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/Generic/__init__.py Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,4 @@
+from ..toolchain_makefile import toolchain_makefile
+
+class Generic_target(toolchain_makefile):
+ pass
diff -r 31c63a6248e1 -r 435965ca8b63 targets/Generic/plc_Generic_main.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/Generic/plc_Generic_main.c Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,4 @@
+/**
+ * No platform specific code for "Generic" target
+ **/
+
diff -r 31c63a6248e1 -r 435965ca8b63 targets/XSD_toolchain_makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/XSD_toolchain_makefile Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,3 @@
+
+
+
diff -r 31c63a6248e1 -r 435965ca8b63 targets/__init__.py
--- a/targets/__init__.py Sun Jan 19 22:39:25 2014 +0100
+++ b/targets/__init__.py Mon Jan 20 11:04:19 2014 +0100
@@ -43,7 +43,8 @@
if path.isdir(path.join(_base_path, name))
and not name.startswith("__")])
-toolchains = {"gcc": path.join(_base_path, "XSD_toolchain_gcc")}
+toolchains = {"gcc": path.join(_base_path, "XSD_toolchain_gcc"),
+ "makefile": path.join(_base_path, "XSD_toolchain_makefile")}
def GetBuilder(targetname):
return targets[targetname]["class"]()
@@ -55,10 +56,8 @@
# Get all xsd toolchains
for toolchainname,xsdfilename in toolchains.iteritems() :
if path.isfile(xsdfilename):
- xsd_toolchain_string = ""
- for line in open(xsdfilename).readlines():
- xsd_toolchain_string += line
- DictXSD_toolchain["toolchain_"+toolchainname] = xsd_toolchain_string
+ DictXSD_toolchain["toolchain_"+toolchainname] = \
+ open(xsdfilename).read()
# Get all xsd targets
for targetname,nfo in targets.iteritems():
diff -r 31c63a6248e1 -r 435965ca8b63 targets/toolchain_makefile.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/toolchain_makefile.py Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,105 @@
+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)
+ 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 :
+ target = self.CTRInstance.GetTarget().getcontent()
+ beremizcommand = {"src": ' '.join(srcfiles),
+ "cflags": ' '.join(cflags),
+ "md5": self.md5key,
+ "buildpath": self.buildpath
+ }
+
+ command = [ token % beremizcommand for token in target.getCommand().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
+
diff -r 31c63a6248e1 -r 435965ca8b63 tests/genericmake/beremiz.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/genericmake/beremiz.xml Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff -r 31c63a6248e1 -r 435965ca8b63 tests/genericmake/plc.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/genericmake/plc.xml Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LocalVara
+
+
+
+
+
+
+
+
+
+
+
+
+ LocalVarb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 31c63a6248e1 -r 435965ca8b63 tests/genericmake/project_files/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/genericmake/project_files/Makefile Mon Jan 20 11:04:19 2014 +0100
@@ -0,0 +1,13 @@
+BEREMIZ_OBJS = $(BEREMIZSRC:.c=.o)
+
+all: warn some_binary
+ @echo "*** all done ***"
+
+warn:
+ @echo "*** Sample Makefile, does nothing ***"
+
+some_binary: $(BEREMIZ_OBJS)
+ @echo "* Would link $^ -> $@"
+
+%o : %c
+ @echo "* Would compile $< -> $@"