1#************************************************************** 2# 3# Licensed to the Apache Software Foundation (ASF) under one 4# or more contributor license agreements. See the NOTICE file 5# distributed with this work for additional information 6# regarding copyright ownership. The ASF licenses this file 7# to you under the Apache License, Version 2.0 (the 8# "License"); you may not use this file except in compliance 9# with the License. You may obtain a copy of the License at 10# 11# http://www.apache.org/licenses/LICENSE-2.0 12# 13# Unless required by applicable law or agreed to in writing, 14# software distributed under the License is distributed on an 15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16# KIND, either express or implied. See the License for the 17# specific language governing permissions and limitations 18# under the License. 19# 20#************************************************************** 21 22 23 24################# 25# use 26################# 27 28use lib ("$ENV{SOLARENV}/bin/modules"); 29 30use Cwd; 31use File::Copy; 32use installer::archivefiles; 33use installer::control; 34use installer::converter; 35use installer::copyproject; 36use installer::download; 37use installer::environment; 38use installer::epmfile; 39use installer::exiter; 40use installer::files; 41use installer::followme; 42use installer::globals; 43use installer::javainstaller; 44use installer::languagepack; 45use installer::languages; 46use installer::logger; 47use installer::mail; 48use installer::packagelist; 49use installer::packagepool; 50use installer::parameter; 51use installer::pathanalyzer; 52use installer::profiles; 53use installer::scppatchsoname; 54use installer::scpzipfiles; 55use installer::scriptitems; 56use installer::setupscript; 57use installer::simplepackage; 58use installer::sorter; 59use installer::strip; 60use installer::substfilenamefiles; 61use installer::upx; 62use installer::systemactions; 63use installer::windows::assembly; 64use installer::windows::binary; 65use installer::windows::component; 66use installer::windows::createfolder; 67use installer::windows::directory; 68use installer::windows::feature; 69use installer::windows::featurecomponent; 70use installer::windows::file; 71use installer::windows::font; 72use installer::windows::icon; 73use installer::windows::idtglobal; 74use installer::windows::inifile; 75use installer::windows::java; 76use installer::windows::media; 77use installer::windows::mergemodule; 78use installer::windows::msiglobal; 79use installer::windows::msp; 80use installer::windows::patch; 81use installer::windows::property; 82use installer::windows::removefile; 83use installer::windows::registry; 84use installer::windows::selfreg; 85use installer::windows::shortcut; 86use installer::windows::strip; 87use installer::windows::update; 88use installer::windows::upgrade; 89use installer::worker; 90use installer::xpdinstaller; 91use installer::ziplist; 92 93################################################# 94# Main program 95################################################# 96 97################################################# 98# Part 1: The platform independent part 99################################################# 100 101################################################# 102# Part 1a: The language independent part 103################################################# 104 105installer::logger::starttime(); 106$installer::logger::Global->add_timestamp("starting logging"); 107 108# While there is no language set and logger::Lang is not yet tied to a log file, 109# forward its output to logger::Global. 110$installer::logger::Lang->set_forward($installer::logger::Global); 111 112######################################### 113# Checking the environment and setting 114# most important variables 115######################################### 116 117$installer::logger::Info->print( "... checking environment variables ...\n" ); 118my $environmentvariableshashref = installer::control::check_system_environment(); 119 120installer::environment::set_global_environment_variables($environmentvariableshashref); 121 122################################# 123# Check and output of parameter 124################################# 125 126installer::parameter::saveparameter(); 127installer::parameter::getparameter(); 128 129# debugging can start after function "getparameter" 130if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 1: The platform independent part\n"); } 131if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 1a: The language independent part\n"); } 132 133installer::parameter::control_fundamental_parameter(); 134installer::parameter::setglobalvariables(); 135installer::parameter::control_required_parameter(); 136 137if (!($installer::globals::languages_defined_in_productlist)) { installer::languages::analyze_languagelist(); } 138installer::parameter::outputparameter(); 139 140installer::control::check_updatepack(); 141 142$installer::globals::build = uc($installer::globals::build); # using "SRC680" instead of "src680" 143 144###################################### 145# Creating the log directory 146###################################### 147 148my $loggingdir = installer::systemactions::create_directories("logging", ""); 149$loggingdir = $loggingdir . $installer::globals::separator; 150$installer::globals::exitlog = $loggingdir; 151 152my $installdir = ""; 153my $currentdir = cwd(); 154my $shipinstalldir = ""; 155my $current_install_number = ""; 156 157###################################### 158# Checking the system requirements 159###################################### 160 161$installer::logger::Info->print( "... checking required files ...\n" ); 162installer::control::check_system_path(); 163 164my $pathvariableshashref = installer::environment::create_pathvariables($environmentvariableshashref); 165 166############################################### 167# Checking saved setting for Windows patches 168############################################### 169 170if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::prepare_winpatch )) { installer::windows::msiglobal::read_saved_mappings(); } 171 172################################################### 173# Analyzing the settings and variables in zip.lst 174################################################### 175 176installer::logger::globallog("zip list file: $installer::globals::ziplistname"); 177 178my $ziplistref = installer::files::read_file($installer::globals::ziplistname); 179 180$installer::logger::Info->print( "... analyzing $installer::globals::ziplistname ... \n" ); 181 182my ($productblockref, $parent) = installer::ziplist::getproductblock($ziplistref, $installer::globals::product, 1); # product block from zip.lst 183if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "productblock.log" ,$productblockref); } 184 185my ($settingsblockref, undef) = installer::ziplist::getproductblock($productblockref, "Settings", 0); # settings block from zip.lst 186if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "settingsblock1.log" ,$settingsblockref); } 187 188$settingsblockref = installer::ziplist::analyze_settings_block($settingsblockref); # select data from settings block in zip.lst 189if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "settingsblock2.log" ,$settingsblockref); } 190 191my $allsettingsarrayref = installer::ziplist::get_settings_from_ziplist($settingsblockref); 192if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allsettings1.log" ,$allsettingsarrayref); } 193 194my $allvariablesarrayref = installer::ziplist::get_variables_from_ziplist($settingsblockref); 195if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allvariables1.log" ,$allvariablesarrayref); } 196 197my ($globalproductblockref, undef) = installer::ziplist::getproductblock($ziplistref, $installer::globals::globalblock, 0); # global product block from zip.lst 198if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "globalproductblock.log" ,$globalproductblockref); } 199 200while (defined $parent) 201{ 202 my $parentproductblockref; 203 ($parentproductblockref, $parent) = installer::ziplist::getproductblock( 204 $ziplistref, $parent, 1); 205 my ($parentsettingsblockref, undef) = installer::ziplist::getproductblock( 206 $parentproductblockref, "Settings", 0); 207 $parentsettingsblockref = installer::ziplist::analyze_settings_block( 208 $parentsettingsblockref); 209 my $allparentsettingsarrayref = 210 installer::ziplist::get_settings_from_ziplist($parentsettingsblockref); 211 my $allparentvariablesarrayref = 212 installer::ziplist::get_variables_from_ziplist($parentsettingsblockref); 213 $allsettingsarrayref = 214 installer::converter::combine_arrays_from_references_first_win( 215 $allsettingsarrayref, $allparentsettingsarrayref) 216 if $#{$allparentsettingsarrayref} > -1; 217 $allvariablesarrayref = 218 installer::converter::combine_arrays_from_references_first_win( 219 $allvariablesarrayref, $allparentvariablesarrayref) 220 if $#{$allparentvariablesarrayref} > -1; 221} 222 223if ( $#{$globalproductblockref} > -1 ) 224{ 225 my ($globalsettingsblockref, undef) = installer::ziplist::getproductblock($globalproductblockref, "Settings", 0); # settings block from zip.lst 226 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "globalsettingsblock1.log" ,$globalsettingsblockref); } 227 228 $globalsettingsblockref = installer::ziplist::analyze_settings_block($globalsettingsblockref); # select data from settings block in zip.lst 229 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "globalsettingsblock2.log" ,$globalsettingsblockref); } 230 231 my $allglobalsettingsarrayref = installer::ziplist::get_settings_from_ziplist($globalsettingsblockref); 232 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allglobalsettings1.log" ,$allglobalsettingsarrayref); } 233 234 my $allglobalvariablesarrayref = installer::ziplist::get_variables_from_ziplist($globalsettingsblockref); 235 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allglobalvariables1.log" ,$allglobalvariablesarrayref); } 236 237 if ( $#{$allglobalsettingsarrayref} > -1 ) { $allsettingsarrayref = installer::converter::combine_arrays_from_references_first_win($allsettingsarrayref, $allglobalsettingsarrayref); } 238 if ( $#{$allglobalvariablesarrayref} > -1 ) { $allvariablesarrayref = installer::converter::combine_arrays_from_references_first_win($allvariablesarrayref, $allglobalvariablesarrayref); } 239} 240 241$allsettingsarrayref = installer::ziplist::remove_multiples_from_ziplist($allsettingsarrayref); # the settings from the zip.lst 242if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allsettings2.log" ,$allsettingsarrayref); } 243 244$allvariablesarrayref = installer::ziplist::remove_multiples_from_ziplist($allvariablesarrayref); 245if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allvariables2.log" ,$allvariablesarrayref); } 246 247installer::ziplist::replace_variables_in_ziplist_variables($allvariablesarrayref); 248if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allvariables2a.log" ,$allvariablesarrayref); } 249 250my $allvariableshashref = installer::converter::convert_array_to_hash($allvariablesarrayref); # the variables from the zip.lst 251if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3.log", $allvariableshashref); } 252 253installer::ziplist::set_default_productversion_if_required($allvariableshashref); 254if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3a.log", $allvariableshashref); } 255 256installer::ziplist::add_variables_to_allvariableshashref($allvariableshashref); 257if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3b.log", $allvariableshashref); } 258 259installer::ziplist::overwrite_ooovendor( $allvariableshashref ); 260if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3c.log", $allvariableshashref); } 261 262######################################################## 263# Check if this is simple packaging mechanism 264######################################################## 265 266installer::simplepackage::check_simple_packager_project($allvariableshashref); 267 268#################################################################### 269# setting global variables 270#################################################################### 271 272installer::control::set_addchildprojects($allvariableshashref); 273installer::control::set_addjavainstaller($allvariableshashref); 274installer::control::set_addsystemintegration($allvariableshashref); 275 276######################################################## 277# Re-define logging dir, after all variables are set 278######################################################## 279 280my $oldloggingdir = $loggingdir; 281installer::systemactions::remove_empty_directory($oldloggingdir); 282$loggingdir = installer::systemactions::create_directories("logging", ""); 283$loggingdir = $loggingdir . $installer::globals::separator; 284$installer::globals::exitlog = $loggingdir; 285 286# checking, whether this is an opensource product 287 288if (!($installer::globals::is_copy_only_project)) { installer::ziplist::set_manufacturer($allvariableshashref); } 289 290############################################## 291# Checking version of makecab.exe 292############################################## 293 294if ( $installer::globals::iswindowsbuild ) { installer::control::check_makecab_version(); } 295 296########################################################## 297# Getting the include path from the settings in zip list 298########################################################## 299 300my $includepathref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "include"); 301if ( $$includepathref eq "" ) 302{ 303 installer::exiter::exit_program("ERROR: Definition for \"include\" not found in $installer::globals::ziplistname", "Main"); 304} 305 306my $includepatharrayref = installer::converter::convert_stringlist_into_array($includepathref, ","); 307if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray1.log" ,$includepatharrayref); } 308 309installer::ziplist::replace_all_variables_in_pathes($includepatharrayref, $pathvariableshashref); 310if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray2.log" ,$includepatharrayref); } 311 312installer::ziplist::replace_minor_in_pathes($includepatharrayref); 313if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3.log" ,$includepatharrayref); } 314 315installer::ziplist::replace_packagetype_in_pathes($includepatharrayref); 316if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3a.log" ,$includepatharrayref); } 317 318installer::ziplist::resolve_relative_pathes($includepatharrayref); 319if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3b.log" ,$includepatharrayref); } 320 321installer::ziplist::remove_ending_separator($includepatharrayref); 322if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3c.log" ,$includepatharrayref); } 323 324############################################## 325# Collecting all files from all include 326# pathes in global hashes. 327############################################## 328 329installer::worker::collect_all_files_from_includepathes($includepatharrayref); 330 331############################################## 332# Analyzing languages in zip.lst if required 333# Probably no longer used. 334############################################## 335 336if ($installer::globals::languages_defined_in_productlist) { installer::languages::get_info_about_languages($allsettingsarrayref); } 337 338##################################### 339# Windows requires the encoding list 340##################################### 341 342if ( $installer::globals::iswindowsbuild ) { installer::control::read_encodinglist($includepatharrayref); } 343 344#################################################################### 345# MacOS dmg build requires special DS_Store file to arrange icons 346#################################################################### 347if (($installer::globals::ismacdmgbuild) && ($installer::globals::product =~ /OpenOffice_Dev/)) { $installer::globals::devsnapshotbuild = 1; } 348 349##################################################################### 350# Including additional inc files for variable settings, if defined 351##################################################################### 352 353if ( $allvariableshashref->{'ADD_INCLUDE_FILES'} ) { installer::worker::add_variables_from_inc_to_hashref($allvariableshashref, $includepatharrayref); } 354 355################################################ 356# Disable xpd installer, if SOLAR_JAVA not set 357################################################ 358 359installer::control::check_java_for_xpd($allvariableshashref); 360 361##################################### 362# Analyzing the setup script 363##################################### 364 365if ($installer::globals::setupscript_defined_in_productlist) { installer::setupscript::set_setupscript_name($allsettingsarrayref, $includepatharrayref); } 366 367installer::logger::globallog("setup script file: $installer::globals::setupscriptname"); 368 369$installer::logger::Info->print( "... analyzing script: $installer::globals::setupscriptname ... \n" ); 370 371my $setupscriptref = installer::files::read_file($installer::globals::setupscriptname); # Reading the setup script file 372 373# Resolving variables defined in the zip list file into setup script 374# All the variables are defined in $allvariablesarrayref 375 376installer::scpzipfiles::replace_all_ziplistvariables_in_file($setupscriptref, $allvariableshashref); 377if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscript1.log" ,$setupscriptref); } 378 379# Resolving %variables defined in the installation object 380 381my $allscriptvariablesref = installer::setupscript::get_all_scriptvariables_from_installation_object($setupscriptref); 382if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscriptvariables1.log" ,$allscriptvariablesref); } 383 384installer::setupscript::add_lowercase_productname_setupscriptvariable($allscriptvariablesref); 385if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscriptvariables2.log" ,$allscriptvariablesref); } 386 387installer::setupscript::resolve_lowercase_productname_setupscriptvariable($allscriptvariablesref); 388if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscriptvariables3.log" ,$allscriptvariablesref); } 389 390$setupscriptref = installer::setupscript::replace_all_setupscriptvariables_in_script($setupscriptref, $allscriptvariablesref); 391if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscript2.log" ,$setupscriptref); } 392 393# Adding all variables defined in the installation object into the hash of all variables. 394# This is needed if variables are defined in the installation object, but not in the zip list file. 395# If there is a definition in the zip list file and in the installation object, the installation object is more important 396 397installer::setupscript::add_installationobject_to_variables($allvariableshashref, $allscriptvariablesref); 398if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables4.log", $allvariableshashref); } 399 400# Adding also all variables, that must be included into the $allvariableshashref. 401installer::setupscript::add_forced_properties($allvariableshashref); 402if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables5.log", $allvariableshashref); } 403 404# Replacing preset properties, not using the default mechanisms (for example for UNIXPRODUCTNAME) 405installer::setupscript::replace_preset_properties($allvariableshashref); 406if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables6.log", $allvariableshashref); } 407 408installer::scpzipfiles::replace_all_ziplistvariables_in_file($setupscriptref, $allvariableshashref); 409if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscript3.log" ,$setupscriptref); } 410 411 412installer::logger::log_hashref($allvariableshashref); 413 414$installer::logger::Info->print( "... analyzing directories ... \n" ); 415 416# Collect all directories in the script to get the destination dirs 417 418my $dirsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Directory"); 419if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1.log", $dirsinproductarrayref); } 420 421if ( $installer::globals::languagepack ) { installer::scriptitems::use_langpack_hostname($dirsinproductarrayref); } 422if ( $installer::globals::patch ) { installer::scriptitems::use_patch_hostname($dirsinproductarrayref); } 423if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1a.log", $dirsinproductarrayref); } 424 425if ( $allvariableshashref->{'SHIFT_BASIS_INTO_BRAND_LAYER'} ) { $dirsinproductarrayref = installer::scriptitems::shift_basis_directory_parents($dirsinproductarrayref); } 426if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1b.log", $dirsinproductarrayref); } 427if ( $allvariableshashref->{'OFFICEDIRECTORYNAME'} ) { installer::scriptitems::set_officedirectory_name($dirsinproductarrayref, $allvariableshashref->{'OFFICEDIRECTORYNAME'}); } 428if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1b.log", $dirsinproductarrayref); } 429 430 431installer::scriptitems::resolve_all_directory_names($dirsinproductarrayref); 432if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories2.log", $dirsinproductarrayref); } 433 434$installer::logger::Info->print( "... analyzing files ... \n" ); 435 436my $filesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "File"); 437if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles1.log", $filesinproductarrayref); } 438 439$filesinproductarrayref = installer::scriptitems::remove_delete_only_files_from_productlists($filesinproductarrayref); 440if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2.log", $filesinproductarrayref); } 441 442if (( ! $installer::globals::iswindowsbuild ) && 443 ( ! $installer::globals::islinuxrpmbuild ) && 444 ( ! $installer::globals::islinuxdebbuild ) && 445 ( ! $installer::globals::issolarispkgbuild ) && 446 ( $installer::globals::packageformat ne "installed" ) && 447 ( $installer::globals::packageformat ne "dmg" ) && 448 ( $installer::globals::packageformat ne "archive" )) 449 { installer::control::check_oxtfiles($filesinproductarrayref); } 450 451if ($installer::globals::product =~ /suite/i ) { $filesinproductarrayref = installer::scriptitems::remove_notinsuite_files_from_productlists($filesinproductarrayref); } 452if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2aa.log", $filesinproductarrayref); } 453 454if (! $installer::globals::languagepack) 455{ 456 $filesinproductarrayref = installer::scriptitems::remove_Languagepacklibraries_from_Installset($filesinproductarrayref); 457 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2b.log", $filesinproductarrayref); } 458} 459 460if (! $installer::globals::patch) 461{ 462 $filesinproductarrayref = installer::scriptitems::remove_patchonlyfiles_from_Installset($filesinproductarrayref); 463 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2c.log", $filesinproductarrayref); } 464} 465 466if (! $installer::globals::tab) 467{ 468 $filesinproductarrayref = installer::scriptitems::remove_tabonlyfiles_from_Installset($filesinproductarrayref); 469 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2c.log", $filesinproductarrayref); } 470} 471 472if (( $installer::globals::packageformat ne "installed" ) && ( $installer::globals::packageformat ne "archive" )) 473{ 474 $filesinproductarrayref = installer::scriptitems::remove_installedproductonlyfiles_from_Installset($filesinproductarrayref); 475 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2cc.log", $filesinproductarrayref); } 476} 477 478$installer::logger::Info->print( "... analyzing scpactions ... \n" ); 479 480my $scpactionsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "ScpAction"); 481if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions1.log", $scpactionsinproductarrayref); } 482 483if (( ! $allvariableshashref->{'XPDINSTALLER'} ) || ( ! $installer::globals::isxpdplatform )) 484{ 485 $scpactionsinproductarrayref = installer::scriptitems::remove_Xpdonly_Items($scpactionsinproductarrayref); 486 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions1a.log", $scpactionsinproductarrayref); } 487} 488 489if ( $installer::globals::languagepack ) { installer::scriptitems::use_langpack_copy_scpaction($scpactionsinproductarrayref); } 490if ( $installer::globals::patch ) { installer::scriptitems::use_patch_copy_scpaction($scpactionsinproductarrayref); } 491if (($installer::globals::devsnapshotbuild)) { installer::scriptitems::use_dev_copy_scpaction($scpactionsinproductarrayref); } 492if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions1b.log", $scpactionsinproductarrayref); } 493 494# $scpactionsinproductarrayref = installer::scriptitems::remove_scpactions_without_name($scpactionsinproductarrayref); 495# if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions2.log", $scpactionsinproductarrayref); } 496 497installer::scriptitems::change_keys_of_scpactions($scpactionsinproductarrayref); 498if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions2.log", $scpactionsinproductarrayref); } 499 500$installer::logger::Info->print( "... analyzing shortcuts ... \n" ); 501 502my $linksinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Shortcut"); 503if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks1.log", $linksinproductarrayref); } 504 505$installer::logger::Info->print( "... analyzing unix links ... \n" ); 506 507my $unixlinksinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Unixlink"); 508if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks1.log", $unixlinksinproductarrayref); } 509 510# $unixlinksinproductarrayref = installer::scriptitems::filter_layerlinks_from_unixlinks($unixlinksinproductarrayref); 511# if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks1b.log", $unixlinksinproductarrayref); } 512 513$installer::logger::Info->print( "... analyzing profile ... \n" ); 514 515my $profilesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Profile"); 516if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles1.log", $profilesinproductarrayref); } 517 518$installer::logger::Info->print( "... analyzing profileitems ... \n" ); 519 520my $profileitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "ProfileItem"); 521if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems1.log", $profileitemsinproductarrayref); } 522 523my $folderinproductarrayref; 524my $folderitemsinproductarrayref; 525my $registryitemsinproductarrayref; 526my $windowscustomactionsarrayref; 527my $mergemodulesarrayref; 528 529if ( $installer::globals::iswindowsbuild ) # Windows specific items: Folder, FolderItem, RegistryItem, WindowsCustomAction 530{ 531 $installer::logger::Info->print( "... analyzing folders ... \n" ); 532 533 $folderinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Folder"); 534 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder1.log", $folderinproductarrayref); } 535 536 $installer::logger::Info->print( "... analyzing folderitems ... \n" ); 537 538 $folderitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "FolderItem"); 539 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems1.log", $folderitemsinproductarrayref); } 540 541 installer::setupscript::add_predefined_folder($folderitemsinproductarrayref, $folderinproductarrayref); 542 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder1b.log", $folderinproductarrayref); } 543 544 installer::setupscript::prepare_non_advertised_files($folderitemsinproductarrayref, $filesinproductarrayref); 545 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2d.log", $filesinproductarrayref); } 546 547 $installer::logger::Info->print( "... analyzing registryitems ... \n" ); 548 549 $registryitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "RegistryItem"); 550 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems1.log", $registryitemsinproductarrayref); } 551 552 $registryitemsinproductarrayref = installer::scriptitems::remove_uninstall_regitems_from_script($registryitemsinproductarrayref); 553 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems1b.log", $registryitemsinproductarrayref); } 554 555 $installer::logger::Info->print( "... analyzing Windows custom actions ... \n" ); 556 557 $windowscustomactionsarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "WindowsCustomAction"); 558 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "windowscustomactions1.log", $windowscustomactionsarrayref); } 559 560 $installer::logger::Info->print( "... analyzing Windows merge modules ... \n" ); 561 562 $mergemodulesarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "MergeModule"); 563 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "mergemodules1.log", $mergemodulesarrayref); } 564} 565 566my $modulesinproductarrayref; 567 568if (!($installer::globals::is_copy_only_project)) 569{ 570 $installer::logger::Info->print( "... analyzing modules ... \n" ); 571 572 $modulesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Module"); 573 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1.log", $modulesinproductarrayref); } 574 575 if (( ! $allvariableshashref->{'XPDINSTALLER'} ) || ( ! $installer::globals::isxpdplatform )) 576 { 577 $modulesinproductarrayref = installer::scriptitems::remove_Xpdonly_Items($modulesinproductarrayref); 578 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1a.log", $modulesinproductarrayref); } 579 } 580 581 installer::scriptitems::resolve_assigned_modules($modulesinproductarrayref); 582 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1b.log", $modulesinproductarrayref); } 583 584 $modulesinproductarrayref = installer::scriptitems::remove_template_modules($modulesinproductarrayref); 585 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1c.log", $modulesinproductarrayref); } 586 587 installer::scriptitems::set_children_flag($modulesinproductarrayref); 588 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1d.log", $modulesinproductarrayref); } 589 590 installer::scriptitems::collect_all_languagemodules($modulesinproductarrayref); 591 592 # Assigning the modules to the items 593 594 installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $filesinproductarrayref, "Files"); 595 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles3.log", $filesinproductarrayref); } 596 597 installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $unixlinksinproductarrayref, "Unixlinks"); 598 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks2.log", $unixlinksinproductarrayref); } 599 600 installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $dirsinproductarrayref, "Dirs"); 601 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories2aa.log", $dirsinproductarrayref); } 602} 603 604if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 1a: The language independent part\n"); } 605 606# saving debug info, before staring part 1b 607if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } 608 609################################################# 610# Part 1b: The language dependent part 611# (still platform independent) 612################################################# 613 614# Now starts the language dependent part, if more than one product is defined on the command line 615# Example -l en-US,de#es,fr,it defines two multilingual products 616 617############################################################################### 618# Beginning of language dependent part 619# The for iterates over all products, separated by an # in the language list 620############################################################################### 621 622if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 1b: The language dependent part\n"); } 623 624 625for ( my $n = 0; $n <= $#installer::globals::languageproducts; $n++ ) 626{ 627 my $languagesarrayref = installer::languages::get_all_languages_for_one_product($installer::globals::languageproducts[$n], $allvariableshashref); 628 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "languages.log" ,$languagesarrayref); } 629 630 $installer::globals::alllanguagesinproductarrayref = $languagesarrayref; 631 my $languagestringref = installer::languages::get_language_string($languagesarrayref); 632 $installer::logger::Info->print( "------------------------------------\n" ); 633 $installer::logger::Info->print( "... languages $$languagestringref ... \n" ); 634 635 if ( $installer::globals::patch ) 636 { 637 $installer::globals::addlicensefile = 0; # no license files for patches 638 $installer::globals::makedownload = 0; 639 $installer::globals::makejds = 0; 640 } 641 642 if ( $installer::globals::languagepack ) 643 { 644 $installer::globals::addchildprojects = 0; 645 $installer::globals::addsystemintegration = 0; 646 $installer::globals::makejds = 0; 647 $installer::globals::addlicensefile = 0; 648 649 if ( $allvariableshashref->{'OPENSOURCE'} ) { $installer::globals::makedownload = 1; } 650 else { $installer::globals::makedownload = 0; } 651 } 652 653 ############################################################ 654 # Beginning of language specific logging mechanism 655 # Until now only global logging into default: logfile.txt 656 ############################################################ 657 658 installer::logger::copy_globalinfo_into_logfile(); 659 $installer::globals::globalinfo_copied = 1; 660 661 my $logminor = ""; 662 if ( $installer::globals::updatepack ) { $logminor = $installer::globals::lastminor; } 663 else { $logminor = $installer::globals::minor; } 664 665 my $loglanguagestring = $$languagestringref; 666 my $loglanguagestring_orig = $loglanguagestring; 667 if (length($loglanguagestring) > $installer::globals::max_lang_length) 668 { 669 my $number_of_languages = installer::systemactions::get_number_of_langs($loglanguagestring); 670 chomp(my $shorter = `echo $loglanguagestring | md5sum | sed -e "s/ .*//g"`); 671 my $id = substr($shorter, 0, 8); # taking only the first 8 digits 672 $loglanguagestring = "lang_" . $number_of_languages . "_id_" . $id; 673 } 674 675 # Setup the directory where the language dependent log file will be stored. 676 $loggingdir = $loggingdir . $loglanguagestring . $installer::globals::separator; 677 installer::systemactions::create_directory($loggingdir); 678 679 # Set language dependent logging. 680 $installer::globals::logfilename = sprintf("log_%s%s_%s.log", 681 $installer::globals::build, 682 $logminor ne "" ? "_" . $logminor : "", 683 $loglanguagestring); 684 $installer::logger::Lang->set_filename($loggingdir . $installer::globals::logfilename); 685 $installer::logger::Lang->copy_lines_from($installer::logger::Global); 686 $installer::logger::Lang->set_filter(\&installer::control::filter_log_error); 687 installer::control::prepare_error_processing(); 688 # All logging to the console is also forwarded to the language dependen log. 689 $installer::logger::Lang->set_forward(undef); 690 $installer::logger::Info->set_forward($installer::logger::Lang); 691 # Scan all log lines for error messages. 692 $installer::logger::Lang->add_timestamp("starting log for language ".$loglanguagestring); 693 694 if ($loglanguagestring ne $loglanguagestring_orig) { 695 (my $dir = $loggingdir) =~ s!/$!!; 696 open(my $F1, "> $dir.dir"); 697 open(my $F2, "> " . $loggingdir . $installer::globals::logfilename . '.file'); 698 my @s = map { "$_\n" } split('_', $loglanguagestring_orig); 699 print $F1 @s; 700 print $F2 @s; 701 } 702 703 $installer::globals::exitlog = $loggingdir; 704 705 ############################################################## 706 # Determining the ship location, if this is an update pack 707 ############################################################## 708 709 if ( $installer::globals::updatepack ) { $shipinstalldir = installer::control::determine_ship_directory($languagestringref); } 710 711 ################################################################### 712 # Reading an existing msi database, to prepare update and patch 713 ################################################################### 714 715 my $refdatabase = ""; 716 my $uniquefilename = ""; 717 my $revuniquefilename = ""; 718 my $revshortfilename = ""; 719 my $allupdatesequences = ""; 720 my $allupdatecomponents = ""; 721 my $allupdatefileorder = ""; 722 my $allupdatecomponentorder = ""; 723 my $shortdirname = ""; 724 my $componentid = ""; 725 my $componentidkeypath = ""; 726 my $alloldproperties = ""; 727 my $allupdatelastsequences = ""; 728 my $allupdatediskids = ""; 729 730 if ( $installer::globals::iswindowsbuild ) 731 { 732 if ( $allvariableshashref->{'UPDATE_DATABASE'} ) 733 { 734 $installer::logger::Info->print( "... analyzing update database ...\n" ); 735 $refdatabase = installer::windows::update::readdatabase($allvariableshashref, $languagestringref, $includepatharrayref); 736 737 if ( $installer::globals::updatedatabase ) 738 { 739 ($uniquefilename, $revuniquefilename, $revshortfilename, $allupdatesequences, $allupdatecomponents, $allupdatefileorder, $allupdatecomponentorder, $shortdirname, $componentid, $componentidkeypath, $alloldproperties, $allupdatelastsequences, $allupdatediskids) = installer::windows::update::create_database_hashes($refdatabase); 740 if ( $mergemodulesarrayref > -1 ) { installer::windows::update::readmergedatabase($mergemodulesarrayref, $languagestringref, $includepatharrayref); } 741 } 742 } 743 } 744 745 ############################################## 746 # Setting global code variables for Windows 747 ############################################## 748 749 if (!($installer::globals::is_copy_only_project)) 750 { 751 if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::packageformat ne "archive" ) && ( $installer::globals::packageformat ne "installed" )) 752 { 753 installer::windows::msiglobal::set_global_code_variables($languagesarrayref, $languagestringref, $allvariableshashref, $alloldproperties); 754 } 755 } 756 757 ################################################ 758 # Resolving include paths (language dependent) 759 ################################################ 760 761 $includepatharrayref_lang = installer::ziplist::replace_languages_in_pathes($includepatharrayref, $languagesarrayref); 762 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray4.log" ,$includepatharrayref_lang); } 763 764 if ( $installer::globals::refresh_includepathes ) { installer::worker::collect_all_files_from_includepathes($includepatharrayref_lang); } 765 766 installer::ziplist::list_all_files_from_include_path($includepatharrayref_lang); 767 768 ############################################## 769 # Analyzing spellchecker languages 770 ############################################## 771 772 if ( $allvariableshashref->{'SPELLCHECKERFILE'} ) { installer::worker::set_spellcheckerlanguages($languagesarrayref, $allvariableshashref); } 773 774 ##################################### 775 # Language dependent directory part 776 ##################################### 777 778 my $dirsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($dirsinproductarrayref, $languagesarrayref); 779 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories3.log", $dirsinproductlanguageresolvedarrayref); } 780 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories2a.log", $dirsinproductarrayref); } 781 782 # A new directory array is needed ($dirsinproductlanguageresolvedarrayref instead of $dirsinproductarrayref) 783 # because $dirsinproductarrayref is needed in get_Destination_Directory_For_Item_From_Directorylist 784 785 installer::scriptitems::changing_name_of_language_dependent_keys($dirsinproductlanguageresolvedarrayref); 786 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories4.log", $dirsinproductlanguageresolvedarrayref); } 787 788 installer::scriptitems::checking_directories_with_corrupt_hostname($dirsinproductlanguageresolvedarrayref, $languagesarrayref); 789 790 installer::scriptitems::set_global_directory_hostnames($dirsinproductlanguageresolvedarrayref, $allvariableshashref); 791 792 ##################################### 793 # files part, language dependent 794 ##################################### 795 796 $installer::logger::Info->print( "... analyzing files ...\n" ); 797 798 my $filesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($filesinproductarrayref, $languagesarrayref); 799 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles4.log", $filesinproductlanguageresolvedarrayref); } 800 801 if ( ! $installer::globals::set_office_start_language ) 802 { 803 $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_office_start_language_files($filesinproductlanguageresolvedarrayref); 804 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles4b.log", $filesinproductlanguageresolvedarrayref); } 805 } 806 807 installer::scriptitems::changing_name_of_language_dependent_keys($filesinproductlanguageresolvedarrayref); 808 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles5.log", $filesinproductlanguageresolvedarrayref); } 809 810 if ( $installer::globals::iswin and $^O =~ /MSWin/i ) { installer::converter::convert_slash_to_backslash($filesinproductlanguageresolvedarrayref); } 811 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles6.log", $filesinproductlanguageresolvedarrayref); } 812 813 $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_non_existent_languages_in_productlists($filesinproductlanguageresolvedarrayref, $languagestringref, "Name", "file"); 814 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles7.log", $filesinproductlanguageresolvedarrayref); } 815 816 installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist($filesinproductlanguageresolvedarrayref, $includepatharrayref_lang, $dirsinproductlanguageresolvedarrayref, "Files"); 817 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles8a.log", $filesinproductlanguageresolvedarrayref); } 818 819 $filesinproductlanguageresolvedarrayref = installer::scriptitems::add_bundled_extension_blobs( $filesinproductlanguageresolvedarrayref); 820 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles8b.log", $filesinproductlanguageresolvedarrayref); } 821 ($filesinproductlanguageresolvedarrayref,$dirsinproductarrayref) = installer::scriptitems::add_bundled_prereg_extensions( 822 $filesinproductlanguageresolvedarrayref, $dirsinproductarrayref); 823 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles8c.log", $filesinproductlanguageresolvedarrayref); } 824 825 installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($filesinproductlanguageresolvedarrayref, $dirsinproductarrayref); 826 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles9.log", $filesinproductlanguageresolvedarrayref); } 827 828 $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_Files_Without_Sourcedirectory($filesinproductlanguageresolvedarrayref); 829 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10.log", $filesinproductlanguageresolvedarrayref); } 830 831 if ($installer::globals::languagepack) 832 { 833 $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_Files_For_Languagepacks($filesinproductlanguageresolvedarrayref); 834 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10c.log", $filesinproductlanguageresolvedarrayref); } 835 } 836 837 838 if ( ! $allvariableshashref->{'NO_README_IN_ROOTDIR'} ) 839 { 840 $filesinproductlanguageresolvedarrayref = installer::scriptitems::add_License_Files_into_Installdir($filesinproductlanguageresolvedarrayref, $dirsinproductlanguageresolvedarrayref, $languagesarrayref); 841 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10b.log", $filesinproductlanguageresolvedarrayref); } 842 } 843 844 $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_onlyasialanguage_files_from_productlists($filesinproductlanguageresolvedarrayref); 845 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10d.log", $filesinproductlanguageresolvedarrayref); } 846 847 $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_onlywesternlanguage_files_from_productlists($filesinproductlanguageresolvedarrayref); 848 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10e.log", $filesinproductlanguageresolvedarrayref); } 849 850 installer::scriptitems::make_filename_language_specific($filesinproductlanguageresolvedarrayref); 851 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10f.log", $filesinproductlanguageresolvedarrayref); } 852 853 ###################################################################################### 854 # Unzipping files with flag ARCHIVE and putting all included files into the file list 855 ###################################################################################### 856 857 $installer::logger::Info->print( "... analyzing files with flag ARCHIVE ...\n" ); 858 859 my @additional_paths_from_zipfiles = (); 860 861 $filesinproductlanguageresolvedarrayref = installer::archivefiles::resolving_archive_flag($filesinproductlanguageresolvedarrayref, \@additional_paths_from_zipfiles, $languagestringref, $loggingdir); 862 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles11.log", $filesinproductlanguageresolvedarrayref); } 863 if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "additional_paths.log" ,\@additional_paths_from_zipfiles); } 864 865 # packed files sometimes contain a "$" in their name: HighlightText$1.class. For epm the "$" has to be quoted by "$$" 866 867 if (!( $installer::globals::iswindowsbuild || $installer::globals::simple ) ) 868 { 869 installer::scriptitems::quoting_illegal_filenames($filesinproductlanguageresolvedarrayref); 870 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles12.log", $filesinproductlanguageresolvedarrayref); } 871 } 872 873 ##################################### 874 # Files with flag SUBST_FILENAME 875 ##################################### 876 877 $installer::logger::Info->print( "... analyzing files with flag SUBST_FILENAME ...\n" ); 878 879 installer::substfilenamefiles::resolving_subst_filename_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, $languagestringref); 880 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles12d.log", $filesinproductlanguageresolvedarrayref); } 881 882 ##################################### 883 # Files with flag SCPZIP_REPLACE 884 ##################################### 885 886 $installer::logger::Info->print( "... analyzing files with flag SCPZIP_REPLACE ...\n" ); 887 888 # Editing files with flag SCPZIP_REPLACE. 889 890 installer::scpzipfiles::resolving_scpzip_replace_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref); 891 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles13.log", $filesinproductlanguageresolvedarrayref); } 892 893 ##################################### 894 # Files with flag PATCH_SO_NAME 895 ##################################### 896 897 $installer::logger::Info->print( "... analyzing files with flag PATCH_SO_NAME ...\n" ); 898 899 # Editing files with flag PATCH_SO_NAME. 900 901 installer::scppatchsoname::resolving_patchsoname_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref); 902 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles13b.log", $filesinproductlanguageresolvedarrayref); } 903 904 ##################################### 905 # Files with flag HIDDEN 906 ##################################### 907 908 $installer::logger::Info->print( "... analyzing files with flag HIDDEN ...\n" ); 909 910 installer::worker::resolving_hidden_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref); 911 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles13c.log", $filesinproductlanguageresolvedarrayref); } 912 913 ############################################ 914 # Collecting directories for epm list file 915 ############################################ 916 917 $installer::logger::Info->print( "... analyzing all directories for this product ...\n" ); 918 919 # There are two ways for a directory to be included into the epm directory list: 920 # 1. Looking for all destination paths in the files array 921 # 2. Looking for directories with CREATE flag in the directory array 922 # Advantage: Many pathes are hidden in zip files, they are not defined in the setup script. 923 # It will be possible, that in the setup script only those directoies have to be defined, 924 # that have a CREATE flag. All other directories are created, if they contain at least one file. 925 926 my ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); 927 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist1.log", $directoriesforepmarrayref); } 928 929 ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash); 930 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist2.log", $directoriesforepmarrayref); } 931 932 # installer::sorter::sorting_array_of_hashes($directoriesforepmarrayref, "HostName"); 933 # if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3.log", $directoriesforepmarrayref); } 934 935 ######################################################### 936 # language dependent scpactions part 937 ######################################################### 938 939 my $scpactionsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($scpactionsinproductarrayref, $languagesarrayref); 940 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions3.log", $scpactionsinproductlanguageresolvedarrayref); } 941 942 installer::scriptitems::changing_name_of_language_dependent_keys($scpactionsinproductlanguageresolvedarrayref); 943 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions4.log", $scpactionsinproductlanguageresolvedarrayref); } 944 945 installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist($scpactionsinproductlanguageresolvedarrayref, $includepatharrayref_lang, $dirsinproductlanguageresolvedarrayref, "ScpActions"); 946 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions5.log", $scpactionsinproductlanguageresolvedarrayref); } 947 948 # Editing scpactions with flag SCPZIP_REPLACE and PATCH_SO_NAME. 949 950 installer::scpzipfiles::resolving_scpzip_replace_flag($scpactionsinproductlanguageresolvedarrayref, $allvariableshashref, "ScpAction", $languagestringref); 951 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6.log", $scpactionsinproductlanguageresolvedarrayref); } 952 953 installer::scppatchsoname::resolving_patchsoname_flag($scpactionsinproductlanguageresolvedarrayref, $allvariableshashref, "ScpAction", $languagestringref); 954 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6a.log", $scpactionsinproductlanguageresolvedarrayref); } 955 956 ######################################################### 957 # language dependent links part 958 ######################################################### 959 960 $installer::logger::Info->print( "... analyzing links ...\n" ); 961 962 my $linksinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($linksinproductarrayref, $languagesarrayref); 963 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks2.log", $linksinproductlanguageresolvedarrayref); } 964 965 installer::scriptitems::changing_name_of_language_dependent_keys($linksinproductlanguageresolvedarrayref); 966 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks3.log", $linksinproductlanguageresolvedarrayref); } 967 968 installer::scriptitems::get_destination_file_path_for_links($linksinproductlanguageresolvedarrayref, $filesinproductlanguageresolvedarrayref); 969 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks4.log", $linksinproductlanguageresolvedarrayref); } 970 971 installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($linksinproductlanguageresolvedarrayref, $dirsinproductarrayref); 972 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks5.log", $linksinproductlanguageresolvedarrayref); } 973 974 # Now taking all links that have no FileID but a ShortcutID, linking to another link 975 976 installer::scriptitems::get_destination_link_path_for_links($linksinproductlanguageresolvedarrayref); 977 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks6.log", $linksinproductlanguageresolvedarrayref); } 978 979 $linksinproductlanguageresolvedarrayref = installer::scriptitems::remove_workstation_only_items($linksinproductlanguageresolvedarrayref); 980 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks7.log", $linksinproductlanguageresolvedarrayref); } 981 982 installer::scriptitems::resolve_links_with_flag_relative($linksinproductlanguageresolvedarrayref); 983 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8.log", $linksinproductlanguageresolvedarrayref); } 984 985 ######################################################### 986 # language dependent unix links part 987 ######################################################### 988 989 $installer::logger::Info->print( "... analyzing unix links ...\n" ); 990 991 my $unixlinksinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($unixlinksinproductarrayref, $languagesarrayref); 992 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks3.log", $unixlinksinproductlanguageresolvedarrayref); } 993 994 installer::scriptitems::changing_name_of_language_dependent_keys($unixlinksinproductlanguageresolvedarrayref); 995 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks4.log", $unixlinksinproductlanguageresolvedarrayref); } 996 997 installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($unixlinksinproductlanguageresolvedarrayref, $dirsinproductarrayref); 998 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks5.log", $unixlinksinproductlanguageresolvedarrayref); } 999 1000 ######################################################### 1001 # language dependent part for profiles and profileitems 1002 ######################################################### 1003 1004 my $profilesinproductlanguageresolvedarrayref; 1005 my $profileitemsinproductlanguageresolvedarrayref; 1006 1007 if ((!($installer::globals::is_copy_only_project)) && (!($installer::globals::product =~ /ada/i )) && (!($installer::globals::languagepack))) 1008 { 1009 $installer::logger::Info->print( "... creating profiles ...\n" ); 1010 1011 $profilesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($profilesinproductarrayref, $languagesarrayref); 1012 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles2.log", $profilesinproductlanguageresolvedarrayref); } 1013 1014 $profileitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($profileitemsinproductarrayref, $languagesarrayref); 1015 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems2.log", $profilesinproductlanguageresolvedarrayref); } 1016 1017 installer::scriptitems::changing_name_of_language_dependent_keys($profilesinproductlanguageresolvedarrayref); 1018 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles3.log", $profilesinproductlanguageresolvedarrayref); } 1019 1020 installer::scriptitems::changing_name_of_language_dependent_keys($profileitemsinproductlanguageresolvedarrayref); 1021 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems3.log", $profileitemsinproductlanguageresolvedarrayref); } 1022 1023 installer::scriptitems::replace_setup_variables($profileitemsinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref); 1024 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems4.log", $profileitemsinproductlanguageresolvedarrayref); } 1025 1026 if ( $installer::globals::patch_user_dir ) 1027 { 1028 installer::scriptitems::replace_userdir_variable($profileitemsinproductlanguageresolvedarrayref); 1029 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems4a.log", $profileitemsinproductlanguageresolvedarrayref); } 1030 } 1031 1032 installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($profilesinproductlanguageresolvedarrayref, $dirsinproductarrayref); 1033 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles4.log", $profilesinproductlanguageresolvedarrayref); } 1034 1035 # Now the Profiles can be created 1036 1037 installer::profiles::create_profiles($profilesinproductlanguageresolvedarrayref, $profileitemsinproductlanguageresolvedarrayref, $filesinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref); 1038 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles15.log", $filesinproductlanguageresolvedarrayref); } 1039 } 1040 1041 my $registryitemsinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )" 1042 my $folderinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )" 1043 my $folderitemsinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )" 1044 1045 if ( $installer::globals::iswindowsbuild ) # Windows specific items: Folder, FolderItem, RegistryItem 1046 { 1047 ######################################################### 1048 # language dependent part for folder 1049 ######################################################### 1050 1051 $installer::logger::Info->print( "... analyzing folder ...\n" ); 1052 1053 $folderinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($folderinproductarrayref, $languagesarrayref); 1054 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder2.log", $folderinproductlanguageresolvedarrayref); } 1055 1056 installer::scriptitems::changing_name_of_language_dependent_keys($folderinproductlanguageresolvedarrayref); 1057 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder3.log", $folderinproductlanguageresolvedarrayref); } 1058 1059 ######################################################### 1060 # language dependent part for folderitems 1061 ######################################################### 1062 1063 $installer::logger::Info->print( "... analyzing folderitems ...\n" ); 1064 1065 $folderitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($folderitemsinproductarrayref, $languagesarrayref); 1066 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems2.log", $folderitemsinproductlanguageresolvedarrayref); } 1067 1068 installer::scriptitems::changing_name_of_language_dependent_keys($folderitemsinproductlanguageresolvedarrayref); 1069 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems3.log", $folderitemsinproductlanguageresolvedarrayref); } 1070 1071 ######################################################### 1072 # language dependent part for registryitems 1073 ######################################################### 1074 1075 $installer::logger::Info->print( "... analyzing registryitems ...\n" ); 1076 1077 $registryitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($registryitemsinproductarrayref, $languagesarrayref); 1078 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems2.log", $registryitemsinproductlanguageresolvedarrayref); } 1079 1080 installer::scriptitems::changing_name_of_language_dependent_keys($registryitemsinproductlanguageresolvedarrayref); 1081 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3.log", $registryitemsinproductlanguageresolvedarrayref); } 1082 } 1083 1084 ######################################################### 1085 # language dependent part for modules 1086 ######################################################### 1087 1088 my $modulesinproductlanguageresolvedarrayref; 1089 1090 if (!($installer::globals::is_copy_only_project)) 1091 { 1092 $installer::logger::Info->print( "... analyzing modules ...\n" ); 1093 1094 $modulesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($modulesinproductarrayref, $languagesarrayref); 1095 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules2.log", $modulesinproductlanguageresolvedarrayref); } 1096 1097 $modulesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_language_modules($modulesinproductlanguageresolvedarrayref, $languagesarrayref); 1098 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules2a.log", $modulesinproductlanguageresolvedarrayref); } 1099 1100 installer::scriptitems::changing_name_of_language_dependent_keys($modulesinproductlanguageresolvedarrayref); 1101 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules3a.log", $modulesinproductlanguageresolvedarrayref); } 1102 1103 # installer::scriptitems::collect_language_specific_names($modulesinproductlanguageresolvedarrayref); 1104 installer::scriptitems::select_required_language_strings($modulesinproductlanguageresolvedarrayref); # using english strings 1105 } 1106 1107 # Copy-only projects can now start to copy all items File and ScpAction 1108 if ( $installer::globals::is_copy_only_project ) { installer::copyproject::copy_project($filesinproductlanguageresolvedarrayref, $scpactionsinproductlanguageresolvedarrayref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref); } 1109 1110 # Language pack projects can now start to select the required information 1111 if ( $installer::globals::languagepack ) 1112 { 1113 $filesinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($filesinproductlanguageresolvedarrayref, $languagesarrayref, "File"); 1114 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16b.log", $filesinproductlanguageresolvedarrayref); } 1115 $scpactionsinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($scpactionsinproductlanguageresolvedarrayref, $languagesarrayref, "ScpAction"); 1116 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6b.log", $scpactionsinproductlanguageresolvedarrayref); } 1117 $linksinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($linksinproductlanguageresolvedarrayref, $languagesarrayref, "Shortcut"); 1118 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8b.log", $linksinproductlanguageresolvedarrayref); } 1119 $unixlinksinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($unixlinksinproductlanguageresolvedarrayref, $languagesarrayref, "Unixlink"); 1120 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks5.log", $unixlinksinproductlanguageresolvedarrayref); } 1121 @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in languagepacks 1122 1123 # Collecting the directories again, to include only the language specific directories 1124 ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); 1125 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3alangpack.log", $directoriesforepmarrayref); } 1126 ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash); 1127 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3blangpack.log", $directoriesforepmarrayref); } 1128 installer::sorter::sorting_array_of_hashes($directoriesforepmarrayref, "HostName"); 1129 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3clangpack.log", $directoriesforepmarrayref); } 1130 1131 if ( $installer::globals::iswindowsbuild ) 1132 { 1133 $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_langpack_items($registryitemsinproductlanguageresolvedarrayref, "RegistryItem"); 1134 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3aa.log", $registryitemsinproductlanguageresolvedarrayref); } 1135 } 1136 1137 } 1138 1139 # Collecting all files without flag PATCH (for maintenance reasons) 1140 if ( $installer::globals::patch ) { installer::worker::collect_all_files_without_patch_flag($filesinproductlanguageresolvedarrayref); } 1141 1142 # Patch projects can now start to select the required information 1143 if (( $installer::globals::patch ) && (( $installer::globals::issolarispkgbuild ) || ( $installer::globals::iswindowsbuild ))) 1144 { 1145 $filesinproductlanguageresolvedarrayref = installer::worker::select_patch_items($filesinproductlanguageresolvedarrayref, "File"); 1146 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16patch.log", $filesinproductlanguageresolvedarrayref); } 1147 $scpactionsinproductlanguageresolvedarrayref = installer::worker::select_patch_items($scpactionsinproductlanguageresolvedarrayref, "ScpAction"); 1148 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6patch.log", $scpactionsinproductlanguageresolvedarrayref); } 1149 $linksinproductlanguageresolvedarrayref = installer::worker::select_patch_items($linksinproductlanguageresolvedarrayref, "Shortcut"); 1150 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8patch.log", $linksinproductlanguageresolvedarrayref); } 1151 $unixlinksinproductlanguageresolvedarrayref = installer::worker::select_patch_items($unixlinksinproductlanguageresolvedarrayref, "Unixlink"); 1152 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks6patch.log", $unixlinksinproductlanguageresolvedarrayref); } 1153 $folderitemsinproductlanguageresolvedarrayref = installer::worker::select_patch_items($folderitemsinproductlanguageresolvedarrayref, "FolderItem"); 1154 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfolderitems1patch.log", $folderitemsinproductlanguageresolvedarrayref); } 1155 # @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in languagepacks 1156 1157 if ( $installer::globals::iswindowsbuild ) 1158 { 1159 $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_patch_items_without_name($registryitemsinproductlanguageresolvedarrayref, "RegistryItem"); 1160 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3a.log", $registryitemsinproductlanguageresolvedarrayref); } 1161 1162 installer::worker::prepare_windows_patchfiles($filesinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref); 1163 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16bpatch.log", $filesinproductlanguageresolvedarrayref); } 1164 1165 # For Windows patches, the directories can now be collected again 1166 ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); 1167 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist4_patch.log", $directoriesforepmarrayref); } 1168 1169 installer::sorter::sorting_array_of_hashes($directoriesforepmarrayref, "HostName"); 1170 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist5_patch.log", $directoriesforepmarrayref); } 1171 } 1172 } 1173 1174 ######################################################### 1175 # Collecting all scp actions 1176 ######################################################### 1177 1178 installer::worker::collect_scpactions($scpactionsinproductlanguageresolvedarrayref); 1179 1180 ######################################################### 1181 # creating inf files for user system integration 1182 ######################################################### 1183 1184 if (( $installer::globals::iswindowsbuild ) && ( ! $installer::globals::patch )) # Windows specific items: Folder, FolderItem, RegistryItem 1185 { 1186 $installer::logger::Info->print( "... creating inf files ...\n" ); 1187 installer::worker::create_inf_file($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $folderinproductlanguageresolvedarrayref, $folderitemsinproductlanguageresolvedarrayref, $modulesinproductlanguageresolvedarrayref, $languagesarrayref, $languagestringref, $allvariableshashref); 1188 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16c.log", $filesinproductlanguageresolvedarrayref); } 1189 } 1190 1191 ########################################### 1192 # Using upx, to decrease file size 1193 # Currently only for Windows. 1194 ########################################### 1195 1196 if ( $allvariableshashref->{'UPXPRODUCT'} ) 1197 { 1198 installer::upx::upx_on_libraries($filesinproductlanguageresolvedarrayref, $languagestringref); 1199 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16d.log", $filesinproductlanguageresolvedarrayref); } 1200 } 1201 1202 ########################################################### 1203 # Simple package projects can now start to create the 1204 # installation structure by creating Directories, Files 1205 # Links and ScpActions. This is the last platform 1206 # independent part. 1207 ########################################################### 1208 1209 if ( $installer::globals::is_simple_packager_project ) 1210 { 1211 installer::simplepackage::create_simple_package($filesinproductlanguageresolvedarrayref, $directoriesforepmarrayref, $scpactionsinproductlanguageresolvedarrayref, $linksinproductlanguageresolvedarrayref, $unixlinksinproductlanguageresolvedarrayref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariableshashref, $includepatharrayref); 1212 next; # ! leaving the current loop, because no further packaging required. 1213 } 1214 1215 ########################################################### 1216 # Analyzing the package structure 1217 ########################################################### 1218 1219 $installer::logger::Info->print( "... analyzing package list ...\n" ); 1220 1221 my $packages = installer::packagelist::collectpackages($modulesinproductlanguageresolvedarrayref, $languagesarrayref); 1222 installer::packagelist::check_packagelist($packages); 1223 1224 $packages = installer::packagelist::analyze_list($packages, $modulesinproductlanguageresolvedarrayref); 1225 installer::packagelist::remove_multiple_modules_packages($packages); 1226 1227 # printing packages content: 1228 installer::packagelist::log_packages_content($packages); 1229 installer::packagelist::create_module_destination_hash($packages, $allvariableshashref); 1230 1231 if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 1b: The language dependent part\n"); } 1232 1233 # saving debug info, before starting part 2 1234 if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } 1235 1236 ################################################# 1237 # Part 2: The platform dependent part 1238 ################################################# 1239 1240 if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 2: The platform dependent part\n"); } 1241 1242 ################################################# 1243 # Part 2a: All non-Windows platforms 1244 ################################################# 1245 1246 if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 2a: All non-Windows platforms\n"); } 1247 1248 ######################################################### 1249 # ... creating epm list file ... 1250 # Only for non-Windows platforms 1251 ######################################################### 1252 1253 if (!( $installer::globals::iswindowsbuild )) 1254 { 1255 #################################################### 1256 # Creating directories 1257 #################################################### 1258 1259 $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); 1260 1261 my $listfiledir = installer::systemactions::create_directories("listfile", $languagestringref); 1262 my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log"); 1263 1264 #################################################### 1265 # Reading for Solaris all package descriptions 1266 # from file defined in property PACKAGEMAP 1267 #################################################### 1268 1269 if ( $installer::globals::issolarisbuild ) { installer::epmfile::read_packagemap($allvariableshashref, $includepatharrayref, $languagesarrayref); } 1270 1271 my $epmexecutable = ""; 1272 my $found_epm = 0; 1273 1274 # shuffle array to reduce parallel packaging process in pool 1275 installer::worker::shuffle_array($packages); 1276 1277 # iterating over all packages 1278 for ( my $k = 0; $k <= $#{$packages}; $k++ ) 1279 { 1280 my $onepackage = ${$packages}[$k]; 1281 1282 # checking, if this is a language pack or a project pack. 1283 # Creating language packs only, if $installer::globals::languagepack is set. Parameter: -languagepack 1284 1285 if ( $installer::globals::languagepack ) { installer::languagepack::replace_languagestring_variable($onepackage, $languagestringref); } 1286 1287 my $onepackagename = $onepackage->{'module'}; # name of the top module (required) 1288 1289 my $shellscriptsfilename = ""; 1290 if ( $onepackage->{'script'} ) { $shellscriptsfilename = $onepackage->{'script'}; } 1291 # no scripts for Solaris patches! 1292 if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild )) { $shellscriptsfilename = ""; } 1293 1294 ########################### 1295 # package name 1296 ########################### 1297 1298 my $packagename = ""; 1299 1300 if ( $installer::globals::issolarisbuild ) # only for Solaris 1301 { 1302 if ( $onepackage->{'solarispackagename'} ) { $packagename = $onepackage->{'solarispackagename'}; } 1303 } 1304 else # not Solaris 1305 { 1306 if ( $onepackage->{'packagename'} ) { $packagename = $onepackage->{'packagename'}; } 1307 } 1308 1309 if (!($packagename eq "")) 1310 { 1311 installer::packagelist::resolve_packagevariables(\$packagename, $allvariableshashref, 0); 1312 } 1313 1314 # Debian allows no underline in package name 1315 if ( $installer::globals::debian ) { $packagename =~ s/_/-/g; } 1316 1317 # Debian allows no underline in package name 1318 if ( $installer::globals::debian ) { $packagename =~ s/_/-/g; } 1319 1320 my $linkaddon = ""; 1321 my $linkpackage = 0; 1322 $installer::globals::add_required_package = ""; 1323 $installer::globals::linuxlinkrpmprocess = 0; 1324 1325 if ( $installer::globals::makelinuxlinkrpm ) 1326 { 1327 my $oldpackagename = $packagename; 1328 $installer::globals::add_required_package = $oldpackagename; # the link rpm requires the non-linked version 1329 if ( $installer::globals::languagepack ) { $packagename = $packagename . "_u"; } 1330 else { $packagename = $packagename . "u"; } 1331 my $savestring = $oldpackagename . "\t" . $packagename; 1332 push(@installer::globals::linkrpms, $savestring); 1333 $linkaddon = "_links"; 1334 $installer::globals::linuxlinkrpmprocess = 1; 1335 $linkpackage = 1; 1336 } 1337 1338 #################################################### 1339 # Header for this package into log file 1340 #################################################### 1341 1342 installer::logger::include_header_into_logfile("Creating package: $packagename ($k)"); 1343 1344 #################################################### 1345 # Pool check: If package is created at the moment 1346 # try it again later. 1347 #################################################### 1348 1349 if (( $installer::globals::patch ) || 1350 ( $installer::globals::languagepack ) || 1351 ( $installer::globals::packageformat eq "native" ) || 1352 ( $installer::globals::packageformat eq "portable" ) || 1353 ( $installer::globals::packageformat eq "osx" )) { $allvariableshashref->{'POOLPRODUCT'} = 0; } 1354 1355 if ( $allvariableshashref->{'POOLPRODUCT'} ) 1356 { 1357 if ( ! $installer::globals::sessionidset ) { installer::packagepool::set_sessionid(); } 1358 if ( ! $installer::globals::poolpathset ) { installer::packagepool::set_pool_path(); } 1359 if (( ! $installer::globals::getuidpathset ) && ( $installer::globals::issolarisbuild )) { installer::worker::set_getuid_path($includepatharrayref); } 1360 1361 my $package_is_creatable = installer::packagepool::check_package_availability($packagename); 1362 1363 if (( ! $package_is_creatable ) && ( ! exists($installer::globals::poolshiftedpackages{$packagename}) )) 1364 { 1365 splice(@{$packages}, $k, 1); # removing package ... 1366 push(@{$packages}, $onepackage); # ... and adding it to the end 1367 $installer::globals::poolshiftedpackages{$packagename} = 1; # only shifting each package once 1368 $k--; # decreasing the counter 1369 $installer::logger::Info->printf("Pool: Package \"%s\" cannot be created at the moment. Trying again later (1).\n", $packagename); 1370 $installer::logger::Lang->printf("Pool: Package \"%s\" cannot be created at the moment. Trying again later (1).\n", $packagename); 1371 next; # repeating this iteration with new package 1372 } 1373 } 1374 1375 ########################################### 1376 # Root path, can be defined as parameter 1377 ########################################### 1378 1379 my $packagerootpath = ""; 1380 1381 if ($installer::globals::rootpath eq "") 1382 { 1383 $packagerootpath = $onepackage->{'destpath'}; 1384 installer::packagelist::resolve_packagevariables(\$packagerootpath, $allvariableshashref, 1); 1385 if ( $^O =~ /darwin/i ) { $packagerootpath =~ s/\/opt\//\/Applications\//; } 1386 } 1387 else 1388 { 1389 $packagerootpath = $installer::globals::rootpath; 1390 } 1391 1392 ############################################# 1393 # copying the collectors for each package 1394 ############################################# 1395 1396 my $filesinpackage = installer::converter::copy_collector($filesinproductlanguageresolvedarrayref); 1397 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files1_" . $packagename . ".log", $filesinpackage); } 1398 my $linksinpackage = installer::converter::copy_collector($linksinproductlanguageresolvedarrayref); 1399 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links1_" . $packagename . ".log", $linksinpackage); } 1400 my $unixlinksinpackage = installer::converter::copy_collector($unixlinksinproductlanguageresolvedarrayref); 1401 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks1_" . $packagename . ".log", $unixlinksinpackage); } 1402 my $dirsinpackage = installer::converter::copy_collector($directoriesforepmarrayref); 1403 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs1_" . $packagename . ".log", $dirsinpackage); } 1404 1405 ########################################### 1406 # setting the root path for the packages 1407 ########################################### 1408 1409 installer::scriptitems::add_rootpath_to_directories($dirsinpackage, $packagerootpath); 1410 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs2_" . $packagename . ".log", $dirsinpackage); } 1411 installer::scriptitems::add_rootpath_to_files($filesinpackage, $packagerootpath); 1412 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files2_" . $packagename . ".log", $filesinpackage); } 1413 installer::scriptitems::add_rootpath_to_links($linksinpackage, $packagerootpath); 1414 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links2_" . $packagename . ".log", $linksinpackage); } 1415 installer::scriptitems::add_rootpath_to_files($unixlinksinpackage, $packagerootpath); 1416 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks2_" . $packagename . ".log", $unixlinksinpackage); } 1417 1418 ################################# 1419 # collecting items for package 1420 ################################# 1421 1422 $filesinpackage = installer::packagelist::find_files_for_package($filesinpackage, $onepackage); 1423 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files3_" . $packagename . ".log", $filesinpackage); } 1424 $unixlinksinpackage = installer::packagelist::find_files_for_package($unixlinksinpackage, $onepackage); 1425 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks3_" . $packagename . ".log", $unixlinksinpackage); } 1426 $linksinpackage = installer::packagelist::find_links_for_package($linksinpackage, $filesinpackage); 1427 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links3_" . $packagename . ".log", $linksinpackage); } 1428 $dirsinpackage = installer::packagelist::find_dirs_for_package($dirsinpackage, $onepackage); 1429 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs3_" . $packagename . ".log", $dirsinpackage); } 1430 1431 ############################################### 1432 # nothing to do, if $filesinpackage is empty 1433 ############################################### 1434 1435 if ( ! ( $#{$filesinpackage} > -1 )) 1436 { 1437 push(@installer::globals::emptypackages, $packagename); 1438 $installer::logger::Lang->print("\n"); 1439 $installer::logger::Lang->print("\n"); 1440 $installer::logger::Lang->print("No file in package: %s \-\> Skipping\n\n", $packagename); 1441 next; # next package, end of loop ! 1442 } 1443 1444 ################################################################# 1445 # nothing to do for Linux patches, if no file has flag PATCH 1446 ################################################################# 1447 1448 # Linux Patch: The complete RPM has to be built, if one file in the RPM has the flag PATCH (also for DEBs) 1449 if (( $installer::globals::patch ) && (( $installer::globals::islinuxrpmbuild ) || ( $installer::globals::islinuxdebbuild ))) 1450 { 1451 my $patchfiles = installer::worker::collect_all_items_with_special_flag($filesinpackage ,"PATCH"); 1452 if ( ! ( $#{$patchfiles} > -1 )) 1453 { 1454 $installer::logger::Lang->print("\n"); 1455 $installer::logger::Lang->print("\n"); 1456 $installer::logger::Lang->print("Linux Patch: No patch file in package: %s \-\> Skipping\n\n", 1457 $packagename); 1458 next; 1459 } 1460 } 1461 1462 ########################################### 1463 # Stripping libraries 1464 ########################################### 1465 1466 # Building for non Windows platforms in cws requires, that all files are stripped before packaging: 1467 # 1. copy all files that need to be stripped locally 1468 # 2. strip all these files 1469 1470 if ( $installer::globals::strip ) 1471 { 1472 installer::strip::strip_libraries($filesinpackage, $languagestringref); 1473 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . $packagename ."_files.log", $filesinpackage); } 1474 } 1475 1476 ############################################################### 1477 # Searching for files in $filesinpackage with flag LINUXLINK 1478 ############################################################### 1479 1480 if (( $installer::globals::islinuxbuild ) && ( ! $installer::globals::simple )) # for rpms and debian packages 1481 { 1482 # special handling for all RPMs in $installer::globals::linuxlinkrpms 1483 1484 # if (( $installer::globals::linuxlinkrpms =~ /\b$onepackagename\b/ ) || ( $installer::globals::languagepack )) 1485 if ( $installer::globals::linuxlinkrpms =~ /\b$onepackagename\b/ ) 1486 { 1487 my $run = 0; 1488 1489 if (( $installer::globals::makelinuxlinkrpm ) && ( ! $run )) 1490 { 1491 $filesinpackage = \@installer::globals::linuxpatchfiles; 1492 $linksinpackage = \@installer::globals::linuxlinks; 1493 $installer::globals::makelinuxlinkrpm = 0; 1494 if ( $installer::globals::patch ) { $installer::globals::call_epm = 1; } # enabling packing again 1495 $run = 1; 1496 1497 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files3b_" . $packagename . ".log", $filesinpackage); } 1498 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links3b_" . $packagename . ".log", $linksinpackage); } 1499 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs3b_" . $packagename . ".log", $dirsinpackage); } 1500 } 1501 1502 if (( ! $installer::globals::makelinuxlinkrpm ) && ( ! $run )) 1503 { 1504 $filesinpackage = installer::worker::prepare_linuxlinkfiles($filesinpackage); 1505 $linksinpackage = installer::worker::prepare_forced_linuxlinkfiles($linksinpackage); 1506 $installer::globals::makelinuxlinkrpm = 1; 1507 if ( $allvariableshashref->{'OPENSOURCE'} ) { $installer::globals::add_required_package = $packagename . "u"; } 1508 if ( $installer::globals::patch ) { $installer::globals::call_epm = 0; } # no packing of core module in patch 1509 $shellscriptsfilename = ""; # shell scripts only need to be included into the link rpm 1510 $run = 1; 1511 1512 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files3a_" . $packagename . ".log", $filesinpackage); } 1513 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links3a_" . $packagename . ".log", $linksinpackage); } 1514 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs3a_" . $packagename . ".log", $dirsinpackage); } 1515 } 1516 } 1517 } 1518 1519 ########################################### 1520 # Simple installation mechanism 1521 ########################################### 1522 1523 if ( $installer::globals::simple ) { installer::worker::install_simple($onepackagename, $$languagestringref, $dirsinpackage, $filesinpackage, $linksinpackage, $unixlinksinpackage); } 1524 1525 ########################################### 1526 # Checking epm state 1527 ########################################### 1528 1529 if (( $installer::globals::call_epm ) && ( ! $found_epm )) 1530 { 1531 $epmexecutable = installer::epmfile::find_epm_on_system($includepatharrayref); 1532 installer::epmfile::set_patch_state($epmexecutable); # setting $installer::globals::is_special_epm 1533 $found_epm = 1; # searching only once 1534 } 1535 1536 ########################################### 1537 # Creating epm list file 1538 ########################################### 1539 1540 if ( ! $installer::globals::simple ) 1541 { 1542 # epm list file format: 1543 # type mode owner group destination source options 1544 # Example for a file: f 755 root sys /usr/bin/foo foo 1545 # Example for a directory: d 755 root sys /var/spool/foo - 1546 # Example for a link: l 000 root sys /usr/bin/linkname filename 1547 # The source field specifies the file to link to 1548 1549 my $epmfilename = "epm_" . $onepackagename . $linkaddon . ".lst"; 1550 1551 $installer::logger::Info->print( "... creating epm list file $epmfilename ... \n" ); 1552 1553 my $completeepmfilename = $listfiledir . $installer::globals::separator . $epmfilename; 1554 1555 my @epmfile = (); 1556 1557 my $epmheaderref = installer::epmfile::create_epm_header($allvariableshashref, $filesinproductlanguageresolvedarrayref, $languagesarrayref, $onepackage); 1558 installer::epmfile::adding_header_to_epm_file(\@epmfile, $epmheaderref); 1559 1560 if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild )) 1561 { 1562 $filesinpackage = installer::worker::analyze_patch_files($filesinpackage); 1563 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files4_" . $packagename . ".log", $filesinpackage); } 1564 1565 if ( ! ( $#{$filesinpackage} > -1 )) 1566 { 1567 push(@installer::globals::emptypackages, $packagename); 1568 $installer::logger::Lang->print("\n"); 1569 $installer::logger::Lang->print("No file in package: %s \-\> Skipping\n", $packagename); 1570 next; # next package, end of loop ! 1571 } 1572 } 1573 1574 # adding directories, files and links into epm file 1575 1576 installer::epmfile::put_directories_into_epmfile($dirsinpackage, \@epmfile, $allvariableshashref, $packagerootpath); 1577 installer::epmfile::put_files_into_epmfile($filesinpackage, \@epmfile ); 1578 installer::epmfile::put_links_into_epmfile($linksinpackage, \@epmfile ); 1579 installer::epmfile::put_unixlinks_into_epmfile($unixlinksinpackage, \@epmfile ); 1580 1581 if ((!( $shellscriptsfilename eq "" )) && (!($installer::globals::iswindowsbuild))) { installer::epmfile::adding_shellscripts_to_epm_file(\@epmfile, $shellscriptsfilename, $packagerootpath, $allvariableshashref, $filesinpackage); } 1582 1583 installer::files::save_file($completeepmfilename ,\@epmfile); 1584 1585 # ... splitting the rootpath into a relocatable part and a static part, if possible 1586 1587 my $staticpath = ""; 1588 my $relocatablepath = ""; 1589 # relocatable path can be defined in package list 1590 if ( $onepackage->{'relocatablepath'} ) { $relocatablepath = $onepackage->{'relocatablepath'}; } 1591 # setting fix part and variable part of destination path 1592 installer::epmfile::analyze_rootpath($packagerootpath, \$staticpath, \$relocatablepath, $allvariableshashref); 1593 1594 # ... replacing the variable PRODUCTDIRECTORYNAME in the shellscriptfile by $staticpath 1595 1596 installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "PRODUCTDIRECTORYNAME", $staticpath); 1597 installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "SOLSUREPACKAGEPREFIX", $allvariableshashref->{'SOLSUREPACKAGEPREFIX'}); 1598 installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "UREPACKAGEPREFIX", $allvariableshashref->{'UREPACKAGEPREFIX'}); 1599 # installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "BASISDIRECTORYVERSION", $allvariableshashref->{'OOOBASEVERSION'}); 1600 installer::files::save_file($completeepmfilename ,\@epmfile); 1601 1602 ####################################################### 1603 # Now the complete content of the package is known, 1604 # including variables and shell scripts. 1605 # Create the package or using the package pool? 1606 ####################################################### 1607 1608 my $use_package_from_pool = 0; 1609 if ( $allvariableshashref->{'POOLPRODUCT'} ) { $use_package_from_pool = installer::packagepool::package_is_up_to_date($allvariableshashref, $onepackage, $packagename, \@epmfile, $filesinpackage, $installdir, $installer::globals::epmoutpath, $languagestringref); } 1610 1611 if ( $use_package_from_pool == 3 ) # repeat this package later 1612 { 1613 my $package_is_creatable = installer::packagepool::check_package_availability($packagename); 1614 1615 if (( ! $package_is_creatable ) && ( ! exists($installer::globals::poolshiftedpackages{$packagename}) )) 1616 { 1617 splice(@{$packages}, $k, 1); # removing package ... 1618 push(@{$packages}, $onepackage); # ... and adding it to the end 1619 $installer::globals::poolshiftedpackages{$packagename} = 1; # only shifting each package once 1620 $k--; # decreasing the counter 1621 $installer::logger::Info->print("\n"); 1622 $installer::logger::Info->print("Pool: Package \"%s\" cannot be created at the moment. Trying again later (2).\n", $packagename); 1623 $installer::logger::Lang->print("\n"); 1624 $installer::logger::Lang->print("Pool: Package \"%s\" cannot be created at the moment. Trying again later (2).\n", $packagename); 1625 next; # repeating this iteration with new package 1626 } 1627 } 1628 1629 if ( $use_package_from_pool == 4 ) # There was a problem with pooling. Repeat this package immediately. 1630 { 1631 $k--; # decreasing the counter 1632 $installer::logger::Info->print("\n"); 1633 $installer::logger::Info->print("Pool: Package \"%s\" had pooling problems. Repeating packaging immediately (3).\n", $packagename); 1634 $installer::logger::Lang->print("\n"); 1635 $installer::logger::Lang->print("Pool: Package \"%s\" had pooling problems. Repeating packaging immediately (3).\n", $packagename); 1636 next; # repeating this iteration 1637 } 1638 1639 if ( $use_package_from_pool == 0 ) 1640 { 1641 # changing into the "install" directory to create installation sets 1642 1643 $currentdir = cwd(); # $currentdir is global in this file 1644 1645 chdir($installdir); # changing into install directory ($installdir is global in this file) 1646 1647 ########################################### 1648 # Starting epm 1649 ########################################### 1650 1651 # With a patched epm, it is now possible to set the relocatable directory, change 1652 # the directory in which the packages are created, setting "requires" and "provides" 1653 # (Linux) or creating the "depend" file (Solaris) and finally to begin 1654 # the packaging process with standard tooling and standard parameter 1655 # Linux: Adding into the spec file: Prefix: /opt 1656 # Solaris: Adding into the pkginfo file: BASEDIR=/opt 1657 # Attention: Changing of the path can influence the shell scripts 1658 1659 if (( $installer::globals::is_special_epm ) && ( ($installer::globals::islinuxrpmbuild) || ($installer::globals::issolarispkgbuild) )) # special handling only for Linux RPMs and Solaris Packages 1660 { 1661 if ( $installer::globals::call_epm ) # only do something, if epm is really executed 1662 { 1663 # ... now epm can be started, to create the installation sets 1664 1665 $installer::logger::Info->print( "... starting patched epm ... \n" ); 1666 1667 installer::epmfile::call_epm($epmexecutable, $completeepmfilename, $packagename, $includepatharrayref); 1668 1669 my $newepmdir = installer::epmfile::prepare_packages($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $allvariableshashref, $filesinpackage, $languagestringref); # adding the line for Prefix / Basedir, include rpmdir 1670 1671 installer::epmfile::create_packages_without_epm($newepmdir, $packagename, $includepatharrayref, $allvariableshashref, $languagestringref); # start to package 1672 1673 # finally removing all temporary files 1674 1675 installer::epmfile::remove_temporary_epm_files($newepmdir, $loggingdir, $packagename); 1676 1677 # Installation: 1678 # Install: pkgadd -a myAdminfile -d ./SUNWso8m34.pkg 1679 # Install: rpm -i --prefix=/opt/special --nodeps so8m35.rpm 1680 1681 installer::epmfile::create_new_directory_structure($newepmdir); 1682 $installer::globals::postprocess_specialepm = 1; 1683 1684 # solaris patch not needed anymore 1685 # if (( $installer::globals::patch ) && ( $installer::globals::issolarisx86build )) { installer::worker::fix2_solaris_x86_patch($packagename, $installer::globals::epmoutpath); } 1686 } 1687 } 1688 else # this is the standard epm (not relocatable) or ( nonlinux and nonsolaris ) 1689 { 1690 installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "\$\$PRODUCTINSTALLLOCATION", $relocatablepath); 1691 installer::files::save_file($completeepmfilename ,\@epmfile); # Warning for pool, content of epm file is changed. 1692 1693 if ( $installer::globals::call_epm ) 1694 { 1695 # ... now epm can be started, to create the installation sets 1696 1697 $installer::logger::Info->print( "... starting unpatched epm ... \n" ); 1698 1699 if ( $installer::globals::call_epm ) { installer::epmfile::call_epm($epmexecutable, $completeepmfilename, $packagename, $includepatharrayref); } 1700 1701 if (($installer::globals::islinuxrpmbuild) || ($installer::globals::issolarispkgbuild) || ($installer::globals::debian)) 1702 { 1703 $installer::globals::postprocess_standardepm = 1; 1704 } 1705 } 1706 } 1707 1708 if ( $allvariableshashref->{'POOLPRODUCT'} ) { installer::packagepool::put_content_into_pool($packagename, $installdir, $installer::globals::epmoutpath, $filesinpackage, \@epmfile); } 1709 1710 chdir($currentdir); # changing back into start directory 1711 1712 } # end of "if ( ! $use_package_from_pool ) 1713 1714 } # end of "if ( ! $installer::globals::simple ) 1715 1716 ########################################### 1717 # xpd installation mechanism 1718 ########################################### 1719 1720 # Creating the xpd file for the package. This has to happen always, not determined by $use_package_from_pool 1721 1722 if ( $installer::globals::isxpdplatform ) 1723 { 1724 if (( ! $installer::globals::languagepack ) && ( ! $installer::globals::patch )) 1725 { 1726 if (( $allvariableshashref->{'XPDINSTALLER'} ) && ( $installer::globals::call_epm != 0 )) 1727 { 1728 installer::xpdinstaller::create_xpd_file($onepackage, $packages, $languagestringref, $allvariableshashref, $modulesinproductarrayref, $installdir, $installer::globals::epmoutpath, $linkpackage, \%installer::globals::xpdpackageinfo); 1729 $installer::globals::xpd_files_prepared = 1; 1730 %installer::globals::xpdpackageinfo = (); 1731 } 1732 } 1733 } 1734 1735 if ( $installer::globals::makelinuxlinkrpm ) { $k--; } # decreasing the counter to create the link rpm! 1736 1737 } # end of "for ( my $k = 0; $k <= $#{$packages}; $k++ )" 1738 1739 installer::packagepool::log_pool_statistics(); 1740 1741 ############################################################## 1742 # Post epm functionality, after the last package is packed 1743 ############################################################## 1744 1745 if ( $installer::globals::postprocess_specialepm ) 1746 { 1747 installer::logger::include_header_into_logfile("Post EPM processes (Patched EPM):"); 1748 1749 chdir($installdir); 1750 1751 # Copying the cde, kde and gnome packages into the installation set 1752 if ( $installer::globals::addsystemintegration ) { installer::epmfile::put_systemintegration_into_installset($installer::globals::epmoutpath, $includepatharrayref, $allvariableshashref, $modulesinproductarrayref); } 1753 1754 # Adding license and readme into installation set 1755 # if ($installer::globals::addlicensefile) { installer::epmfile::put_installsetfiles_into_installset($installer::globals::epmoutpath); } 1756 if ($installer::globals::addlicensefile) { installer::worker::put_scpactions_into_installset("."); } 1757 1758 # Adding child projects to installation dynamically 1759 if ($installer::globals::addchildprojects) { installer::epmfile::put_childprojects_into_installset($installer::globals::epmoutpath, $allvariableshashref, $modulesinproductarrayref, $includepatharrayref); } 1760 1761 # Adding license file into setup 1762 if ( $allvariableshashref->{'PUT_LICENSE_INTO_SETUP'} ) { installer::worker::put_license_into_setup(".", $includepatharrayref); } 1763 1764 # Creating installation set for Unix language packs, that are not part of multi lingual installation sets 1765 if ( ( $installer::globals::languagepack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::languagepack::build_installer_for_languagepack($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); } 1766 1767 # Finalizing patch installation sets 1768 if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild )) { installer::epmfile::finalize_patch($installer::globals::epmoutpath, $allvariableshashref); } 1769 if (( $installer::globals::patch ) && ( $installer::globals::islinuxrpmbuild )) { installer::epmfile::finalize_linux_patch($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref); } 1770 1771 # Copying the xpd installer into the installation set 1772 if (( $allvariableshashref->{'XPDINSTALLER'} ) && ( $installer::globals::isxpdplatform ) && ( $installer::globals::xpd_files_prepared )) 1773 { 1774 installer::xpdinstaller::create_xpd_installer($installdir, $allvariableshashref, $languagestringref); 1775 $installer::globals::addjavainstaller = 0; # only one java installer possible 1776 } 1777 1778 # Copying the java installer into the installation set 1779 chdir($currentdir); # changing back into start directory 1780 if ( $installer::globals::addjavainstaller ) { installer::javainstaller::create_java_installer($installdir, $installer::globals::epmoutpath, $languagestringref, $languagesarrayref, $allvariableshashref, $includepatharrayref, $modulesinproductarrayref); } 1781 } 1782 1783 if ( $installer::globals::postprocess_standardepm ) 1784 { 1785 installer::logger::include_header_into_logfile("Post EPM processes (Standard EPM):"); 1786 1787 chdir($installdir); 1788 1789 # determine the destination directory 1790 my $newepmdir = installer::epmfile::determine_installdir_ooo(); 1791 1792 # Copying the cde, kde and gnome packages into the installation set 1793 if ( $installer::globals::addsystemintegration ) { installer::epmfile::put_systemintegration_into_installset($newepmdir, $includepatharrayref, $allvariableshashref, $modulesinproductarrayref); } 1794 1795 # Adding license and readme into installation set 1796 # if ($installer::globals::addlicensefile) { installer::epmfile::put_installsetfiles_into_installset($newepmdir); } 1797 if ($installer::globals::addlicensefile) { installer::worker::put_scpactions_into_installset("."); } 1798 1799 # Adding license file into setup 1800 if ( $allvariableshashref->{'PUT_LICENSE_INTO_SETUP'} ) { installer::worker::put_license_into_setup(".", $includepatharrayref); } 1801 1802 # Creating installation set for Unix language packs, that are not part of multi lingual installation sets 1803 if ( ( $installer::globals::languagepack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::languagepack::build_installer_for_languagepack($newepmdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); } 1804 1805 chdir($currentdir); # changing back into start directory 1806 } 1807 1808 if (( $installer::globals::issolarispkgbuild ) && ( $allvariableshashref->{'COLLECT_PKGMAP'} )) { installer::worker::collectpackagemaps($installdir, $languagestringref, $allvariableshashref); } 1809 1810 ####################################################### 1811 # Analyzing the log file 1812 ####################################################### 1813 1814 my $is_success = 0; 1815 my $finalinstalldir = ""; 1816 1817 installer::worker::clean_output_tree(); # removing directories created in the output tree 1818 ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 1819 my $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname"); 1820 if ( $is_success ) { installer::followme::save_followme_info($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref, $current_install_number, $loggingdir, $installlogdir); } 1821 1822 ####################################################### 1823 # Creating download installation set 1824 ####################################################### 1825 1826 if ( $installer::globals::makedownload ) 1827 { 1828 my $create_download = 0; 1829 if ( $$downloadname ne "" ) { $create_download = 1; } 1830 if (( $is_success ) && ( $create_download ) && ( $ENV{'ENABLE_DOWNLOADSETS'} )) 1831 { 1832 my $downloaddir = installer::download::create_download_sets($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref); 1833 installer::worker::analyze_and_save_logfile($loggingdir, $downloaddir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 1834 } 1835 } 1836 1837 ####################################################### 1838 # Creating jds installation set 1839 ####################################################### 1840 1841 if ( $installer::globals::makejds ) 1842 { 1843 my $create_jds = 0; 1844 1845 if ( $allvariableshashref->{'JDSBUILD'} ) { $create_jds = 1; } 1846 if (! $installer::globals::issolarispkgbuild ) { $create_jds = 0; } 1847 1848 if (( $is_success ) && ( $create_jds )) 1849 { 1850 if ( ! $installer::globals::jds_language_controlled ) 1851 { 1852 my $correct_language = installer::worker::check_jds_language($allvariableshashref, $languagestringref); 1853 $installer::globals::correct_jds_language = $correct_language; 1854 $installer::globals::jds_language_controlled = 1; 1855 } 1856 1857 if ( $installer::globals::correct_jds_language ) 1858 { 1859 my $jdsdir = installer::worker::create_jds_sets($finalinstalldir, $allvariableshashref, $languagestringref, $languagesarrayref, $includepatharrayref); 1860 installer::worker::clean_jds_temp_dirs(); 1861 installer::worker::analyze_and_save_logfile($loggingdir, $jdsdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 1862 } 1863 } 1864 } 1865 1866 } # end of "if (!( $installer::globals::iswindowsbuild ))" 1867 1868 if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 2a: All non-Windows platforms\n"); } 1869 1870 ################################################# 1871 # Part 2b: The Windows platform 1872 ################################################# 1873 1874 if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 2b: The Windows platform\n"); } 1875 1876 ##################################################################### 1877 # ... creating idt files ... 1878 # Only for Windows builds ($installer::globals::compiler is wntmsci) 1879 ##################################################################### 1880 1881 if ( $installer::globals::iswindowsbuild ) 1882 { 1883 ########################################### 1884 # Stripping libraries 1885 ########################################### 1886 1887 # Building for gcc build in cws requires, that all files are stripped before packaging: 1888 # 1. copy all files that need to be stripped locally 1889 # 2. strip all these files 1890 1891 if ( $installer::globals::compiler =~ /wntgcci/ ) 1892 { 1893 installer::windows::strip::strip_binaries($filesinproductlanguageresolvedarrayref, $languagestringref); 1894 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16e.log", $filesinproductlanguageresolvedarrayref); } 1895 } 1896 1897 $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); 1898 1899 my $idtdirbase = installer::systemactions::create_directories("idt_files", $languagestringref); 1900 $installer::globals::infodirectory = installer::systemactions::create_directories("info_files", $languagestringref); 1901 my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log"); 1902 # my $installchecksumdir = installer::systemactions::create_directory_next_to_directory($installdir, "checksum"); 1903 1904 ################################################################################# 1905 # Preparing cabinet files from package definitions 1906 ################################################################################# 1907 1908 # installer::packagelist::prepare_cabinet_files($packages, $allvariableshashref, $$languagestringref); 1909 installer::packagelist::prepare_cabinet_files($packages, $allvariableshashref); 1910 # printing packages content: 1911 installer::packagelist::log_cabinet_assignments(); 1912 1913 ################################################################################# 1914 # Begin of functions that are used for the creation of idt files (Windows only) 1915 ################################################################################# 1916 1917 $installer::logger::Info->print( "... creating idt files ...\n" ); 1918 1919 installer::logger::include_header_into_logfile("Creating idt files:"); 1920 1921 my $newidtdir = $idtdirbase . $installer::globals::separator . "00"; # new files into language independent directory "00" 1922 installer::systemactions::create_directory($newidtdir); 1923 1924 my @allfilecomponents = (); 1925 my @allregistrycomponents = (); 1926 1927 # Collecting all files with flag "BINARYTABLE" 1928 my $binarytablefiles = installer::worker::collect_all_items_with_special_flag($filesinproductlanguageresolvedarrayref ,"BINARYTABLE"); 1929 1930 # Removing all files with flag "BINARYTABLE_ONLY" 1931 @installer::globals::binarytableonlyfiles = (); 1932 $filesinproductlanguageresolvedarrayref = installer::worker::remove_all_items_with_special_flag($filesinproductlanguageresolvedarrayref ,"BINARYTABLE_ONLY"); 1933 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17.log", $filesinproductlanguageresolvedarrayref); } 1934 1935 # Collecting all profileitems with flag "INIFILETABLE" for table "IniFile" 1936 my $inifiletableentries = installer::worker::collect_all_items_with_special_flag($profileitemsinproductlanguageresolvedarrayref ,"INIFILETABLE"); 1937 1938 # Creating the important dynamic idt files 1939 installer::windows::msiglobal::set_msiproductversion($allvariableshashref); 1940 installer::windows::msiglobal::put_msiproductversion_into_bootstrapfile($filesinproductlanguageresolvedarrayref); 1941 1942 # Add cabinet assignments to files 1943 installer::windows::file::assign_cab_to_files($filesinproductlanguageresolvedarrayref); 1944 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17a.log", $filesinproductlanguageresolvedarrayref); } 1945 installer::windows::file::assign_sequencenumbers_to_files($filesinproductlanguageresolvedarrayref); 1946 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17b.log", $filesinproductlanguageresolvedarrayref); } 1947 1948 # Collection all available directory trees 1949 installer::windows::directory::collectdirectorytrees($directoriesforepmarrayref); 1950 1951 $filesinproductlanguageresolvedarrayref = installer::windows::file::create_files_table($filesinproductlanguageresolvedarrayref, \@allfilecomponents, $newidtdir, $allvariableshashref, $uniquefilename, $allupdatesequences, $allupdatecomponents, $allupdatefileorder); 1952 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17c.log", $filesinproductlanguageresolvedarrayref); } 1953 if ( $installer::globals::updatedatabase ) { installer::windows::file::check_file_sequences($allupdatefileorder, $allupdatecomponentorder); } 1954 1955 installer::windows::directory::create_directory_table($directoriesforepmarrayref, $newidtdir, $allvariableshashref, $shortdirname, $loggingdir); 1956 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles18.log", $filesinproductlanguageresolvedarrayref); } 1957 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt1.log", $directoriesforepmarrayref); } 1958 1959 # Attention: The table "Registry.idt" contains language specific strings -> parameter: $languagesarrayref ! 1960 installer::windows::registry::create_registry_table($registryitemsinproductlanguageresolvedarrayref, \@allregistrycomponents, $newidtdir, $languagesarrayref, $allvariableshashref); 1961 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems4.log", $registryitemsinproductlanguageresolvedarrayref); } 1962 1963 installer::windows::component::create_component_table($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $directoriesforepmarrayref, \@allfilecomponents, \@allregistrycomponents, $newidtdir, $componentid, $componentidkeypath, $allvariableshashref); 1964 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles19.log", $filesinproductlanguageresolvedarrayref); } 1965 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems5.log", $registryitemsinproductlanguageresolvedarrayref); } 1966 1967 # Attention: The table "Feature.idt" contains language specific strings -> parameter: $languagesarrayref ! 1968 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules4.log", $modulesinproductlanguageresolvedarrayref); } 1969 installer::windows::feature::add_uniquekey($modulesinproductlanguageresolvedarrayref); 1970 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules4a.log", $modulesinproductlanguageresolvedarrayref); } 1971 $modulesinproductlanguageresolvedarrayref = installer::windows::feature::sort_feature($modulesinproductlanguageresolvedarrayref); 1972 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules4b.log", $modulesinproductlanguageresolvedarrayref); } 1973 installer::windows::feature::create_feature_table($modulesinproductlanguageresolvedarrayref, $newidtdir, $languagesarrayref, $allvariableshashref); 1974 1975 installer::windows::featurecomponent::create_featurecomponent_table($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $newidtdir); 1976 1977 installer::windows::media::create_media_table($filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref, $allupdatelastsequences, $allupdatediskids); 1978 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles20.log", $filesinproductlanguageresolvedarrayref); } 1979 1980 installer::windows::font::create_font_table($filesinproductlanguageresolvedarrayref, $newidtdir); 1981 1982 # Attention: The table "Shortcut.idt" contains language specific strings -> parameter: $languagesarrayref ! 1983 # Attention: Shortcuts (Folderitems) have icon files, that have to be copied into the Icon directory (last parameter) 1984 my @iconfilecollector = (); 1985 1986 installer::windows::shortcut::create_shortcut_table($filesinproductlanguageresolvedarrayref, $linksinproductlanguageresolvedarrayref, $folderinproductlanguageresolvedarrayref, $folderitemsinproductlanguageresolvedarrayref, $directoriesforepmarrayref, $newidtdir, $languagesarrayref, $includepatharrayref, \@iconfilecollector); 1987 if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems4.log", $folderitemsinproductlanguageresolvedarrayref); } 1988 1989 installer::windows::inifile::create_inifile_table($inifiletableentries, $filesinproductlanguageresolvedarrayref, $newidtdir); 1990 1991 installer::windows::icon::create_icon_table(\@iconfilecollector, $newidtdir); # creating the icon table with all iconfiles used as shortcuts (FolderItems) 1992 1993 installer::windows::createfolder::create_createfolder_table($directoriesforepmarrayref, $filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref); 1994 1995 installer::windows::upgrade::create_upgrade_table($newidtdir, $allvariableshashref); 1996 1997 if ( ! $installer::globals::languagepack ) # the following tables not for language packs 1998 { 1999 installer::windows::removefile::create_removefile_table($folderitemsinproductlanguageresolvedarrayref, $newidtdir); 2000 2001 installer::windows::selfreg::create_selfreg_table($filesinproductlanguageresolvedarrayref, $newidtdir); 2002 2003 # Adding Assemblies into the tables MsiAssembly and MsiAssemblyName dynamically 2004 installer::windows::assembly::create_msiassembly_table($filesinproductlanguageresolvedarrayref, $newidtdir); 2005 installer::windows::assembly::create_msiassemblyname_table($filesinproductlanguageresolvedarrayref, $newidtdir); 2006 installer::windows::assembly::add_assembly_condition_into_component_table($filesinproductlanguageresolvedarrayref, $newidtdir); 2007 } 2008 2009 $installer::logger::Lang->print("\n"); 2010 2011 # Localizing the language dependent idt files 2012 # For every language there will be a localized msi database 2013 # For multilingual installation sets, the differences of this 2014 # databases have to be stored in transforms. 2015 2016 for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ ) 2017 { 2018 my $onelanguage = ${$languagesarrayref}[$m]; 2019 2020 my $is_bidi = 0; 2021 if ( installer::existence::exists_in_array($onelanguage, \@installer::globals::bidilanguages) ) { $is_bidi = 1; } 2022 2023 my $languageidtdir = $idtdirbase . $installer::globals::separator . $onelanguage; 2024 if ( -d $languageidtdir ) { installer::systemactions::remove_complete_directory($languageidtdir, 1); } 2025 installer::systemactions::create_directory($languageidtdir); 2026 2027 # Copy the template idt files and the new created idt files into this language directory 2028 2029 $installer::logger::Info->print( "... copying idt files ...\n" ); 2030 2031 installer::logger::include_header_into_logfile("Copying idt files to $languageidtdir:"); 2032 2033 installer::windows::idtglobal::prepare_language_idt_directory($languageidtdir, $newidtdir, $onelanguage, $filesinproductlanguageresolvedarrayref, \@iconfilecollector, $binarytablefiles, $allvariableshashref); 2034 2035 if (( ! $installer::globals::languagepack ) && ( ! $allvariableshashref->{'NOLANGUAGESELECTIONPRODUCT'} )) 2036 { 2037 # For multilingual installation sets, the dialog for the language selection can now be prepared, with 2038 # a checkbox for each available language. This has to happen before the following translation. 2039 # The new controls have to be added into the Control.idt 2040 2041 my $controlidttablename = $languageidtdir . $installer::globals::separator . "Control.idt"; 2042 my $controlidttable = installer::files::read_file($controlidttablename); 2043 installer::windows::idtglobal::add_language_checkboxes_to_database($controlidttable, $languagesarrayref); 2044 installer::files::save_file($controlidttablename, $controlidttable); 2045 $installer::logger::Lang->printf("Added checkboxes for language selection dialog into table %s\n", 2046 $controlidttablename); 2047 } 2048 2049 # Now all files are copied into a language specific directory 2050 # The template idt files can be translated 2051 2052 $installer::logger::Info->print( "... localizing idt files (language: $onelanguage) ...\n" ); 2053 2054 installer::logger::include_header_into_logfile("Localizing idt files (Language: $onelanguage):"); 2055 2056 my @translationfiles = (); # all idt files, that need a translation 2057 push(@translationfiles, "ActionTe.idt"); 2058 push(@translationfiles, "Control.idt"); 2059 push(@translationfiles, "CustomAc.idt"); 2060 push(@translationfiles, "Error.idt"); 2061 push(@translationfiles, "LaunchCo.idt"); 2062 push(@translationfiles, "RadioBut.idt"); 2063 push(@translationfiles, "Property.idt"); 2064 push(@translationfiles, "UIText.idt"); 2065 2066 my $oneidtfilename; 2067 my $oneidtfile; 2068 2069 foreach $oneidtfilename (@translationfiles) 2070 { 2071 my $languagefilename = installer::windows::idtglobal::get_languagefilename($oneidtfilename, $installer::globals::idtlanguagepath); 2072 my $languagefile = installer::files::read_file($languagefilename); 2073 2074 $oneidtfilename = $languageidtdir . $installer::globals::separator . $oneidtfilename; 2075 $oneidtfile = installer::files::read_file($oneidtfilename); 2076 2077 # Now the substitution can start 2078 installer::windows::idtglobal::translate_idtfile($oneidtfile, $languagefile, $onelanguage); 2079 2080 installer::files::save_file($oneidtfilename, $oneidtfile); 2081 2082 $installer::logger::Lang->printf("Translated idt file: %s into language %s\n", 2083 $oneidtfilename, 2084 $onelanguage); 2085 $installer::logger::Lang->printf("Used languagefile: %s\n", $languagefilename); 2086 } 2087 2088 # setting the encoding in every table (replacing WINDOWSENCODINGTEMPLATE) 2089 2090 installer::windows::idtglobal::setencoding($languageidtdir, $onelanguage); 2091 2092 # setting bidi attributes, if required 2093 2094 if ( $is_bidi ) { installer::windows::idtglobal::setbidiattributes($languageidtdir, $onelanguage); } 2095 2096 # setting the encoding in every table (replacing WINDOWSENCODINGTEMPLATE) 2097 installer::windows::idtglobal::set_multilanguageonly_condition($languageidtdir); 2098 2099 # include the license text into the table Control.idt 2100 2101 if ( ! $allvariableshashref->{'HIDELICENSEDIALOG'} ) 2102 { 2103 my $licensefilesource = installer::windows::idtglobal::get_rtflicensefilesource($onelanguage, $includepatharrayref_lang); 2104 my $licensefile = installer::files::read_file($licensefilesource); 2105 installer::scpzipfiles::replace_all_ziplistvariables_in_rtffile($licensefile, $allvariablesarrayref, $onelanguage, $loggingdir); 2106 my $controltablename = $languageidtdir . $installer::globals::separator . "Control.idt"; 2107 my $controltable = installer::files::read_file($controltablename); 2108 installer::windows::idtglobal::add_licensefile_to_database($licensefile, $controltable); 2109 installer::files::save_file($controltablename, $controltable); 2110 2111 $installer::logger::Lang->printf("Added licensefile %s into database %s\n", 2112 $licensefilesource, 2113 $controltablename); 2114 } 2115 2116 # include a component into environment table if required 2117 2118 installer::windows::component::set_component_in_environment_table($languageidtdir, $filesinproductlanguageresolvedarrayref); 2119 2120 # include the ProductCode and the UpgradeCode from codes-file into the Property.idt 2121 2122 installer::windows::property::set_codes_in_property_table($languageidtdir); 2123 2124 # the language specific properties can now be set in the Property.idt 2125 2126 installer::windows::property::update_property_table($languageidtdir, $onelanguage, $allvariableshashref, $languagestringref); 2127 2128 # replacing variables in RegLocat.idt 2129 2130 installer::windows::msiglobal::update_reglocat_table($languageidtdir, $allvariableshashref); 2131 2132 # replacing variables in RemoveRe.idt (RemoveRegistry.idt) 2133 2134 installer::windows::msiglobal::update_removere_table($languageidtdir); 2135 2136 # adding language specific properties for multilingual installation sets 2137 2138 installer::windows::property::set_languages_in_property_table($languageidtdir, $languagesarrayref); 2139 2140 # adding settings into CheckBox.idt 2141 installer::windows::property::update_checkbox_table($languageidtdir, $allvariableshashref); 2142 2143 # adding the files from the binary directory into the binary table 2144 installer::windows::binary::update_binary_table($languageidtdir, $filesinproductlanguageresolvedarrayref, $binarytablefiles); 2145 2146 # setting patch codes to detect installed products 2147 2148 if (( $installer::globals::patch ) || ( $installer::globals::languagepack ) || ( $allvariableshashref->{'PDFCONVERTER'} )) { installer::windows::patch::update_patch_tables($languageidtdir, $allvariableshashref); } 2149 2150 # Adding Windows Installer CustomActions 2151 2152 installer::windows::idtglobal::addcustomactions($languageidtdir, $windowscustomactionsarrayref, $filesinproductlanguageresolvedarrayref); 2153 2154 # Adding child projects if specified 2155 2156 if ($installer::globals::addchildprojects) 2157 { 2158 # Adding child projects to installation dynamically (also in feature table) 2159 installer::windows::idtglobal::add_childprojects($languageidtdir, $filesinproductlanguageresolvedarrayref, $allvariableshashref); 2160 # setting Java variables for Java products 2161 if ( $allvariableshashref->{'JAVAPRODUCT'} ) { installer::windows::java::update_java_tables($languageidtdir, $allvariableshashref); } 2162 } 2163 2164 # Then the language specific msi database can be created 2165 2166 if ( $installer::globals::iswin ) # only possible on a Windows platform 2167 { 2168 my $msidatabasename = installer::windows::msiglobal::get_msidatabasename($allvariableshashref, $onelanguage); 2169 my $msifilename = $languageidtdir . $installer::globals::separator . $msidatabasename; 2170 2171 $installer::logger::Info->print( "... creating msi database (language $onelanguage) ... \n" ); 2172 2173 installer::windows::msiglobal::set_uuid_into_component_table($languageidtdir, $allvariableshashref); # setting new GUID for the components using the tool uuidgen.exe 2174 installer::windows::msiglobal::prepare_64bit_database($languageidtdir, $allvariableshashref); # making last 64 bit changes 2175 installer::windows::msiglobal::create_msi_database($languageidtdir ,$msifilename); 2176 2177 # validating the database # ToDo 2178 2179 my $languagefile = installer::files::read_file($installer::globals::idtlanguagepath . $installer::globals::separator . "SIS.mlf"); 2180 # my $languagefile = installer::files::read_file($installer::globals::idtlanguagepath . $installer::globals::separator . "SIS.ulf"); 2181 2182 installer::windows::msiglobal::write_summary_into_msi_database($msifilename, $onelanguage, $languagefile, $allvariableshashref); 2183 2184 # if there are Merge Modules, they have to be integrated now 2185 $filesinproductlanguageresolvedarrayref = installer::windows::mergemodule::merge_mergemodules_into_msi_database($mergemodulesarrayref, $filesinproductlanguageresolvedarrayref, $msifilename, $languagestringref, $onelanguage, $languagefile, $allvariableshashref, $includepatharrayref, $allupdatesequences, $allupdatelastsequences, $allupdatediskids); 2186 if (( $installer::globals::globallogging ) && ($installer::globals::globalloggingform21)) { installer::files::save_array_of_hashes($loggingdir . "productfiles21_" . $onelanguage . ".log", $filesinproductlanguageresolvedarrayref); } 2187 $installer::globals::globalloggingform21 = 0; 2188 2189 # copy msi database into installation directory 2190 2191 my $msidestfilename = $installdir . $installer::globals::separator . $msidatabasename; 2192 installer::systemactions::copy_one_file($msifilename, $msidestfilename); 2193 } 2194 } 2195 2196 # Creating transforms, if the installation set has more than one language 2197 # renaming the msi database and generating the setup.ini file 2198 2199 my $defaultlanguage = installer::languages::get_default_language($languagesarrayref); 2200 2201 if ( $installer::globals::iswin ) # only possible on a Windows platform 2202 { 2203 if ( $#{$languagesarrayref} > 0 ) 2204 { 2205 installer::windows::msiglobal::create_transforms($languagesarrayref, $defaultlanguage, $installdir, $allvariableshashref); 2206 } 2207 2208 installer::windows::msiglobal::rename_msi_database_in_installset($defaultlanguage, $installdir, $allvariableshashref); 2209 2210 if ( $allvariableshashref->{'ADDLANGUAGEINDATABASENAME'} ) { installer::windows::msiglobal::add_language_to_msi_database($defaultlanguage, $installdir, $allvariableshashref); } 2211 2212 $installer::logger::Info->print( "... generating setup.ini ...\n" ); 2213 2214 if ( ! $allvariableshashref->{'NOLOADERREQUIRED'} ) { installer::windows::msiglobal::create_setup_ini($languagesarrayref, $defaultlanguage, $installdir, $allvariableshashref); } 2215 } 2216 2217 # Analyzing the ScpActions and copying the files into the installation set 2218 # At least the loader.exe 2219 2220 $installer::logger::Info->print( "... copying files into installation set ...\n" ); 2221 2222 # installer::windows::msiglobal::copy_scpactions_into_installset($defaultlanguage, $installdir, $scpactionsinproductlanguageresolvedarrayref); 2223 installer::worker::put_scpactions_into_installset($installdir); 2224 2225 # ... copying the setup.exe 2226 2227 installer::windows::msiglobal::copy_windows_installer_files_into_installset($installdir, $includepatharrayref, $allvariableshashref); 2228 2229 # ... copying MergeModules into installation set 2230 2231 if ( ! $installer::globals::fix_number_of_cab_files ) { installer::windows::msiglobal::copy_merge_modules_into_installset($installdir); } 2232 2233 # ... copying the child projects 2234 2235 if ($installer::globals::addchildprojects) 2236 { 2237 installer::windows::msiglobal::copy_child_projects_into_installset($installdir, $allvariableshashref); 2238 } 2239 2240 $installer::logger::Info->print( "... creating ddf files ...\n" ); 2241 2242 # Creating all needed ddf files and generating a list 2243 # for the package process containing all system calls 2244 2245 my $ddfdir = installer::systemactions::create_directories("ddf", $languagestringref); 2246 2247 $installer::globals::packjobref = installer::windows::msiglobal::generate_cab_file_list($filesinproductlanguageresolvedarrayref, $installdir, $ddfdir, $allvariableshashref); 2248 2249 # Update and patch reasons the pack order needs to be saved 2250 installer::windows::msiglobal::save_packorder(); 2251 2252 $installer::logger::Info->print("\n"); 2253 2254 ####################################################### 2255 # Finally really create the installation packages, 2256 # Only for Windows and only on a windows platform. 2257 ####################################################### 2258 2259 if ( $installer::globals::iswin ) # only possible on a Windows platform 2260 { 2261 $installer::logger::Info->print( "... packaging installation set ... \n" ); 2262 installer::windows::msiglobal::execute_packaging($installer::globals::packjobref, $loggingdir, $allvariableshashref); 2263 if ( $installer::globals::include_cab_in_msi ) { installer::windows::msiglobal::include_cabs_into_msi($installdir); } 2264 } 2265 2266 ####################################################### 2267 # Analyzing the log file 2268 ####################################################### 2269 2270 my $is_success = 0; 2271 my $finalinstalldir = ""; 2272 installer::worker::clean_output_tree(); # removing directories created in the output tree 2273 ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 2274 2275 ####################################################### 2276 # Creating Windows msp patches 2277 ####################################################### 2278 2279 if (( $is_success ) && ( $installer::globals::updatedatabase ) && ( $allvariableshashref->{'CREATE_MSP_INSTALLSET'} )) 2280 { 2281 # Required: 2282 # Temp path for administrative installations: $installer::globals::temppath 2283 # Path of new installation set: $finalinstalldir 2284 # Path of old installation set: $installer::globals::updatedatabasepath 2285 my $mspdir = installer::windows::msp::create_msp_patch($finalinstalldir, $includepatharrayref, $allvariableshashref, $languagestringref, $languagesarrayref, $filesinproductlanguageresolvedarrayref); 2286 ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $mspdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 2287 installer::worker::clean_output_tree(); # removing directories created in the output tree 2288 } 2289 2290 ####################################################### 2291 # Creating download installation set 2292 ####################################################### 2293 2294 my $create_download = 0; 2295 my $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname"); 2296 if ( $installer::globals::languagepack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "langpackdownloadname"); } 2297 if ( $installer::globals::patch ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "patchdownloadname"); } 2298 2299 if ( $is_success ) { installer::followme::save_followme_info($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref, $current_install_number, $loggingdir, $installlogdir); } 2300 2301 if ( $$downloadname ne "" ) { $create_download = 1; } 2302 if (( $is_success ) && ( $create_download ) && ( $ENV{'ENABLE_DOWNLOADSETS'} )) 2303 { 2304 my $downloaddir = installer::download::create_download_sets($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref); 2305 installer::worker::analyze_and_save_logfile($loggingdir, $downloaddir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); 2306 } 2307 2308 } # end of "if ( $installer::globals::iswindowsbuild )" 2309 2310 if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 2b: The Windows platform\n"); } 2311 2312 # saving file_info file for later analysis 2313 my $speciallogfilename = "fileinfo_" . $installer::globals::product . "\.log"; 2314 installer::files::save_array_of_hashes($loggingdir . $speciallogfilename, $filesinproductlanguageresolvedarrayref); 2315 2316} # end of iteration for one language group 2317 2318# saving debug info at end 2319if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } 2320 2321####################################################### 2322# Stopping time 2323####################################################### 2324 2325installer::logger::stoptime(); 2326 2327#################################### 2328# Main program end 2329#################################### 2330