blob: 08f14bd3c77ba84c1edf795be658577eea7275b1 [file] [log] [blame]
#**************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#**************************************************************
package installer::ziplist;
use installer::existence;
use installer::exiter;
use installer::globals;
use installer::logger;
use installer::parameter;
use installer::remover;
use installer::systemactions;
use strict;
=head2 read_openoffice_lst_file (#loggingdir)
Read the settings and variables from the settings file (typically 'openoffice.lst').
=cut
sub read_openoffice_lst_file ($$;$)
{
my ($filename, $product_name, $loggingdir) = @_;
# Read all lines from the settings file.
my $ziplistref = installer::files::read_file($filename);
# Extract the lines of the settings block for the current product.
my ($productblockref, $parent) = installer::ziplist::getproductblock(
$ziplistref, $product_name, 1);
my ($settingsblockref, undef) = installer::ziplist::getproductblock($productblockref, "Settings", 0);
$settingsblockref = installer::ziplist::analyze_settings_block($settingsblockref);
# Split into settings and variables.
my $allsettingsarrayref = installer::ziplist::get_settings_from_ziplist($settingsblockref);
my $allvariablesarrayref = installer::ziplist::get_variables_from_ziplist($settingsblockref);
# global product block from zip.lst
my ($globalproductblockref, undef) = installer::ziplist::getproductblock(
$ziplistref, $installer::globals::globalblock, 0);
if ($installer::globals::globallogging && defined $loggingdir)
{
installer::files::save_file($loggingdir . "productblock.log", $productblockref);
installer::files::save_file($loggingdir . "settingsblock.log", $settingsblockref);
installer::files::save_file($loggingdir . "allsettings1.log", $allsettingsarrayref);
installer::files::save_file($loggingdir . "allvariables1.log", $allvariablesarrayref);
installer::files::save_file($loggingdir . "globalproductblock.log", $globalproductblockref);
}
# Integrate parent values.
while (defined $parent)
{
my $parentproductblockref;
($parentproductblockref, $parent) = installer::ziplist::getproductblock($ziplistref, $parent, 1);
my ($parentsettingsblockref, undef) = installer::ziplist::getproductblock(
$parentproductblockref, "Settings", 0);
$parentsettingsblockref = installer::ziplist::analyze_settings_block($parentsettingsblockref);
my $allparentsettingsarrayref = installer::ziplist::get_settings_from_ziplist($parentsettingsblockref);
my $allparentvariablesarrayref = installer::ziplist::get_variables_from_ziplist($parentsettingsblockref);
if (scalar @$allparentsettingsarrayref > 0)
{
$allsettingsarrayref = installer::converter::combine_arrays_from_references_first_win(
$allsettingsarrayref,
$allparentsettingsarrayref)
}
if (scalar @$allparentvariablesarrayref)
{
$allvariablesarrayref = installer::converter::combine_arrays_from_references_first_win(
$allvariablesarrayref,
$allparentvariablesarrayref)
}
}
# Integrate global values.
if (scalar @$globalproductblockref)
{
# settings block from zip.lst
my ($globalsettingsblockref, undef) = installer::ziplist::getproductblock(
$globalproductblockref, "Settings", 0);
# select data from settings block in zip.lst
$globalsettingsblockref = installer::ziplist::analyze_settings_block($globalsettingsblockref);
my $allglobalsettingsarrayref = installer::ziplist::get_settings_from_ziplist($globalsettingsblockref);
my $allglobalvariablesarrayref = installer::ziplist::get_variables_from_ziplist($globalsettingsblockref);
if ($installer::globals::globallogging && defined $loggingdir)
{
installer::files::save_file($loggingdir . "globalsettingsblock1.log", $globalsettingsblockref);
installer::files::save_file($loggingdir . "globalsettingsblock2.log", $globalsettingsblockref);
installer::files::save_file($loggingdir . "allglobalsettings1.log", $allglobalsettingsarrayref);
installer::files::save_file($loggingdir . "allglobalvariables1.log", $allglobalvariablesarrayref);
}
if (scalar @$allglobalsettingsarrayref > 0)
{
$allsettingsarrayref = installer::converter::combine_arrays_from_references_first_win(
$allsettingsarrayref, $allglobalsettingsarrayref);
}
if (scalar @$allglobalvariablesarrayref > 0)
{
$allvariablesarrayref = installer::converter::combine_arrays_from_references_first_win(
$allvariablesarrayref, $allglobalvariablesarrayref);
}
}
# Remove multiples (and the trailing ##%##).
$allsettingsarrayref = installer::ziplist::remove_multiples_from_ziplist($allsettingsarrayref);
$allvariablesarrayref = installer::ziplist::remove_multiples_from_ziplist($allvariablesarrayref);
installer::ziplist::replace_variables_in_ziplist_variables($allvariablesarrayref);
# Transform array into hash.
my $allvariableshashref = installer::converter::convert_array_to_hash($allvariablesarrayref);
# Postprocess the variables.
installer::ziplist::set_default_productversion_if_required($allvariableshashref);
installer::ziplist::add_variables_to_allvariableshashref($allvariableshashref);
installer::ziplist::overwrite_ooovendor($allvariableshashref);
if ($installer::globals::globallogging && defined $loggingdir)
{
installer::files::save_file($loggingdir . "allsettings2.log" ,$allsettingsarrayref);
installer::files::save_file($loggingdir . "allvariables2.log" ,$allvariablesarrayref);
}
# Eventually we should fix this so that we don't have to return the raw arrays, only the resulting hashes.
return ($allvariableshashref, $allsettingsarrayref);
}
#################################################
# Getting data from path file and zip list file
#################################################
sub getproductblock
{
my ($fileref, $search, $inheritance) = @_;
my @searchblock = ();
my $searchexists = 0;
my $record = 0;
my $count = 0;
my $line;
my $inh = $inheritance ? '(?::\s*(\S+)\s*)?' : "";
my $parent;
for ( my $i = 0; $i <= $#{$fileref}; $i++ )
{
$line = ${$fileref}[$i];
if ( $line =~ /^\s*\Q$search\E\s*$inh$/i ) # case insensitive
{
$record = 1;
$searchexists = 1;
$parent = $1 if $inheritance;
}
if ($record)
{
push(@searchblock, $line);
}
if ( ($record) && ($line =~ /\{/) )
{
$count++;
}
if ( ($record) && ($line =~ /\}/) )
{
$count--;
}
if ( ($record) && ($line =~ /\}/) && ( $count == 0 ) )
{
$record = 0;
}
}
if (( ! $searchexists ) && ( $search ne $installer::globals::globalblock ))
{
if ($search eq $installer::globals::product )
{
installer::exiter::exit_program("ERROR: Product $installer::globals::product not defined in $installer::globals::ziplistname", "getproductblock");
}
elsif ($search eq $installer::globals::compiler )
{
installer::exiter::exit_program("ERROR: Compiler $installer::globals::compiler not defined in $installer::globals::pathfilename", "getproductblock");
}
else # this is not possible
{
installer::exiter::exit_program("ERROR: Unknown value for $search in getproductblock()", "getproductblock");
}
}
return (\@searchblock, $parent);
}
###############################################
# Analyzing the settings in the zip list file
###############################################
sub analyze_settings_block
{
my ($blockref) = @_;
my @newsettingsblock = ();
my $compilerstring = "";
my $record = 1;
my $counter = 0;
# Allowed values in settings block:
# "Settings", "Variables", "unix" (for destination path and logfile)
# Furthermore allowed values are $installer::globals::build (srx645) and $installer::globals::compiler (pro and nonpro (unxsols4.pro))
# Comment line in settings block begin with "#" or ";"
if ( $installer::globals::pro )
{
$compilerstring = $installer::globals::compiler . ".pro";
}
else
{
$compilerstring = $installer::globals::compiler;
}
for ( my $i = 0; $i <= $#{$blockref}; $i++ )
{
my $line = ${$blockref}[$i];
my $nextline = "";
if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; }
# removing comment lines
if (($line =~ /^\s*\#/) || ($line =~ /^\s*\;/))
{
next;
}
# complete blocks of unknows strings are not recorded
if ((!($line =~ /^\s*\Q$compilerstring\E\s*$/i)) &&
(!($line =~ /^\s*\Q$installer::globals::build\E\s*$/i)) &&
(!($line =~ /^\s*\bSettings\b\s*$/i)) &&
(!($line =~ /^\s*\bVariables\b\s*$/i)) &&
(!($line =~ /^\s*\bunix\b\s*$/i)) &&
($nextline =~ /^\s*\{\s*$/i))
{
$record = 0;
next; # continue with next $i
}
if (!( $record ))
{
if ($line =~ /^\s*\{\s*$/i)
{
$counter++;
}
if ($line =~ /^\s*\}\s*$/i)
{
$counter--;
}
if ($counter == 0)
{
$record = 1;
next; # continue with next $i
}
}
if ($record)
{
push(@newsettingsblock, $line);
}
}
return \@newsettingsblock;
}
########################################
# Settings in zip list file
########################################
sub get_settings_from_ziplist
{
my ($blockref) = @_;
my @allsettings = ();
my $isvariables = 0;
my $counter = 0;
my $variablescounter = 0;
# Take all settings from the settings block
# Do not take the variables from the settings block
# If a setting is defined more than once, take the
# setting with the largest counter (open brackets)
for ( my $i = 0; $i <= $#{$blockref}; $i++ )
{
my $line = ${$blockref}[$i];
my $nextline = "";
if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; }
if (($line =~ /^\s*\S+\s*$/i) &&
($nextline =~ /^\s*\{\s*$/i) &&
(!($line =~ /^\s*Variables\s*$/i)))
{
next;
}
if ($line =~ /^\s*Variables\s*$/i)
{
# This is a block of variables
$isvariables = 1;
next;
}
if ($line =~ /^\s*\{\s*$/i)
{
if ($isvariables)
{
$variablescounter++;
}
else
{
$counter++;
}
next;
}
if ($line =~ /^\s*\}\s*$/i)
{
if ($isvariables)
{
$variablescounter--;
if ($variablescounter == 0)
{
$isvariables = 0;
}
}
else
{
$counter--;
}
next;
}
if ($isvariables)
{
next;
}
installer::remover::remove_leading_and_ending_whitespaces(\$line);
$line .= "\t##$counter##\n";
push(@allsettings, $line);
}
return \@allsettings;
}
#######################################
# Variables from zip list file
#######################################
sub get_variables_from_ziplist
{
my ($blockref) = @_;
my @allvariables = ();
my $isvariables = 0;
my $counter = 0;
my $variablescounter = 0;
my $countersum = 0;
# Take all variables from the settings block
# Do not take the other settings from the settings block
# If a variable is defined more than once, take the
# variable with the largest counter (open brackets)
for ( my $i = 0; $i <= $#{$blockref}; $i++ )
{
my $line = ${$blockref}[$i];
my $nextline = ${$blockref}[$i+1];
if ($line =~ /^\s*Variables\s*$/i)
{
# This is a block of variables
$isvariables = 1;
next;
}
if ($line =~ /^\s*\{\s*$/i)
{
if ($isvariables)
{
$variablescounter++;
}
else
{
$counter++;
}
next;
}
if ($line =~ /^\s*\}\s*$/i)
{
if ($isvariables)
{
$variablescounter--;
if ($variablescounter == 0)
{
$isvariables = 0;
}
}
else
{
$counter--;
}
next;
}
if (!($isvariables))
{
next;
}
$countersum = $counter + $variablescounter;
installer::remover::remove_leading_and_ending_whitespaces(\$line);
$line .= "\t##$countersum##\n";
push(@allvariables, $line);
}
return \@allvariables;
}
#######################################################################
# Removing multiple variables and settings, defined in zip list file
#######################################################################
sub remove_multiples_from_ziplist
{
my ($blockref) = @_;
# remove all definitions of settings and variables
# that occur more than once in the zip list file.
# Take the one with the most open brackets. This
# number is stored at the end of the string.
my @newarray = ();
my @itemarray = ();
my ($line, $itemname, $itemnumber);
# first collecting all variables and settings names
for ( my $i = 0; $i <= $#{$blockref}; $i++ )
{
$line = ${$blockref}[$i];
if ($line =~ /^\s*\b(\S*)\b\s+.*\#\#\d+\#\#\s*$/i)
{
$itemname = $1;
}
if (! installer::existence::exists_in_array($itemname, \@itemarray))
{
push(@itemarray, $itemname);
}
}
# and now all $items can be selected with the highest number
for ( my $i = 0; $i <= $#itemarray; $i++ )
{
$itemname = $itemarray[$i];
my $itemnumbermax = 0;
my $printline = "";
for ( my $j = 0; $j <= $#{$blockref}; $j++ )
{
$line = ${$blockref}[$j];
if ($line =~ /^\s*\Q$itemname\E\s+.*\#\#(\d+)\#\#\s*$/)
{
$itemnumber = $1;
if ($itemnumber >= $itemnumbermax)
{
$printline = $line;
$itemnumbermax = $itemnumber;
}
}
}
# removing the ending number from the printline
# and putting it into the array
$printline =~ s/\#\#\d+\#\#//;
installer::remover::remove_leading_and_ending_whitespaces(\$line);
push(@newarray, $printline);
}
return \@newarray;
}
#########################################################
# Reading one variable defined in the zip list file
#########################################################
sub getinfofromziplist
{
my ($blockref, $variable) = @_;
my $searchstring = "";
my $line;
for ( my $i = 0; $i <= $#{$blockref}; $i++ )
{
$line = ${$blockref}[$i];
if ( $line =~ /^\s*\Q$variable\E\s+(.+?)\s*$/ ) # "?" for minimal matching
{
$searchstring = $1;
last;
}
}
return \$searchstring;
}
####################################################
# Replacing variables in include path
####################################################
sub replace_all_variables_in_pathes
{
my ( $patharrayref, $variableshashref ) = @_;
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
my $line = ${$patharrayref}[$i];
my $key;
foreach $key (keys %{$variableshashref})
{
my $value = $variableshashref->{$key};
if (( $line =~ /\{$key\}/ ) && ( $value eq "" )) { $line = ".\n"; }
$line =~ s/\{\Q$key\E\}/$value/g;
}
${$patharrayref}[$i] = $line;
}
}
####################################################
# Replacing minor in include path
####################################################
sub replace_minor_in_pathes
{
my ( $patharrayref ) = @_;
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
my $line = ${$patharrayref}[$i];
if ( ! defined $ENV{CWS_WORK_STAMP} and defined $ENV{UPDMINOR} )
# if ( $installer::globals::minor )
{
$line =~ s/\{minor\}/$installer::globals::minor/g;
# no difference for minor and minornonpre (ToDo ?)
$line =~ s/\{minornonpre\}/$installer::globals::minor/g;
}
else # building without a minor
{
$line =~ s/\.\{minor\}//g;
$line =~ s/\.\{minornonpre\}//g;
}
${$patharrayref}[$i] = $line;
}
}
####################################################
# Replacing packagetype in include path
####################################################
sub replace_packagetype_in_pathes
{
my ( $patharrayref ) = @_;
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
my $line = ${$patharrayref}[$i];
if (( $installer::globals::installertypedir ) && ( $line =~ /\{pkgtype\}/ ))
{
$line =~ s/\{pkgtype\}/$installer::globals::installertypedir/g;
}
${$patharrayref}[$i] = $line;
}
}
####################################################
# Removing ending separators in pathes
####################################################
sub remove_ending_separator
{
my ( $patharrayref ) = @_;
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
my $line = ${$patharrayref}[$i];
installer::remover::remove_ending_pathseparator(\$line);
$line =~ s/\s*$//;
$line = $line . "\n";
${$patharrayref}[$i] = $line;
}
}
####################################################
# Replacing languages in include path
####################################################
sub replace_languages_in_pathes
{
my ( $patharrayref, $languagesref ) = @_;
installer::logger::include_header_into_logfile("Replacing languages in include pathes:");
my @patharray = ();
my $infoline = "";
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
my $line = ${$patharrayref}[$i];
if ( $line =~ /\$\(LANG\)/ )
{
my $originalline = $line;
my $newline = "";
for ( my $j = 0; $j <= $#{$languagesref}; $j++ )
{
my $language = ${$languagesref}[$j];
$line =~ s/\$\(LANG\)/$language/g;
push(@patharray ,$line);
my $newdir = $line;
$line = $originalline;
installer::remover::remove_leading_and_ending_whitespaces(\$newline);
# Is it necessary to refresh the global array, containing all files of all include pathes?
if ( -d $newdir )
{
# Checking if $newdir is empty
if ( ! installer::systemactions::is_empty_dir($newdir) )
{
$installer::globals::refresh_includepathes = 1;
$infoline = "Directory $newdir exists and is not empty. Refreshing global file array is required.\n";
$installer::logger::Lang->print($infoline);
}
else
{
$infoline = "Directory $newdir is empty. No refresh of global file array required.\n";
$installer::logger::Lang->print($infoline);
}
}
else
{
$infoline = "Directory $newdir does not exist. No refresh of global file array required.\n";
$installer::logger::Lang->print($infoline);
}
}
}
else # not language dependent include path
{
push(@patharray ,$line);
}
}
return \@patharray;
}
#####################################################
# Collecting all files from all include paths
#####################################################
sub list_all_files_from_include_path
{
my ( $patharrayref) = @_;
installer::logger::include_header_into_logfile("Include pathes:");
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
my $path = ${$patharrayref}[$i];
installer::remover::remove_leading_and_ending_whitespaces(\$path);
my $infoline = "$path\n";
$installer::logger::Lang->print($infoline);
}
$installer::logger::Lang->print("\n");
}
#####################################################
# Collecting all files from all include paths
#####################################################
sub set_manufacturer
{
my ($allvariables) = @_;
my $openofficeproductname = "OpenOffice";
my $sunname = "";
if ( $allvariables->{'OPENSOURCE'} && $allvariables->{'OPENSOURCE'} == 1 )
{
$installer::globals::isopensourceproduct = 1;
$installer::globals::manufacturer = $openofficeproductname;
$installer::globals::longmanufacturer = $openofficeproductname;
}
else
{
$installer::globals::isopensourceproduct = 0;
if (( $allvariables->{'DEFINEDMANUFACTURER'} ) && ( $allvariables->{'DEFINEDMANUFACTURER'} ne "" )) { $sunname = $allvariables->{'DEFINEDMANUFACTURER'}; }
else { installer::exiter::exit_program("ERROR: Property DEFINEDMANUFACTURER has to be set for this product!", "set_manufacturer"); }
$installer::globals::manufacturer = $sunname;
$installer::globals::longmanufacturer = $sunname;
}
$allvariables->{'MANUFACTURER'} = $installer::globals::manufacturer;
}
##############################################################
# A ProductVersion has to be defined. If it is not set in
# zip.lst, it is set now to "1"
##############################################################
sub set_default_productversion_if_required
{
my ($allvariables) = @_;
if (!($allvariables->{'PRODUCTVERSION'}))
{
$allvariables->{'PRODUCTVERSION'} = 1; # FAKE
}
}
####################################################
# Removing .. in pathes
####################################################
sub simplify_path
{
my ( $pathref ) = @_;
my $oldpath = $$pathref;
my $change = 0;
while ( $oldpath =~ /(^.*)(\Q$installer::globals::separator\E.*\w+?)(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ )
{
my $part1 = $1;
my $part2 = $4;
$oldpath = $part1 . $part2;
$change = 1;
}
if ( $change ) { $$pathref = $oldpath . "\n"; }
}
####################################################
# Removing ending separators in pathes
####################################################
sub resolve_relative_pathes
{
my ( $patharrayref ) = @_;
for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
{
installer::parameter::make_path_absolute(\${$patharrayref}[$i]);
simplify_path(\${$patharrayref}[$i]);
}
}
####################################################
# Replacing variables inside zip list variables
# Example: {milestone} to be replaced by
# $installer::globals::lastminor
####################################################
sub replace_variables_in_ziplist_variables
{
my ($blockref) = @_;
my $milestonevariable = $installer::globals::lastminor;
$milestonevariable =~ s/m//;
$milestonevariable =~ s/s/\./;
my $localminor = $installer::globals::lastminor;
if ( $installer::globals::minor ) { $localminor = $installer::globals::minor; }
my $buildidstringcws = $installer::globals::build . $localminor . "(Build:" . $installer::globals::buildid . ")";
# the environment variable CWS_WORK_STAMP is set only in CWS
if ( $ENV{'CWS_WORK_STAMP'} ) { $buildidstringcws = $buildidstringcws . "\[CWS\:" . $ENV{'CWS_WORK_STAMP'} . "\]"; }
for ( my $i = 0; $i <= $#{$blockref}; $i++ )
{
if ($installer::globals::lastminor) { ${$blockref}[$i] =~ s/\{milestone\}/$milestonevariable/; }
else { ${$blockref}[$i] =~ s/\{milestone\}//; }
if ( $localminor ) { ${$blockref}[$i] =~ s/\{minor\}/$localminor/; }
else { ${$blockref}[$i] =~ s/\{minor\}//; }
if ( $installer::globals::buildid ) { ${$blockref}[$i] =~ s/\{buildid\}/$installer::globals::buildid/; }
else { ${$blockref}[$i] =~ s/\{buildid\}//; }
if ( $installer::globals::build ) { ${$blockref}[$i] =~ s/\{buildsource\}/$installer::globals::build/; }
else { ${$blockref}[$i] =~ s/\{build\}//; }
${$blockref}[$i] =~ s/\{buildidcws\}/$buildidstringcws/;
}
}
###########################################################
# Overwrite the vendor string in openoffice.lst that is defined in configure
###########################################################
sub overwrite_ooovendor
{
my ($variableshashref) = @_;
$variableshashref->{'OOOVENDOR'} = $ENV{'OOO_VENDOR'} , if( defined $ENV{'OOO_VENDOR'} && $ENV{'OOO_VENDOR'} ne "" );
}
###########################################################
# Adding the lowercase variables into the variableshashref
###########################################################
sub add_variables_to_allvariableshashref
{
my ($variableshashref) = @_;
my $lcvariable = lc($variableshashref->{'PRODUCTNAME'});
$variableshashref->{'LCPRODUCTNAME'} = $lcvariable;
if ($variableshashref->{'SHORT_PRODUCTEXTENSION'})
{
$variableshashref->{'LCPRODUCTEXTENSION'} = "\-" . lc($variableshashref->{'SHORT_PRODUCTEXTENSION'}); # including the "-" !
}
else
{
$variableshashref->{'LCPRODUCTEXTENSION'} = "";
}
if ($installer::globals::patch)
{
$variableshashref->{'PRODUCTADDON'} = $installer::globals::patchaddon;
}
elsif ($installer::globals::languagepack)
{
$variableshashref->{'PRODUCTADDON'} = $installer::globals::languagepackaddon;
}
else
{
$variableshashref->{'PRODUCTADDON'} = "";
}
my $localbuild = $installer::globals::build;
if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680"
$variableshashref->{'PRODUCTMAJOR'} = $localbuild;
my $localminor = "";
if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; }
else { $localminor = $installer::globals::lastminor; }
if ( $localminor =~ /^\s*\w(\d+)\w*\s*$/ ) { $localminor = $1; }
$variableshashref->{'PRODUCTMINOR'} = $localminor;
$variableshashref->{'PRODUCTBUILDID'} = $installer::globals::buildid;
$variableshashref->{'SYSTEM_LIBTEXTCAT_DATA'} = $ENV{'SYSTEM_LIBTEXTCAT_DATA'} , if( defined $ENV{'SYSTEM_LIBTEXTCAT_DATA'} && $ENV{'SYSTEM_LIBTEXTCAT_DATA'} ne "" );
}
1;