#! /usr/bin/perl
use bytes;
use strict;
use warnings;

sub analyze_buildlink3_mk(@) {
	my @lines = @_;

	return "MOD1" unless shift(@lines) =~ m"^BUILDLINK_DEPTH:=\s*\$\{BUILDLINK_DEPTH\}\+$";
	return "MOD1" unless shift(@lines) =~ m"^([A-Z0-9_]+)_BUILDLINK3_MK:=\s*\$\{\1_BUILDLINK3_MK\}\+$";
	my $PKGNAME = $1;

	return "MOD2" unless shift(@lines) =~ m"^\.if (?:!empty\(BUILDLINK_DEPTH:M\+\)|\$\{BUILDLINK_DEPTH\} == \"\+\")$";
	return "MOD2" unless shift(@lines) =~ m"^BUILDLINK_DEPENDS\+=\s*([\w_\-]+)$";
	my $pkgname = $1;
	return "MOD2" unless shift(@lines) eq ".endif";

	return "MOD3" unless shift(@lines) =~ m"^BUILDLINK_PACKAGES:=\s*\$\{BUILDLINK_PACKAGES:N\Q$pkgname\E\}$";
	return "MOD3" unless shift(@lines) =~ m"^BUILDLINK_PACKAGES\+=\s*\Q$pkgname\E$";
	return "MOD3" unless shift(@lines) =~ m"^BUILDLINK_ORDER:=\s*\$\{BUILDLINK_ORDER\} \$\{BUILDLINK_DEPTH\}\Q$pkgname\E$";

	return "MOD4" unless shift(@lines) =~ m"^\.if (?:!empty\(\Q$PKGNAME\E_BUILDLINK3_MK:M\+\)|\$\{\Q$PKGNAME\E_BUILDLINK3_MK\} == \"\+\")$";
	return "MOD4" unless shift(@lines) =~ m"BUILDLINK_API_DEPENDS.\Q$pkgname\E\+=\s*(.*)$";
	my $api_depends = $1;
	my $abi_depends = undef;
	if ($lines[0] =~ m"BUILDLINK_ABI_DEPENDS.\Q$pkgname\E\+=\s*(.*)$") {
		$abi_depends = $1;
		shift(@lines);
	}
	return "MOD4" unless shift(@lines) =~ m"BUILDLINK_PKGSRCDIR.\Q$pkgname\E\?=\s*\.\./\.\./(.*)$";
	my $pkgpath = $1;
	return "MOD4" unless shift(@lines) =~ m"^\.endif";

	my @includes = ();
	while ($lines[0] =~ m"^\.include \"(.*/buildlink3.mk)\"$") {
		push(@includes, $1);
		shift(@lines);
	}

	return "MOD5" unless shift(@lines) =~ m"^BUILDLINK_DEPTH:=\s*\$\{BUILDLINK_DEPTH:S/\+\$//\}$";
	return "DEF";
}

foreach my $f (@ARGV) {
	open(F, "<", $f) or die;
	chomp(my @lines = <F>);
	close(F) or die;

	my @nclines = grep { !m"^#" && !m"^\s*$" } @lines;
	printf("%s\t%s\n", analyze_buildlink3_mk(@nclines), $f);
}
