[source] build: add FIXUP option for make check

LEDE Commits lede-commits at lists.infradead.org
Sat Dec 17 01:37:38 PST 2016


nbd pushed a commit to source.git, branch master:
https://git.lede-project.org/d49059693b752f6bca398073c1f0d0908e3d9b80

commit d49059693b752f6bca398073c1f0d0908e3d9b80
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Fri Dec 16 13:34:37 2016 +0100

    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 at nbd.name>
---
 include/download.mk       |  19 ++++++-
 scripts/fixup-makefile.pl | 135 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 153 insertions(+), 1 deletion(-)

diff --git a/include/download.mk b/include/download.mk
index a9e8a0e..63ded7e 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 0000000..9026ddc
--- /dev/null
+++ b/scripts/fixup-makefile.pl
@@ -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";



More information about the lede-commits mailing list