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