source: soft/build_system/build_system/mkcd/tags/V3_0_4_1mdk/pm/Mkcd/Functions.pm @ 1

Last change on this file since 1 was 1, checked in by fasma, 12 years ago

Initial Import from Mandriva's soft revision 224062 and package revision 45733

File size: 45.7 KB
Line 
1package Mkcd::Functions;
2
3our $VERSION = '0.1.5';
4
5use strict;
6use File::Path;
7use Mkcd::Tools qw(cpal du checkDiscs imageSize printDiscsFile config readBatchFile log_);
8use Mkcd::Package qw(mkcd_build_hdlist);
9
10=head1 NAME
11
12Functions - mkcd module
13
14=head1 SYNOPSYS
15
16    require Mkcd::Functions;
17
18=head1 DESCRIPTION
19
20<Mkcd::Functions> include the disc building standard functions.
21
22=head1 SEE ALSO
23
24mkcd
25
26=head1 COPYRIGHT
27
28Copyright (C) 2000,2001 MandrakeSoft <warly@mandrakesoft.com>
29
30This program is free software; you can redistribute it and/or modify
31it under the terms of the GNU General Public License as published by
32the Free Software Foundation; either version 2, or (at your option)
33any later version.
34
35This program is distributed in the hope that it will be useful,
36but WITHOUT ANY WARRANTY; without even the implied warranty of
37MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38GNU General Public License for more details.
39
40You should have received a copy of the GNU General Public License
41along with this program; if not, write to the Free Software
42Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
43
44=cut
45use vars qw(%functions $config);
46# need to do it to have its address
47#my %functions = ();
48# [ function name, matching regexp, [arguments list (same as above)]]
49$functions{dir} =
50        [
51            ["","dir",2,"<directory name> <directory location>", "Set directory name",
52            sub {       my ($cd,$fn,$repname,$reploc) = @_;
53                my @a = ("dir", { repname => $repname, reploc => $reploc });
54                $config->{disc}[$cd]{function}{data}{dir}{$repname} and log_("WARNING: disc $cd: duplicate directory $repname ($reploc)\n",$config->{verbose},$config->{LOG});
55                $config->{disc}[$cd]{function}{list}[$fn] = \@a;
56                $config->{disc}[$cd]{function}{data}{dir}{$repname} = $reploc;
57                log_("dir: disc $cd rep $repname ($reploc)\n",$config->{verbose},$config->{LOG}) ;
58                push @{$config->{disc}[$cd]{steps}}, \@a;
59                1
60            }, "Setting directory" ]
61];
62#
63# generic options
64#
65# source => source dir
66#
67# done  => done
68#
69
70$functions{generic} =
71        [ 
72            # 0
73            ["","generic", 2, "<directory name> <list name>","Copy rpms from a list to a directory", 
74                sub {   my ($cd,$fn,$repname,$list) = @_; 
75                    my @a = ("generic", { repname => $repname, list => $list });
76                    $config->{disc}[$cd]{function}{data}{dir}{$repname} or log_("ERROR: disc $cd: $repname not defined\n",1,$config->{LOG});
77                    $config->{list}[$list] or log_("ERROR: lists $list does not exist, ignoring\n",1,$config->{LOG}) and return 0;
78                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
79                    push @{$config->{disc}[$cd]{function}{data}{generic}{$repname}}, \@a ;
80                    push @{$config->{disc}[$cd]{fastgeneric}}, \@a;
81                    push @{$config->{disc}[$cd]{steps}}, \@a;
82                    1
83                }, "Copying rpms to directory"],
84            # 1
85            ["s","source", [
86            [ "", "source", 0, "","Source mode configuration", 
87                sub {   my ($tmp) = @_;
88                    $tmp->[0]{source} = 1;
89                }, "Source mode"],
90# 2002 03 14 deprecated
91#           [ "p", "priority", 1, "<priority>","Set the repository priority", sub { my ($tmp,$prio) = @_; $tmp->[0]{priority} = $prio}, "Setting source repository priority"]
92            ], "[options]","Source mode setting", 
93                sub { my ($cd,$fn,$options) = @_; 
94                    foreach (keys %$options){ $config->{disc}[$cd]{function}{list}[$fn][1]{$_} = $options->{$_}}
95                    1
96                }, "Source mode option configuration"],
97            [ "", "synthesis", 0, "","Add synthesis file in the repository", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1 }, "Setting synthesis tag"],
98            [ "l", "limit", [
99                [ "", "limit", 1, "<limit>","Source mode configuration", 
100                    sub {       my ($tmp,$limit) = @_;
101                        $tmp->[0]{limit} = 1;
102                        $tmp->[0]{value} = $limit;
103                    }, "Limit mode"],
104                [ "s", "soft",0, "","Soft mode, do not limit size if disc is not full", sub { my ($tmp) = @_; $tmp->[0]{soft} = 1 } , "Setting soft limit flag"]
105           
106            ], "[options] <limit>","Limit the space of this directory on the disc", 
107                sub { my ($cd,$fn,$options) = @_; 
108                    $config->{disc}[$cd]{function}{list}[$fn][1]{limit} = $options
109                }, "Setting limit option"]
110        ];
111           
112           
113        #
114        # installation data
115        #
116        #       install => install source path
117        #
118        #       rpmsdir => rpm repositories list
119        #
120        #       bootimg => boot image
121        #
122        #       tag => tag
123        #
124        #       lang  => langage list
125        #
126        #       rpmsrate => rpmsrate file to use
127        #
128        #       compssUsers => compssUsers file to use
129        #
130        #       score => score weights
131        #
132        # Installation options
133        #
134        #       nosources
135        #
136        #       nosrcfit
137        #
138$functions{installation} = 
139        [ 
140        # 0
141            [ "", "installation", 0, "","Preparing the installation directory and dependencies files", 
142                sub {   my ($cd,$fn) = @_; 
143                    my @a = ('installation', { });
144                    ref $config->{disc}[$cd]{function}{data}{installation} and log_("ERROR: disc $cd: duplicate installation procedure, ignored\n",1,$config->{LOG}) and return 0;
145                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
146                    $config->{disc}[$cd]{function}{data}{installation} = \@a;
147                    push @{$config->{disc}[$cd]{steps}}, \@a;
148                    1
149                }, "Setting up installation files"],
150    # 1
151            [ "b", "bootimg", 1, "<boot image>","boot image for the cd", sub { my ($cd,$fn,$img) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{bootimg} = $img; 1}, "Setting boot image"],
152    # 2
153            [ "c", "compss", 1, "<compsUser file>", "Choose alternative compssUser file", sub { my ($cd,$fn,$compss) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{compssUsers} = $compss; 1 }, "Setting alternative compssUser file"],
154    # 3
155            [ "f", "fixed", [
156                ["", "fixed", -1, "<repository> <extra RPMS directory 1> <extra RPMS directory 2> ... <extra RPMS directory n>","Fixed repository option configuration", 
157                    sub {       my ($tmp,@arg) = @_;
158                        $tmp->[0]{fixed} = 1;
159                        push @$tmp, @arg;
160                        1
161                    },"Setting fixed option arguments"],
162                ["d", "dup", 0, "","Duplicate mode, accept to put package present in already done discs", sub { my ($tmp) = @_; $tmp->[0]{dup} = 1; 1 },"Setting duplicate mode"],
163                ["", "nodeps", 0, "","Do not handle other discs dependencies", sub { my ($tmp) = @_; $tmp->[0]{nodeps} = 1; 1 },"Setting nodeps mode"],
164                ["", "update", 0, "","Update mode, update already done packages", sub { my ($tmp) = @_; $tmp->[0]{update} = 1; 1 },"Setting update mode"]
165                ], "[options] <fixed dir 1> <fixed dir 2> ... <fixed dir n>","repositories that must not be computed but integrated in the installation group", 
166                    sub { my ($cd,$fn,$options,@fixed) = @_; 
167                    foreach (@fixed){
168                        my ($cdrep,$repname,$list) = m,(\d+)/([^/]+)(?:/(\d+))?,;
169                        push @{$config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir}}, [ $list, $cdrep, $repname, $options ]
170                    }
171                    $config->{disc}[$cd]{function}{list}[$fn][1]{fixed} = 1;
172                    1}, "Setting fixed option"],
173            # 4 
174            [ "l", "lang", 1, "<languages to include>","languages that are conisdered by the install", sub { my ($cd,$fn,$lang) = @_; my @l = split ',',$lang; push @{$config->{disc}[$cd]{function}{list}[$fn][1]{lang}},  @l; 1}, "Setting language supported"],
175            # 5
176            [ "i", "installdir", 1, "<installation directory source>","Installation directory source", sub { my ($cd,$fn,$dir) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{install} = $dir; 1}, "Setting install source directory"],
177            # 6
178            [ "", "nosources", 0, "","Do not add source rpm for this installation group", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nosources} = 1; 1}, "Setting nosources tag for this installation group"],
179            # 7
180            [ "", "nosrcfit", 0, "","Do not stop if sources discs are full", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nosrcfit} = 1; 1}, "Setting nosourcefit tag for this installation group"],
181            # 8
182            [ "o", "sortweight", 1, "<list of respective ordering weight (size,dependencies,rpmsrate)>","Set the weight for automatic sorting rules", sub { my ($cd,$fn,$weight) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{score} = [split ',', $weight]; 1}, "Setting sorting weights"],
183            # 9
184            [ "r", "rpmsrate", 1, "<rpmsrate file>", "Choose alternative rpmsrate", sub { my ($cd,$fn,$rpmsrate) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{rpmsrate} = $rpmsrate }, "Setting alternative rpmsrate file"],
185            # 10
186            [ "t", "tag name", 1, "<tag name>", "Tag added to the VERSION file", sub { my ($cd,$fn,$tag) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{tag} = $tag }, "Setting the tag name"],
187            # 11
188            [ "", "dup", 0, "", "Authorize duplicate version for this install", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{data}[$fn][1]{dup} = 1 }, "Setting the tag name"],
189            # 12
190            [ "", "nodeps", 0, "", "Do not include deps", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nodeps} = 1 }, "Setting nodeps flag for this installation"],
191            # 13
192            [ "", "isolinux", 0, "", "Isolinux mode", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{isolinux} = 1 }, "Build an isolinux install"],
193            # 14
194            [ "", "synthesis", 0, "","Add synthesis file in the repository", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1 }, "Setting synthesis tag"],
195            # 15
196            [ "", "sequential", 0, "","Build disc in a sequential way", sub { my ($cd,$fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{sequential} = 1 }, "Setting sequential tag"],
197            # 16
198            [ "", "oem", [
199                ["", "oem", 1, "[options] <rpms dir>","OEM mode configuration", 
200                    sub {       my ($tmp,@arg) = @_;
201                        $tmp->[0]{oem} = 1;
202                        push @$tmp, @arg;
203                        1
204                    },"Setting fixed option arguments"],
205                ["d", "dir", -1, "<installation dir> <root dir 1> ... <root dir n>","Create OEM disc based on existing directories list", 
206                    sub { 
207                        my ($tmp,$instdir,@dir) = @_; 
208                        $tmp->[0]{file} and log_("ERROR installation oem: could not use file and dir option in the same time, ignoring dir\n",1,$config->{LOG}) and return 0;
209                        log_("dir $instdir @dir\n",$config->{verbose},$config->{LOG});
210                        $tmp->[0]{instdir} = $instdir; 
211                        $tmp->[0]{dir} = \@dir; 
212                        1 },"Selecting directories"],
213                ["h", "hdlists", 1, "<hdlists to include>","Select hdlists to include (all if omitted)", sub { my ($tmp,$hdlists) = @_; $tmp->[0]{hdlists} = $hdlists; 1 },"Selecting hdlists to include"],
214                ["f", "file", 2, "<script file> <installation disc>","Script file describing the discs (generated with printscript)", 
215                    sub { 
216                        my ($tmp,$file,$instdisc) = @_; 
217                        $tmp->[0]{dir} and log_("ERROR installation oem: could not use file and dir option in the same time, ignoring file\n",1,$config->{LOG}) and return 0;
218                        $tmp->[0]{file} = $file;
219                        $tmp->[0]{instdisc} = $instdisc; 1 
220                    },"Setting update mode"],
221                ["l", "listfile", 1, "<list of package to choose>","Choose an alternative method to select package to select in OEM mode (default is to use packages with rate greater than 2 in rpmsrate ", sub { my ($tmp,$file) = @_; $tmp->[0]{file} = $file; 1 },"Selecting list file"],
222                ["n", "norebuild", 0, "","Do not rebuild hdlists", sub { my ($tmp,$file) = @_; $tmp->[0]{norebuild} = 1; 1 },"Setting no rebuilding flag"],
223                ["r", "rpmsrate", 1, "<rpmsrate file>","Rpmsrate file to use for OEM mode (use the installation one if omitted)", sub { my ($tmp,$rpmsrate) = @_; $tmp->[0]{rpmsrate} = $rpmsrate; 1 },"Setting rpmsrate file OEM file"]
224                ], "[options] <rpms dir>","OEM mode", 
225                    sub { my ($cd,$fn,$options,$rpmsdir) = @_; 
226                    $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = $options;
227                    if ($options->{dir}){
228                        my $list = @{$config->{list}};
229                        $config->{list}[$list]{prelist} = [
230                                [ "INSTALL", { section => 1, force => 1 }],
231                                [ ".*", { section => 4, regexp => 1 }]
232                                        ];
233                        log_("installation oem: adding list $list for OEM mode\n",$config->{verbose},$config->{LOG});
234                        my $hdlists = "$options->{instdir}/Mandrake/base/hdlists";
235                        local *A; open A,$hdlists or die "ERROR oem: could not open hdlists $hdlists file"; 
236                        my $i;
237                        while (<A>){
238                            my ($hdlist,$rep,$mname) = /(\S+)\s+(\S+)\s+(.*)/ or next;
239                            log_("$i -- $hdlist -- $rep -- $options->{dir}[$i]\n",$config->{verbose},$config->{LOG});
240                            $options->{dir}[$i] or last;
241                            push @{$options->{hdlist}}, [ "$options->{instdir}/Mandrake/base/", $hdlist, $rep, $mname ];
242                            push @{$config->{list}[$list]{packages}}, [ "$options->{dir}[$i]/$rep" ];
243                            $i++
244                        }
245                        foreach ($rpmsdir){
246                            my ($cdrep,$repname) = m,^(\d+)/([^/]+)$,;
247                            my $gfn = @{$config->{disc}[$cdrep]{function}{list}};
248                            log_("installation oem: adding function $gfn for generic oem packages on cd $cdrep\n",$config->{verbose},$config->{LOG});
249                            $functions{generic}[0][5]($cdrep,$gfn,$repname,$list);
250                            if ($cd == $cdrep){
251                                # FIXME trick to have this generic function done before the installation
252                                my $a = pop @{$config->{disc}[$cdrep]{steps}};
253                                unshift @{$config->{disc}[$cdrep]{steps}}, $a
254                            }
255                            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir}}, [ $list, $cdrep, $repname, { oem => 1 } ];
256                        }
257                    }elsif ($options->{file}){
258                        my $oemconfig;
259                        config($options->{file},$oemconfig,\%functions);
260                        my ($discsFiles) = readBatchFile($options->{file}) or log_("ERROR installation oem: cannot read script file $options->{file}\n",1,$config->{LOG}) and return 0;
261                        my $list = @{$config->{list}};
262                        log_("installation oem: adding list $list for OEM mode\n",$config->{verbose},$config->{LOG});
263                        foreach (@{$config->{list}}){
264                            $_ or next;
265                            push @{$config->{list}[$list]{packages}}, @{$_->{packages}}
266                        }
267                        my $gfn = @{$config->{disc}[$cd]{function}{list}};
268                        $config->{list}[$list]{prelist} = [[ ".*", { section => 3, regexp => 1 }]];
269                        log_("installation oem: adding function $gfn for generic oem packages\n",$config->{verbose},$config->{LOG});
270                        $functions{generic}[0][5]($cd,$gfn,"rpms",$list);
271                    }else{
272                        log_("ERROR installation oem: no disc to build OEM on (either file or dir option are needed)\n",1,$config->{LOG});
273                        $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = 0;
274                        return 0
275                    }
276                    1}, "Setting oem option"],
277            # 17
278            [ "s", "sources", -1, "<srpms directory name 1> <srpms directory name 2> ... <srpms directory name n>","Select the sources list where to put packages", 
279                sub { my ($cd,$fn,@sources) = @_; 
280                    foreach (@sources){
281                        my ($cdrep,$repname,$list) = m,(\d+)/([^/]+)(?:/(\d+))?,;
282                        push @{$config->{disc}[$cd]{function}{list}[$fn][1]{srpmsdir}}, [ $list, $cdrep, $repname ]
283                    }
284                    $config->{disc}[$cd]{function}{list}[$fn][1]{sources} = 1;
285                    1}, "Setting fixed option"],
286            # 18
287            [ "d", "rpmsdir", -1, "<rpms directory name 1> <rpms directory name 2> ... <rpms directory name n>","Select rpms dir to take into account", 
288                sub {   my ($cd,$fn,@rpms) = @_; 
289                    my @rpmsdir;
290                    foreach (@rpms){
291                        my ($cdrep,$repname,$list) = m,(\d+)/([^/]+)(?:/(\d+))?,;
292                        push @{$config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir}}, [ $list, $cdrep, $repname ]
293                    }
294                    1
295                }, "Setting rpms dir"]];
296#
297#
298# advertising option
299#
300#    img
301#    lang (new advertising mode in 8.2 deprecates this option)
302#   
303
304$functions{advertising} =
305        [
306            [ "", "advertising", -1, "<picture 1> <picture 2> ... <picture n>", "Setting the advertising pictures used by the installation", 
307                sub { my ($cd,$fn,@img) = @_;
308                    my @a = ('advertising',{ img => \@img });   
309                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
310                    push @{$config->{disc}[$cd]{function}{data}{advertising}}, \@a;
311                    push @{$config->{disc}[$cd]{steps}}, \@a
312                }, "Setting the advertising pictures"],
313         [ "l", "lang", 1, "<language>", "Set the advertising picture language", sub { my ($cd,$fn,$lang) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{lang} = $lang; 1}, "Setting the picture language"]
314];
315
316#
317# cdcom data
318#
319#      dir
320#
321#      source
322#
323$functions{cdcom} =
324         [
325            [ "", "cdcom", 2, "<directory name> <disc directory location>", "Commercial disc",
326                sub { my ($cd,$fn,$dir,$source) = @_;
327                    my @a = ('cdcom',{ dir => $dir, source => $source });
328                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
329                    push @{$config->{disc}[$cd]{function}{data}{cdcom}}, \@a;
330                    my $list = @{$config->{list}};
331                    log_("cdcom: disc $cd adding list $list for $source/Mandrake/RPMS\n",$config->{verbose},$config->{LOG});
332                    $config->{list}[$list]{packages} = [[ "$source/Mandrake/RPMS" ]];
333                    $config->{list}[$list]{prelist} = [[ ".*", { regexp => 1 }]];
334                    #$config->{list}[$list]{done} = 1;
335                    push @{$config->{disc}[$cd]{fastgeneric}}, [ '', { repname => $dir ,list => $list }];
336                    push @{$config->{disc}[$cd]{steps}}, \@a;
337                    1
338                }, "Configuring a commercial disc"],
339            [ "d", "dest", 1, "<destination on the disc>", "Select the destination directory on the disc", sub { my ($cd,$fn,$dest) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{dest} = $dest; 1}, "Selecting destination directory"]
340];
341#
342# cp
343#
344$functions{cp} =
345        [
346            [ "", "cp", 2, "<file source> <file destination>", "Copy",
347                sub { my ($cd,$fn,$src,$dest) = @_;
348                    my @a = ('cp',{ src => $src, dest => $dest });
349                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
350                    push @{$config->{disc}[$cd]{function}{data}{cp}}, \@a;
351                    push @{$config->{disc}[$cd]{steps}}, \@a;
352                    1
353        }, "Copying files"]
354];
355 #
356 # isolinux
357 #
358$functions{isolinux} = 
359    [ 
360    # 0
361        [ "", "isolinux", 1, "<source dir of the isolinux files","Create an isolinux bootable disc", 
362            sub {   my ($cd,$fn,$source) = @_; 
363                    my @a = ('isolinux', { isolinux => $source });
364                    ref $config->{disc}[$cd]{function}{data}{isolinux} and log_("ERROR: disc $cd: duplicate isolinux procedure, ignored\n",1,$config->{LOG}) and return 0;
365                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
366                    $config->{disc}[$cd]{function}{data}{isolinux} = \@a;
367                    push @{$config->{disc}[$cd]{steps}}, \@a;
368                    1
369          }, "Setting an isolinux boot disc"],
370          # 1
371        [ "b", "bootimg", 1, "<isolinux boot file>","boot file for isolinux", sub { my ($cd,$fn,$img) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{bootimg} = $img; 1}, "Setting isolinux boot file"],
372];
373 #
374 # boot
375 #
376$functions{boot} = 
377    [ 
378    # 0
379        [ "", "boot", 0, "<options> <files or dir to copy 1> <files or dir to copy 2> .. <files or dir to copy 3>","Boot parameters and files", 
380            sub {   my ($cd,$fn) = @_; 
381                    my @a = ('boot', { });
382                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
383                    push @{$config->{disc}[$cd]{function}{data}{boot}}, \@a;
384                    push @{$config->{disc}[$cd]{steps}}, \@a;
385                    1
386          }, "Setting boot parameters"
387        ],
388          # 1
389        [ "", "isolinux", [
390                ["", "isolinux", 1, "<isolinux directory>", "Create an isolinux bootable disc", 
391                    sub {       my ($tmp,@args) = @_;
392                        $tmp->[0]{isolinux} = 1;
393                        push @$tmp, @args
394                    },"Setting an isolinux boot disc"],
395                ], "<options> <isolinux directory>","isolinux boot disc", 
396                    sub { my ($cd,$fn,$options,$dir) = @_; 
397                        foreach (@{ $config->{disc}[$cd]{function}{data}{boot}}){
398                                ref $_->[1]{isolinux} and log_("ERROR: disc $cd: duplicate isolinux boot image, ignored\n",1,$config->{LOG}) and return 0;
399                        }
400                        $config->{disc}[$cd]{function}{list}[$fn][1]{isolinux} =  [$dir,$options]
401                    }, "Setting isolinux image"
402        ],
403          #2
404        [ "b", "bootimg", [
405            [ "", "bootimg", 1, "<boot image name>","set boot image name",
406                    sub { my ($tmp,@args) = @_;
407                        $tmp->[0]{bootimg} = 1;
408                        push @$tmp, @args
409                    }, "setting boot image name"
410            ],
411            [ "d", "dir", 1, "<directory>", "duplicate the boot image in directory and put it first in the ISO",
412               sub { my ($tmp,$dir) = @_; $tmp->[0]{dir} = $dir }, ""   
413            ]
414                ], "<options> <boot image>", "Create a bootable iso with given image", 
415                    sub { my ($cd,$fn,$options,$img) = @_;
416                        foreach (@{ $config->{disc}[$cd]{function}{data}{boot}}){
417                                ref $_->[1]{bootimg} and log_("ERROR: disc $cd: duplicate boot image, ignored\n",1,$config->{LOG}) and return 0;
418                        }
419                        $config->{disc}[$cd]{function}{list}[$fn][1]{bootimg} = [$img,$options]
420                    },"Setting boot image options"
421        ],
422          #3
423        [ "d", "dest", [
424                [ "", "dest", -2, "<destination> <file 1> <file 2> .. <file n>","Set options for files copied to a given destination",
425                    sub{ my ($tmp, @args) = @_;
426                        $tmp->[0]{dest} = $args[0];
427                        push @$tmp, @args
428                   
429                    },"Setting dest options"],
430                [ "f", "first", 0 , "", "Put this files first in the ISO", sub { my ($tmp) = @_; $tmp->[0]{first} = 1; 1}, "Setting first flag for files"]
431            ], "[options] <destination> <files 1> <files 2> .. <files n>","Copy files to a special destination", 
432                sub { my ($cd,$fn,$options, @files) = @_; 
433                    foreach (@files){
434                        push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_, $options ]
435                    }
436                }, 
437            "Setting isolinux boot file"
438            ],
439          #4
440        [ "f", "files", -1, "<file 1> <file 2> <file 3>","Files to copy", 
441            sub { my ($cd,$fn,@files) = @_; 
442                foreach (@files){
443                    push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_ ]
444                }; 1
445            }, "files to copy"
446        ],
447          #5
448        [ "", "first", -1, "<file 1> <file 2> <file 3>","Set first flag to put files in the beginning of the ISO", 
449            sub { my ($cd,$fn,@files) = @_; 
450                foreach (@files){
451                    push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_, { first => 1 } ]
452                }
453            }, "Setting first flag"
454        ]
455];
456
457sub new {
458    my ($class, $conf) = @_;
459    $config = $conf;
460    bless {
461        config       => $conf,
462        functions    => \%functions
463    }, $class;
464}
465
466
467sub template {
468    my ($class,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft,$discFile) = @_;
469    if (!$fixed){
470        my $size;
471        if ($nolive){
472            return $size
473        }else {
474        }
475    }elsif ($fixed == 1){
476        my $mkiso;
477        if ($nolive){
478        }else {
479        }
480    }elsif ($fixed == 2){
481        my $mkiso;
482        if ($nolive){
483        }else {
484        }
485    }   
486}
487
488sub cp {
489    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft) = @_;
490    if (!$fixed){
491        my $size;
492        my $source = $fct->[1]{src};
493        my $dest = $fct->[1]{dest};
494        if ($nolive){
495            $size += du($source);
496            log_("cp: copying $source => $dest (size $size)\n",$config->{verbose},$config->{LOG});
497            $graft->{"/$dest"}{$source} = 1;
498            return $size
499        }else {
500            cpal($source, "$dir/$cdnum/$dest");
501            $graft->{"$dir/$cdnum/$dest"}{$source} = 1;
502            return
503        }
504    }
505}
506
507sub cdcom {
508    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft) = @_;
509    if (!$fixed){
510        my $size;
511        my $source = $fct->[1]{source};
512        my $dest = $config->{disc}[$cdnum]{function}{data}{dir}{$fct->[1]{dir}};
513        my $destination = $fct->[1]{dest};
514        my $uppath = $destination;
515        $uppath =~ s,([^/]+),../,g;
516        $uppath =~ s,/+,/,g;
517        log_("DEST: $destination uppath $uppath dest $dest\n",$config->{verbose},$config->{LOG});
518        my $fdest = "$dir/$cdnum/$destination";
519        if ($nolive){
520            my $path = "$dir/$cdnum/$dest";
521            -d $path or mkpath "$path";
522            local *A; opendir A, "$source";
523            log_("cdcom: $source\n",$config->{verbose},$config->{LOG});
524            foreach (readdir A){
525                /^\.{1,2}$/ and next;
526                if (! /^Mandrake$/){
527                    $size += du("$source/$_");
528                    log_("cdcom: adding $_ (size $size)\n",$config->{verbose},$config->{LOG});
529                    $graft->{"/$destination/$_/"}{"$source/$_"} = 1
530                }else {
531                    $graft->{"/$dest/"}{"$source/Mandrake/RPMS/"} = 1
532                }
533            }
534            local *A; opendir A, "$source/Mandrake/RPMS";
535            foreach (readdir A){
536                /^\.{1,2}$/ and next;
537                my $newdest = readlink "$source/Mandrake/RPMS/$_";
538                $newdest =~ s,((?:../))*(.*),$1/$destination/$2,;
539                log_("cdcom: creating symlink $dest/$_ => $newdest\n",$config->{verbose},$config->{LOG});
540                my $err = symlink $newdest, "$dir/$cdnum/$dest/$_";
541                !$err and log_("ERROR cdcom: $!\n",1,$config->{LOG}) and next;
542                $graft->{"/$dest/"}{"$dir/$cdnum/$dest/$_"} = 1
543            }
544            log_("cdcom: creating symlink $uppath$dest => $fdest/RPMS\n",$config->{verbose},$config->{LOG});
545            my $err = symlink "$uppath$dest", "$fdest/RPMS";                                           
546            !$err and log_("ERROR cdcom: $!\n",1,$config->{LOG});
547            $graft->{"/"}{"$fdest/RPMS"} = 1;
548            return $size
549        }else {
550            -f $fdest or mkpath $fdest;
551            cpal($source, $fdest, "Mandrake/RPMS");
552            local *A; opendir A, "$source/Mandrake/RPMS";
553            foreach (readdir A){
554                /^\.{1,2}$/ and next;
555                my $newdest = readlink "$source/Mandrake/RPMS/$_";
556                $newdest =~ s,((?:../)*)(.*),$1$destination/$2,;
557                log_("cdcom: creating symlink $dest/$_ => $newdest\n",$config->{verbose},$config->{LOG});
558                my $err = symlink $newdest, "$dir/$cdnum/$dest/$_";
559                !$err and log_("ERROR cdcom: $!\n",1,$config->{LOG})
560            }
561            log_("cdcom: creating symlink $uppath$dest => $fdest/RPMS\n",$config->{verbose},$config->{LOG});
562            my $err = symlink "$uppath$dest", "$fdest/RPMS";                                           
563            !$err and log_("ERROR cdcom: $!\n",1,$config->{LOG});
564            return
565        }
566    }
567}
568
569sub printSize {
570    my ($img,$file) = @_;
571    local *A; open A, ">$file";
572    my $size = imageSize("$img");
573    log_("printSize: creating $file for $img\n",$config->{verbose},$config->{LOG}) ;
574    if ($size) {
575        print A <<EOF
576#!/usr/bin/perl
577
578\$width = $size->[0];
579\$height = $size->[1];
580\@data = ()
581EOF
582        ;
583    }else{
584        print "ERROR advertising: $size/n";
585        return 0
586    }
587}
588
589sub advertising {
590    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft) = @_;
591    if (!$fixed){
592        my $size;
593        if ($nolive){
594            log_("Getting advertising images size\n",$config->{verbose},$config->{LOG});
595            my $addir = "Mandrake/share/advertising" . ($fct->[1]{lang} ? ".$fct->[1]{lang}" : "");
596            my $rep = "$dir/$cdnum/$addir";
597            -d "$rep" or mkpath "$rep";
598            local *L; open L, ">$rep/list";
599            foreach (@{$fct->[1]{img}}){
600                s/\.png$//;
601                my ($name) = /([^\/]*)$/;
602                $size += du($_);
603                print L "$name\n";
604                if (-f "$_.png") { $graft->{"$addir/$name.png"}{"$_.png"} = 1 } else { next }
605                if (-f "$_.pl") { $graft->{"$addir/$name.pl"}{"$_.pl"} = 1
606                } else {
607                    printSize("$_.png","$rep/$name.pl");
608                    $graft->{"$addir/$name.pl"}{"$_.pl"} = 1
609                }
610                -f "${_}_icon.png" and $graft->{"$addir/$name-icon.png"}{"${_}_icon.png"} = 1
611            } 
612            close L;
613            $graft->{"$addir/list"}{"$rep/list"} = 1;
614            $size += du("$rep/list");
615            return $size
616        }else {
617            log_("Creating advertising images directory\n",$config->{verbose},$config->{LOG});
618            my $rep = "$dir/$cdnum/Mandrake/share/advertising" . ($fct->[1]{lang} ? ".$fct->[1]{lang}" : "");
619            -d "$rep" or mkpath "$rep";
620            local *L; open L, ">$rep/list";
621            foreach (@{$fct->[1]{img}}){
622                s/\.png$//;
623                my ($name) = /([^\/]*)$/;
624                if (-f "$_.png") { cpal("$_.png","$rep/$name.png") } else { next }
625                if (-f "$_.pl") { cpal("$_.pl","$rep/$name.pl") } else { printSize("$_.png","$rep/$name.pl") }
626                -f "${_}_icon.png" and cpal("${_}_icon.png","$rep/${name}_icon.png");
627                print L "$name.png\n"
628            }
629            close L;
630            return
631        }
632    }
633}
634
635sub dir {
636    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd) = @_;
637    if (!$fixed){
638        if ($nolive){
639            return 0
640        }else {
641            my $reploc = "$dir/$cdnum/$fct->[1]{reploc}";
642            log_("dir: creating $reploc\n",$config->{verbose},$config->{LOG});
643            -d $reploc or mkpath $reploc;
644            return 0   
645        }
646    }
647}
648
649sub generic {
650    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft,$discFiles) = @_;
651    if ($fixed){
652        my $rep = $fct->[1]{repname};
653        my $list = $fct->[1]{list};
654        log_("generic: rep $rep\n",$config->{verbose},$config->{LOG});
655        my $reploc = "$dir/$cdnum/$cd->{function}{data}{dir}{$rep}/";
656        if ($nolive){
657            my $size;
658            if ($fixed == 1){
659                #local *A; open A, ">>$dir/$cdnum.list";
660                foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}){
661                    log_("generic: src $src\n",$config->{verbose},$config->{LOG});
662                    foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}){
663                        if ($_->[0] == 1){
664                            $graft->{"$cd->{function}{data}{dir}{$rep}/$_->[1]"}{"$src/$_->[1]"} = 1
665                            # print A "$cd->{function}{data}{dir}{$rep}/$_->[1]=$src/$_->[1]\n";
666                        }
667                    }
668                }
669                close A
670            }elsif ($fixed == 2){
671                my %todo;
672                foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}){
673                    log_("generic: src $src\n",$config->{verbose},$config->{LOG});
674                    foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}){
675                        if ($_->[0] == 1){
676                            push @{$todo{add}} , "$cd->{function}{data}{dir}{$rep}/$_->[1]=$src/$_->[1]"
677                        }elsif ($_->[0] == 2){
678                            $todo{del}{"$cd->{function}{data}{dir}{$rep}/$_->[1]=$src/$_->[1]"} = 1
679                        }
680                    }
681                }
682                link "$dir/$cdnum.list", "$dir/$cdnum.list.tmp";
683                unlink "$dir/$cdnum.list";
684                local *A; open A, "$dir/$cdnum.list.tmp";
685                local *B; open B, ">>$dir/$cdnum.list";
686                while (<A>){
687                    chomp;
688                    if (!$todo{del}{$_}) { print B "$_\n" }
689                }
690                close A;
691                foreach (@{$todo{add}}){
692                    print B "$_\n"
693                }
694                close B
695            }
696            if ($fct->[1]{synthesis} || $fct->[1]{hdlist}){
697                buildGenericHdlist($dir,$cdnum,$fct,$rep,$reploc,$discFiles->[$cdnum]{$rep}{$list});
698                if ($fct->[1]{hdlist}){
699                    $size += du ("$dir/$cdnum/$reploc/hdlist$cdnum$rep.cz");
700                    $graft->{"Mandrake/base/hdlist$cdnum$rep.cz"}{"$reploc/hdlist$cdnum$rep.c"} = 1
701                }
702                if ($fct->[1]{synthesis}){
703                    $size += du ("$dir/$cdnum/$reploc/synthesis.hdlist$cdnum$rep.cz");
704                    $graft->{"$cd->{function}{data}{dir}{$rep}/synthesis.hdlist$cdnum$rep.cz"}{"$reploc/synthesis.hdlist$cdnum$rep.cz"} = 1
705                }
706            }
707            return $size
708        }else {
709            foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}){
710                log_("generic: src $src\n",$config->{verbose},$config->{LOG});
711                foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}){
712                    if ($_->[0] == 1){
713                        cpal("$src/$_->[1]",$reploc)   
714                    }elsif ($_->[1] == 2){
715                        unlink "$reploc/$_->[1]";
716                    }
717                }
718            }
719            if ($fct->[1]{synthesis} || $fct->[1]{hdlist}){
720                buildGenericHdlist($dir,$cdnum,$fct,$rep,$reploc,$discFiles->[$cdnum]{$rep}{$list});
721            }
722            return 0
723        }
724    }
725}
726
727sub printVERSION {
728    my ($name,$file, $tag) = @_;
729    local *A; open A, ">$file";
730    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
731    $year += 1900;
732    printf A "Mandrake Linux $name $tag %04d%02d%02d $hour:%02d\n", $year, $mon+1, $mday, $min;
733}
734
735sub buildGenericHdlist{
736    my ($dir,$cdnum,$fct,$rep,$reploc,$discFilescdrep,$hdlist) = @_;
737    my @rpm = map { "$discFilescdrep->{$_}/$_.rpm" } keys %{$discFilescdrep};
738
739    if ($fct->[1]{synthesis}){
740        -d $reploc or mkpath "$reploc";
741    }
742    $hdlist = "$reploc/hdlist$cdnum$rep.cz" if $fct->[1]{hdlist};
743    my $synthesis = "$reploc/synthesis.hdlist$cdnum$rep.cz" if $fct->[1]{synthesis};
744    mkcd_build_hdlist(1,[ 0, { hdlist => $hdlist, rpm => \@rpm , synthesis => $synthesis } ],"$config->{tmp}/.mkcd_build_hdlist");
745}
746
747sub buildInstallHdlist{
748    my ($dir,$cdnum,$inst,$list,$discsFiles) = @_;
749    my (@hdlist, @hdlist_list);
750    -d "$dir/$cdnum/Mandrake/base/" or mkpath "$dir/$cdnum/Mandrake/base/";
751    local *A; open A, ">$dir/$cdnum/Mandrake/base/hdlists";
752    my %rpmdone;
753    my $repnum = 1;
754    my (@thisInstallRep, @check);
755    my $headers_dir = "$config->{tmp}/.mkcd_build_hdlist";
756    my $path = "$dir/$cdnum/Mandrake/base";
757    foreach my $rd (@{$inst->[1]{rpmsdir}}){
758        my ($ls,$cdrep,$repname,$opts) = @$rd;
759        $list->{$cdrep} or log_("WARNING buildInstallHdlist: disc $cdrep not in list, ignoring\n",$config->{verbose},$config->{LOG}) and next;
760        my $a = $discsFiles->[$cdrep]{$repname};
761        if (!(ref $a && %$a)){ log_("WARNING buildInstallHdlist: $cdrep/$repname is empty\n",$config->{verbose},$config->{LOG}) ; next }
762        my $realcd = $config->{disc}[$cdrep]{name};
763        my $rpmdir = $config->{disc}[$cdrep]{function}{data}{dir}{$repname};
764        $rpmdir or log_("ERROR buildInstallHdlist: disc $cdrep: $repname not defined\n",1,$config->{LOG}) and next;
765        if ($opts->{oem}){
766            log_("buildInstallHdlist: oem mode for $cdrep/$repname ($rpmdir)\n",$config->{verbose},$config->{LOG});
767            foreach (@{$inst->[1]{oem}{hdlist}}){
768                my ($oemdir,$hl,$rep,$name) = @$_;
769                print A "$hl $rep $name\n";
770                my $hdlist = "$path/$hl";
771                log_("buildInstallHdlist: adding oem hdlist $hdlist from $dir\n",$config->{verbose},$config->{LOG});
772                if ($inst->[1]{oem}{norebuild}){
773                    cpal("$oemdir/$hl",$hdlist)
774                }
775                $hdlist[$repnum]{hdlist} = $hdlist;
776                $hdlist_list[$repnum] = $hdlist;
777                $hdlist[$repnum]{synthesis} = "$path/synthesis.$hl";
778                $repnum++
779            }
780        }else{
781            log_("BUILDING $cdrep -- $repname -- $rpmdir\n",$config->{verbose},$config->{LOG});
782            if ($realcd){
783                print A "hdlist$repnum.cz $rpmdir disc $realcd $config->{disc}[$cdrep]{longname}\n";
784            }else{
785                print A "hdlist$repnum.cz $rpmdir $config->{disc}[$cdrep]{longname}\n";
786            }
787            $hdlist[$repnum]{hdlist} = "$path/hdlist$repnum.cz";
788            $hdlist_list[$repnum] = "$path/hdlist$repnum.cz";
789            $hdlist[$repnum]{synthesis} = "$path/synthesis.hdlist$repnum.cz" if $inst->[1]{synthesis};
790            #
791            # even for live sources rpm are taken, this may lead to errors in some special case, where
792            # the sources change after the live is created, but this could help in combined live/nolive
793            # situation
794            #
795            foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}){
796                next if $ls && $ls == $list;
797                $thisInstallRep[$cdrep]{$repname}{$list} = $discsFiles->[$cdrep]{$repname}{$list};
798                push @{$check[$repnum]}, [$cdrep,$repname,$list];
799                my $cdsfilesrpms = $discsFiles->[$cdrep]{$repname}{$list};
800                if ($opts->{update}){
801                    my %localdone;
802                    log_("buildInstallHdlist: update mode for $cdrep/$repname list $list\n",$config->{verbose},$config->{LOG});
803                    push @{$hdlist[$repnum]{rpms}}, map { /(.*)-[^-]+-[^-]+\.[^.]+$/; $rpmdone{$_} = 1; $rpmdone{$1} = 1;  "$cdsfilesrpms->{$_}/$_.rpm" } grep { /(.*)-[^-]+-[^-]+\.[^.]+$/; if ($localdone{$1}) { 0 } else { $localdone{$1} = 1; ! $rpmdone{$_} } } keys %{$cdsfilesrpms};
804                } else {
805                    my %localdone;
806                    log_("buildInstallHdlist: normal mode for $cdrep/$repname list $list\n",$config->{verbose},$config->{LOG});
807                    push @{$hdlist[$repnum]{rpms}}, map { /(.*)-[^-]+-[^-]+\.[^.]+$/; $rpmdone{$_} = 1; $rpmdone{$1} = 1;  "$cdsfilesrpms->{$_}/$_.rpm" } grep { /(.*)-[^-]+-[^-]+\.[^.]+$/; if ($localdone{$1}) { 0 } else { $localdone{$1} = 1; ! ($rpmdone{$_} || $rpmdone{$1})} } keys %{$cdsfilesrpms};
808                }
809            }
810            log_("installation: $cdrep - $repname\n",$config->{verbose},$config->{LOG});
811            $repnum++
812        }
813    }
814    # FIXME OEM mode not tested, moreover this norebuild test is wrong, new URPM need to rebuild hdlist.
815    if (!$inst->[1]{oem}{norebuild}){
816        mkcd_build_hdlist($repnum - 1,\@hdlist,$headers_dir,"$path/depslist.ordered","$path/provides","$path/compss");
817    }
818
819    checkDiscs(\@hdlist_list,"$path/depslist.ordered",\@thisInstallRep,\@check,$config->{LOG}) or die "depslist.ordered, hdlists and RPMS mismatch\n";
820    # Add sources
821    foreach my $rd (@{$inst->[1]{srpmsdir}}){
822        my ($ls,$cdrep,$repname,$opts) = @$rd;
823        $list->{$cdrep} or log_("WARNING buildInstallHdlist: disc $cdrep not in list, ignoring\n",$config->{verbose},$config->{LOG}) and next;
824        foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}){
825            next if $ls && $ls == $list;
826            $thisInstallRep[$cdrep]{$repname}{$list} = $discsFiles->[$cdrep]{$repname}{$list};
827        }
828    }
829    my $pfile = "$dir/$cdnum/pkg-$config->{name}" . ($inst->[1]{tag} ? "-$inst->[1]{tag}" : "") . ".idx";
830    printDiscsFile($config,\@thisInstallRep,$pfile);
831   
832    return ($repnum,$path,$pfile);
833}
834#
835# deprecated
836#
837sub isolinux {
838    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft,$discsFiles) = @_;
839    my $isolinux = $fct->[1]{isolinux};
840    my $bootimg = $fct->[1]{bootimg} ? $fct->[1]{bootimg} : "isolinux.bin";
841    if (!$fixed){
842        my $size;
843        if ($nolive){
844            my $mkiso;
845            $mkiso .= qq( -b isolinux/$bootimg -c isolinux/boot.cat isolinux/=$isolinux/$bootimg -no-emul-boot -boot-load-size 4 -boot-info-table $mkisos->[$cdnum]);
846            $graft->{"isolinux/"}{"$isolinux/$bootimg"} = 1;
847            $graft->{"isolinux/boot.cat"} = 0;
848            $size += du($isolinux);
849            local *A; opendir A, $isolinux;
850            foreach (readdir A){
851                /~$/ and next;
852                $size += du ("$isolinux/$_");
853                # if (-d "$isolinux/$_"){ $mkiso .= " /$_/=$isolinux/$_"; next }
854                # $mkiso .= " /=$isolinux/$_"
855                if (-d "$isolinux/$_"){ $graft->{"/$_/"}{"$isolinux/$_"} = 1; next }
856                $graft->{"/"}{"$isolinux/$_"} = 1
857            }
858            $mkisos->[$cdnum] .= " $mkiso";
859        }else{
860            my $isolinuxdest = "$dir/isolinux/$cdnum/isolinux/";
861            rmtree $isolinuxdest;
862            -d $isolinuxdest or mkpath $isolinuxdest;
863            cpal("$isolinux/", $isolinuxdest);
864            $graft->{"/"}{"$isolinuxdest"} = 1;
865            $size = du($isolinuxdest);
866        }
867        return $size
868    }else{
869        if (!$nolive){
870            if ($bootimg){
871                $mkisos->[$cdnum] = qq| -b isolinux/$bootimg -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table "$config->{topdir}/build/$config->{name}/isolinux/$cdnum" "$config->{topdir}/build/$config->{name}/$cdnum"|;
872                $graft->{"/"}{"$config->{topdir}/build/$config->{name}/isolinux/$cdnum"} = 1;
873                $graft->{"/"}{"$config->{topdir}/build/$config->{name}/$cdnum"} = 1;
874                $graft->{"/isolinux/boot.cat"} = 0;
875            }
876        }
877    }
878
879}
880
881sub boot {
882    my ($class,$fct,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft,$discsFiles) = @_;
883    my $isolinux = $fct->[1]{isolinux};
884    my $bootimg = $fct->[1]{bootimg};
885    log_("Boot: $fixed nolive $nolive\n",$config->{verbose},$config->{LOG});
886    if (!$fixed){
887        my $size;
888        if ($nolive){
889            my $mkiso;
890            my $img;
891            my $dir;
892            my $path;
893            if ($isolinux){
894                my $dir = $isolinux->[0];
895                my $img = $bootimg ? $bootimg->[0] : "isolinux/isolinux.bin"; 
896                $mkiso = qq( -b $img -c $dir/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table);
897                $graft->{"$dir/boot.cat"} = 0;
898                $graft->{"/isolinux/isolinux.bin"} = 0
899            }elsif ($bootimg){
900                $img = $bootimg->[0];
901                $dir = $bootimg->[1]{dir};
902                $img =~ s/(.*)\/([^\/]+)$/$2/;
903                $dir or ($dir) = $1;
904                $mkiso = qq( -b $dir/$img -c ${dir}/boot.cat);
905                $graft->{"$dir/boot.cat"} = 0
906            }
907            foreach (@{$fct->[1]{files}}){
908                my ($files,$opt) = @$_;
909                my $dest = $opt->{dest};
910                $size += du ($files);
911                my ($dirname) = $files =~ /([^\/]*)$/;
912                log_("boot: files $files dest $dest dirname $dirname\n",$config->{verbose},$config->{LOG});
913                if ($img) { 
914                    my $bimg = $bootimg->[0];
915                    $bimg =~ s/^$dirname//;
916                    log_("boot: boot image $files/$bimg in $dir/$img (",(stat "$files/$bimg")[7],")\n",$config->{verbose},$config->{LOG});
917                    if (-f "$files/$bimg") { 
918                        if ((stat "$files/$bimg")[7] > 3000000){ 
919                            $mkiso .= qq( -no-emul-boot)
920                        }
921                        # $mkiso .= qq( $dir/$img=$files/$bimg)
922                        $graft->{"$dir/$img"}{"$files/$bimg"} = 1
923                    }
924                }
925                # if (-d "$files"){ $mkiso .= " $dest/$dirname/=$files"; next }
926                # $mkiso .= " $dest/=$files";
927                if (-d "$files"){ $graft->{"$dest/$dirname/"}{"$files"} = 1; next }
928                $graft->{"$dest/"}{"$files"} = 1
929            }
930            # it is = and not .= because mkcdisos->[$cdnum] has been added already at the beginning
931            $mkisos->[$cdnum] = "$mkiso $mkisos->[$cdnum]";
932        }else{
933            log_("FILES $fct->[1]{files}\n",$config->{verbose},$config->{LOG});
934            foreach (@{$fct->[1]{files}}){
935                my ($files,$opt) = @$_;
936                log_("boot: file $files\n",$config->{verbose},$config->{LOG});
937                my $dest = "$config->{topdir}/build/$config->{name}/" . ($opt->{first} ? "first/" : "") . "$cdnum/";
938                -d $dest or mkpath $dest;
939                my $odest = $opt->{dest};
940                if ($odest){
941                    $dest .= "/$odest";
942                    if ($odest =~ /\/$/) { mkpath $dest }
943                }else{
944                    my ($dirname) = $files =~ /([^\/]*)$/;
945                    $dest .= "/$dirname"
946                }
947                cpal($files,$dest)
948            }
949            $graft->{"/"}{"$dir/first/$cdnum/"} = 1;
950            $size = du("$dir/first/$cdnum/");
951        }
952        return $size
953    }else{
954        if (!$nolive){
955            if ($isolinux){
956                my $dir = $isolinux->[0];
957                my $img = $bootimg ? $bootimg->[0] : "isolinux/isolinux.bin"; 
958                $mkisos->[$cdnum] .= qq| -b $img -c $dir/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table "$config->{topdir}/build/$config->{name}/first/$cdnum"|;
959                $graft->{"/isolinux/isolinux.bin"} = 0;
960                $graft->{"$dir/boot.cat"} = 0
961            }elsif ($bootimg){
962                my $img = $bootimg->[0];
963                my $sdir = $bootimg->[1]{dir};
964                $img =~ s/(.*\/)([^\/]+)$/$2/;
965                $sdir or ($sdir) = $1;
966                log_("boot: boot image $sdir/$img\n",$config->{verbose},$config->{LOG});
967                $mkisos->[$cdnum] .= qq(-b $sdir/$img);
968                if ((stat "$img")[7] > 3000000){ 
969                    $mkisos->[$cdnum] .= qq( -no-emul-boot)
970                }
971                my $cdimages = "$dir/$cdnum/";
972                my $Bootdir = "$dir/first/$cdnum/$sdir/";
973                if (! -f "$Bootdir/$img") {
974                    if (! -d $Bootdir) { mkpath $Bootdir or die "cannot create $Bootdir\n" }
975                    my $err = link "$cdimages/$bootimg->[0]","$Bootdir/$img";
976                    if (!$err) { log_("Linking failed $cdimages/$bootimg->[0]: $!\n",$config->{verbose},$config->{LOG})};
977                }
978                $mkisos->[$cdnum] .= qq( -c $sdir/boot.cat $dir/first/$cdnum);
979                $graft->{"$sdir/boot.cat"} = 0;
980                log_("BOOT $mkisos->[$cdnum]\n",$config->{verbose},$config->{LOG});
981            }
982        }
983    }
984}
985
986sub installation {
987    my ($class,$inst,$dir,$fixed,$nolive,$cdnum,$cd,$cdfile,$list,$mkisos,$graft,$discsFiles) = @_;
988    my $install = $inst->[1]{install};
989    if (!$fixed){
990        $install or return;
991        my $size;
992        if ($nolive){
993            local *A; opendir A, "$install";
994            foreach (readdir A){
995                /~$/ and next;
996                /^(\.{1,2}|Mandrake|LICENSE-APPS.txt|isolinux|images|VERSION)$/ and next;
997                $size += du ("$install/$_");
998                # if (-d "$install/$_"){ $mkiso .= " /$_/=$install/$_"; next }
999                # $mkiso .= " /=$install/$_"
1000                if (-d "$install/$_"){ $graft->{"/$_/"}{"$install/$_"} = 1; next }
1001                $graft->{"/"}{"$install/$_"} = 1
1002            }
1003
1004            local *A; opendir A, "$install/Mandrake";
1005            foreach (readdir A){
1006                log_("Mandrake -- $_\n",$config->{verbose},$config->{LOG});
1007                /~$/ and next;
1008                /(^(\.{1,2}|base)$|RPMS|share)/ and next;
1009                $size += du ("$install/Mandrake/$_");
1010                # if (-d "$install/Mandrake/$_") { $mkiso .= " Mandrake/$_/=$install/Mandrake/$_"; next }
1011                # $graft->{"Mandrake/"}{"$install/Mandrake/$_"} = 1;
1012                if (-d "$install/Mandrake/$_") { $graft->{"Mandrake/$_/"}{"$install/Mandrake/$_"} = 1; next }
1013                $graft->{"Mandrake/"}{"$install/Mandrake/$_"} = 1;
1014            }
1015
1016            local *A; opendir A, "$install/Mandrake/base";
1017            foreach (readdir A){
1018                /~$/ and next; 
1019                /(^(\.{1,2}|compss|provides|depslist.ordered|synthesis|compssUsers|rpmsrate|rpmslist|filelist|Serial|hashfile)|hdlist|cooker)/ and next;
1020                $size += du ("$install/Mandrake/base/$_");
1021                # if (-d "$install/Mandrake/base/$_"){ $mkiso .= " Mandrake/base/$_/=$install/Mandrake/base/$_"; next}
1022                # $mkiso .= " Mandrake/base/=$install/Mandrake/base/$_";
1023                if (-d "$install/Mandrake/base/$_"){ $graft->{"Mandrake/base/$_/"}{"$install/Mandrake/base/$_"} = 1; next}
1024                $graft->{"Mandrake/base/"}{"$install/Mandrake/base/$_"} = 1
1025            }
1026            my $compss = $cd->{function}{data}{installation}[1]{compssUsers} || "$install/Mandrake/base/compssUsers";
1027            if (-f $compss){ 
1028                $size += du ($compss);
1029                # $mkiso .= " Mandrake/base/compssUsers=$compss"
1030                $graft->{"Mandrake/base/compssUsers"}{"$compss"} = 1
1031            } else { log_("ERROR installation: $compss file does not exist",1,$config->{LOG}) }
1032        }else {
1033            cpal("$install/","$dir/$cdnum","($install/+(Mandrake/+base/+(hdlist|depslist|synthesis|rpmslist|filelist|Serial|hashfile|compssUsers|rpmsrate)|Mandrake/+RPMS|Mandrake/+share|isolinux|images|tutorial|misc|doc|LICENSE-APPS.txt))");
1034            if (!$inst->[1]{oem}) {
1035                cpal("$install/tutorial","$dir/$cdnum/tutorial") if -d "$install/tutorial";
1036                cpal("$install/misc","$dir/$cdnum/misc") if -d "$install/misc";
1037                cpal("$install/doc","$dir/$cdnum/doc") if -d "$install/doc";
1038            }
1039            my $compss = $cd->{function}{data}{installation}[1]{compssUsers} || "$install/Mandrake/base/compssUsers";
1040            if (-f $compss){
1041                log_("installation: compssUsers $compss\n",$config->{verbose},$config->{LOG});
1042                cpal($compss,"$dir/$cdnum/Mandrake/base/compssUsers");
1043            }else { log_("ERROR installation: $compss file does not exist",1,$config->{LOG}) }
1044        }
1045        return $size
1046    }elsif ($fixed == 1){
1047        if ($nolive){
1048            my $size;
1049            my ($repnum,$path,$pfile) = buildInstallHdlist($dir, $cdnum,$inst,$list,$discsFiles);
1050            if ($install){
1051                my $rpmsrate = $cd->{function}{data}{installation}[1]{rpmsrate} || "$install/Mandrake/base/rpmsrate";
1052                # $mkiso = " Mandrake/base/=$path/compss Mandrake/base/=$path/depslist.ordered Mandrake/base/=$path/provides Mandrake/base/=$path/hdlists /=$pfile";
1053                $graft->{"Mandrake/base/"}{"$path/compss"} = 1;
1054                $graft->{"Mandrake/base/"}{"$path/depslist.ordered"} = 1; 
1055                $graft->{"Mandrake/base/"}{"$path/provides"} = 1;
1056                $graft->{"Mandrake/base/"}{"$path/hdlists"} = 1;
1057                $graft->{"/"}{"$pfile"} = 1;
1058                if (-f $rpmsrate){
1059                    $size += du ($rpmsrate);
1060                    # $mkiso .= " Mandrake/base/rpmsrate=$rpmsrate"
1061                    $graft->{"Mandrake/base/rpmsrate"}{"$rpmsrate"} = 1
1062                } else { log_("ERROR installation: $rpmsrate file does not exist",1,$config->{LOG}); return 0 }
1063                $size += du("$path/compss");
1064                $size += du("$path/depslist.ordered");
1065                $size += du("$path/provides");
1066                $size += du($pfile);
1067                my $version = "$dir/$cdnum/VERSION";
1068                printVERSION($config->{name},$version,$inst->[1]{tag});
1069                # $mkiso .= " VERSION=$version";
1070                $graft->{VERSION}{$version} = 1;
1071                $size += du($version); 
1072                $size += du("$path/hdlists");
1073            }   
1074            foreach my $n (1 .. $repnum - 1){
1075                # $mkiso .= " Mandrake/base/=$path/hdlist$n.cz";
1076                $graft->{"Mandrake/base/"}{"$path/hdlist$n.cz"} = 1;
1077                $size += du("Mandrake/base/=$path/hdlist$n.cz");
1078                if ($inst->[1]{synthesis}){
1079                    # $mkiso .= " Mandrake/base/=$path/synthesis.hdlist$n.cz";
1080                    $graft->{"Mandrake/base/"}{"$path/synthesis.hdlist$n.cz"} = 1;
1081                    $size += du("Mandrake/base/=$path/synthesys.hdlist$n.cz")
1082                }
1083            }
1084            return $size;
1085        } else {
1086            if (!$install){ mkpath "$dir/$cdnum/Mandrake/base/" }
1087            unlink "$dir/$cdnum/Mandrake/base/hdlists";
1088            buildInstallHdlist($dir, $cdnum,$inst,$list,$discsFiles);
1089            if ($install){
1090                my $rpmsrate = $cd->{function}{data}{installation}[1]{rpmsrate} || "$install/Mandrake/base/rpmsrate";
1091                if (-f $rpmsrate){
1092                    log_("installation: rpmsrate: $rpmsrate\n",$config->{verbose},$config->{LOG});
1093                    cpal($rpmsrate,"$dir/$cdnum/Mandrake/base/rpmsrate");
1094                }else { log_("ERROR installation: $rpmsrate file does not exist",1,$config->{LOG}); return 0 }
1095                my $version = "$dir/$cdnum/VERSION";
1096                unlink $version;
1097                printVERSION($config->{name},$version,$inst->[1]{tag});
1098            }
1099        }
1100    }
1101}
1102
1103
11041
1105
1106#
1107# Changeloh
1108#
1109# 2002 03 15
1110# new sources handling in installation
1111#
1112# 2002 03 19
1113# cdcom are now build as normal ones not to force deps, use standard list
1114#
1115# 2002 03 29
1116# fix a bug in nolive mode that prevent rpmsrate to be put on discs
1117#
1118# 2002 05 13
1119# finish md5 check
1120# fix commented du in sub installation
Note: See TracBrowser for help on using the repository browser.