From d49059693b752f6bca398073c1f0d0908e3d9b80 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 16 Dec 2016 13:34:37 +0100 Subject: [PATCH] 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 --- include/download.mk | 19 +++++- scripts/fixup-makefile.pl | 135 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100755 scripts/fixup-makefile.pl diff --git a/include/download.mk b/include/download.mk index a9e8a0e2ff..63ded7ebcd 100644 --- a/include/download.mk +++ b/include/download.mk @@ -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 diff --git a/scripts/fixup-makefile.pl b/scripts/fixup-makefile.pl new file mode 100755 index 0000000000..9026ddcce4 --- /dev/null +++ b/scripts/fixup-makefile.pl @@ -0,0 +1,135 @@ +#!/usr/bin/env perl +use strict; + +my $error; +my %state; + +sub usage() { +die < [] + +Commands: +add-hash +fix-hash +rename-var + +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 = ) { + $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";