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:
parent
7a315b0b5d
commit
d49059693b
|
@ -47,9 +47,22 @@ endef
|
|||
ifdef CHECK
|
||||
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}')
|
||||
|
||||
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_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))
|
||||
|
@ -69,6 +82,10 @@ check_hash = \
|
|||
$(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)
|
||||
|
||||
# Skip MD5SUM check in feeds until OpenWrt is updated
|
||||
|
|
|
@ -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";
|
Loading…
Reference in New Issue