xref: /AOO41X/main/solenv/bin/modules/packager/work.pm (revision ef1ef8e674fabf3a541d12c6e6c14cecdfc2f9e7)
1#*************************************************************************
2#
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# Copyright 2000, 2010 Oracle and/or its affiliates.
6#
7# OpenOffice.org - a multi-platform office productivity suite
8#
9# This file is part of OpenOffice.org.
10#
11# OpenOffice.org is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Lesser General Public License version 3
13# only, as published by the Free Software Foundation.
14#
15# OpenOffice.org is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU Lesser General Public License version 3 for more details
19# (a copy is included in the LICENSE file that accompanied this code).
20#
21# You should have received a copy of the GNU Lesser General Public License
22# version 3 along with OpenOffice.org.  If not, see
23# <http://www.openoffice.org/license.html>
24# for a copy of the LGPLv3 License.
25#
26#*************************************************************************
27
28
29package packager::work;
30
31use packager::exiter;
32use packager::existence;
33use packager::files;
34use packager::globals;
35
36###########################################
37# Setting global variables
38###########################################
39
40sub set_global_variable
41{
42    my $compiler = $ENV{'OUTPATH'};
43
44    if ( $ENV{'PROEXT'} ) { $compiler = $compiler . $ENV{'PROEXT'}; }
45
46    $packager::globals::compiler = $compiler;
47}
48
49#############################################################################
50# Converting a string list with separator $listseparator
51# into an array
52#############################################################################
53
54sub convert_stringlist_into_array
55{
56    my ( $includestringref, $listseparator ) = @_;
57
58    my @newarray = ();
59    my $first;
60    my $last = ${$includestringref};
61
62    while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching
63    {
64        $first = $1;
65        $last = $2;
66        push(@newarray, "$first");
67    }
68
69    push(@newarray, "$last");
70
71    return \@newarray;
72}
73
74###########################################
75# Generating a list of package calls
76# corresponding to the package list
77###########################################
78
79sub create_package_todos
80{
81    my ( $packagelist ) = @_;
82
83    my @targets = ();   # only used, if the build server is not used
84
85    for ( my $i = 0; $i <= $#{$packagelist}; $i++ )
86    {
87        my $line = ${$packagelist}[$i];
88
89        if ( $line =~ /^\s*\#/ ) { next; }  # comment line
90
91        if ( $line =~ /^\s*(\w+?)\s+(\S+?)\s+(\S+?)\s+(\w+?)\s*$/ )
92        {
93            my $product = $1;
94            my $compilerlist = $2;
95            my $languagelist = $3;
96            my $target = $4;
97
98            $product =~ s/\s//g;
99            $compilerlist =~ s/\s//g;
100            $languagelist =~ s/\s//g;
101            $target =~ s/\s//g;
102
103            my $compilers = convert_stringlist_into_array(\$compilerlist, ",");
104
105            # is the compiler of this "build" part of the compiler list in pack.lst ?
106
107            if ( packager::existence::exists_in_array($packager::globals::compiler, $compilers) )
108            {
109                # products are separated in pack.lst by "|"
110
111                my $languagesets = convert_stringlist_into_array(\$languagelist, "\|");
112
113                # now all information is available to create the targets for the systemcalls
114
115                for ( my $j = 0; $j <= $#{$languagesets}; $j++ )
116                {
117                    my $languagestring = ${$languagesets}[$j];
118                    $languagestring =~ s/\,/\_/g;   # comma in pack.lst becomes "_" in dmake command
119
120                    my $target = $target . "_" . $languagestring;
121                    push(@targets, $target);
122
123                    my $insertline = $target . "\n";
124                    push( @packager::globals::logfileinfo, $insertline);
125                }
126            }
127        }
128    }
129
130    return \@targets;
131}
132
133###########################################
134# Executing the generated system calls
135###########################################
136
137sub execute_system_calls
138{
139    my ( $targets ) = @_;
140
141    for ( my $i = 0; $i <= $#{$targets}; $i++ )
142    {
143        my $systemcall = "dmake " . ${$targets}[$i];
144
145        my $infoline = "Packager: $systemcall\n";
146        print $infoline;
147        push( @packager::globals::logfileinfo, $infoline);
148
149        my $returnvalue = system($systemcall);
150
151        $infoline = "Packager finished: $systemcall\n";
152        print $infoline;
153        push( @packager::globals::logfileinfo, $infoline);
154
155        if ( $returnvalue )
156        {
157            $infoline = "\nERROR: Packager $systemcall\n";
158            print $infoline;
159            push( @packager::globals::logfileinfo, $infoline);
160            if (!($packager::globals::ignoreerrors)) { packager::exiter::exit_program("ERROR: Packing not successful : $systemcall", "execute_system_calls"); }
161        }
162    }
163}
164
165##############################################################
166# Starting the build server with the generated system calls
167##############################################################
168
169sub start_build_server
170{
171    my ( $targets ) = @_;
172
173    # preparing the directory structure
174
175    my $prj = $ENV{PRJ};                # for example "..";
176    my $platform = $ENV{INPATH};        # wntmsci10.pro, unxsols4.pro
177    my $platformpath = $prj . $packager::globals::separator . $platform;
178    if ( ! -d $platformpath ) { packager::files::create_directory($miscpath); }
179    my $miscpath = $platformpath  . $packager::globals::separator . "misc";
180    if ( ! -d $miscpath ) { packager::files::create_directory($miscpath); }
181    $miscpath = $miscpath  . $packager::globals::separator . "temp";
182    if ( -d $miscpath ) { packager::files::remove_complete_directory($miscpath); }  # removing old files !
183    if ( ! -d $miscpath ) { packager::files::create_directory($miscpath); }
184
185    my $prjroot = ".." . $packager::globals::separator . ".." . $packager::globals::separator . ".." . $packager::globals::separator . ".."; # platform/misc/temp/uniquetempdir
186
187    my $makefilepath = $prj . $packager::globals::separator . "util" . $packager::globals::separator . "makefile.mk";
188
189    if ( ! $ENV{'PRJNAME'} ) { packager::exiter::exit_program("ERROR: Environment variable PRJNAME not set!", "do_broadcast"); }
190    my $prjname = $ENV{PRJNAME};
191
192    my $pkgformat = $ENV{PKGFORMAT};
193
194    my $prjdep = $prjname . "\\" . "util";  # always windows like path
195    my @targetdirs;
196    my @targetlines = ();
197    # iterating over all targets
198    for ( my $i = 0; $i <= $#{$targets}; $i++ )
199    {
200        my $target = ${$targets}[$i];
201        my $tempdir = $miscpath . $packager::globals::separator . $target;
202        $tempdir = packager::files::create_unique_directory ($tempdir);
203        @targetlines=();
204        push( @targetlines, "\ngenerated_target : $target\n\n");    # to be included into the makefile.mk
205
206        if ( defined $pkgformat ) {
207            push( @targetlines, "\n$target : ".'$$@{$(PKGFORMAT:^".")}'."\n\n");    # to be included into the makefile.mk
208        }
209
210        generate_makefile($tempdir, $makefilepath, $prjroot, $target, \@targetlines);
211
212        do_broadcast($tempdir, $prjname, $prj, $platform, $prjdep);
213        push @targetdirs, $tempdir;
214    }
215}
216
217##############################################################
218# Generating the makefile in the temporary directory
219##############################################################
220
221sub generate_makefile
222{
223    my ( $tempdir, $makefilepath, $prjroot, $target, $targetlines_ref ) = @_;
224
225    my $makefile = packager::files::read_file($makefilepath);
226
227    my @targetlines = ();
228    push( @targetlines, @{$targetlines_ref});   # to be included into the makefile.mk
229
230    $prjroot = $prjroot . "\n";
231
232    my $uniquename = $tempdir;
233    get_filename_from_path(\$uniquename);
234    $uniquename = $uniquename . "\n";
235
236    my $counter = 0;
237    my $increase = 1;
238
239    for ( my $i = 0; $i <= $#{$makefile}; $i++ )
240    {
241        if ( ${$makefile}[$i] =~ /^\s*TARGET\s*=.*/ ) { ${$makefile}[$i] = "TARGET=" . $uniquename; }   # setting the new project root
242
243        if ( ${$makefile}[$i] =~ /^\s*PRJ\s*=.*/ ) { ${$makefile}[$i] = "PRJ=" . $prjroot; }    # setting the new project root
244
245        if ( ${$makefile}[$i] =~ /^\s*\.INCLUDE[\t ]*:[\t ]*target.mk[\t ]*$/ ) { $increase = 0; }  # no more increase of the counter
246
247        if ( $increase ) { $counter++; }
248    }
249
250    splice(@{$makefile}, $counter, 0, @targetlines);    # including the new target lines at position $counter
251
252    my $newmakefilepath = $tempdir . $packager::globals::separator . "makefile.mk";
253    packager::files::save_file($newmakefilepath, $makefile);
254}
255
256##############################################################
257# Generating the broadcasts for the build server
258##############################################################
259
260sub do_broadcast
261{
262    use  File::Temp;
263
264    my ( $tempdir, $prjname, $prj, $platform, $prjdep ) = @_;
265
266    # Syntax:  cmd_bcst -s 18 "Version;Environment;Project;Verzeichnis;Restriction[;Abhaengigkeit1][;Abhaengigkeit n]..."
267    # Example: cmd_bcst -s 18 "SRC680;wntmsci10.pro;instsetoo_native;;instsetoo_native\bla1;instsetoo_native\util"
268
269    if ( ! $ENV{'WORK_STAMP'} ) { packager::exiter::exit_program("ERROR: Environment variable WORK_STAMP not set!", "do_broadcast"); }
270    my $workstamp = $ENV{WORK_STAMP};
271    my $cwsworkstamp = $ENV{CWS_WORK_STAMP};
272
273    my $prjdir = $tempdir;
274    $prjdir =~ s/$prj/$prjname/;
275    $prjdir =~ s/\//\\/g;                   # convert to windows path syntax
276
277    my $tempfiledir = $ENV{TMP};
278    $tempfiledir = $tempdir if ( ! defined $tempfiledir );
279    my ( $tmpfile_handle, $tmpfile_name ) = mkstemp( $tempfiledir . $packager::globals::separator . "packagerXXXXX");
280    if ( ! $tmpfile_handle ) {
281        packager::exiter::exit_program("ERROR: Couldn't open temporary file \"$tmpfile_name\"!", "do_broadcast");
282    }
283    if (defined($cwsworkstamp)) {
284        print $tmpfile_handle "\"$cwsworkstamp;$platform;$prjname;$prjdir;nobase;$prjdep\"";
285        print "to tmpfile: \"$cwsworkstamp;$platform;$prjname;$prjdir;nobase;$prjdep\"\n";
286    }
287    else {
288        print $tmpfile_handle "\"$workstamp;$platform;$prjname;$prjdir;nobase;$prjdep\"";
289        print "to tmpfile: \"$workstamp;$platform;$prjname;$prjdir;nobase;$prjdep\"\n";
290    }
291    close $tmpfile_handle;
292    my $returnvalue = system("cmd_bcst -s 18 \@$tmpfile_name");
293    print "cmd_bcst -s 18 \@$tmpfile_name\n";
294    unlink "$tmpfile_name";
295
296    if ( $returnvalue ) # an error occured
297    {
298        if (!($packager::globals::ignoreerrors)) { packager::exiter::exit_program("ERROR: Packing not successful!", "do_broadcast"); }
299    }
300}
301
302##############################################################
303# Returning the name of file or directory from complete path
304##############################################################
305
306sub get_filename_from_path
307{
308    my ($longfilenameref) = @_;
309
310    if ( $packager::globals::isunix )
311    {
312        if ( $$longfilenameref =~ /^.*\/(\S.+\S?)/ )
313        {
314            $$longfilenameref = $1;
315        }
316    }
317
318    if ( $packager::globals::iswin )
319    {
320        if ( $$longfilenameref =~ /^.*\\(\S.+\S?)/ )
321        {
322            $$longfilenameref = $1;
323        }
324    }
325}
326
3271;
328