70 """ |
70 """ |
71 Returns linker |
71 Returns linker |
72 """ |
72 """ |
73 return self.CTRInstance.GetTarget().getcontent().getLinker() |
73 return self.CTRInstance.GetTarget().getcontent().getLinker() |
74 |
74 |
75 def GetBinaryCode(self): |
75 def GetBinaryPath(self): |
76 try: |
76 return self.bin_path |
77 return open(self.exe_path, "rb").read() |
|
78 except Exception: |
|
79 return None |
|
80 |
77 |
81 def _GetMD5FileName(self): |
78 def _GetMD5FileName(self): |
82 return os.path.join(self.buildpath, "lastbuildPLC.md5") |
79 return os.path.join(self.buildpath, "lastbuildPLC.md5") |
83 |
80 |
84 def ResetBinaryCodeMD5(self): |
81 def ResetBinaryMD5(self): |
85 self.md5key = None |
82 self.md5key = None |
86 try: |
83 try: |
87 os.remove(self._GetMD5FileName()) |
84 os.remove(self._GetMD5FileName()) |
88 except Exception: |
85 except Exception: |
89 pass |
86 pass |
90 |
87 |
91 def GetBinaryCodeMD5(self): |
88 def GetBinaryMD5(self): |
92 if self.md5key is not None: |
89 if self.md5key is not None: |
93 return self.md5key |
90 return self.md5key |
94 else: |
91 else: |
95 try: |
92 try: |
96 return open(self._GetMD5FileName(), "r").read() |
93 return open(self._GetMD5FileName(), "r").read() |
98 return None |
95 return None |
99 |
96 |
100 def SetBuildPath(self, buildpath): |
97 def SetBuildPath(self, buildpath): |
101 if self.buildpath != buildpath: |
98 if self.buildpath != buildpath: |
102 self.buildpath = buildpath |
99 self.buildpath = buildpath |
103 self.exe = self.CTRInstance.GetProjectName() + self.extension |
100 self.bin = self.CTRInstance.GetProjectName() + self.extension |
104 self.exe_path = os.path.join(self.buildpath, self.exe) |
101 self.bin_path = os.path.join(self.buildpath, self.bin) |
105 self.md5key = None |
102 self.md5key = None |
106 self.srcmd5 = {} |
103 self.srcmd5 = {} |
107 |
104 |
108 def append_cfile_deps(self, src, deps): |
105 def append_cfile_deps(self, src, deps): |
109 for l in src.splitlines(): |
106 for l in src.splitlines(): |
150 for CFile, _CFLAGS in CFilesAndCFLAGS: |
147 for CFile, _CFLAGS in CFilesAndCFLAGS: |
151 CFileName = os.path.basename(CFile) |
148 CFileName = os.path.basename(CFile) |
152 wholesrcdata += self.concat_deps(CFileName) |
149 wholesrcdata += self.concat_deps(CFileName) |
153 return hashlib.md5(wholesrcdata).hexdigest() |
150 return hashlib.md5(wholesrcdata).hexdigest() |
154 |
151 |
155 def calc_md5(self): |
|
156 return hashlib.md5(self.GetBinaryCode()).hexdigest() |
|
157 |
|
158 def build(self): |
152 def build(self): |
159 # Retrieve compiler and linker |
153 # Retrieve compiler and linker |
160 self.compiler = self.getCompiler() |
154 self.compiler = self.getCompiler() |
161 self.linker = self.getLinker() |
155 self.linker = self.getLinker() |
162 |
156 |
163 Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS()) |
157 Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS()) |
164 |
158 |
165 # ----------------- GENERATE OBJECT FILES ------------------------ |
159 # ----------------- GENERATE OBJECT FILES ------------------------ |
166 obns = [] |
160 obns = [] |
167 objs = [] |
161 objs = [] |
168 relink = self.GetBinaryCode() is None |
162 relink = not os.path.exists(self.bin_path) |
169 for Location, CFilesAndCFLAGS, _DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS: |
163 for Location, CFilesAndCFLAGS, _DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS: |
170 if CFilesAndCFLAGS: |
164 if CFilesAndCFLAGS: |
171 if Location: |
165 if Location: |
172 self.CTRInstance.logger.write(".".join(map(str, Location))+" :\n") |
166 self.CTRInstance.logger.write(".".join(map(str, Location))+" :\n") |
173 else: |
167 else: |
211 # Generate list .o files |
205 # Generate list .o files |
212 listobjstring = '"' + '" "'.join(objs) + '"' |
206 listobjstring = '"' + '" "'.join(objs) + '"' |
213 |
207 |
214 ALLldflags = ' '.join(self.getBuilderLDFLAGS()) |
208 ALLldflags = ' '.join(self.getBuilderLDFLAGS()) |
215 |
209 |
216 self.CTRInstance.logger.write(" [CC] " + ' '.join(obns)+" -> " + self.exe + "\n") |
210 self.CTRInstance.logger.write(" [CC] " + ' '.join(obns)+" -> " + self.bin + "\n") |
217 |
211 |
218 status, _result, _err_result = ProcessLogger( |
212 status, _result, _err_result = ProcessLogger( |
219 self.CTRInstance.logger, |
213 self.CTRInstance.logger, |
220 "\"%s\" %s -o \"%s\" %s" % |
214 "\"%s\" %s -o \"%s\" %s" % |
221 (self.linker, |
215 (self.linker, |
222 listobjstring, |
216 listobjstring, |
223 self.exe_path, |
217 self.bin_path, |
224 ALLldflags) |
218 ALLldflags) |
225 ).spin() |
219 ).spin() |
226 |
220 |
227 if status: |
221 if status: |
228 return False |
222 return False |
229 |
223 |
230 else: |
224 else: |
231 self.CTRInstance.logger.write(" [pass] " + ' '.join(obns)+" -> " + self.exe + "\n") |
225 self.CTRInstance.logger.write(" [pass] " + ' '.join(obns)+" -> " + self.bin + "\n") |
232 |
226 |
233 # Calculate md5 key and get data for the new created PLC |
227 # Calculate md5 key and get data for the new created PLC |
234 self.md5key = self.calc_md5() |
228 self.md5key = hashlib.md5(open(self.bin_path, "rb").read()).hexdigest() |
235 |
229 |
236 # Store new PLC filename based on md5 key |
230 # Store new PLC filename based on md5 key |
237 f = open(self._GetMD5FileName(), "w") |
231 f = open(self._GetMD5FileName(), "w") |
238 f.write(self.md5key) |
232 f.write(self.md5key) |
239 f.close() |
233 f.close() |