[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/GetDepMod.pl b/mcu/tools/GetDepMod.pl
new file mode 100644
index 0000000..6e25359
--- /dev/null
+++ b/mcu/tools/GetDepMod.pl
@@ -0,0 +1,225 @@
+#!/usr/bin/perl -w
+#use strict;
+use File::Basename;
+use Cwd;
+
+&Usage() if ($#ARGV < 3);
+
+my $DEBUG = 0; # debug for normal info.
+my $DEBUG1 = 0; # debug for parsing .dep file
+my $InterMode = 0; # turn ON/OFF interaction mode
+
+my $time = 0;
+$time = time if($DEBUG);
+
+chomp($CWD = cwd());
+$CWD =~ s/\\$// if ($CWD =~ /\\$/);
+print "[CWD]: ",$CWD,"\n" if ($DEBUG);
+
+my ($CODEBASE_PATH,$PROJECT_NAME,$FLAVOR,$MODEM_TYPE,@CHANGE_SET) = @ARGV;
+my @DEP_MODS = ();
+
+$CODEBASE_PATH = (dirname($CODEBASE_PATH) =~ /:/)? $CODEBASE_PATH : "$CWD/$CODEBASE_PATH";
+die "$CODEBASE_PATH does NOT exist, PLEASE check it!!!\n" if (!-d $CODEBASE_PATH);
+
+if ((@CHANGE_SET == 1) && $CHANGE_SET[0] =~ /^\s*@(.*)/)
+{
+ @CHANGE_SET = ();
+ open (FH, "<$1") or die "can NOT open $1!!!\n";
+ while(<FH>)
+ {
+ chomp;
+ push (@CHANGE_SET, $_);
+ }
+ close (FH);
+ &Usage() if (!@CHANGE_SET);
+}
+
+print "[CHANGE_SET]: @CHANGE_SET\n" if ($DEBUG);
+
+chdir($CODEBASE_PATH);
+foreach my $f (@CHANGE_SET)
+{
+ die "$f does NOT exist, PLEASE check it!!!\n" if (!-e $f);
+}
+
+open (MF,"<make/pcore/${PROJECT_NAME}_${MODEM_TYPE}(${FLAVOR}).mak") or die "can NOT open make/pcore/${PROJECT_NAME}_${MODEM_TYPE}(${FLAVOR}).mak!!!\n";
+while(<MF>)
+{
+ if (/^\s*(\w+)\s*=\s*(\w+)/)
+ {
+ my $keyname = uc($1);
+ $${keyname} = uc($2);
+ }
+}
+close (MF);
+my @tmp = &NOTExistDEPMods("build/${PROJECT_NAME}_${MODEM_TYPE}/$FLAVOR/bin/dep",
+ &GetSRCMods("build/${PROJECT_NAME}_${MODEM_TYPE}/$FLAVOR/bin/log/infomake.log"));
+
+print "[NOTExistDEPMods]: @tmp\n" if ($DEBUG && @tmp);
+
+if (@tmp)
+{
+ print "\n===========================================================\n";
+ print "@tmp";
+ print "\n===========================================================\n";
+ my $msg = "The above " . ((@tmp == 1)? "module's" : "modules'") . " .dep file NOT exists";
+
+ if ($InterMode)
+ {
+ my $flag = 1;
+ while(1)
+ {
+ if ($flag)
+ {
+ print "$msg!!!\n".
+ "WARNING: *** Execute the action \"check_dep/remake_dep/update_dep\" may get the wrong result!!!\n";
+ $flag = 0;
+ }
+ print "Do you really want to go ahead? (Y/N): ";
+ my $choice = <STDIN>;
+ last if ($choice =~ /^\s*(Y|YES)\s*$/i);
+ exit 1 if ($choice =~ /^\s*(N|NO)\s*$/i);
+ }
+ }
+ else
+ {
+ print "$msg!!!\n".
+ "Execute the action \"check_dep/remake_dep/update_dep\" may get the wrong result!!!\n".
+ "PLEASE use action \"scan\" to generate" . ((@tmp == 1)? " its dependency file" : " their dependency files") . "!!!\n";
+ exit 1;
+ }
+}
+
+print "Scanning dependency modules...\n";
+@DEP_MODS = &GetDEPMods("build/${PROJECT_NAME}_${MODEM_TYPE}/$FLAVOR/bin/dep", \@CHANGE_SET);
+if (@DEP_MODS)
+{
+ print "===================DEPENDENCY MODULE(S)===================\n";
+ print "@DEP_MODS\n";
+}
+else
+{
+ print "NOT found dependency modules!!!\n";
+}
+
+$time = time - $time if ($DEBUG);
+print "Time Comsumption: $time\n" if ($DEBUG);
+
+
+sub GetDEPMods
+{
+ my ($deppath, $change_set_ref) = @_;
+ my @result = ();
+ while(<$deppath/*.dep>)
+ {
+ my $depfile = $_;
+ print $depfile,"\n" if ($DEBUG1);
+ my $module = basename($_, '.dep');
+ next if ($module eq "codegen" || $module eq "resgen" || $module eq "nvram_auto_gen");
+ my $tar = '';
+ open(FH, "<$depfile") or die "can NOT open $depfile!!!\n";
+ while(<FH>)
+ {
+ chomp;
+ next if (/^\s*#/);
+ next if ($_ eq '');
+ print $_,"\n" if ($DEBUG1);
+ $_ =~ s/\//\\/g;
+# if (/^\s*((\w+)\.obj:)?\s+(\w+(\\\w+)*\\\w+\.\w+)(\s+\\)?$/)
+# if (/^\s*((.+)\.obj:)?\s+(.+(\\.+)*\\.+\.\w+)(\s+\\)?$/)
+
+ if (/^\s*((\S+)\.(?:obj|o|db):)?\s+(\S+(\\\S+)*\\\S+\.\w+)(\s+\\)?$/)
+ {
+ # ------------------------------------------------------
+ # $2: target, $3: dependency
+ # sourcename.obj: dir1\dir2\...\dirN\headername.(h|hpp)
+ # ------------------------------------------------------
+ # $3: dependency
+ # dir1\dir2\...\dirN\headername.(h|hpp)
+ # ------------------------------------------------------
+ my $dep = $3;
+ $dep =~ s/\//\\/g;
+ $dep =~ s/\\/\\\\/g;
+ my $dep_head = (/^\s*(\S+)\.(?:obj|o|db):/)? 1:0;
+ $tar = $1 if ($dep_head);
+ print "[target: dependency] \$tar: $tar\n" if ($DEBUG1 && $dep_head);
+ print "[dependency] \$tar: $tar\n" if ($DEBUG1 && !$dep_head);
+
+ foreach my $i (@$change_set_ref)
+ {
+ $i =~s/\//\\/g;
+ if ($i =~ /$dep/i)
+ {
+ push (@result, $module) if (!grep(/^$module$/i, @result));
+ }
+ elsif (basename($i) =~ /^$tar\.(c|cpp|s|arm)\b$/i)
+ {
+ push (@result, $module) if (!grep(/^$module$/i, @result));
+ }
+ else
+ {
+ next;
+ }
+ }
+ }
+ elsif ($tar eq '')
+ {
+ die "Incorrect content in dependency file \"$depfile\"!!!\n";
+ }
+ else
+ {
+ print "Match Failed Line: *** ",$_,"\n" if ($DEBUG1);
+ next;
+ }
+ }
+ close(FH);
+ }
+ return @result;
+}
+
+sub GetSRCMods
+{
+ my $infomakelog = shift;
+ my @allSRCMods = ();
+ open (INFOMAKELOG, "<$infomakelog") or die "can NOT open $infomakelog!!!\n";
+ while(<INFOMAKELOG>)
+ {
+ chomp;
+ if (/^\s*COMPLIST\s*=\s*(.*)\s*/)
+ {
+ my $COMPLIST = $1;
+ @allSRCMods = split(/\s+/,$COMPLIST);
+ last;
+ }
+ }
+ close (INFOMAKELOG);
+ return \@allSRCMods;
+}
+
+sub NOTExistDEPMods
+{
+ my ($deppath, $arr_ref) = @_;
+ my @DEPMods = ();
+ foreach my $d (@$arr_ref)
+ {
+ push (@DEPMods, $d) if (!-e "$deppath/$d.dep");
+ }
+ return @DEPMods;
+}
+
+sub Usage
+{
+ my $script = basename($0);
+ print <<"__EOFUSAGE";
+
+Usage: $script CODEBASE PROJECT_NAME MODEM_TYPE <file1[ file2[ ...]] | \@files>
+
+CODEBASE Specify the code path
+PROJECT_NAME Specify project name, such as TIANYU28_DEMO etc...
+MODEM_TYPE Specify modem type, such as l1s, basic, gsm, gprs, umts etc...
+file1 Specify the changed source/header
+\@files Specify more changed sources/headers via a file (change list)
+__EOFUSAGE
+ exit 1;
+}
\ No newline at end of file