#!/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*\s*$^\s*(.+)<\/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 -cleanBuild $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); } }