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