Add an optional compilation cache
[gruntmaster-daemon.git] / lib / Gruntmaster / Daemon / Format.pm
index 6160a31e9460a08bba84bafb9f44eab524ffc89d..cd0e47d495df05296a9e32c20534544d728b67b6 100644 (file)
@@ -6,8 +6,10 @@ use warnings;
 use parent qw/Exporter/;
 no if $] > 5.017011, warnings => 'experimental::smartmatch';
 
+use Digest::SHA qw/sha256_hex/;
 use Expect::Simple;
 use File::Basename qw/fileparse/;
+use File::Copy qw/cp/;
 use File::Slurp qw/read_file write_file/;
 use List::MoreUtils qw/natatime/;
 use Log::Log4perl qw/get_logger/;
@@ -30,7 +32,7 @@ sub runvm {
        $vm{$name} = Expect::Simple->new({
                Cmd => $cmd,
                Prompt => '# ',
-               DisconnectCmd => 'exit',
+               DisconnectCmd => '/sbin/poweroff -fn',
                RawPty => 1,
                Timeout => 10,
        });
@@ -115,7 +117,19 @@ sub prepare_files{
 
                $file->{run} = mkrun($format);
                write_file $name, $content;
-               prepare $name, $format;
+               if ($ENV{GRUNTMASTER_CCACHE}) {
+                       my $key = lc sha256_hex($content) . '-' . $format;
+                       my $cachefn = "$ENV{GRUNTMASTER_CCACHE}/$key";
+                       my $exefn = fileparse $name, qr/[.][^.]*/s;
+                       if (cp $cachefn, $exefn) {
+                               get_logger->trace("File $name found in compilation cache")
+                       } else {
+                               prepare $name, $format;
+                               cp $exefn, $cachefn
+                       }
+               } else {
+                       prepare $name, $format
+               }
        }
 }
 
This page took 0.010333 seconds and 4 git commands to generate.