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);
 | |
|   }
 | |
| }
 | 
