targets/toolchain_gcc.py
changeset 2463 8742337a9fe3
parent 2456 7373e3048167
child 3571 fdd4b171ac6c
equal deleted inserted replaced
2462:ed6b0e905fcb 2463:8742337a9fe3
    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()