# HG changeset patch # User Edouard Tisserant # Date 1635500962 -7200 # Node ID 83ed4ea362db37c6ae8e3f4b48f503442644ede8 # Parent aa25c89a8845b07a44ae30d562998300b8b2357b IDE: prevent invoking matiec when IEC code did not change since last build. diff -r aa25c89a8845 -r 83ed4ea362db ProjectController.py --- a/ProjectController.py Fri Oct 29 10:27:31 2021 +0200 +++ b/ProjectController.py Fri Oct 29 11:49:22 2021 +0200 @@ -36,6 +36,7 @@ import shutil import re import tempfile +import hashlib from datetime import datetime from weakref import WeakKeyDictionary from functools import reduce @@ -277,6 +278,9 @@ self.DebugToken = None self.debug_status = PlcStatus.Stopped + self.IECcodeDigest = None + self.LastBuiltIECcodeDigest = None + def __del__(self): self.KillDebugThread() @@ -779,21 +783,27 @@ self.logger.write_error( _("Error in ST/IL/SFC code generator :\n%s\n") % errors[0]) return False - plc_file = open(self._getIECcodepath(), "w") + # Add ST Library from confnodes - plc_file.write(self.GetLibrariesSTCode()) - if os.path.isfile(self._getIECrawcodepath()): - plc_file.write(open(self._getIECrawcodepath(), "r").read()) - plc_file.write("\n") - plc_file.close() - plc_file = open(self._getIECcodepath(), "r") - self.ProgramOffset = 0 - for dummy in plc_file.readlines(): - self.ProgramOffset += 1 - plc_file.close() - plc_file = open(self._getIECcodepath(), "a") - plc_file.write(open(self._getIECgeneratedcodepath(), "r").read()) - plc_file.close() + IECCodeContent = self.GetLibrariesSTCode() + + IECrawcodepath = self._getIECrawcodepath() + if os.path.isfile(IECrawcodepath): + IECCodeContent += open(IECrawcodepath, "r").read() + "\n" + + + # Compute offset before ST resulting of transformation from user POUs + self.ProgramOffset = IECCodeContent.count("\n") + + IECCodeContent += open(self._getIECgeneratedcodepath(), "r").read() + + with open(self._getIECcodepath(), "w") as plc_file: + plc_file.write(IECCodeContent) + + hasher = hashlib.md5() + hasher.update(IECCodeContent) + self.IECcodeDigest = hasher.hexdigest() + return True def _Compile_ST_to_SoftPLC(self): @@ -802,6 +812,10 @@ self.logger.write_error(_("matiec installation is not found\n")) return False + if self.LastBuiltIECcodeDigest == self.IECcodeDigest: + self.logger.write(_("IEC program did no change, not re-compiling into C code.\n")) + return True + self.logger.write(_("Compiling IEC Program into C code...\n")) buildpath = self._getBuildPath() buildcmd = "\"%s\" %s -I \"%s\" -T \"%s\" \"%s\"" % ( @@ -889,6 +903,9 @@ self.PLCGeneratedCFiles = C_files # compute CFLAGS for plc self.plcCFLAGS = '"-I%s" -Wno-unused-function' % self.iec2c_cfg.getLibCPath() + + self.LastBuiltIECcodeDigest = self.IECcodeDigest + return True def GetBuilder(self):