use warnings FATAL => 'all';
use strict;
+use Digest::MD5;
-my ($in_dir, $out_dir) = @ARGV;
+my ( $in_dir, $out_dir ) = @ARGV;
my @files = <$in_dir/*.lua>;
sub quote_file {
- my ($in, $out) = @_;
-
- while (<$in>) {
- if (/^--.USE\s*"(\S+)"$/) {
- open(my $inc, '<', "$in_dir/$1.lua.in") or die "missing include $1";
- quote_file($inc, $out);
- }
- else {
- s/^\s*//; # remove unnecessary spaces at the beginning
- next if /^--/; # skip comments
- next if /^\s*$/; # skip empty lines
- s/(.)/'$1',/g; # split as 'c',
- s/\'\\\'/\'\\\\'/g; # escape backslashes
- s/\'\'\'/\'\\\'\'/g; # escape single quotes
- print $out "$_'\\n',";
- }
- }
+ my ( $in, $out ) = @_;
+
+ while (<$in>) {
+ if (/^--.USE\s*"(\S+)"$/) {
+ open( my $inc, '<', "$in_dir/$1.lua.in" )
+ or die "missing include $1";
+ quote_file( $inc, $out );
+ }
+ else {
+ s/^\s*//; # remove unnecessary spaces at the beginning
+ next if /^--/; # skip comments
+ next if /^\s*$/; # skip empty lines
+ s/(.)/'$1',/g; # split as 'c',
+ s/\'\\\'/\'\\\\'/g; # escape backslashes
+ s/\'\'\'/\'\\\'\'/g; # escape single quotes
+ print $out "$_'\\n',";
+ }
+ }
}
-foreach my $file (@files) {
- if ($file =~ /([^\/.]+)(.lua)$/) {
- my $fname = "$1$2";
- my $varname = "rspamadm_script_$1";
- my $definename = uc $varname;
+sub digest_for_file {
+ my ($file) = @_;
+
+ open( my $in, '<', $file ) or die "file missing";
+ my $digest = Digest::MD5->new->addfile($in)->hexdigest;
+
+ return $digest;
+}
+
+sub changed {
+ my ( $file, $outfile ) = @_;
- open(my $in, '<', $file) or die "input missing";
- open(my $out, '>', "$out_dir/$fname.h") or die "output missing";
+ open( my $out, '<', $outfile ) or return 1;
+
+ my $in_checksum = digest_for_file($file);
+ my $ln = <$out>;
+
+ if ( $ln =~ /^.*id:(\S+)\s.*$/ ) {
+ if ( $in_checksum ne $1 ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+foreach my $file (@files) {
+ if ( $file =~ /([^\/.]+)(.lua)$/ ) {
+ my $fname = "$1$2";
+ my $varname = "rspamadm_script_$1";
+ my $definename = uc $varname;
+ my $outfile = "$out_dir/$fname.h";
- print $out <<EOD;
+ if ( changed( $file, $outfile ) ) {
+ open( my $in, '<', $file ) or die "input missing";
+ open( my $out, '>', $outfile ) or die "output missing";
+ my $checksum = digest_for_file($file);
+ print $out <<EOD;
+/* id:$checksum */
#ifndef ${definename}_GUARD_H
#define ${definename}_GUARD_H
static const char ${varname}\[\] = {
EOD
- quote_file($in, $out);
+ quote_file( $in, $out );
- print $out <<EOD;
+ print $out <<EOD;
'\\0'};
#endif
EOD
- }
+ }
+ }
}