Quantcast

[Beremiz-devel] RFC, tollchain_gcc

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[Beremiz-devel] RFC, tollchain_gcc

Beremiz-Devel mailing list
Hi, Beremiz developers!

  I've recently worked on toolchain_gcc, my goal was:
make use of toolchain_gcc.py for bare metal targets.

Changes are:
  1. added getCompiler and getLinker methods, to abstract from XSD.
  2. Added calc_source_md5 as it's more convenient to add -DPLC_MD5="something" option at compile time than to mess with editing binary.
  3. some more helper methods added.

The result is in patch.
I propose to include it to main tree :)

Best regards,
Paul Beltyukov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel

tollchain_gcc_rfc.patch (5K) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [Beremiz-devel] RFC, tollchain_gcc

Beremiz-Devel mailing list
Hi Paul,

Now it looks good for me.

On 17-04-28 14:56, [hidden email] wrote:

> Hi, Beremiz developers!
>
>   I've recently worked on toolchain_gcc, my goal was:
> make use of toolchain_gcc.py for bare metal targets.
>
> Changes are:
>   1. added getCompiler and getLinker methods, to abstract from XSD.
>   2. Added calc_source_md5 as it's more convenient to add -DPLC_MD5="something"
> option at compile time than to mess with editing binary.
>   3. some more helper methods added.
>
> The result is in patch.
> I propose to include it to main tree :)
>
> Best regards,
> Paul Beltyukov

> diff -r 0d026b440ddf -r ac2e1df57f12 targets/toolchain_gcc.py
> --- a/targets/toolchain_gcc.py Втр Апр 11 11:15:09 2017 +0500
> +++ b/targets/toolchain_gcc.py Птн Апр 28 14:24:07 2017 +0500
> @@ -52,6 +52,18 @@
>          return self.CTRInstance.LDFLAGS + \
>                 [self.CTRInstance.GetTarget().getcontent().getLDFLAGS()]
>  
> +    def getCompiler(self):
> +        """
> +        Returns compiler
> +        """
> +        return self.CTRInstance.GetTarget().getcontent().getCompiler()
> +      
> +    def getLinker(self):
> +        """
> +        Returns linker
> +        """
> +        return self.CTRInstance.GetTarget().getcontent().getLinker()
> +              
>      def GetBinaryCode(self):
>          try:
>              return open(self.exe_path, "rb").read()
> @@ -84,7 +96,25 @@
>              self.exe_path = os.path.join(self.buildpath, self.exe)
>              self.md5key = None
>              self.srcmd5 = {}
> -    
> +            
> +    def append_cfile_deps(self, src, deps):
> +        for l in src.splitlines():
> +            res = includes_re.match(l)
> +            if res is not None:
> +                depfn = res.groups()[0]
> +                if os.path.exists(os.path.join(self.buildpath, depfn)):
> +                    deps.append(depfn)
> +                    
> +    def concat_deps(self, bn):
> +        # read source
> +        src = open(os.path.join(self.buildpath, bn),"r").read()
> +        # update direct dependencies
> +        deps = []
> +        self.append_cfile_deps(src, deps)
> +        # recurse through deps
> +        # TODO detect cicular deps.
> +        return reduce(operator.concat, map(self.concat_deps, deps), src)
> +        
>      def check_and_update_hash_and_deps(self, bn):
>          # Get latest computed hash and deps
>          oldhash, deps = self.srcmd5.get(bn,(None,[]))
> @@ -98,24 +128,29 @@
>              # file have changed
>              # update direct dependencies
>              deps = []
> -            for l in src.splitlines():
> -                res = includes_re.match(l)
> -                if res is not None:
> -                    depfn = res.groups()[0]
> -                    if os.path.exists(os.path.join(self.buildpath, depfn)):
> -                        #print bn + " depends on "+depfn
> -                        deps.append(depfn)
> +            self.append_cfile_deps(src, deps)
>              # store that hashand deps
>              self.srcmd5[bn] = (newhash, deps)
>          # recurse through deps
>          # TODO detect cicular deps.
>          return reduce(operator.and_, map(self.check_and_update_hash_and_deps, deps), match)
> -                
> +        
> +    def calc_source_md5(self):
> +        wholesrcdata = ""
> +        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
> +            # Get CFiles list to give it to makefile
> +            for CFile, CFLAGS in CFilesAndCFLAGS:
> +                CFileName = os.path.basename(CFile)
> +                wholesrcdata += self.concat_deps(CFileName)
> +        return hashlib.md5(wholesrcdata).hexdigest()
> +    
> +    def calc_md5(self):
> +        return hashlib.md5(self.GetBinaryCode()).hexdigest()
> +    
>      def build(self):
> -        # Retrieve toolchain user parameters
> -        toolchain_params = self.CTRInstance.GetTarget().getcontent()
> -        self.compiler = toolchain_params.getCompiler()
> -        self.linker = toolchain_params.getLinker()
> +        # Retrieve compiler and linker
> +        self.compiler = self.getCompiler()
> +        self.linker = self.getLinker()
>  
>          Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS())
>  
> @@ -161,7 +196,7 @@
>                      obns.append(os.path.basename(CFile))
>                      objs.append(CFile)
>  
> -        ######### GENERATE library FILE ########################################
> +        ######### GENERATE OUTPUT FILE ########################################
>          # Link all the object files into one binary file
>          self.CTRInstance.logger.write(_("Linking :\n"))
>          if relink:
> @@ -190,8 +225,7 @@
>              self.CTRInstance.logger.write("   [pass]  " + ' '.join(obns)+" -> " + self.exe + "\n")
>          
>          # Calculate md5 key and get data for the new created PLC
> -        data=self.GetBinaryCode()
> -        self.md5key = hashlib.md5(data).hexdigest()
> +        self.md5key = self.calc_md5()
>  
>          # Store new PLC filename based on md5 key
>          f = open(self._GetMD5FileName(), "w")

--
Best regards,
Andrey Skvortsov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel

signature.asc (849 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [Beremiz-devel] RFC, tollchain_gcc

Beremiz-Devel mailing list
Hi, Andrey!

It's shorter than initial variant.
But IMO, it's less readable.

Best regards,
Paul Beltyukov

2017-04-28 15:11 GMT+05:00 <[hidden email]>:
Hi Paul,

Now it looks good for me.

On 17-04-28 14:56, [hidden email] wrote:
> Hi, Beremiz developers!
>
>   I've recently worked on toolchain_gcc, my goal was:
> make use of toolchain_gcc.py for bare metal targets.
>
> Changes are:
>   1. added getCompiler and getLinker methods, to abstract from XSD.
>   2. Added calc_source_md5 as it's more convenient to add -DPLC_MD5="something"
> option at compile time than to mess with editing binary.
>   3. some more helper methods added.
>
> The result is in patch.
> I propose to include it to main tree :)
>
> Best regards,
> Paul Beltyukov

> diff -r 0d026b440ddf -r ac2e1df57f12 targets/toolchain_gcc.py
> --- a/targets/toolchain_gcc.py        Втр Апр 11 11:15:09 2017 +0500
> +++ b/targets/toolchain_gcc.py        Птн Апр 28 14:24:07 2017 +0500
> @@ -52,6 +52,18 @@
>          return self.CTRInstance.LDFLAGS + \
>                 [self.CTRInstance.GetTarget().getcontent().getLDFLAGS()]
>
> +    def getCompiler(self):
> +        """
> +        Returns compiler
> +        """
> +        return self.CTRInstance.GetTarget().getcontent().getCompiler()
> +
> +    def getLinker(self):
> +        """
> +        Returns linker
> +        """
> +        return self.CTRInstance.GetTarget().getcontent().getLinker()
> +
>      def GetBinaryCode(self):
>          try:
>              return open(self.exe_path, "rb").read()
> @@ -84,7 +96,25 @@
>              self.exe_path = os.path.join(self.buildpath, self.exe)
>              self.md5key = None
>              self.srcmd5 = {}
> -
> +
> +    def append_cfile_deps(self, src, deps):
> +        for l in src.splitlines():
> +            res = includes_re.match(l)
> +            if res is not None:
> +                depfn = res.groups()[0]
> +                if os.path.exists(os.path.join(self.buildpath, depfn)):
> +                    deps.append(depfn)
> +
> +    def concat_deps(self, bn):
> +        # read source
> +        src = open(os.path.join(self.buildpath, bn),"r").read()
> +        # update direct dependencies
> +        deps = []
> +        self.append_cfile_deps(src, deps)
> +        # recurse through deps
> +        # TODO detect cicular deps.
> +        return reduce(operator.concat, map(self.concat_deps, deps), src)
> +
>      def check_and_update_hash_and_deps(self, bn):
>          # Get latest computed hash and deps
>          oldhash, deps = self.srcmd5.get(bn,(None,[]))
> @@ -98,24 +128,29 @@
>              # file have changed
>              # update direct dependencies
>              deps = []
> -            for l in src.splitlines():
> -                res = includes_re.match(l)
> -                if res is not None:
> -                    depfn = res.groups()[0]
> -                    if os.path.exists(os.path.join(self.buildpath, depfn)):
> -                        #print bn + " depends on "+depfn
> -                        deps.append(depfn)
> +            self.append_cfile_deps(src, deps)
>              # store that hashand deps
>              self.srcmd5[bn] = (newhash, deps)
>          # recurse through deps
>          # TODO detect cicular deps.
>          return reduce(operator.and_, map(self.check_and_update_hash_and_deps, deps), match)
> -
> +
> +    def calc_source_md5(self):
> +        wholesrcdata = ""
> +        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
> +            # Get CFiles list to give it to makefile
> +            for CFile, CFLAGS in CFilesAndCFLAGS:
> +                CFileName = os.path.basename(CFile)
> +                wholesrcdata += self.concat_deps(CFileName)
> +        return hashlib.md5(wholesrcdata).hexdigest()
> +
> +    def calc_md5(self):
> +        return hashlib.md5(self.GetBinaryCode()).hexdigest()
> +
>      def build(self):
> -        # Retrieve toolchain user parameters
> -        toolchain_params = self.CTRInstance.GetTarget().getcontent()
> -        self.compiler = toolchain_params.getCompiler()
> -        self.linker = toolchain_params.getLinker()
> +        # Retrieve compiler and linker
> +        self.compiler = self.getCompiler()
> +        self.linker = self.getLinker()
>
>          Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS())
>
> @@ -161,7 +196,7 @@
>                      obns.append(os.path.basename(CFile))
>                      objs.append(CFile)
>
> -        ######### GENERATE library FILE ########################################
> +        ######### GENERATE OUTPUT FILE ########################################
>          # Link all the object files into one binary file
>          self.CTRInstance.logger.write(_("Linking :\n"))
>          if relink:
> @@ -190,8 +225,7 @@
>              self.CTRInstance.logger.write("   [pass]  " + ' '.join(obns)+" -> " + self.exe + "\n")
>
>          # Calculate md5 key and get data for the new created PLC
> -        data=self.GetBinaryCode()
> -        self.md5key = hashlib.md5(data).hexdigest()
> +        self.md5key = self.calc_md5()
>
>          # Store new PLC filename based on md5 key
>          f = open(self._GetMD5FileName(), "w")


--
Best regards,
Andrey Skvortsov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [Beremiz-devel] RFC, tollchain_gcc

Beremiz-Devel mailing list
In reply to this post by Beremiz-Devel mailing list
On 17-04-28 13:11, Andrey Skvortsov wrote:
> Hi Paul,
>
> Now it looks good for me.

Applied and pushed. Thank you!

> On 17-04-28 14:56, [hidden email] wrote:
> > Hi, Beremiz developers!
> >
> >   I've recently worked on toolchain_gcc, my goal was:
> > make use of toolchain_gcc.py for bare metal targets.
> >
> > Changes are:
> >   1. added getCompiler and getLinker methods, to abstract from XSD.
> >   2. Added calc_source_md5 as it's more convenient to add -DPLC_MD5="something"
> > option at compile time than to mess with editing binary.
> >   3. some more helper methods added.
> >
> > The result is in patch.
> > I propose to include it to main tree :)
> >
> > Best regards,
> > Paul Beltyukov
>
> > diff -r 0d026b440ddf -r ac2e1df57f12 targets/toolchain_gcc.py
> > --- a/targets/toolchain_gcc.py Втр Апр 11 11:15:09 2017 +0500
> > +++ b/targets/toolchain_gcc.py Птн Апр 28 14:24:07 2017 +0500
> > @@ -52,6 +52,18 @@
> >          return self.CTRInstance.LDFLAGS + \
> >                 [self.CTRInstance.GetTarget().getcontent().getLDFLAGS()]
> >  
> > +    def getCompiler(self):
> > +        """
> > +        Returns compiler
> > +        """
> > +        return self.CTRInstance.GetTarget().getcontent().getCompiler()
> > +      
> > +    def getLinker(self):
> > +        """
> > +        Returns linker
> > +        """
> > +        return self.CTRInstance.GetTarget().getcontent().getLinker()
> > +              
> >      def GetBinaryCode(self):
> >          try:
> >              return open(self.exe_path, "rb").read()
> > @@ -84,7 +96,25 @@
> >              self.exe_path = os.path.join(self.buildpath, self.exe)
> >              self.md5key = None
> >              self.srcmd5 = {}
> > -    
> > +            
> > +    def append_cfile_deps(self, src, deps):
> > +        for l in src.splitlines():
> > +            res = includes_re.match(l)
> > +            if res is not None:
> > +                depfn = res.groups()[0]
> > +                if os.path.exists(os.path.join(self.buildpath, depfn)):
> > +                    deps.append(depfn)
> > +                    
> > +    def concat_deps(self, bn):
> > +        # read source
> > +        src = open(os.path.join(self.buildpath, bn),"r").read()
> > +        # update direct dependencies
> > +        deps = []
> > +        self.append_cfile_deps(src, deps)
> > +        # recurse through deps
> > +        # TODO detect cicular deps.
> > +        return reduce(operator.concat, map(self.concat_deps, deps), src)
> > +        
> >      def check_and_update_hash_and_deps(self, bn):
> >          # Get latest computed hash and deps
> >          oldhash, deps = self.srcmd5.get(bn,(None,[]))
> > @@ -98,24 +128,29 @@
> >              # file have changed
> >              # update direct dependencies
> >              deps = []
> > -            for l in src.splitlines():
> > -                res = includes_re.match(l)
> > -                if res is not None:
> > -                    depfn = res.groups()[0]
> > -                    if os.path.exists(os.path.join(self.buildpath, depfn)):
> > -                        #print bn + " depends on "+depfn
> > -                        deps.append(depfn)
> > +            self.append_cfile_deps(src, deps)
> >              # store that hashand deps
> >              self.srcmd5[bn] = (newhash, deps)
> >          # recurse through deps
> >          # TODO detect cicular deps.
> >          return reduce(operator.and_, map(self.check_and_update_hash_and_deps, deps), match)
> > -                
> > +        
> > +    def calc_source_md5(self):
> > +        wholesrcdata = ""
> > +        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
> > +            # Get CFiles list to give it to makefile
> > +            for CFile, CFLAGS in CFilesAndCFLAGS:
> > +                CFileName = os.path.basename(CFile)
> > +                wholesrcdata += self.concat_deps(CFileName)
> > +        return hashlib.md5(wholesrcdata).hexdigest()
> > +    
> > +    def calc_md5(self):
> > +        return hashlib.md5(self.GetBinaryCode()).hexdigest()
> > +    
> >      def build(self):
> > -        # Retrieve toolchain user parameters
> > -        toolchain_params = self.CTRInstance.GetTarget().getcontent()
> > -        self.compiler = toolchain_params.getCompiler()
> > -        self.linker = toolchain_params.getLinker()
> > +        # Retrieve compiler and linker
> > +        self.compiler = self.getCompiler()
> > +        self.linker = self.getLinker()
> >  
> >          Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS())
> >  
> > @@ -161,7 +196,7 @@
> >                      obns.append(os.path.basename(CFile))
> >                      objs.append(CFile)
> >  
> > -        ######### GENERATE library FILE ########################################
> > +        ######### GENERATE OUTPUT FILE ########################################
> >          # Link all the object files into one binary file
> >          self.CTRInstance.logger.write(_("Linking :\n"))
> >          if relink:
> > @@ -190,8 +225,7 @@
> >              self.CTRInstance.logger.write("   [pass]  " + ' '.join(obns)+" -> " + self.exe + "\n")
> >          
> >          # Calculate md5 key and get data for the new created PLC
> > -        data=self.GetBinaryCode()
> > -        self.md5key = hashlib.md5(data).hexdigest()
> > +        self.md5key = self.calc_md5()
> >  
> >          # Store new PLC filename based on md5 key
> >          f = open(self._GetMD5FileName(), "w")
>
>
> --
> Best regards,
> Andrey Skvortsov


--
Best regards,
Andrey Skvortsov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel

signature.asc (849 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [Beremiz-devel] RFC, tollchain_gcc

Beremiz-Devel mailing list
Best regards,
Paul Beltyukov

2017-04-28 15:30 GMT+05:00 <[hidden email]>:
On 17-04-28 13:11, Andrey Skvortsov wrote:
> Hi Paul,
>
> Now it looks good for me.

Applied and pushed. Thank you!

> On 17-04-28 14:56, [hidden email] wrote:
> > Hi, Beremiz developers!
> >
> >   I've recently worked on toolchain_gcc, my goal was:
> > make use of toolchain_gcc.py for bare metal targets.
> >
> > Changes are:
> >   1. added getCompiler and getLinker methods, to abstract from XSD.
> >   2. Added calc_source_md5 as it's more convenient to add -DPLC_MD5="something"
> > option at compile time than to mess with editing binary.
> >   3. some more helper methods added.
> >
> > The result is in patch.
> > I propose to include it to main tree :)
> >
> > Best regards,
> > Paul Beltyukov
>
> > diff -r 0d026b440ddf -r ac2e1df57f12 targets/toolchain_gcc.py
> > --- a/targets/toolchain_gcc.py      Втр Апр 11 11:15:09 2017 +0500
> > +++ b/targets/toolchain_gcc.py      Птн Апр 28 14:24:07 2017 +0500
> > @@ -52,6 +52,18 @@
> >          return self.CTRInstance.LDFLAGS + \
> >                 [self.CTRInstance.GetTarget().getcontent().getLDFLAGS()]
> >
> > +    def getCompiler(self):
> > +        """
> > +        Returns compiler
> > +        """
> > +        return self.CTRInstance.GetTarget().getcontent().getCompiler()
> > +
> > +    def getLinker(self):
> > +        """
> > +        Returns linker
> > +        """
> > +        return self.CTRInstance.GetTarget().getcontent().getLinker()
> > +
> >      def GetBinaryCode(self):
> >          try:
> >              return open(self.exe_path, "rb").read()
> > @@ -84,7 +96,25 @@
> >              self.exe_path = os.path.join(self.buildpath, self.exe)
> >              self.md5key = None
> >              self.srcmd5 = {}
> > -
> > +
> > +    def append_cfile_deps(self, src, deps):
> > +        for l in src.splitlines():
> > +            res = includes_re.match(l)
> > +            if res is not None:
> > +                depfn = res.groups()[0]
> > +                if os.path.exists(os.path.join(self.buildpath, depfn)):
> > +                    deps.append(depfn)
> > +
> > +    def concat_deps(self, bn):
> > +        # read source
> > +        src = open(os.path.join(self.buildpath, bn),"r").read()
> > +        # update direct dependencies
> > +        deps = []
> > +        self.append_cfile_deps(src, deps)
> > +        # recurse through deps
> > +        # TODO detect cicular deps.
> > +        return reduce(operator.concat, map(self.concat_deps, deps), src)
> > +
> >      def check_and_update_hash_and_deps(self, bn):
> >          # Get latest computed hash and deps
> >          oldhash, deps = self.srcmd5.get(bn,(None,[]))
> > @@ -98,24 +128,29 @@
> >              # file have changed
> >              # update direct dependencies
> >              deps = []
> > -            for l in src.splitlines():
> > -                res = includes_re.match(l)
> > -                if res is not None:
> > -                    depfn = res.groups()[0]
> > -                    if os.path.exists(os.path.join(self.buildpath, depfn)):
> > -                        #print bn + " depends on "+depfn
> > -                        deps.append(depfn)
> > +            self.append_cfile_deps(src, deps)
> >              # store that hashand deps
> >              self.srcmd5[bn] = (newhash, deps)
> >          # recurse through deps
> >          # TODO detect cicular deps.
> >          return reduce(operator.and_, map(self.check_and_update_hash_and_deps, deps), match)
> > -
> > +
> > +    def calc_source_md5(self):
> > +        wholesrcdata = ""
> > +        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
> > +            # Get CFiles list to give it to makefile
> > +            for CFile, CFLAGS in CFilesAndCFLAGS:
> > +                CFileName = os.path.basename(CFile)
> > +                wholesrcdata += self.concat_deps(CFileName)
> > +        return hashlib.md5(wholesrcdata).hexdigest()
> > +
> > +    def calc_md5(self):
> > +        return hashlib.md5(self.GetBinaryCode()).hexdigest()
> > +
> >      def build(self):
> > -        # Retrieve toolchain user parameters
> > -        toolchain_params = self.CTRInstance.GetTarget().getcontent()
> > -        self.compiler = toolchain_params.getCompiler()
> > -        self.linker = toolchain_params.getLinker()
> > +        # Retrieve compiler and linker
> > +        self.compiler = self.getCompiler()
> > +        self.linker = self.getLinker()
> >
> >          Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS())
> >
> > @@ -161,7 +196,7 @@
> >                      obns.append(os.path.basename(CFile))
> >                      objs.append(CFile)
> >
> > -        ######### GENERATE library FILE ########################################
> > +        ######### GENERATE OUTPUT FILE ########################################
> >          # Link all the object files into one binary file
> >          self.CTRInstance.logger.write(_("Linking :\n"))
> >          if relink:
> > @@ -190,8 +225,7 @@
> >              self.CTRInstance.logger.write("   [pass]  " + ' '.join(obns)+" -> " + self.exe + "\n")
> >
> >          # Calculate md5 key and get data for the new created PLC
> > -        data=self.GetBinaryCode()
> > -        self.md5key = hashlib.md5(data).hexdigest()
> > +        self.md5key = self.calc_md5()
> >
> >          # Store new PLC filename based on md5 key
> >          f = open(self._GetMD5FileName(), "w")
>
>
> --
> Best regards,
> Andrey Skvortsov



--
Best regards,
Andrey Skvortsov

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Beremiz-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/beremiz-devel
Loading...