#!/usr/bin/perl use Scalar::Util qw(looks_like_number); $" = "\n"; # change list separator $keil_size = "Program Size:.+"; %report_patterns = ( #toolchain, pattern-list 'keil' => ['Build target \'(.+)\'', '(\d+ Error.+\d+ Warning)', $keil_size . 'Code=(\d+)', $keil_size . 'RO-data=(\d+)', $keil_size . 'RW-data=(\d+)', $keil_size . 'ZI-data=(\d+)'], 'iar' => ['Building configuration.+ (.+)', 'Total number of (.+)', '((\s+\d+){4})\s+[0-9a-f]+'], 'xpresso' => ['Build of configuration (\S+) ', '(Finished) building target', '((\s+\d+){4})\s+[0-9a-f]+'] ); @report_file_list = ; #print "@report_file_list"; die; open $freport, ">build_report.txt" or die "cannot open build_reprot.txt"; foreach (@report_file_list) { /build_all_([^_]+)_/; build_report($_, $1); } sub build_report { my $report_file = $_[0]; my $toolchain = $_[1]; my @pattern = @{$report_patterns{$toolchain}}; open $report_handle, $report_file or die "cannot open $report_file"; $report_file =~ /build_all_(.+).txt/; print $freport "--------------------------------------------------------------------\n"; printf $freport "%-25s", $1; printf $freport "%13s", "" if $toolchain eq 'iar'; print $freport " text data bss dec" if $toolchain eq 'xpresso' or $toolchain eq 'iar'; print $freport " Code RO RW ZI" if $toolchain eq 'keil'; print $freport "\n--------------------------------------------------------------------"; while( my $line = <$report_handle> ) { local $/ = "\r\n"; chomp $line; foreach (@pattern) { if ($line =~ /$_/) { my $fmat = ($_ eq $pattern[0]) ? "\n%-25s" : "%s "; $fmat = "%6s " if $toolchain eq 'keil' and looks_like_number($1); printf $freport $fmat, $1; } } } close $report_handle; print $freport "\n\n"; }