build: add FIXUP option for make check

This will attempt to automatically fix common mistakes like using MD5
instead of SHA256, using the MD5SUM variable instead of HASH, or even a
missing mirror file hash.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2016-12-16 13:34:37 +01:00
parent 7a315b0b5d
commit d49059693b
2 changed files with 153 additions and 1 deletions

View file

@ -47,9 +47,22 @@ endef
ifdef CHECK ifdef CHECK
check_escape=$(subst ','\'',$(1)) check_escape=$(subst ','\'',$(1))
#') #')
check_warn = $(info $(shell printf "$(_R)WARNING: %s$(_N)" '$(call check_escape,$(call C_$(1),$(2),$(3),$(4)))'))
check_warn_nofix = $(info $(shell printf "$(_R)WARNING: %s$(_N)" '$(call check_escape,$(call C_$(1),$(2),$(3),$(4)))'))
ifndef FIXUP
check_warn = $(check_warn_nofix)
else
check_warn = $(if $(filter-out undefined,$(origin F_$(1))),$(filter ,$(shell $(call F_$(1),$(2),$(3),$(4)) >&2)),$(check_warn_nofix))
endif
gen_sha256sum = $(shell openssl dgst -sha256 $(DL_DIR)/$(1) | awk '{print $$2}') gen_sha256sum = $(shell openssl dgst -sha256 $(DL_DIR)/$(1) | awk '{print $$2}')
ifdef FIXUP
F_hash_deprecated = $(SCRIPT_DIR)/fixup-makefile.pl $(CURDIR)/Makefile fix-hash $(3) $(call gen_sha256sum,$(1)) $(2)
F_hash_mismatch = $(F_hash_deprecated)
F_hash_missing = $(SCRIPT_DIR)/fixup-makefile.pl $(CURDIR)/Makefile add-hash $(3) $(call gen_sha256sum,$(1))
endif
C_download_missing = $(1) is missing, please run make download before re-running this check C_download_missing = $(1) is missing, please run make download before re-running this check
C_hash_mismatch = $(3) does not match $(1) hash $(call gen_sha256sum,$(1)) C_hash_mismatch = $(3) does not match $(1) hash $(call gen_sha256sum,$(1))
C_hash_deprecated = $(3) uses deprecated hash, set to $(call gen_sha256sum,$(1)) C_hash_deprecated = $(3) uses deprecated hash, set to $(call gen_sha256sum,$(1))
@ -69,6 +82,10 @@ check_hash = \
$(call check_warn,download_missing,$(1),$(2),$(3)) \ $(call check_warn,download_missing,$(1),$(2),$(3)) \
) )
ifdef FIXUP
F_md5_deprecated = $(SCRIPT_DIR)/fixup-makefile.pl $(CURDIR)/Makefile rename-var $(2) $(3)
endif
C_md5_deprecated = Use of $(2) is deprecated, switch to $(3) C_md5_deprecated = Use of $(2) is deprecated, switch to $(3)
# Skip MD5SUM check in feeds until OpenWrt is updated # Skip MD5SUM check in feeds until OpenWrt is updated

135
scripts/fixup-makefile.pl Executable file
View file

@ -0,0 +1,135 @@
#!/usr/bin/env perl
use strict;
my $error;
my %state;
sub usage() {
die <<EOF;
Usage: $0 <file> <command> [<arguments>]
Commands:
add-hash <variable> <value>
fix-hash <variable> <value>
rename-var <variable> <name>
EOF
}
sub set_var($) {
my $var = shift;
$state{var} = $var;
if ($var =~ /(.*):(.*)/) {
$state{template} = $1;
$state{var} = $2;
$state{related_var} = "URL";
} else {
$state{context} = 1;
$state{related_var} = "PKG_SOURCE";
}
}
my %check_command = (
"add-hash" => sub {
set_var($ARGV[0]);
$state{value} = $ARGV[1];
length($ARGV[1]) == 64 or die "Invalid hash value\n";
},
"fix-hash" => sub {
set_var($ARGV[0]);
$state{value} = $ARGV[1];
$state{prev_value} = $ARGV[2];
length($ARGV[1]) == 64 or die "Invalid hash value\n";
},
"rename-var" => sub {
set_var($ARGV[0]);
$state{new_var} = $ARGV[1];
$state{new_var} =~ s/.*://g;
},
);
sub check_context($) {
my $line = shift;
return unless $state{template};
$state{next} and do {
$state{context} = 1;
undef $state{next};
return;
};
if (not $state{context}) {
$line =~ /^\s*define\s+$state{template}/ and $state{next} = 1;
} else {
$line =~ /^\s*endef/ and do {
$state{done} = 1;
undef $state{context};
}
}
}
my %commands = (
"add-hash" => sub {
my $line = shift;
check_context($line);
return $line unless $state{context};
# skip existing hash variable
return "" if $line =~ /^(\s*)$state{var}(\s*):?=(\s*)(.*)\n/;
# insert md5sum after related variable
return $line unless $line =~ /^(\s*)$state{related_var}(\s*):?=(\s*)(.*)\n/;
return "$line$1$state{var}$2:=$3$state{value}\n";
},
"fix-hash" => sub {
my $line = shift;
check_context($line);
return $line unless $state{context};
return $line unless $line =~ /^(\s*)$state{var}(\s*):?=(\s*)(.*)$state{prev_value}(.*)\n/;
$state{done} = 1;
$4 =~ /\$/ and do {
warn "$state{var} contains a reference to another variable, can't fix automatically\n";
return $line;
};
return "$1$state{var}$2:=$3$state{value}\n";
},
"rename-var" => sub {
my $line = shift;
check_context($line);
return $line unless $state{context};
return $line unless $line =~ /^(\s*)$state{var}(\s*:?=.*)\n/;
return "$1$state{new_var}$2\n";
},
);
my $file = shift @ARGV;
my $command = shift @ARGV;
($file and $command and $check_command{$command}) or usage;
&{$check_command{$command}}();
-f $file or die "File $file not found\n";
open IN, "<${file}" or die "Cannot open input file\n";
open OUT, ">${file}.new" or die "Cannot open output file\n";
my $cmd = $commands{$command};
while (my $line = <IN>) {
$line = &$cmd($line) unless $state{done};
print OUT $line;
last if $error;
}
close OUT;
close IN;
$error and do {
unlink "${file}.new";
exit 1;
};
rename "${file}.new", "$file";