155 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/perl
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################## HOW TO USE THIS FILE #####################
							 | 
						||
| 
								 | 
							
								# iar keil xpresso to build with those toolchain
							 | 
						||
| 
								 | 
							
								# clean or build for action
							 | 
						||
| 
								 | 
							
								#############################################################
							 | 
						||
| 
								 | 
							
								use List::MoreUtils 'any';
							 | 
						||
| 
								 | 
							
								use File::Spec;
							 | 
						||
| 
								 | 
							
								use File::Find;
							 | 
						||
| 
								 | 
							
								use File::Path;
							 | 
						||
| 
								 | 
							
								use File::Glob;
							 | 
						||
| 
								 | 
							
								use File::stat;
							 | 
						||
| 
								 | 
							
								use File::Basename;
							 | 
						||
| 
								 | 
							
								use Cwd;
							 | 
						||
| 
								 | 
							
								use Cwd 'abs_path';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#use Time::Piece;
							 | 
						||
| 
								 | 
							
								#use Time::Seconds;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$" = "\n"; # change list separator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$KEIL_PATH    = 'C:/Keil/UV4'; #'/C/Keil/UV4';
							 | 
						||
| 
								 | 
							
								$IAR_PATH     = glob ('C:/Program*/IAR*/Embedded*/common/bin');
							 | 
						||
| 
								 | 
							
								$XPRESSO_PATH = glob ('C:/nxp/LPCXpresso_7*/lpcxpresso');
							 | 
						||
| 
								 | 
							
								$XPRESSO_PATH = "$XPRESSO_PATH;$XPRESSO_PATH/bin;$XPRESSO_PATH/tools/bin;$XPRESSO_PATH/msys/bin";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$ENV{'PATH'} = $KEIL_PATH . ';' . $IAR_PATH . ';' . $XPRESSO_PATH . ';' . $ENV{'PATH'};
							 | 
						||
| 
								 | 
							
								#print $ENV{'PATH'}; die;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$repo_path = abs_path(cwd . "/.."); 
							 | 
						||
| 
								 | 
							
								#print $repo_path; die;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$device_dir = "device/device";
							 | 
						||
| 
								 | 
							
								$host_dir   = "host/host";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$is_build = any { /build/ } @ARGV;
							 | 
						||
| 
								 | 
							
								$is_clean = any { /clean/ } @ARGV;
							 | 
						||
| 
								 | 
							
								$is_build = 1 if !$is_clean; # default is build
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								$is_keil     = (any { /keil/    } @ARGV) || (any { /all/ } @ARGV);
							 | 
						||
| 
								 | 
							
								$is_iar      = (any { /iar/     } @ARGV) || (any { /all/ } @ARGV);
							 | 
						||
| 
								 | 
							
								$is_xpresso  = (any { /xpresso/ } @ARGV) || (any { /all/ } @ARGV);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################## KEIL #####################
							 | 
						||
| 
								 | 
							
								if ($is_keil)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  @KEIL_PROJECT_LIST = (<$device_dir*/*.uvproj>, <$host_dir*/*.uvproj>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  foreach (@KEIL_PROJECT_LIST)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    /([^\/]+).uvproj/;
							 | 
						||
| 
								 | 
							
								    my $log_file = "build_all_keil_" . $1 . ".txt";
							 | 
						||
| 
								 | 
							
								    my $build_cmd = "Uv4 -b $_ -z -j0 -o ../../$log_file";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cmd_execute($build_cmd);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################## IAR #####################
							 | 
						||
| 
								 | 
							
								if ($is_iar)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  @IAR_PROJECT_LIST = (<$device_dir*/*.ewp>, <$host_dir*/*.ewp>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  foreach (@IAR_PROJECT_LIST)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    my $proj_dir = dirname $_;
							 | 
						||
| 
								 | 
							
								     
							 | 
						||
| 
								 | 
							
								    /([^\/]+).ewp/;
							 | 
						||
| 
								 | 
							
								    my $proj_name = $1;
							 | 
						||
| 
								 | 
							
								    my $log_file = "build_all_iar_" . $proj_name . ".txt";
							 | 
						||
| 
								 | 
							
								    unlink $log_file; #delete log_file if existed
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #open project file to get configure name
							 | 
						||
| 
								 | 
							
								    my $file_content = file_to_var($_);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    #get configure by pattern and build
							 | 
						||
| 
								 | 
							
								    while ($file_content =~ /^\s*<configuration>\s*$^\s*<name>(.+)<\/name>\s*$/gm)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      my $build_cmd = "IarBuild $_ -build $1 -log warnings >> $log_file";
							 | 
						||
| 
								 | 
							
								      cmd_execute($build_cmd);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      my $out_file = "$proj_dir/$1/Exe/$proj_name.out";
							 | 
						||
| 
								 | 
							
								      system("size $out_file >> $log_file");
							 | 
						||
| 
								 | 
							
								    }  
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################## LPCXPRESSO #####################
							 | 
						||
| 
								 | 
							
								($repo_path_other_dash = $repo_path) =~ s/\//\\/g;
							 | 
						||
| 
								 | 
							
								if ($is_xpresso)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  $workspace_dir = "C:/Users/hathach/Dropbox/tinyusb/workspace7"; #projects must be opened in the workspace to be built
							 | 
						||
| 
								 | 
							
								  @XPRESSO_PROJECT_LIST = (<$device_dir*/.cproject>, <$host_dir*/.cproject>);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  foreach (@XPRESSO_PROJECT_LIST)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    /([^\/]+)\/.cproject/;
							 | 
						||
| 
								 | 
							
								    my $log_file = "build_all_xpresso_" . $1 . ".txt";
							 | 
						||
| 
								 | 
							
								    my $build_cmd = "lpcxpressoc -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -build $1 -data $workspace_dir > $log_file";
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    cmd_execute($build_cmd);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    #open log file to clean up output
							 | 
						||
| 
								 | 
							
								    open (my $fin, $log_file) or die;
							 | 
						||
| 
								 | 
							
								    my @log_content = <$fin>;
							 | 
						||
| 
								 | 
							
								    close($fin);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    open (my $fout, ">$log_file") or die;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    foreach (@log_content)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      unless (/Invoking: MCU C Compiler/ or /arm-none-eabi-gcc -D/ or /Finished building:/ or /^ $/)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        s/Building file:.+?([^\/]+\.[ch])/\1/;
							 | 
						||
| 
								 | 
							
								        s/$repo_path//;
							 | 
						||
| 
								 | 
							
								        s/$repo_path_other_dash//;
							 | 
						||
| 
								 | 
							
								        print $fout $_;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### call report builder ###
							 | 
						||
| 
								 | 
							
								system("perl build_report.pl");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								################## HELPER #####################
							 | 
						||
| 
								 | 
							
								sub cmd_execute 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  print "executing: $_[0]\n...";
							 | 
						||
| 
								 | 
							
								  system($_[0]);
							 | 
						||
| 
								 | 
							
								  print "done\n";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub file_to_var
							 | 
						||
| 
								 | 
							
								{ #open project file to get configure name
							 | 
						||
| 
								 | 
							
								  my $file_content;
							 | 
						||
| 
								 | 
							
								  open(my $fin, $_[0]) or die "Can't open $_[0] to read\n";
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    local $/;
							 | 
						||
| 
								 | 
							
								    $file_content = <$fin>;
							 | 
						||
| 
								 | 
							
								    close($fin);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  return $file_content;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub var_to_file
							 | 
						||
| 
								 | 
							
								{ # file name, content
							 | 
						||
| 
								 | 
							
								  open(my $fout, ">$_[0]") or die "Can't open $_[0] to write\n";
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    print $fout $_[1];
							 | 
						||
| 
								 | 
							
								    close($fout);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |