203
|
1 |
import os
|
|
2 |
from wxPopen import ProcessLogger
|
|
3 |
import hashlib
|
|
4 |
|
|
5 |
class toolchain_gcc():
|
|
6 |
"""
|
|
7 |
This abstract class contains GCC specific code.
|
|
8 |
It cannot be used as this and should be inherited in a target specific
|
|
9 |
class such as target_linux or target_win32
|
|
10 |
"""
|
|
11 |
def __init__(self, PuginsRootInstance):
|
|
12 |
self.PuginsRootInstance = PuginsRootInstance
|
|
13 |
self.logger = PuginsRootInstance.logger
|
|
14 |
self.exe = PuginsRootInstance.GetProjectName() + self.extension
|
|
15 |
self.buildpath = PuginsRootInstance._getBuildPath()
|
|
16 |
self.exe_path = os.path.join(self.buildpath, self.exe)
|
|
17 |
self.md5key = None
|
|
18 |
|
|
19 |
def GetBinaryCode(self):
|
|
20 |
try:
|
|
21 |
return open(self.exe_path, "rb").read()
|
|
22 |
except Exception, e:
|
|
23 |
return None
|
|
24 |
|
|
25 |
def _GetMD5FileName(self):
|
|
26 |
return os.path.join(self.buildpath, "lastbuildPLC.md5")
|
|
27 |
|
|
28 |
def GetBinaryCodeMD5(self):
|
|
29 |
if self.md5key is not None:
|
|
30 |
return self.md5key
|
|
31 |
else:
|
|
32 |
try:
|
|
33 |
return open(self._GetMD5FileName(), "r").read()
|
|
34 |
except Exception, e:
|
|
35 |
return None
|
|
36 |
|
|
37 |
|
|
38 |
def build(self):
|
|
39 |
# Retrieve toolchain user parameters
|
|
40 |
toolchain_params = self.PuginsRootInstance.BeremizRoot.getTargetType().getcontent()["value"]
|
|
41 |
self.compiler = toolchain_params.getCompiler()
|
|
42 |
self._CFLAGS = toolchain_params.getCFLAGS()
|
|
43 |
self.linker = toolchain_params.getLinker()
|
|
44 |
self._LDFLAGS = toolchain_params.getLDFLAGS()
|
|
45 |
|
|
46 |
######### GENERATE OBJECT FILES ########################################
|
|
47 |
obns = []
|
|
48 |
objs = []
|
|
49 |
for Location, CFilesAndCFLAGS, DoCalls in self.PuginsRootInstance.LocationCFilesAndCFLAGS:
|
|
50 |
if Location:
|
|
51 |
self.logger.write("Plugin : " + self.PuginsRootInstance.GetChildByIECLocation(Location).GetCurrentName() + " " + str(Location)+"\n")
|
|
52 |
else:
|
|
53 |
self.logger.write("PLC :\n")
|
|
54 |
|
|
55 |
for CFile, CFLAGS in CFilesAndCFLAGS:
|
|
56 |
bn = os.path.basename(CFile)
|
|
57 |
obn = os.path.splitext(bn)[0]+".o"
|
|
58 |
obns.append(obn)
|
|
59 |
self.logger.write(" [CC] "+bn+" -> "+obn+"\n")
|
|
60 |
objectfilename = os.path.splitext(CFile)[0]+".o"
|
|
61 |
|
|
62 |
status, result, err_result = ProcessLogger(
|
|
63 |
self.logger,
|
|
64 |
"\"%s\" -c \"%s\" -o \"%s\" %s %s"%
|
|
65 |
(self.compiler, CFile, objectfilename, self._CFLAGS, CFLAGS)
|
|
66 |
).spin()
|
|
67 |
|
|
68 |
if status :
|
|
69 |
self.logger.write_error("C compilation of "+ bn +" failed.\n")
|
|
70 |
return False
|
|
71 |
objs.append(objectfilename)
|
|
72 |
|
|
73 |
######### GENERATE library FILE ########################################
|
|
74 |
# Link all the object files into one binary file
|
|
75 |
self.logger.write("Linking :\n")
|
|
76 |
objstring = []
|
|
77 |
|
|
78 |
# Generate list .o files
|
|
79 |
listobjstring = '"' + '" "'.join(objs) + '"'
|
|
80 |
|
|
81 |
ALLldflags = ' '.join(self.CustomLDFLAGS+self.PuginsRootInstance.LDFLAGS+[self._LDFLAGS])
|
|
82 |
|
|
83 |
self.logger.write(" [CC] " + ' '.join(obns)+" -> " + self.exe + "\n")
|
|
84 |
|
|
85 |
status, result, err_result = ProcessLogger(
|
|
86 |
self.logger,
|
|
87 |
"\"%s\" %s -o \"%s\" %s"%
|
|
88 |
(self.linker,
|
|
89 |
listobjstring,
|
|
90 |
self.exe_path,
|
|
91 |
ALLldflags)
|
|
92 |
).spin()
|
|
93 |
|
|
94 |
if status :
|
|
95 |
return False
|
|
96 |
else :
|
|
97 |
# Calculate md5 key and get data for the new created PLC
|
|
98 |
data=self.GetBinaryCode()
|
|
99 |
self.md5key = hashlib.md5(data).hexdigest()
|
|
100 |
|
|
101 |
# Store new PLC filename based on md5 key
|
|
102 |
file = open(self._GetMD5FileName(), "w")
|
|
103 |
file.write(self.md5key)
|
|
104 |
file.close()
|
|
105 |
|
|
106 |
return True
|
|
107 |
|