blob: 6313c390c5f700decb85b92e008aa0be11f70592 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#!/usr/bin/perl
2#
3# Copyright Statement:
4# --------------------
5# This software is protected by Copyright and the information contained
6# herein is confidential. The software may not be copied and the information
7# contained herein may not be used or disclosed except with the written
8# permission of MediaTek Inc. (C) 2005
9#
10# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
11# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
12# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
13# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
14# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
15# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
16# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
17# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
18# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
19# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
20# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
21# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
22#
23# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
24# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
25# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
26# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
27# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
28#
29# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
30# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
31# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
32# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
33# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
34#
35#
36#*****************************************************************************
37#*
38#* Filename:
39#* ---------
40#* vivaPrelink.pl
41#*
42#* Project:
43#* --------
44#* Maui_Software
45#*
46#* Description:
47#* ------------
48#* This file implemented the VIVA prelink process.
49#*
50#*
51#* Author:
52#* -------
53#* Ke-Ting Chen (mtk03141)
54#*
55#*****************************************************************************
56
57#****************************************************************************
58# Included Modules
59#****************************************************************************
60use strict;
61use warnings;
62BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path
63use vivaHelper;
64
65#****************************************************************************
66# History
67#****************************************************************************
68my $VIVA_PRELINK_VERNO = " v1.00";
69 # v1.00: Phase in VIVA
70
71#****************************************************************************
72# Constants
73#****************************************************************************
74my $DEBUG = 1;
75my $afOverlapListName = "objectAF_Overlap.list";
76my $afOverlapLibraryName = "af_overlap.lib";
77my $separateLine = "=============================================================";
78
79#****************************************************************************
80# Arguments
81#****************************************************************************
82&vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__)
83 unless scalar(@ARGV) == 5;
84
85my $customFolder = $ARGV[0];
86my $libraryFolder = $ARGV[1];
87my $objectFolder = $ARGV[2];
88my $makefilePath = $ARGV[3];
89my $outputFilePath = $ARGV[4];
90
91# To align error message file name format
92$customFolder =~ s/^.\\|^\\//;
93$libraryFolder =~ s/^.\\|^\\//;
94$objectFolder =~ s/^.\\|^\\//;
95$makefilePath =~ s/^.\\|^\\//;
96$outputFilePath =~ s/^.\\|^\\//;
97
98# Print out the arguments
99printLog($separateLine);
100printLog("Arguments:");
101printLog("Custom Folder: $customFolder");
102printLog("Library Folder: $libraryFolder");
103printLog("Object Folder: $objectFolder");
104printLog("Makefile: $makefilePath");
105printLog("Output File: $outputFilePath");
106printLog("");
107
108#****************************************************************************
109# Variables
110#****************************************************************************
111my $afOverlapList = "$customFolder\\$afOverlapListName";
112my $afOverlapLibrary = "$libraryFolder\\$afOverlapLibraryName";
113
114#****************************************************************************
115# Process
116#****************************************************************************
117exit 0;
118
119printLog("[Start VIVA prelink]");
120
121&vivaHelper::Initialize(&vivaHelper::PROCESS_TYPE, $makefilePath);
122
123# Check feature options
124{
125 my $zImageOption = &vivaHelper::GetMakefileOption("ZIMAGE_SUPPORT");
126 my $aliceOption = &vivaHelper::GetMakefileOption("ALICE_SUPPORT");
127
128 unless ((defined $zImageOption and $zImageOption eq "TRUE") and
129 (defined $aliceOption and $aliceOption eq "TRUE"))
130 {
131 printLog("No need of prelinking");
132 goto END_PROCESS;
133 }
134}
135
136# ALICE Prelink process
137{
138 my %objectAFOverlapHash;
139 my @libraryList;
140
141 # Get AF overlap list hash
142 {
143 printLog("Getting AF overlap list...");
144 # Read AF overlap list
145 my @objectAFOverlapList;
146 &vivaHelper::InputObjectListFromFile($afOverlapList, \@objectAFOverlapList);
147
148 # Change to AF overlap list to hash form
149 foreach my $object (@objectAFOverlapList)
150 {
151 $objectAFOverlapHash{"$object->{name}"} = 1;
152 debugLog("$object->{name}");
153 }
154 }
155
156 # Delete the original AF overlap library
157 unlink($afOverlapLibrary) if -e $afOverlapLibrary;
158
159 # Move the AF overlap objects
160 {
161 printLog("Getting all object list...");
162 my @allObjectList;
163 &getFileList($objectFolder, \@allObjectList);
164
165 my %deleteObjectHash;
166 my $addObjectString = "";
167
168 printLog("Matching overlap object...");
169 foreach my $object (@allObjectList)
170 {
171 if ($object =~ /\\([\w\.]+)\\([\w\.]+)$/)
172 {
173 # Check if in the AF overlap list
174 if ($objectAFOverlapHash{$2})
175 {
176 # Mark the file as processed
177 $objectAFOverlapHash{$2} = 0;
178
179 if (exists $deleteObjectHash{$1})
180 {
181 $deleteObjectHash{$1} .= "$2 ";
182 }
183 else
184 {
185 $deleteObjectHash{$1} = "$2 ";
186 }
187
188 $addObjectString .= "$object "
189 }
190 }
191 }
192
193 printLog("Adding objects...");
194 debugLog("$_") foreach split(/ /, $addObjectString);
195 &addLibraryFile($afOverlapLibrary, $addObjectString);
196
197 printLog("Deleting objects...");
198 while (my ($key, $value) = each %deleteObjectHash)
199 {
200 debugLog("$key: $value");
201 &deleteLibraryFile("$libraryFolder\\$key.lib", $value);
202 }
203 }
204
205 # Output the library name to the output file
206 if (-e $afOverlapLibrary)
207 {
208 open my $output, ">$outputFilePath" or
209 &vivaHelper::ErrorHandler("Cannot open file $outputFilePath: $!", __FILE__, __LINE__);
210
211 print $output $afOverlapLibraryName;
212
213 close $output;
214 }
215
216 # Print out the non-processed list
217 printLog("\nNon-processed objects");
218 while (my ($key, $value) = each %objectAFOverlapHash)
219 {
220 printLog("\t$key") if ($value);
221 }
222}
223
224
225END_PROCESS:
226
227printLog("[End VIVA prelink]");
228exit 0;
229
230#****************************************************************************
231# subroutine: getFileList
232# description: Get all the file list under the folder.
233# input: Folder path, file list ref
234# output: File list
235#****************************************************************************
236sub getFileList
237{
238 my $folderPath = shift;
239 my $fileListRef = shift;
240
241 system("dir $folderPath /S /B > ~listTemp.tmp");
242 open my $input, "<~listTemp.tmp";
243 while (<$input>)
244 {
245 chomp;
246 push @$fileListRef, $_;
247 }
248 close $input;
249
250 unlink("~listTemp.tmp");
251}
252
253#****************************************************************************
254# subroutine: getLibraryFileList
255# description: Get the file list in a library.
256# input: Library path, library file list ref
257# output: Library file list
258#****************************************************************************
259sub getLibraryFileList
260{
261 my $library = shift;
262 my $listRef = shift;
263
264 my $result = `armar -t $library 2>&1`;
265
266 if ($result =~ /Error:/)
267 {
268 &vivaHelper::ErrorHandler("Fail to get library content files $library $result", __FILE__, __LINE__);
269 }
270 else
271 {
272 @$listRef = split(/\n/, $result);
273 }
274}
275
276
277#****************************************************************************
278# subroutine: addLibraryFile
279# description: Add the files to the library.
280# input: Library, files
281# output: None
282#****************************************************************************
283sub addLibraryFile
284{
285 my $library = shift;
286 my $files = shift;
287
288 my $result;
289
290 open my $output, ">~tempVIAFile.tmp";
291 print $output $files;
292 close $output;
293
294 if (-e $library)
295 {
296 $result = `armar -r $library -via ~tempVIAFile.tmp 2>&1`;
297 }
298 else
299 {
300 $result = `armar --create $library -via ~tempVIAFile.tmp 2>&1`;
301 }
302
303 unlink("~tempVIAFile.tmp");
304
305 if ($result =~ /Error/)
306 {
307 &vivaHelper::ErrorHandler("Fail to add library content files $library $result", __FILE__, __LINE__);
308 }
309}
310
311#****************************************************************************
312# subroutine: deleteLibraryFile
313# description: Delete the files from the library.
314# input: Library, files
315# output: None
316#****************************************************************************
317sub deleteLibraryFile
318{
319 my $library = shift;
320 my $files = shift;
321
322 my $result;
323
324 # Delete files one by one for only remake some module case
325 foreach my $file (split(/ /, $files))
326 {
327 $result = `armar -d $library $file 2>&1`;
328
329 chomp $result;
330
331 if ($result =~ /Error/)
332 {
333 printLog("Warning: Cannot delete library content file $file from $library. $result");
334 #&vivaHelper::ErrorHandler("Fail to delete library content files $library $result", __FILE__, __LINE__);
335 }
336 }
337}
338
339sub printLog
340{
341 print "$_[0]\n";
342}
343
344sub debugLog
345{
346 if ($DEBUG)
347 {
348 printLog("\t$_[0]");
349 }
350}
351
352# 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