| #!/usr/bin/perl | |
| # | |
| # Copyright Statement: | |
| # -------------------- | |
| # This software is protected by Copyright and the information contained | |
| # herein is confidential. The software may not be copied and the information | |
| # contained herein may not be used or disclosed except with the written | |
| # permission of MediaTek Inc. (C) 2005 | |
| # | |
| # 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). | |
| # | |
| # | |
| #***************************************************************************** | |
| #* | |
| #* Filename: | |
| #* --------- | |
| #* vivaPrelink.pl | |
| #* | |
| #* Project: | |
| #* -------- | |
| #* Maui_Software | |
| #* | |
| #* Description: | |
| #* ------------ | |
| #* This file implemented the VIVA prelink process. | |
| #* | |
| #* | |
| #* Author: | |
| #* ------- | |
| #* Ke-Ting Chen (mtk03141) | |
| #* | |
| #***************************************************************************** | |
| #**************************************************************************** | |
| # Included Modules | |
| #**************************************************************************** | |
| use strict; | |
| use warnings; | |
| BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path | |
| use vivaHelper; | |
| #**************************************************************************** | |
| # History | |
| #**************************************************************************** | |
| my $VIVA_PRELINK_VERNO = " v1.00"; | |
| # v1.00: Phase in VIVA | |
| #**************************************************************************** | |
| # Constants | |
| #**************************************************************************** | |
| my $DEBUG = 1; | |
| my $afOverlapListName = "objectAF_Overlap.list"; | |
| my $afOverlapLibraryName = "af_overlap.lib"; | |
| my $separateLine = "============================================================="; | |
| #**************************************************************************** | |
| # Arguments | |
| #**************************************************************************** | |
| &vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__) | |
| unless scalar(@ARGV) == 5; | |
| my $customFolder = $ARGV[0]; | |
| my $libraryFolder = $ARGV[1]; | |
| my $objectFolder = $ARGV[2]; | |
| my $makefilePath = $ARGV[3]; | |
| my $outputFilePath = $ARGV[4]; | |
| # To align error message file name format | |
| $customFolder =~ s/^.\\|^\\//; | |
| $libraryFolder =~ s/^.\\|^\\//; | |
| $objectFolder =~ s/^.\\|^\\//; | |
| $makefilePath =~ s/^.\\|^\\//; | |
| $outputFilePath =~ s/^.\\|^\\//; | |
| # Print out the arguments | |
| printLog($separateLine); | |
| printLog("Arguments:"); | |
| printLog("Custom Folder: $customFolder"); | |
| printLog("Library Folder: $libraryFolder"); | |
| printLog("Object Folder: $objectFolder"); | |
| printLog("Makefile: $makefilePath"); | |
| printLog("Output File: $outputFilePath"); | |
| printLog(""); | |
| #**************************************************************************** | |
| # Variables | |
| #**************************************************************************** | |
| my $afOverlapList = "$customFolder\\$afOverlapListName"; | |
| my $afOverlapLibrary = "$libraryFolder\\$afOverlapLibraryName"; | |
| #**************************************************************************** | |
| # Process | |
| #**************************************************************************** | |
| exit 0; | |
| printLog("[Start VIVA prelink]"); | |
| &vivaHelper::Initialize(&vivaHelper::PROCESS_TYPE, $makefilePath); | |
| # Check feature options | |
| { | |
| my $zImageOption = &vivaHelper::GetMakefileOption("ZIMAGE_SUPPORT"); | |
| my $aliceOption = &vivaHelper::GetMakefileOption("ALICE_SUPPORT"); | |
| unless ((defined $zImageOption and $zImageOption eq "TRUE") and | |
| (defined $aliceOption and $aliceOption eq "TRUE")) | |
| { | |
| printLog("No need of prelinking"); | |
| goto END_PROCESS; | |
| } | |
| } | |
| # ALICE Prelink process | |
| { | |
| my %objectAFOverlapHash; | |
| my @libraryList; | |
| # Get AF overlap list hash | |
| { | |
| printLog("Getting AF overlap list..."); | |
| # Read AF overlap list | |
| my @objectAFOverlapList; | |
| &vivaHelper::InputObjectListFromFile($afOverlapList, \@objectAFOverlapList); | |
| # Change to AF overlap list to hash form | |
| foreach my $object (@objectAFOverlapList) | |
| { | |
| $objectAFOverlapHash{"$object->{name}"} = 1; | |
| debugLog("$object->{name}"); | |
| } | |
| } | |
| # Delete the original AF overlap library | |
| unlink($afOverlapLibrary) if -e $afOverlapLibrary; | |
| # Move the AF overlap objects | |
| { | |
| printLog("Getting all object list..."); | |
| my @allObjectList; | |
| &getFileList($objectFolder, \@allObjectList); | |
| my %deleteObjectHash; | |
| my $addObjectString = ""; | |
| printLog("Matching overlap object..."); | |
| foreach my $object (@allObjectList) | |
| { | |
| if ($object =~ /\\([\w\.]+)\\([\w\.]+)$/) | |
| { | |
| # Check if in the AF overlap list | |
| if ($objectAFOverlapHash{$2}) | |
| { | |
| # Mark the file as processed | |
| $objectAFOverlapHash{$2} = 0; | |
| if (exists $deleteObjectHash{$1}) | |
| { | |
| $deleteObjectHash{$1} .= "$2 "; | |
| } | |
| else | |
| { | |
| $deleteObjectHash{$1} = "$2 "; | |
| } | |
| $addObjectString .= "$object " | |
| } | |
| } | |
| } | |
| printLog("Adding objects..."); | |
| debugLog("$_") foreach split(/ /, $addObjectString); | |
| &addLibraryFile($afOverlapLibrary, $addObjectString); | |
| printLog("Deleting objects..."); | |
| while (my ($key, $value) = each %deleteObjectHash) | |
| { | |
| debugLog("$key: $value"); | |
| &deleteLibraryFile("$libraryFolder\\$key.lib", $value); | |
| } | |
| } | |
| # Output the library name to the output file | |
| if (-e $afOverlapLibrary) | |
| { | |
| open my $output, ">$outputFilePath" or | |
| &vivaHelper::ErrorHandler("Cannot open file $outputFilePath: $!", __FILE__, __LINE__); | |
| print $output $afOverlapLibraryName; | |
| close $output; | |
| } | |
| # Print out the non-processed list | |
| printLog("\nNon-processed objects"); | |
| while (my ($key, $value) = each %objectAFOverlapHash) | |
| { | |
| printLog("\t$key") if ($value); | |
| } | |
| } | |
| END_PROCESS: | |
| printLog("[End VIVA prelink]"); | |
| exit 0; | |
| #**************************************************************************** | |
| # subroutine: getFileList | |
| # description: Get all the file list under the folder. | |
| # input: Folder path, file list ref | |
| # output: File list | |
| #**************************************************************************** | |
| sub getFileList | |
| { | |
| my $folderPath = shift; | |
| my $fileListRef = shift; | |
| system("dir $folderPath /S /B > ~listTemp.tmp"); | |
| open my $input, "<~listTemp.tmp"; | |
| while (<$input>) | |
| { | |
| chomp; | |
| push @$fileListRef, $_; | |
| } | |
| close $input; | |
| unlink("~listTemp.tmp"); | |
| } | |
| #**************************************************************************** | |
| # subroutine: getLibraryFileList | |
| # description: Get the file list in a library. | |
| # input: Library path, library file list ref | |
| # output: Library file list | |
| #**************************************************************************** | |
| sub getLibraryFileList | |
| { | |
| my $library = shift; | |
| my $listRef = shift; | |
| my $result = `armar -t $library 2>&1`; | |
| if ($result =~ /Error:/) | |
| { | |
| &vivaHelper::ErrorHandler("Fail to get library content files $library $result", __FILE__, __LINE__); | |
| } | |
| else | |
| { | |
| @$listRef = split(/\n/, $result); | |
| } | |
| } | |
| #**************************************************************************** | |
| # subroutine: addLibraryFile | |
| # description: Add the files to the library. | |
| # input: Library, files | |
| # output: None | |
| #**************************************************************************** | |
| sub addLibraryFile | |
| { | |
| my $library = shift; | |
| my $files = shift; | |
| my $result; | |
| open my $output, ">~tempVIAFile.tmp"; | |
| print $output $files; | |
| close $output; | |
| if (-e $library) | |
| { | |
| $result = `armar -r $library -via ~tempVIAFile.tmp 2>&1`; | |
| } | |
| else | |
| { | |
| $result = `armar --create $library -via ~tempVIAFile.tmp 2>&1`; | |
| } | |
| unlink("~tempVIAFile.tmp"); | |
| if ($result =~ /Error/) | |
| { | |
| &vivaHelper::ErrorHandler("Fail to add library content files $library $result", __FILE__, __LINE__); | |
| } | |
| } | |
| #**************************************************************************** | |
| # subroutine: deleteLibraryFile | |
| # description: Delete the files from the library. | |
| # input: Library, files | |
| # output: None | |
| #**************************************************************************** | |
| sub deleteLibraryFile | |
| { | |
| my $library = shift; | |
| my $files = shift; | |
| my $result; | |
| # Delete files one by one for only remake some module case | |
| foreach my $file (split(/ /, $files)) | |
| { | |
| $result = `armar -d $library $file 2>&1`; | |
| chomp $result; | |
| if ($result =~ /Error/) | |
| { | |
| printLog("Warning: Cannot delete library content file $file from $library. $result"); | |
| #&vivaHelper::ErrorHandler("Fail to delete library content files $library $result", __FILE__, __LINE__); | |
| } | |
| } | |
| } | |
| sub printLog | |
| { | |
| print "$_[0]\n"; | |
| } | |
| sub debugLog | |
| { | |
| if ($DEBUG) | |
| { | |
| printLog("\t$_[0]"); | |
| } | |
| } | |
| # tools\vivaPrelink.pl .\custom\system\MT6250_EVB .\build\MT6250_EVB\gprs\MT6250o\lib .\build\MT6250_EVB\gprs\MT6250o .\make\MT6250_EVB_GPRS.mak .\output.txt >tempVIVA.txt |