# 
# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
# 
# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
# 
# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
# LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
# 

package tools::pack_dep_gen;
use File::Basename;
use File::Path;
use strict;
use Cwd qw(abs_path);
use Exporter;
use vars qw(@ISA @EXPORT @EXPORT_OK);
@ISA = qw(Exporter);
@EXPORT = qw(PushDependFile PrintDependModule PrintToDep);
@EXPORT_OK = qw(PushDependFile PrintDependModule PrintToDep);

return 1;

my @collect_file;
my $target;

#*************************************************************************************************
# Print source file to dependency file
#*************************************************************************************************
sub PrintToDep {
  $target = shift;
  my $printTarget = $target;
  if ($^O eq "linux"){
  if ($printTarget =~ /^(\.\.\/)*(\S*)/) {
    $printTarget = $2;
  } 

  foreach my $value (values %INC) {
    if ($value =~ /[\/\\]Perl([\/\\].*)?[\/\\]lib[\/\\]/i) {
      # skip system module
    }
    else {
      push(@collect_file,$value);
    }
  }
  
  my $file_dir = dirname($target);
  mkpath($file_dir) or die "[Error:][pack_gen_dep.pm]Can Not create $file_dir! $!" if(!-d "$file_dir");
  
  my $current_abs_path = abs_path("./");
  my $element;
  my $abs_element;
  my $mcu_abs_path;
  my $uni_com_abs_path;
  open (det_file,">>$target") or &pack_error_handler("cannot open $target!", __FILE__, __LINE__);
  
  if ($current_abs_path =~ /mcu(.*)/){
    $uni_com_abs_path = $current_abs_path;
    $uni_com_abs_path =~ s/\/mcu(.*)//;
  } else {
     print "[Error]: Cannot figure out the current path: $current_abs_path, please CHECK!\n";
     exit 1;
  }
  
  $mcu_abs_path = "$uni_com_abs_path/mcu";
  foreach $element (@collect_file){
    $abs_element = abs_path($element);
    $abs_element =~ s/$mcu_abs_path\///;
    $abs_element =~ s/$uni_com_abs_path/../;
    print det_file "$printTarget: $abs_element\n";
  }
  close(det_file);
  }
}

#*************************************************************************************************
# store source file to dependency file
#*************************************************************************************************
sub PushDependFile {
  my $file = shift;
  
  if (-e $file) {
    push(@collect_file,$file);
  }
  else {
    print "[Error]: $file does not exist in codebase, plase help to check!\n";
    exit 1;
  }
}

#*************************************************************************************************
# Get source file from script
#*************************************************************************************************
sub PrintDependModule {
  my $file = shift;
  if ($^O eq "linux"){
  if ($file eq "") {
    PushDependFile($0);
  }
  else {
    PushDependFile($file);
  }
  }
}

#*************************************************************************************************
# Error Handling Message
#*************************************************************************************************
sub pack_error_handler {
  my ($error_msg, $pack_file, $line_no) = @_;
  my $final_error_msg = "Error: $error_msg at $pack_file line $line_no\n";
  print "\n\n$final_error_msg";
  die $final_error_msg;
}