etisserant@203: import os etisserant@203: from wxPopen import ProcessLogger etisserant@203: import hashlib etisserant@203: etisserant@203: class toolchain_gcc(): etisserant@203: """ etisserant@203: This abstract class contains GCC specific code. etisserant@203: It cannot be used as this and should be inherited in a target specific etisserant@203: class such as target_linux or target_win32 etisserant@203: """ etisserant@203: def __init__(self, PuginsRootInstance): etisserant@203: self.PuginsRootInstance = PuginsRootInstance etisserant@203: self.logger = PuginsRootInstance.logger etisserant@203: self.exe = PuginsRootInstance.GetProjectName() + self.extension etisserant@203: self.buildpath = PuginsRootInstance._getBuildPath() etisserant@203: self.exe_path = os.path.join(self.buildpath, self.exe) etisserant@203: self.md5key = None etisserant@203: etisserant@203: def GetBinaryCode(self): etisserant@203: try: etisserant@203: return open(self.exe_path, "rb").read() etisserant@203: except Exception, e: etisserant@203: return None etisserant@203: etisserant@203: def _GetMD5FileName(self): etisserant@203: return os.path.join(self.buildpath, "lastbuildPLC.md5") etisserant@203: etisserant@203: def GetBinaryCodeMD5(self): etisserant@203: if self.md5key is not None: etisserant@203: return self.md5key etisserant@203: else: etisserant@203: try: etisserant@203: return open(self._GetMD5FileName(), "r").read() etisserant@203: except Exception, e: etisserant@203: return None etisserant@203: etisserant@203: etisserant@203: def build(self): etisserant@203: # Retrieve toolchain user parameters etisserant@203: toolchain_params = self.PuginsRootInstance.BeremizRoot.getTargetType().getcontent()["value"] etisserant@203: self.compiler = toolchain_params.getCompiler() etisserant@203: self._CFLAGS = toolchain_params.getCFLAGS() etisserant@203: self.linker = toolchain_params.getLinker() etisserant@203: self._LDFLAGS = toolchain_params.getLDFLAGS() etisserant@203: etisserant@203: ######### GENERATE OBJECT FILES ######################################## etisserant@203: obns = [] etisserant@203: objs = [] etisserant@203: for Location, CFilesAndCFLAGS, DoCalls in self.PuginsRootInstance.LocationCFilesAndCFLAGS: etisserant@203: if Location: etisserant@203: self.logger.write("Plugin : " + self.PuginsRootInstance.GetChildByIECLocation(Location).GetCurrentName() + " " + str(Location)+"\n") etisserant@203: else: etisserant@203: self.logger.write("PLC :\n") etisserant@203: etisserant@203: for CFile, CFLAGS in CFilesAndCFLAGS: etisserant@203: bn = os.path.basename(CFile) etisserant@203: obn = os.path.splitext(bn)[0]+".o" etisserant@203: obns.append(obn) etisserant@203: self.logger.write(" [CC] "+bn+" -> "+obn+"\n") etisserant@203: objectfilename = os.path.splitext(CFile)[0]+".o" etisserant@203: etisserant@203: status, result, err_result = ProcessLogger( etisserant@203: self.logger, etisserant@203: "\"%s\" -c \"%s\" -o \"%s\" %s %s"% etisserant@203: (self.compiler, CFile, objectfilename, self._CFLAGS, CFLAGS) etisserant@203: ).spin() etisserant@203: etisserant@203: if status : etisserant@203: self.logger.write_error("C compilation of "+ bn +" failed.\n") etisserant@203: return False etisserant@203: objs.append(objectfilename) etisserant@203: etisserant@203: ######### GENERATE library FILE ######################################## etisserant@203: # Link all the object files into one binary file etisserant@203: self.logger.write("Linking :\n") etisserant@203: objstring = [] etisserant@203: etisserant@203: # Generate list .o files etisserant@203: listobjstring = '"' + '" "'.join(objs) + '"' etisserant@203: etisserant@203: ALLldflags = ' '.join(self.CustomLDFLAGS+self.PuginsRootInstance.LDFLAGS+[self._LDFLAGS]) etisserant@203: etisserant@203: self.logger.write(" [CC] " + ' '.join(obns)+" -> " + self.exe + "\n") etisserant@203: etisserant@203: status, result, err_result = ProcessLogger( etisserant@203: self.logger, etisserant@203: "\"%s\" %s -o \"%s\" %s"% etisserant@203: (self.linker, etisserant@203: listobjstring, etisserant@203: self.exe_path, etisserant@203: ALLldflags) etisserant@203: ).spin() etisserant@203: etisserant@203: if status : etisserant@203: return False etisserant@203: else : etisserant@203: # Calculate md5 key and get data for the new created PLC etisserant@203: data=self.GetBinaryCode() etisserant@203: self.md5key = hashlib.md5(data).hexdigest() etisserant@203: etisserant@203: # Store new PLC filename based on md5 key etisserant@203: file = open(self._GetMD5FileName(), "w") etisserant@203: file.write(self.md5key) etisserant@203: file.close() etisserant@203: etisserant@203: return True etisserant@203: