1*b1cdbd2cSJim Jagielski: 2*b1cdbd2cSJim Jagielskieval 'exec perl -wS $0 ${1+"$@"}' 3*b1cdbd2cSJim Jagielski if 0; 4*b1cdbd2cSJim Jagielski 5*b1cdbd2cSJim Jagielski#************************************************************** 6*b1cdbd2cSJim Jagielski# 7*b1cdbd2cSJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 8*b1cdbd2cSJim Jagielski# or more contributor license agreements. See the NOTICE file 9*b1cdbd2cSJim Jagielski# distributed with this work for additional information 10*b1cdbd2cSJim Jagielski# regarding copyright ownership. The ASF licenses this file 11*b1cdbd2cSJim Jagielski# to you under the Apache License, Version 2.0 (the 12*b1cdbd2cSJim Jagielski# "License"); you may not use this file except in compliance 13*b1cdbd2cSJim Jagielski# with the License. You may obtain a copy of the License at 14*b1cdbd2cSJim Jagielski# 15*b1cdbd2cSJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 16*b1cdbd2cSJim Jagielski# 17*b1cdbd2cSJim Jagielski# Unless required by applicable law or agreed to in writing, 18*b1cdbd2cSJim Jagielski# software distributed under the License is distributed on an 19*b1cdbd2cSJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 20*b1cdbd2cSJim Jagielski# KIND, either express or implied. See the License for the 21*b1cdbd2cSJim Jagielski# specific language governing permissions and limitations 22*b1cdbd2cSJim Jagielski# under the License. 23*b1cdbd2cSJim Jagielski# 24*b1cdbd2cSJim Jagielski#************************************************************** 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski#***************************************************************************************** 30*b1cdbd2cSJim Jagielski# ASCII parser for the changeover of the current build.lst files to XML files * 31*b1cdbd2cSJim Jagielski# programmer: Pascal Junck, Sun Microsystems GmbH * 32*b1cdbd2cSJim Jagielski#***************************************************************************************** 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski# this is the first step for the changeover of the current 'build.lst' files to the new 35*b1cdbd2cSJim Jagielski# 'build.xlist'(XML) files 36*b1cdbd2cSJim Jagielski# before we create the new ones we have to parse all important informations from the old files 37*b1cdbd2cSJim Jagielski# important parameters are: 38*b1cdbd2cSJim Jagielski# 1. 'module name' 39*b1cdbd2cSJim Jagielski# 2. 'module dependency names' 40*b1cdbd2cSJim Jagielski# 3. 'dependency type' 41*b1cdbd2cSJim Jagielski# 4. 'job dir' 42*b1cdbd2cSJim Jagielski# 5. 'depending directories' 43*b1cdbd2cSJim Jagielski# 6. 'job platform'(only: 'w', 'u', 'm' and 'all') 44*b1cdbd2cSJim Jagielski# 7. 'job'(only: 'nmake' means 'make') 45*b1cdbd2cSJim Jagielski# 8. 'build requirements'(here called: 'restrictions') 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski################################# begin of main ####################################### 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielskiuse strict; 51*b1cdbd2cSJim Jagielskiuse lib ("/home/vg119683/work/modules"); 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielskiuse XMLBuildListParser; 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski# get and work with each argument(build.lst files) of the commando line 56*b1cdbd2cSJim Jagielski# e.g. if the user wants to parse the build.lst file(s): 57*b1cdbd2cSJim Jagielski# user input (on unix) for all modules : 'perl -w ascii_parser.pl /so/ws/SRC680/src.m42/*/prj/build.lst' 58*b1cdbd2cSJim Jagielski# user input (on windows) for one module : 'perl -w ascii_parser.pl O:/SRC680/src.m42/[module]/prj/build.lst' 59*b1cdbd2cSJim Jagielski# get all arguments (build.lst files) of the commando line in this global variable '@buildlist_files' 60*b1cdbd2cSJim Jagielskimy @buildlist_files = @ARGV; 61*b1cdbd2cSJim Jagielski# global variable for each file name that we want to parse in ASCII 62*b1cdbd2cSJim Jagielskimy $parse_file = ""; 63*b1cdbd2cSJim Jagielski# set the global variable '$debug' (= 1) to see all results on the terminal, 64*b1cdbd2cSJim Jagielski# else (= 0) it shows nothing of the working output! 65*b1cdbd2cSJim Jagielskimy $debug = 0; 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski# open the filehandle 'ERROR_LOG' for all errors 68*b1cdbd2cSJim Jagielskiopen (ERROR_LOG, ">>ascii_parse.log") 69*b1cdbd2cSJim Jagielski or die "Error. Open the file <ascii_parse.log> wasn't successful!\n\n"; 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski# reference of the instance of a new object 72*b1cdbd2cSJim Jagielskimy $XMLTree; 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielskiforeach (@buildlist_files) 75*b1cdbd2cSJim Jagielski{ 76*b1cdbd2cSJim Jagielski # get each element (= module) in '$parse_file' 77*b1cdbd2cSJim Jagielski $parse_file = $_; 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski # open the filehandle 'PARSE_ASCII' for each module/file that we want to parse 80*b1cdbd2cSJim Jagielski open (PARSE_ASCII, $parse_file) 81*b1cdbd2cSJim Jagielski or die "Error. Open the module <$parse_file> wasn't successful!\n\n"; 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski # create a new object 84*b1cdbd2cSJim Jagielski $XMLTree = XMLBuildListParser->new(); 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski # invoking of the main subroutine 87*b1cdbd2cSJim Jagielski reading_file(); 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski # is the file name 'build.lst' in the path on the command line? 90*b1cdbd2cSJim Jagielski # if not, we can not parse and create the new 'build.xlist' file 91*b1cdbd2cSJim Jagielski if ($parse_file =~ /build(\w+)?\.lst\S*$/) 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski my $path = $parse_file; 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski $path =~ s/build(\w+)?\.lst\S*$/build\.xlist/; 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski $XMLTree->saveXMLFile($path); 98*b1cdbd2cSJim Jagielski } 99*b1cdbd2cSJim Jagielski else 100*b1cdbd2cSJim Jagielski { 101*b1cdbd2cSJim Jagielski add_errorlog_no_buildlst_file_found_statement($parse_file); 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski # close the current $parse_file 105*b1cdbd2cSJim Jagielski close(PARSE_ASCII); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski} 108*b1cdbd2cSJim Jagielski# after all files were read close the errorlog file 109*b1cdbd2cSJim Jagielskiclose(ERROR_LOG); 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski########################### begin of subroutines ##################################### 113*b1cdbd2cSJim Jagielski# 114*b1cdbd2cSJim Jagielski# global used variable: $parse_file 115*b1cdbd2cSJim Jagielski# 116*b1cdbd2cSJim Jagielski######################################################################################## 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski######################################################################################## 120*b1cdbd2cSJim Jagielski# sub: reading_file 121*b1cdbd2cSJim Jagielski# gets: $_ (current file) 122*b1cdbd2cSJim Jagielski# returns: - 123*b1cdbd2cSJim Jagielski######################################################################################## 124*b1cdbd2cSJim Jagielskisub reading_file 125*b1cdbd2cSJim Jagielski{ 126*b1cdbd2cSJim Jagielski # variable for the name of the current module 127*b1cdbd2cSJim Jagielski my $module_name = ""; 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski # hashes for the infos beginning at the second line of the build.lst files 130*b1cdbd2cSJim Jagielski my %dir_of_job_platform = (); 131*b1cdbd2cSJim Jagielski my %dir_of_alias = (); 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski # control variable for the module dependency line of the file 134*b1cdbd2cSJim Jagielski # like line 1 of module 'sal' (dependencies means the colon(s)) (SRC680/src.m42) 135*b1cdbd2cSJim Jagielski # "sa sal : xml2cmp NULL" 136*b1cdbd2cSJim Jagielski my $module_dependency_line_exists = 0; 137*b1cdbd2cSJim Jagielski my $module_dependency_line_was_read = 0; 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski # this line variables are for checking that all lines will be read 140*b1cdbd2cSJim Jagielski # counts each line 141*b1cdbd2cSJim Jagielski my $line_number = 0; 142*b1cdbd2cSJim Jagielski # for the sum of the informative lines (='module dependency line' and 'nmake' lines of the file) 143*b1cdbd2cSJim Jagielski my $info_line_sum = 0; 144*b1cdbd2cSJim Jagielski # for the sum of the no-info lines, like: 145*b1cdbd2cSJim Jagielski # job lines: 'usr1', 'get', ... and comment lines: '# ...' or empty lines 146*b1cdbd2cSJim Jagielski my $no_info_line_sum = 0; 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski # read all lines of the file to resolve the first alias 149*b1cdbd2cSJim Jagielski # with the matching dir to know all aliases and directories 150*b1cdbd2cSJim Jagielski # at the later second file reading 151*b1cdbd2cSJim Jagielski while (<PARSE_ASCII>) 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski # the variable for each line of a file 154*b1cdbd2cSJim Jagielski my $line = $_; 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski # count each line for more exact error descriptions in the log file 157*b1cdbd2cSJim Jagielski $line_number += 1; 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski # remember it, if this line exists 160*b1cdbd2cSJim Jagielski if ( (is_module_dependency_line($line)) && ($module_dependency_line_exists == 0) ) 161*b1cdbd2cSJim Jagielski { 162*b1cdbd2cSJim Jagielski $module_dependency_line_exists = 1; 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski # get the name of the current module 165*b1cdbd2cSJim Jagielski $module_name = get_module_name($line); 166*b1cdbd2cSJim Jagielski } 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski # skip all lines, that hasn't the job 'nmake' 169*b1cdbd2cSJim Jagielski next if (!(is_nmake_line($line))); 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski # check that the infos (job directory, job platform and alias) exist 172*b1cdbd2cSJim Jagielski if (my ($job_dir, $job_platform, $alias) = get_alias_resolving_infos($line)) 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski # prove that it's a valid job_platform 175*b1cdbd2cSJim Jagielski # and that each first alias and matching job platform exists only once 176*b1cdbd2cSJim Jagielski check_alias_and_job_platform($job_dir, $job_platform, $alias, \%dir_of_job_platform, 177*b1cdbd2cSJim Jagielski \%dir_of_alias, $module_name, $line_number); 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski else 180*b1cdbd2cSJim Jagielski { 181*b1cdbd2cSJim Jagielski chomp; 182*b1cdbd2cSJim Jagielski add_errorlog_unknown_format_statement($line, $module_name, $line_number); 183*b1cdbd2cSJim Jagielski next; 184*b1cdbd2cSJim Jagielski } 185*b1cdbd2cSJim Jagielski } 186*b1cdbd2cSJim Jagielski # reset the $line_number, because we count it again 187*b1cdbd2cSJim Jagielski $line_number = 0; 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski # read the same file again 190*b1cdbd2cSJim Jagielski seek (PARSE_ASCII,0,0); 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski # read each line of the file for all other informations 193*b1cdbd2cSJim Jagielski # e.g. line 8 of module 'sal' 194*b1cdbd2cSJim Jagielski # "sa sal\systools\win32\guistdio nmake - n sa_guistdio sa_uwinapi.n NULL" 195*b1cdbd2cSJim Jagielski # $job_dir $job $job_platform 1.$alias 2.$alias + alias platform 196*b1cdbd2cSJim Jagielski while (<PARSE_ASCII>) 197*b1cdbd2cSJim Jagielski { 198*b1cdbd2cSJim Jagielski # the variable for each line of a file 199*b1cdbd2cSJim Jagielski my $line = $_; 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski # count each line to check at the end of the file that all lines were read 202*b1cdbd2cSJim Jagielski # and for more exact error descriptions in the log file 203*b1cdbd2cSJim Jagielski $line_number += 1; 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski # is it a 'nmake' or a 'module dependency' line? 206*b1cdbd2cSJim Jagielski # if not: print this line to STDOUT, 207*b1cdbd2cSJim Jagielski # count one to the no-info lines, 208*b1cdbd2cSJim Jagielski # try to get the information about the module name from this line 209*b1cdbd2cSJim Jagielski # and skip the line 210*b1cdbd2cSJim Jagielski if ( (!(is_nmake_line($line))) && (!(is_module_dependency_line($line))) ) 211*b1cdbd2cSJim Jagielski { 212*b1cdbd2cSJim Jagielski my $no_info_line = show_no_info_line($line, $line_number); 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski $no_info_line_sum += $no_info_line; 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski # if no module dependency line exists get the name of the current module from another line 217*b1cdbd2cSJim Jagielski $module_name = get_module_name($line) if (!($module_name)); 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski # skip the no-info line 220*b1cdbd2cSJim Jagielski next; 221*b1cdbd2cSJim Jagielski } 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski # only if the module dependency line exists and it wasn't read get the infos about it 224*b1cdbd2cSJim Jagielski if ( ($module_dependency_line_exists) && (!($module_dependency_line_was_read)) ) 225*b1cdbd2cSJim Jagielski { 226*b1cdbd2cSJim Jagielski ($module_dependency_line_was_read, $info_line_sum) = get_module_dependency_line_infos 227*b1cdbd2cSJim Jagielski ($line, $module_name, $line_number); 228*b1cdbd2cSJim Jagielski } 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski # get all 'nmake' line infos 231*b1cdbd2cSJim Jagielski my $info_line = get_nmake_line_infos($line, \%dir_of_alias, \%dir_of_job_platform, 232*b1cdbd2cSJim Jagielski $module_name, $line_number); 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski # count the info lines; 235*b1cdbd2cSJim Jagielski $info_line_sum += $info_line; 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski if ($debug == 1) 239*b1cdbd2cSJim Jagielski { 240*b1cdbd2cSJim Jagielski # show the sums of the info and no-info lines 241*b1cdbd2cSJim Jagielski lines_sums_output($module_name, $line_number, $info_line_sum, $no_info_line_sum); 242*b1cdbd2cSJim Jagielski } 243*b1cdbd2cSJim Jagielski} 244*b1cdbd2cSJim Jagielski 245*b1cdbd2cSJim Jagielski######################################################################################## 246*b1cdbd2cSJim Jagielski# sub: is_module_dependency_line 247*b1cdbd2cSJim Jagielski# gets: $line 248*b1cdbd2cSJim Jagielski# returns: 1 (true) or 0 (false) 249*b1cdbd2cSJim Jagielski######################################################################################## 250*b1cdbd2cSJim Jagielskisub is_module_dependency_line 251*b1cdbd2cSJim Jagielski{ 252*b1cdbd2cSJim Jagielski my $line = shift; 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski # if the module dpendency line exists return 1, otherwise 0 255*b1cdbd2cSJim Jagielski ($line =~ /^\w+\s+\S+\s+:+\s+/) 256*b1cdbd2cSJim Jagielski ? return 1 257*b1cdbd2cSJim Jagielski : return 0; 258*b1cdbd2cSJim Jagielski} 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski######################################################################################## 261*b1cdbd2cSJim Jagielski# sub: is_nmake_line 262*b1cdbd2cSJim Jagielski# gets: $line 263*b1cdbd2cSJim Jagielski# returns: '1' (true) or '0' (false) 264*b1cdbd2cSJim Jagielski######################################################################################## 265*b1cdbd2cSJim Jagielskisub is_nmake_line 266*b1cdbd2cSJim Jagielski{ 267*b1cdbd2cSJim Jagielski my $line = shift; 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski # these lines are NO nmake lines: 270*b1cdbd2cSJim Jagielski # 1. a empty line 271*b1cdbd2cSJim Jagielski # 2. a comment line (perhaps with the job 'nmake') 272*b1cdbd2cSJim Jagielski # like line 20 of module 'bridges' (SRC680/src.m42) 273*b1cdbd2cSJim Jagielski # "#br bridges\source\cli_uno nmake - w,vc7 br_cli_uno br_unotypes NULL========= " 274*b1cdbd2cSJim Jagielski # 3. the module dependency line 275*b1cdbd2cSJim Jagielski # like line 1 of module 'sal' (dependencies means the colon(s)) (SRC680/src.m42) 276*b1cdbd2cSJim Jagielski # "sa sal : xml2cmp N ULL" 277*b1cdbd2cSJim Jagielski # 4. a 'p' job platform line (for OS2) 278*b1cdbd2cSJim Jagielski # 5. a line with a job, which is not 'nmake' 279*b1cdbd2cSJim Jagielski ($line =~ (/^[^\s+\#]/) && (!(/\s+:+\s+/)) && (!(/\s+p\s+/)) && (/\bnmake\b/) ) 280*b1cdbd2cSJim Jagielski ? return 1 281*b1cdbd2cSJim Jagielski : return 0; 282*b1cdbd2cSJim Jagielski} 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski######################################################################################## 285*b1cdbd2cSJim Jagielski# sub: get_alias_resolving_infos 286*b1cdbd2cSJim Jagielski# gets: $line 287*b1cdbd2cSJim Jagielski# returns: $job_dir, $job_platform, $alias 288*b1cdbd2cSJim Jagielski######################################################################################## 289*b1cdbd2cSJim Jagielskisub get_alias_resolving_infos 290*b1cdbd2cSJim Jagielski{ 291*b1cdbd2cSJim Jagielski my $line = shift; 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski if ($line =~ /^\w+\s+(\S+)\s+\w+\s+\-\s+(\w+)\,?(\w+)?\s+(\S+)\s+/) 294*b1cdbd2cSJim Jagielski { 295*b1cdbd2cSJim Jagielski # get the current work directory 296*b1cdbd2cSJim Jagielski my $temp_job_dir = $1; 297*b1cdbd2cSJim Jagielski 298*b1cdbd2cSJim Jagielski my $job_dir = change_job_directory($temp_job_dir); 299*b1cdbd2cSJim Jagielski 300*b1cdbd2cSJim Jagielski # get the job platform of the current job 301*b1cdbd2cSJim Jagielski # if it is a 'n' job platform transform it to 'w' 302*b1cdbd2cSJim Jagielski # because 'n' can be used now as 'w' (both means windows) 303*b1cdbd2cSJim Jagielski my $job_platform = $2; 304*b1cdbd2cSJim Jagielski $job_platform = "w" if($job_platform eq "n"); 305*b1cdbd2cSJim Jagielski 306*b1cdbd2cSJim Jagielski # get the first alias in each line 307*b1cdbd2cSJim Jagielski my $alias = $4; 308*b1cdbd2cSJim Jagielski 309*b1cdbd2cSJim Jagielski return ($job_dir, $job_platform, $alias); 310*b1cdbd2cSJim Jagielski } 311*b1cdbd2cSJim Jagielski return (undef, undef, undef); 312*b1cdbd2cSJim Jagielski} 313*b1cdbd2cSJim Jagielski 314*b1cdbd2cSJim Jagielski######################################################################################## 315*b1cdbd2cSJim Jagielski# sub: change_job_directory 316*b1cdbd2cSJim Jagielski# gets: $job_dir 317*b1cdbd2cSJim Jagielski# returns: $changed_job_dir 318*b1cdbd2cSJim Jagielski######################################################################################## 319*b1cdbd2cSJim Jagielski# we don't need the module name and the first '\' in the current directory 320*b1cdbd2cSJim Jagielskisub change_job_directory 321*b1cdbd2cSJim Jagielski{ 322*b1cdbd2cSJim Jagielski my $changed_job_dir = shift; 323*b1cdbd2cSJim Jagielski 324*b1cdbd2cSJim Jagielski # ignore the module name 325*b1cdbd2cSJim Jagielski $changed_job_dir =~ s/^\w+//; 326*b1cdbd2cSJim Jagielski # change all other '\' against the '/' of the current dir 327*b1cdbd2cSJim Jagielski $changed_job_dir =~ s/\\/\//g; 328*b1cdbd2cSJim Jagielski 329*b1cdbd2cSJim Jagielski # get only a "/" if we are in the root directory 330*b1cdbd2cSJim Jagielski $changed_job_dir = "/" if ($changed_job_dir eq ""); 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski return $changed_job_dir; 333*b1cdbd2cSJim Jagielski} 334*b1cdbd2cSJim Jagielski 335*b1cdbd2cSJim Jagielski######################################################################################## 336*b1cdbd2cSJim Jagielski# sub: check_alias_and_job_platform 337*b1cdbd2cSJim Jagielski# gets: $job_dir, $job_platform, $alias, $dir_of_job_platform_ref, 338*b1cdbd2cSJim Jagielski# $dir_of_alias_ref, $module_name, $line_number 339*b1cdbd2cSJim Jagielski# returns: - 340*b1cdbd2cSJim Jagielski######################################################################################## 341*b1cdbd2cSJim Jagielski# get it in the hash only if it is a valid job platform, 342*b1cdbd2cSJim Jagielski# like 'w', 'u', 'm' and 'n' 343*b1cdbd2cSJim Jagielski# 'all' is also valid but it doesn't exist in an alias platform(!) 344*b1cdbd2cSJim Jagielskisub check_alias_and_job_platform 345*b1cdbd2cSJim Jagielski{ 346*b1cdbd2cSJim Jagielski my ($job_dir, $job_platform, $alias, $dir_of_job_platform_ref, 347*b1cdbd2cSJim Jagielski $dir_of_alias_ref, $module_name, $line_number) = @_; 348*b1cdbd2cSJim Jagielski 349*b1cdbd2cSJim Jagielski # is it a valid job_platform? 350*b1cdbd2cSJim Jagielski if ($job_platform =~ /(w|u|m|n|all)/) 351*b1cdbd2cSJim Jagielski { 352*b1cdbd2cSJim Jagielski # get only the 'w', 'u', 'm' and 'n' based job platforms 353*b1cdbd2cSJim Jagielski if ($job_platform =~ /[wumn]/) 354*b1cdbd2cSJim Jagielski { 355*b1cdbd2cSJim Jagielski # doesn't the key already exist? 356*b1cdbd2cSJim Jagielski (!(exists $$dir_of_job_platform_ref{$job_platform.$alias})) 357*b1cdbd2cSJim Jagielski # get the first alias with the matching job platform in the hash 358*b1cdbd2cSJim Jagielski ? get_alias_and_job_platform($job_platform, $alias, $dir_of_job_platform_ref) 359*b1cdbd2cSJim Jagielski # this is a line with a redundant alias and job platform 360*b1cdbd2cSJim Jagielski : add_errorlog_alias_redundancy_statement($module_name, $alias, $job_platform, $line_number); 361*b1cdbd2cSJim Jagielski } 362*b1cdbd2cSJim Jagielski if (!(exists $$dir_of_alias_ref{$alias})) 363*b1cdbd2cSJim Jagielski { 364*b1cdbd2cSJim Jagielski # get each first alias with the matching job platform 365*b1cdbd2cSJim Jagielski get_alias_and_matching_directory($dir_of_alias_ref, $alias, $job_dir); 366*b1cdbd2cSJim Jagielski } 367*b1cdbd2cSJim Jagielski } 368*b1cdbd2cSJim Jagielski # it's not a valid job platform 369*b1cdbd2cSJim Jagielski else 370*b1cdbd2cSJim Jagielski { 371*b1cdbd2cSJim Jagielski add_errorlog_invalid_platform_statement($module_name, $job_platform, $line_number); 372*b1cdbd2cSJim Jagielski } 373*b1cdbd2cSJim Jagielski} 374*b1cdbd2cSJim Jagielski 375*b1cdbd2cSJim Jagielski######################################################################################## 376*b1cdbd2cSJim Jagielski# sub: get_alias_and_job_platform 377*b1cdbd2cSJim Jagielski# gets: $job_platform, $alias, $dir_of_job_platform_ref 378*b1cdbd2cSJim Jagielski# returns: - 379*b1cdbd2cSJim Jagielski######################################################################################## 380*b1cdbd2cSJim Jagielski# get the the job platform and the first alias as a unique key 381*b1cdbd2cSJim Jagielski# and the job platform as value of the hash 382*b1cdbd2cSJim Jagielski# it's for checking later that the alias platform is equal to the job platform 383*b1cdbd2cSJim Jagielski# e.g.: line 6 + 7 of the module 'gtk' (SRC680/src.m42) 384*b1cdbd2cSJim Jagielski# "gt gtk\pkgconfig nmake - u gt_pkg NULL" 385*b1cdbd2cSJim Jagielski# "gt gtk\glib nmake - u gt_glib gt_pkg.u NULL" 386*b1cdbd2cSJim Jagielski# the alias 'gt_pkg' has the directory 'gtk\pkgconfig' (we need only 'pkgconfig') 387*b1cdbd2cSJim Jagielski# and it has the job platform 'u' - compare it with the alias platform 'gt_pkg.u' 388*b1cdbd2cSJim Jagielskisub get_alias_and_job_platform 389*b1cdbd2cSJim Jagielski{ 390*b1cdbd2cSJim Jagielski my ($job_platform, $alias, $dir_of_job_platform_ref) = @_; 391*b1cdbd2cSJim Jagielski 392*b1cdbd2cSJim Jagielski # key = 'job platform' and 'first alias' => value = 'job platform' 393*b1cdbd2cSJim Jagielski $$dir_of_job_platform_ref{$job_platform.$alias} = $job_platform; 394*b1cdbd2cSJim Jagielski} 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski######################################################################################## 397*b1cdbd2cSJim Jagielski# sub: get_alias_and_matching_directory 398*b1cdbd2cSJim Jagielski# gets: $dir_of_alias_ref, $alias, $job_dir 399*b1cdbd2cSJim Jagielski# returns: - 400*b1cdbd2cSJim Jagielski######################################################################################## 401*b1cdbd2cSJim Jagielski# fill the hash with the first alias and the matching directory 402*b1cdbd2cSJim Jagielski# e.g. line 14 of module 'setup2' (SRC680/src.m42) 403*b1cdbd2cSJim Jagielski# "se setup2\win\source\unloader nmake - w se_wulo se_unotypes NULL" 404*b1cdbd2cSJim Jagielski# key = 'se_wulo' => value = 'win/source/unloader' 405*b1cdbd2cSJim Jagielskisub get_alias_and_matching_directory 406*b1cdbd2cSJim Jagielski{ 407*b1cdbd2cSJim Jagielski my ($dir_of_alias_ref, $alias, $job_dir) = @_; 408*b1cdbd2cSJim Jagielski 409*b1cdbd2cSJim Jagielski # key = 'first alias' => value = 'job directory' 410*b1cdbd2cSJim Jagielski $$dir_of_alias_ref{$alias} = $job_dir; 411*b1cdbd2cSJim Jagielski} 412*b1cdbd2cSJim Jagielski 413*b1cdbd2cSJim Jagielski######################################################################################## 414*b1cdbd2cSJim Jagielski# sub: show_no_info_line 415*b1cdbd2cSJim Jagielski# gets: $line, $line_number 416*b1cdbd2cSJim Jagielski# returns: $no_info_line 417*b1cdbd2cSJim Jagielski######################################################################################## 418*b1cdbd2cSJim Jagielskisub show_no_info_line 419*b1cdbd2cSJim Jagielski{ 420*b1cdbd2cSJim Jagielski my ($line, $line_number) = @_; 421*b1cdbd2cSJim Jagielski my $no_info_line += 1; 422*b1cdbd2cSJim Jagielski 423*b1cdbd2cSJim Jagielski chomp($line); 424*b1cdbd2cSJim Jagielski 425*b1cdbd2cSJim Jagielski print"Ignore line <$line_number>:\n\"$line\"\n\n" if ($debug); 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski return $no_info_line; 428*b1cdbd2cSJim Jagielski} 429*b1cdbd2cSJim Jagielski 430*b1cdbd2cSJim Jagielski######################################################################################## 431*b1cdbd2cSJim Jagielski# sub: get_module_name 432*b1cdbd2cSJim Jagielski# gets: $line 433*b1cdbd2cSJim Jagielski# returns: $module_name 434*b1cdbd2cSJim Jagielski######################################################################################## 435*b1cdbd2cSJim Jagielskisub get_module_name 436*b1cdbd2cSJim Jagielski{ 437*b1cdbd2cSJim Jagielski my $line = shift; 438*b1cdbd2cSJim Jagielski my $module_name = ""; 439*b1cdbd2cSJim Jagielski 440*b1cdbd2cSJim Jagielski if ($line =~ /^\w+\s+([\w\.\-]+)\\?/) 441*b1cdbd2cSJim Jagielski { 442*b1cdbd2cSJim Jagielski $module_name = $1; 443*b1cdbd2cSJim Jagielski } 444*b1cdbd2cSJim Jagielski 445*b1cdbd2cSJim Jagielski # set the 'module name' in the data structure tree 446*b1cdbd2cSJim Jagielski $XMLTree->setModuleName($module_name); 447*b1cdbd2cSJim Jagielski 448*b1cdbd2cSJim Jagielski return $module_name; 449*b1cdbd2cSJim Jagielski} 450*b1cdbd2cSJim Jagielski 451*b1cdbd2cSJim Jagielski######################################################################################## 452*b1cdbd2cSJim Jagielski# sub: get_module_dependency_line_infos 453*b1cdbd2cSJim Jagielski# gets: $line, $module_name, $line_number 454*b1cdbd2cSJim Jagielski# returns: $module_dependency_line_was_read, $info_line_sum 455*b1cdbd2cSJim Jagielski######################################################################################## 456*b1cdbd2cSJim Jagielski# get the informations about the module dependency line 457*b1cdbd2cSJim Jagielski# like line 1 of module 'sal' (SRC680/src.m42) 458*b1cdbd2cSJim Jagielski# "sa sal : xml2cmp NULL" 459*b1cdbd2cSJim Jagielski# $module_name $module_dependency @module_dependency_names 460*b1cdbd2cSJim Jagielskisub get_module_dependency_line_infos 461*b1cdbd2cSJim Jagielski{ 462*b1cdbd2cSJim Jagielski my ($line, $module_name, $line_number) = @_; 463*b1cdbd2cSJim Jagielski my $module_dependency = ""; 464*b1cdbd2cSJim Jagielski my @module_dependency_names = (); 465*b1cdbd2cSJim Jagielski my %dep_modules_and_products = (); 466*b1cdbd2cSJim Jagielski my $product = ""; 467*b1cdbd2cSJim Jagielski 468*b1cdbd2cSJim Jagielski my $module_dependency_line_was_read = 1; 469*b1cdbd2cSJim Jagielski my $info_line_sum = 1; 470*b1cdbd2cSJim Jagielski 471*b1cdbd2cSJim Jagielski if ($debug) 472*b1cdbd2cSJim Jagielski { 473*b1cdbd2cSJim Jagielski print"\nline number : <$line_number>\n"; 474*b1cdbd2cSJim Jagielski print"module-name : <$module_name>\n"; 475*b1cdbd2cSJim Jagielski } 476*b1cdbd2cSJim Jagielski 477*b1cdbd2cSJim Jagielski # get the dependencies 478*b1cdbd2cSJim Jagielski if ($line =~ /\s+(:+)\s+/) 479*b1cdbd2cSJim Jagielski { 480*b1cdbd2cSJim Jagielski $module_dependency = $1; 481*b1cdbd2cSJim Jagielski print"module-dependency : <$module_dependency>\n" if ($debug); 482*b1cdbd2cSJim Jagielski 483*b1cdbd2cSJim Jagielski # transform the dependency type to the corresponding tag name 484*b1cdbd2cSJim Jagielski if ($module_dependency eq ":") 485*b1cdbd2cSJim Jagielski { 486*b1cdbd2cSJim Jagielski $module_dependency = "md-simple"; 487*b1cdbd2cSJim Jagielski } 488*b1cdbd2cSJim Jagielski elsif ($module_dependency eq "::") 489*b1cdbd2cSJim Jagielski { 490*b1cdbd2cSJim Jagielski $module_dependency = "md-always"; 491*b1cdbd2cSJim Jagielski } 492*b1cdbd2cSJim Jagielski elsif ($module_dependency eq ":::") 493*b1cdbd2cSJim Jagielski { 494*b1cdbd2cSJim Jagielski $module_dependency = "md-force"; 495*b1cdbd2cSJim Jagielski } 496*b1cdbd2cSJim Jagielski } 497*b1cdbd2cSJim Jagielski 498*b1cdbd2cSJim Jagielski # get a list of all depending module names 499*b1cdbd2cSJim Jagielski if ($line =~ /:+\s+([\S\s]+)\s+NULL/) 500*b1cdbd2cSJim Jagielski { 501*b1cdbd2cSJim Jagielski @module_dependency_names = split(/\s+/, $1); 502*b1cdbd2cSJim Jagielski 503*b1cdbd2cSJim Jagielski foreach my $module (@module_dependency_names) 504*b1cdbd2cSJim Jagielski { 505*b1cdbd2cSJim Jagielski # check whether that there is another product (as "all") of a module 506*b1cdbd2cSJim Jagielski if ($module =~ /(\S+):+(\S+)/) 507*b1cdbd2cSJim Jagielski { 508*b1cdbd2cSJim Jagielski $dep_modules_and_products{$2} = $1; 509*b1cdbd2cSJim Jagielski } 510*b1cdbd2cSJim Jagielski else 511*b1cdbd2cSJim Jagielski { 512*b1cdbd2cSJim Jagielski $dep_modules_and_products{$module} = "all"; 513*b1cdbd2cSJim Jagielski } 514*b1cdbd2cSJim Jagielski } 515*b1cdbd2cSJim Jagielski } 516*b1cdbd2cSJim Jagielski 517*b1cdbd2cSJim Jagielski # add the dependency module names, the module dependency type and the product to the data structure 518*b1cdbd2cSJim Jagielski foreach my $module (sort keys %dep_modules_and_products) 519*b1cdbd2cSJim Jagielski { 520*b1cdbd2cSJim Jagielski print"module-dependency-name(s) : key <$module> value <".$dep_modules_and_products{$module}.">\n" if ($debug); 521*b1cdbd2cSJim Jagielski 522*b1cdbd2cSJim Jagielski $XMLTree->addModuleDependencies($module, $module_dependency, $dep_modules_and_products{$module}); 523*b1cdbd2cSJim Jagielski } 524*b1cdbd2cSJim Jagielski 525*b1cdbd2cSJim Jagielski return ($module_dependency_line_was_read, $info_line_sum); 526*b1cdbd2cSJim Jagielski} 527*b1cdbd2cSJim Jagielski 528*b1cdbd2cSJim Jagielski######################################################################################## 529*b1cdbd2cSJim Jagielski# sub: get_nmake_line_infos 530*b1cdbd2cSJim Jagielski# gets: $line, \%dir_of_alias, \%dir_of_job_platform, $module_name, $line_number 531*b1cdbd2cSJim Jagielski# returns: $info_line 532*b1cdbd2cSJim Jagielski######################################################################################## 533*b1cdbd2cSJim Jagielski# get all infos about the 'nmake' lines 534*b1cdbd2cSJim Jagielski# e.g. line 8 of module 'sal' 535*b1cdbd2cSJim Jagielski# "sa sal\systools\win32\guistdio nmake - n sa_guistdio sa_uwinapi.n NULL" 536*b1cdbd2cSJim Jagielski# $job_dir $job $job_platform 1.$alias 2.$alias + alias platform 537*b1cdbd2cSJim Jagielskisub get_nmake_line_infos 538*b1cdbd2cSJim Jagielski{ 539*b1cdbd2cSJim Jagielski my ($line, $dir_of_alias_ref, $dir_of_job_platform_ref, $module_name, $line_number) = @_; 540*b1cdbd2cSJim Jagielski my $directories_ref = ""; 541*b1cdbd2cSJim Jagielski my $info_line = 0; 542*b1cdbd2cSJim Jagielski 543*b1cdbd2cSJim Jagielski # get the infos about the 'nmake' lines 544*b1cdbd2cSJim Jagielski if ($line =~ /^\w+\s+(\S+)\s+(\w+)\s+\-\s+(\w+)\,?(\S+)?/) 545*b1cdbd2cSJim Jagielski { 546*b1cdbd2cSJim Jagielski # get the current working directory 547*b1cdbd2cSJim Jagielski my $temp_job_dir = $1; 548*b1cdbd2cSJim Jagielski my $job_dir = change_job_directory($temp_job_dir); 549*b1cdbd2cSJim Jagielski 550*b1cdbd2cSJim Jagielski # get the job 551*b1cdbd2cSJim Jagielski my $job = $2; 552*b1cdbd2cSJim Jagielski $job = "make" if ($job eq "nmake"); 553*b1cdbd2cSJim Jagielski 554*b1cdbd2cSJim Jagielski # get the job platform of the current job 555*b1cdbd2cSJim Jagielski # if it is a 'n' job platform transform it to 'wnt' 556*b1cdbd2cSJim Jagielski # available values are: 'wnt', 'unx', 'mac' or 'all' 557*b1cdbd2cSJim Jagielski my $job_platform = $3; 558*b1cdbd2cSJim Jagielski $job_platform = change_job_platform_name($job_platform); 559*b1cdbd2cSJim Jagielski 560*b1cdbd2cSJim Jagielski # get the first alias in each line 561*b1cdbd2cSJim Jagielski my $restriction = $4; 562*b1cdbd2cSJim Jagielski my %build_req = ( "$restriction" => "$job_platform") if ($restriction && $job_platform); 563*b1cdbd2cSJim Jagielski 564*b1cdbd2cSJim Jagielski 565*b1cdbd2cSJim Jagielski # get all aliases (but not the first) in an array 566*b1cdbd2cSJim Jagielski my $aliases_ref = get_aliases($line); 567*b1cdbd2cSJim Jagielski 568*b1cdbd2cSJim Jagielski # filter the list of aliases, which has a 'p' job platform 569*b1cdbd2cSJim Jagielski # and transform a 'n' ending alias platform to a 'w' ending alias platform 570*b1cdbd2cSJim Jagielski filter_aliases($aliases_ref); 571*b1cdbd2cSJim Jagielski 572*b1cdbd2cSJim Jagielski # resolve all aliases (alias[.job platform] => matching directory) 573*b1cdbd2cSJim Jagielski $directories_ref = resolve_aliases($aliases_ref, $dir_of_alias_ref, 574*b1cdbd2cSJim Jagielski $dir_of_job_platform_ref, $module_name, $line_number); 575*b1cdbd2cSJim Jagielski 576*b1cdbd2cSJim Jagielski # count the informative lines 577*b1cdbd2cSJim Jagielski $info_line = 1; 578*b1cdbd2cSJim Jagielski 579*b1cdbd2cSJim Jagielski $XMLTree->addJob($job_dir, $job, $job_platform, $directories_ref, \%build_req); 580*b1cdbd2cSJim Jagielski 581*b1cdbd2cSJim Jagielski # show the infos, that we know about each line 582*b1cdbd2cSJim Jagielski if ($debug == 1) 583*b1cdbd2cSJim Jagielski { 584*b1cdbd2cSJim Jagielski show_line_infos($line_number, $job_dir, $job, $job_platform, $restriction, $aliases_ref, $directories_ref); 585*b1cdbd2cSJim Jagielski } 586*b1cdbd2cSJim Jagielski } 587*b1cdbd2cSJim Jagielski return $info_line; 588*b1cdbd2cSJim Jagielski} 589*b1cdbd2cSJim Jagielski 590*b1cdbd2cSJim Jagielski######################################################################################## 591*b1cdbd2cSJim Jagielski# sub: change_job_platform_name 592*b1cdbd2cSJim Jagielski# gets: $job_platform 593*b1cdbd2cSJim Jagielski# returns: $job_platform 594*b1cdbd2cSJim Jagielski######################################################################################## 595*b1cdbd2cSJim Jagielskisub change_job_platform_name 596*b1cdbd2cSJim Jagielski{ 597*b1cdbd2cSJim Jagielski my $job_platform = shift; 598*b1cdbd2cSJim Jagielski 599*b1cdbd2cSJim Jagielski $job_platform = "wnt" if($job_platform eq "n" || $job_platform eq "w"); 600*b1cdbd2cSJim Jagielski $job_platform = "unx" if($job_platform eq "u"); 601*b1cdbd2cSJim Jagielski $job_platform = "mac" if($job_platform eq "m"); 602*b1cdbd2cSJim Jagielski 603*b1cdbd2cSJim Jagielski return $job_platform; 604*b1cdbd2cSJim Jagielski} 605*b1cdbd2cSJim Jagielski 606*b1cdbd2cSJim Jagielski######################################################################################## 607*b1cdbd2cSJim Jagielski# sub: get_aliases 608*b1cdbd2cSJim Jagielski# gets: $_ (current line) 609*b1cdbd2cSJim Jagielski# returns: \@aliases 610*b1cdbd2cSJim Jagielski######################################################################################## 611*b1cdbd2cSJim Jagielski# get all aliases of the line in an array 612*b1cdbd2cSJim Jagielskisub get_aliases 613*b1cdbd2cSJim Jagielski{ 614*b1cdbd2cSJim Jagielski my $line = shift; 615*b1cdbd2cSJim Jagielski my @aliases = (); 616*b1cdbd2cSJim Jagielski 617*b1cdbd2cSJim Jagielski # get all aliases in an array (but cut out the first alias) 618*b1cdbd2cSJim Jagielski if ($line =~ /\-\s+[\w+\,]+\s+([\S\s]+)\s+NULL$/) 619*b1cdbd2cSJim Jagielski { 620*b1cdbd2cSJim Jagielski print"\nall job aliases : <$1>\n" if ($debug); 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski @aliases = split /\s+/, $1; 623*b1cdbd2cSJim Jagielski 624*b1cdbd2cSJim Jagielski # we don't need the first alias (it stands for the current job directory) 625*b1cdbd2cSJim Jagielski shift @aliases; 626*b1cdbd2cSJim Jagielski } 627*b1cdbd2cSJim Jagielski return \@aliases; 628*b1cdbd2cSJim Jagielski} 629*b1cdbd2cSJim Jagielski 630*b1cdbd2cSJim Jagielski######################################################################################## 631*b1cdbd2cSJim Jagielski# sub: filter_aliases 632*b1cdbd2cSJim Jagielski# gets: $aliases_ref 633*b1cdbd2cSJim Jagielski# returns: - 634*b1cdbd2cSJim Jagielski######################################################################################## 635*b1cdbd2cSJim Jagielski# filter all aliases, because we only need the 'w', 'u' and 'm' job platform based aliases 636*b1cdbd2cSJim Jagielskisub filter_aliases 637*b1cdbd2cSJim Jagielski{ 638*b1cdbd2cSJim Jagielski my $aliases_ref = shift; 639*b1cdbd2cSJim Jagielski 640*b1cdbd2cSJim Jagielski # get the highest index of the array (number of elements of the array - 1) 641*b1cdbd2cSJim Jagielski # also works: my $index = scalar(@$aliases_ref)-1; 642*b1cdbd2cSJim Jagielski my $index = $#{@{$aliases_ref}}; 643*b1cdbd2cSJim Jagielski 644*b1cdbd2cSJim Jagielski for (; $index >= 0; $index--) 645*b1cdbd2cSJim Jagielski { 646*b1cdbd2cSJim Jagielski # filter the 'p' job platform based aliases from '@aliases' 647*b1cdbd2cSJim Jagielski splice(@$aliases_ref, $index, 1) if ($$aliases_ref[$index] =~ /\.p$/); 648*b1cdbd2cSJim Jagielski 649*b1cdbd2cSJim Jagielski # transform a '.n' ending alias platform to '.w' ending alias platform 650*b1cdbd2cSJim Jagielski if ($$aliases_ref[$index] =~ /\.n$/) 651*b1cdbd2cSJim Jagielski { 652*b1cdbd2cSJim Jagielski $$aliases_ref[$index] =~ s/\.n$/\.w/; 653*b1cdbd2cSJim Jagielski splice(@$aliases_ref, $index, 1, $$aliases_ref[$index]); 654*b1cdbd2cSJim Jagielski } 655*b1cdbd2cSJim Jagielski } 656*b1cdbd2cSJim Jagielski} 657*b1cdbd2cSJim Jagielski 658*b1cdbd2cSJim Jagielski######################################################################################## 659*b1cdbd2cSJim Jagielski# sub: resolve_aliases 660*b1cdbd2cSJim Jagielski# gets: $aliases_ref, $dir_of_alias_ref, $dir_of_job_platform_ref, 661*b1cdbd2cSJim Jagielski# $module_name, $line_number 662*b1cdbd2cSJim Jagielski# returns: \@directories 663*b1cdbd2cSJim Jagielski######################################################################################## 664*b1cdbd2cSJim Jagielski# here we get each alias with the matching job directory 665*b1cdbd2cSJim Jagielskisub resolve_aliases 666*b1cdbd2cSJim Jagielski{ 667*b1cdbd2cSJim Jagielski my ($aliases_ref, $dir_of_alias_ref, $dir_of_job_platform_ref, $module_name, $line_number) = @_; 668*b1cdbd2cSJim Jagielski 669*b1cdbd2cSJim Jagielski my @directories = (); 670*b1cdbd2cSJim Jagielski my ($alias_platform, $alias, $temp_alias) = ""; 671*b1cdbd2cSJim Jagielski 672*b1cdbd2cSJim Jagielski # resolving all directory aliases 673*b1cdbd2cSJim Jagielski foreach $temp_alias (@$aliases_ref) 674*b1cdbd2cSJim Jagielski { 675*b1cdbd2cSJim Jagielski ($alias, $alias_platform) = compare_job_platform_with_alias_platform 676*b1cdbd2cSJim Jagielski ($temp_alias, $dir_of_job_platform_ref, $module_name, $line_number); 677*b1cdbd2cSJim Jagielski 678*b1cdbd2cSJim Jagielski # does the alias exist? 679*b1cdbd2cSJim Jagielski if (exists $$dir_of_alias_ref{$alias}) 680*b1cdbd2cSJim Jagielski { 681*b1cdbd2cSJim Jagielski # then get the matching directory in the array 682*b1cdbd2cSJim Jagielski push (@directories, $$dir_of_alias_ref{$alias}); 683*b1cdbd2cSJim Jagielski } 684*b1cdbd2cSJim Jagielski else 685*b1cdbd2cSJim Jagielski { 686*b1cdbd2cSJim Jagielski add_errorlog_no_directory_of_alias_statement($module_name, $alias, $line_number); 687*b1cdbd2cSJim Jagielski } 688*b1cdbd2cSJim Jagielski } 689*b1cdbd2cSJim Jagielski return \@directories; 690*b1cdbd2cSJim Jagielski} 691*b1cdbd2cSJim Jagielski 692*b1cdbd2cSJim Jagielski######################################################################################## 693*b1cdbd2cSJim Jagielski# sub: compare_job_platform_with_alias_platform 694*b1cdbd2cSJim Jagielski# gets: $alias, $dir_of_job_platform_ref, $module_name, $line_number 695*b1cdbd2cSJim Jagielski# returns: $alias 696*b1cdbd2cSJim Jagielski######################################################################################## 697*b1cdbd2cSJim Jagielskisub compare_job_platform_with_alias_platform 698*b1cdbd2cSJim Jagielski{ 699*b1cdbd2cSJim Jagielski my ($alias, $dir_of_job_platform_ref, $module_name, $line_number) = @_; 700*b1cdbd2cSJim Jagielski 701*b1cdbd2cSJim Jagielski my $alias_platform = ""; 702*b1cdbd2cSJim Jagielski 703*b1cdbd2cSJim Jagielski # compare the alias platform (with a dot and an ending letter, like "al_alib.u") 704*b1cdbd2cSJim Jagielski # with the job platform of the line in which this alias was resolved 705*b1cdbd2cSJim Jagielski if ($alias =~ /\.([wum])$/) 706*b1cdbd2cSJim Jagielski { 707*b1cdbd2cSJim Jagielski $alias_platform = $1; 708*b1cdbd2cSJim Jagielski 709*b1cdbd2cSJim Jagielski # don't memorize the ending dot and letter 710*b1cdbd2cSJim Jagielski $alias =~ s/\.\w$//; 711*b1cdbd2cSJim Jagielski 712*b1cdbd2cSJim Jagielski # if the value(= job platform) of the hash or the alias platform has no value 713*b1cdbd2cSJim Jagielski # set it to "no valid value" 714*b1cdbd2cSJim Jagielski if (!(exists $$dir_of_job_platform_ref{$alias_platform.$alias})) 715*b1cdbd2cSJim Jagielski { 716*b1cdbd2cSJim Jagielski $$dir_of_job_platform_ref{$alias_platform.$alias} = "no valid value"; 717*b1cdbd2cSJim Jagielski } 718*b1cdbd2cSJim Jagielski $alias_platform = "no valid value" if (!($alias_platform)); 719*b1cdbd2cSJim Jagielski 720*b1cdbd2cSJim Jagielski # are the job platform and the alias platform equal? 721*b1cdbd2cSJim Jagielski if ($$dir_of_job_platform_ref{$alias_platform.$alias} ne $alias_platform) 722*b1cdbd2cSJim Jagielski { 723*b1cdbd2cSJim Jagielski add_errorlog_not_equal_platforms_statement 724*b1cdbd2cSJim Jagielski ($module_name, $alias, $alias_platform, $dir_of_job_platform_ref, $line_number); 725*b1cdbd2cSJim Jagielski } 726*b1cdbd2cSJim Jagielski } 727*b1cdbd2cSJim Jagielski return ($alias, $alias_platform); 728*b1cdbd2cSJim Jagielski} 729*b1cdbd2cSJim Jagielski 730*b1cdbd2cSJim Jagielski######################################################################################## 731*b1cdbd2cSJim Jagielski# sub: show_line_infos 732*b1cdbd2cSJim Jagielski# gets: $line_number, $job_dir, $job, $job_platform, $restriction, 733*b1cdbd2cSJim Jagielski# $aliases_ref, $directories_ref 734*b1cdbd2cSJim Jagielski# returns: - 735*b1cdbd2cSJim Jagielski######################################################################################## 736*b1cdbd2cSJim Jagielski# print the infos about each line 737*b1cdbd2cSJim Jagielskisub show_line_infos 738*b1cdbd2cSJim Jagielski{ 739*b1cdbd2cSJim Jagielski my ($line_number, $job_dir, $job, $job_platform, $restriction, $aliases_ref, $directories_ref) = @_; 740*b1cdbd2cSJim Jagielski 741*b1cdbd2cSJim Jagielski print"line number : <$line_number>\n"; 742*b1cdbd2cSJim Jagielski print"job directory : <$job_dir>\n"; 743*b1cdbd2cSJim Jagielski print"job : <$job>\n"; 744*b1cdbd2cSJim Jagielski print"job platform : <$job_platform>\n" if ($job_platform =~ /(w|u|m|all)/); 745*b1cdbd2cSJim Jagielski print"restriction : <$restriction>\n" if ($restriction); 746*b1cdbd2cSJim Jagielski print"alias dependencies : <@$aliases_ref>\n"; 747*b1cdbd2cSJim Jagielski print"directory dependencies : <@$directories_ref>\n\n"; 748*b1cdbd2cSJim Jagielski} 749*b1cdbd2cSJim Jagielski 750*b1cdbd2cSJim Jagielski######################################################################################## 751*b1cdbd2cSJim Jagielski# sub: lines_sums_output 752*b1cdbd2cSJim Jagielski# gets: $module_name, $line_number, $info_line_sum, $no_info_line_sum 753*b1cdbd2cSJim Jagielski# returns: - 754*b1cdbd2cSJim Jagielski######################################################################################## 755*b1cdbd2cSJim Jagielskisub lines_sums_output 756*b1cdbd2cSJim Jagielski{ 757*b1cdbd2cSJim Jagielski # this line variables are for checking that all lines will be read: 758*b1cdbd2cSJim Jagielski my ($module_name, $line_number, $info_line_sum, $no_info_line_sum) = @_; 759*b1cdbd2cSJim Jagielski my $lines_sum = 0; 760*b1cdbd2cSJim Jagielski 761*b1cdbd2cSJim Jagielski add_errorlog_no_module_name_statement() if (!($module_name)); 762*b1cdbd2cSJim Jagielski 763*b1cdbd2cSJim Jagielski # were all lines read? and is the checksum okay? 764*b1cdbd2cSJim Jagielski $lines_sum = $info_line_sum + $no_info_line_sum; 765*b1cdbd2cSJim Jagielski if ($lines_sum == $line_number) 766*b1cdbd2cSJim Jagielski { 767*b1cdbd2cSJim Jagielski print"All $line_number line(s) of module <$module_name> were read and checked!\n\n"; 768*b1cdbd2cSJim Jagielski } 769*b1cdbd2cSJim Jagielski else 770*b1cdbd2cSJim Jagielski { 771*b1cdbd2cSJim Jagielski add_errorlog_different_lines_sums_statement($module_name); 772*b1cdbd2cSJim Jagielski } 773*b1cdbd2cSJim Jagielski 774*b1cdbd2cSJim Jagielski print"module: <$module_name>\n". 775*b1cdbd2cSJim Jagielski "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n". 776*b1cdbd2cSJim Jagielski " info line(s) sum = $info_line_sum\n". 777*b1cdbd2cSJim Jagielski "no-info line(s) sum = $no_info_line_sum\n". 778*b1cdbd2cSJim Jagielski "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n". 779*b1cdbd2cSJim Jagielski " total line(s) sum = $line_number\n\n\n"; 780*b1cdbd2cSJim Jagielski} 781*b1cdbd2cSJim Jagielski 782*b1cdbd2cSJim Jagielski 783*b1cdbd2cSJim Jagielski############################ ERROR_LOG subroutines ##################################### 784*b1cdbd2cSJim Jagielski 785*b1cdbd2cSJim Jagielski 786*b1cdbd2cSJim Jagielski######################################################################################## 787*b1cdbd2cSJim Jagielski# sub: add_errorlog_invalid_job_platform_statement 788*b1cdbd2cSJim Jagielski# gets: $module_name, $platform, $line_number 789*b1cdbd2cSJim Jagielski# returns: - 790*b1cdbd2cSJim Jagielski######################################################################################## 791*b1cdbd2cSJim Jagielskisub add_errorlog_invalid_job_platform_statement 792*b1cdbd2cSJim Jagielski{ 793*b1cdbd2cSJim Jagielski my ($module_name, $job_platform, $line_number) = @_; 794*b1cdbd2cSJim Jagielski 795*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n". 796*b1cdbd2cSJim Jagielski "The job platform <$job_platform> is not valid.\n\n"; 797*b1cdbd2cSJim Jagielski} 798*b1cdbd2cSJim Jagielski 799*b1cdbd2cSJim Jagielski######################################################################################## 800*b1cdbd2cSJim Jagielski# sub: add_errorlog_not_equal_platforms_statement 801*b1cdbd2cSJim Jagielski# gets: $module_name, $alias, $alias_platform, $dir_of_job_platform_ref, $line_number 802*b1cdbd2cSJim Jagielski# returns: - 803*b1cdbd2cSJim Jagielski######################################################################################## 804*b1cdbd2cSJim Jagielskisub add_errorlog_not_equal_platforms_statement 805*b1cdbd2cSJim Jagielski{ 806*b1cdbd2cSJim Jagielski my ($module_name, $alias, $alias_platform, $dir_of_job_platform_ref, $line_number) = @_; 807*b1cdbd2cSJim Jagielski 808*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n". 809*b1cdbd2cSJim Jagielski "The alias platform <$alias.$alias_platform> is not equal ". 810*b1cdbd2cSJim Jagielski "with the job platform <$$dir_of_job_platform_ref{$alias_platform.$alias}>.\n\n"; 811*b1cdbd2cSJim Jagielski} 812*b1cdbd2cSJim Jagielski 813*b1cdbd2cSJim Jagielski######################################################################################## 814*b1cdbd2cSJim Jagielski# sub: add_errorlog_no_directory_of_alias_statement 815*b1cdbd2cSJim Jagielski# gets: $module_name, $alias, $line_number 816*b1cdbd2cSJim Jagielski# returns: - 817*b1cdbd2cSJim Jagielski######################################################################################## 818*b1cdbd2cSJim Jagielskisub add_errorlog_no_directory_of_alias_statement 819*b1cdbd2cSJim Jagielski{ 820*b1cdbd2cSJim Jagielski my ($module_name, $alias, $line_number) = @_; 821*b1cdbd2cSJim Jagielski 822*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n". 823*b1cdbd2cSJim Jagielski "The directory of the alias <$alias> doesn't exist!\n\n"; 824*b1cdbd2cSJim Jagielski} 825*b1cdbd2cSJim Jagielski 826*b1cdbd2cSJim Jagielski######################################################################################## 827*b1cdbd2cSJim Jagielski# sub: add_errorlog_no_module_name_statement 828*b1cdbd2cSJim Jagielski# gets: - 829*b1cdbd2cSJim Jagielski# returns: - 830*b1cdbd2cSJim Jagielski######################################################################################## 831*b1cdbd2cSJim Jagielskisub add_errorlog_no_module_name_statement 832*b1cdbd2cSJim Jagielski{ 833*b1cdbd2cSJim Jagielski print ERROR_LOG "Error. No module name found in dir/file <$parse_file>.\n\n"; 834*b1cdbd2cSJim Jagielski} 835*b1cdbd2cSJim Jagielski 836*b1cdbd2cSJim Jagielski######################################################################################## 837*b1cdbd2cSJim Jagielski# sub: add_errorlog_alias_redundancy_statement 838*b1cdbd2cSJim Jagielski# gets: $module_name, $alias, $job_platform, $line_number 839*b1cdbd2cSJim Jagielski# returns: - 840*b1cdbd2cSJim Jagielski######################################################################################## 841*b1cdbd2cSJim Jagielskisub add_errorlog_alias_redundancy_statement 842*b1cdbd2cSJim Jagielski{ 843*b1cdbd2cSJim Jagielski my ($module_name, $alias, $job_platform, $line_number)= @_; 844*b1cdbd2cSJim Jagielski 845*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n". 846*b1cdbd2cSJim Jagielski "The alias <$alias> with the job platform <$job_platform> is redundant.\n\n"; 847*b1cdbd2cSJim Jagielski} 848*b1cdbd2cSJim Jagielski 849*b1cdbd2cSJim Jagielski######################################################################################## 850*b1cdbd2cSJim Jagielski# sub: add_errorlog_unknown_format_statement 851*b1cdbd2cSJim Jagielski# gets: $module_name, $line_number 852*b1cdbd2cSJim Jagielski# returns: - 853*b1cdbd2cSJim Jagielski######################################################################################## 854*b1cdbd2cSJim Jagielskisub add_errorlog_unknown_format_statement 855*b1cdbd2cSJim Jagielski{ 856*b1cdbd2cSJim Jagielski my ($line, $module_name, $line_number) = @_; 857*b1cdbd2cSJim Jagielski 858*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.". 859*b1cdbd2cSJim Jagielski "\nUnknown format:\n\"$line\"\n\n"; 860*b1cdbd2cSJim Jagielski} 861*b1cdbd2cSJim Jagielski 862*b1cdbd2cSJim Jagielski######################################################################################## 863*b1cdbd2cSJim Jagielski# sub: add_errorlog_different_lines_sums_statement 864*b1cdbd2cSJim Jagielski# gets: $module_name 865*b1cdbd2cSJim Jagielski# returns: - 866*b1cdbd2cSJim Jagielski######################################################################################## 867*b1cdbd2cSJim Jagielskisub add_errorlog_different_lines_sums_statement 868*b1cdbd2cSJim Jagielski{ 869*b1cdbd2cSJim Jagielski my $module_name = shift; 870*b1cdbd2cSJim Jagielski 871*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file>.\n". 872*b1cdbd2cSJim Jagielski "The sums of all info and no-info lines are not correct!\n\n"; 873*b1cdbd2cSJim Jagielski} 874*b1cdbd2cSJim Jagielski 875*b1cdbd2cSJim Jagielski######################################################################################## 876*b1cdbd2cSJim Jagielski# sub: add_errorlog_no_buildlst_file_found_statement 877*b1cdbd2cSJim Jagielski# gets: $parse_file 878*b1cdbd2cSJim Jagielski# returns: - 879*b1cdbd2cSJim Jagielski######################################################################################## 880*b1cdbd2cSJim Jagielskisub add_errorlog_no_buildlst_file_found_statement 881*b1cdbd2cSJim Jagielski{ 882*b1cdbd2cSJim Jagielski my $parse_file = shift; 883*b1cdbd2cSJim Jagielski 884*b1cdbd2cSJim Jagielski print ERROR_LOG "Error in command line argument <$parse_file>.\n". 885*b1cdbd2cSJim Jagielski "File 'build.lst' not found!\n"; 886*b1cdbd2cSJim Jagielski} 887*b1cdbd2cSJim Jagielski 888*b1cdbd2cSJim Jagielski############################# end of the subroutines ################################### 889