greg@425: import os, re, operator greg@425: from wxPopen import ProcessLogger greg@425: import hashlib, shutil greg@425: from toolchain_gcc import toolchain_gcc greg@425: greg@425: includes_re = re.compile('\s*#include\s*["<]([^">]*)[">].*') greg@425: edouard@508: class toolchain_makefile(): edouard@508: def __init__(self, PluginsRootInstance): edouard@508: self.PluginsRootInstance = PluginsRootInstance edouard@508: self.md5key = None edouard@508: self.buildpath = None edouard@508: self.SetBuildPath(self.PluginsRootInstance._getBuildPath()) edouard@508: edouard@508: def getTarget(self): edouard@508: target = self.PluginsRootInstance.BeremizRoot.getTargetType() edouard@508: if target.getcontent() is None: edouard@508: target = self.PluginsRootInstance.GetDefaultTarget() edouard@508: return target edouard@508: edouard@508: def SetBuildPath(self, buildpath): edouard@508: self.buildpath = buildpath edouard@508: self.exe_path = os.path.join(self.buildpath, "ArmPLC_rom.bin") edouard@508: self.md5_path = os.path.join(self.buildpath, "ArmPLC.md5") edouard@508: edouard@508: def GetBinaryCode(self): edouard@508: try: edouard@508: return open(self.exe_path, "rb").read() edouard@508: except Exception, e: edouard@508: return None edouard@508: edouard@508: def _GetMD5FileName(self): edouard@508: return os.path.join(self.buildpath, "lastbuildPLC.md5") edouard@508: edouard@508: def GetBinaryCodeMD5(self): edouard@508: if self.md5key is not None: edouard@508: return self.md5key edouard@508: else: edouard@508: try: edouard@508: return open(self._GetMD5FileName(), "r").read() edouard@508: except Exception, e: edouard@508: return None greg@425: greg@425: def build(self): greg@425: srcfiles= [] greg@425: cflags = [] greg@425: for Location, CFilesAndCFLAGS, DoCalls in self.PluginsRootInstance.LocationCFilesAndCFLAGS: edouard@508: wholesrcdata = "" edouard@508: # Get CFiles list to give it to makefile greg@425: for CFile, CFLAGS in CFilesAndCFLAGS: greg@425: CFileName = os.path.basename(CFile) edouard@508: wholesrcdata += open(CFile, "r").read() greg@425: srcfiles.append(CFileName) greg@425: if CFLAGS not in cflags: greg@425: cflags.append(CFLAGS) greg@425: edouard@508: self.md5key = hashlib.md5(wholesrcdata).hexdigest() edouard@508: # Store new PLC filename based on md5 key edouard@508: f = open(self._GetMD5FileName(), "w") edouard@508: f.write(self.md5key) edouard@508: f.close() greg@425: beremizcommand = {"src": ' '.join(srcfiles), edouard@508: "cflags": ' '.join(cflags), edouard@508: "md5": self.md5key greg@425: } greg@425: greg@425: target = self.getTarget().getcontent()["value"] greg@425: command = target.getCommand().split(' ') +\ greg@425: [target.getBuildPath()] +\ greg@425: [arg % beremizcommand for arg in target.getArguments().split(' ')] +\ greg@425: target.getRule().split(' ') greg@425: greg@425: # Call Makefile to build PLC code and link it with target specific code greg@425: status, result, err_result = ProcessLogger(self.PluginsRootInstance.logger, greg@425: command).spin() greg@425: if status : greg@425: self.PluginsRootInstance.logger.write_error(_("C compilation of %s failed.\n")) greg@425: return False greg@425: return True