tools/debmaker.pl
author Igor Pashev <igor.pashev@nexenta.com>
Thu, 13 Oct 2011 18:18:33 +0400
changeset 446 44ca7c055bea
child 466 c0df6d8c64ab
permissions -rw-r--r--
Integrated debmaker.pl
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
446
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     1
#!/usr/bin/env perl
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     2
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     3
use strict;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     4
use warnings FATAL => 'all';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     5
use integer;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     6
use Data::Dumper;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     7
use Getopt::Long qw(:config no_ignore_case);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     8
use File::Copy;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
     9
use Text::Wrap;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    10
use File::Basename;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    11
use Cwd;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    12
use POSIX qw(strftime);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    13
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    14
sub blab {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    15
    print 'debmaker: ', @_, "\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    16
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    17
sub warning {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    18
    blab 'WARNING: ', @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    19
    sleep 2;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    20
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    21
sub fatal {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    22
    blab 'FATAL: ', @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    23
    exit 1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    24
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    25
sub my_chdir {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    26
    my ($path) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    27
    chdir $path or fatal "Can't chdir() to `$path': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    28
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    29
sub my_symlink {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    30
    my ($src, $dst) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    31
    symlink $src, $dst
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    32
        or fatal "Can't create symlink `$src' -> `$dst': $!"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    33
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    34
sub my_hardlink {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    35
    my ($src, $dst) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    36
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    37
    # For harlink creating target file must be accessible:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    38
    my $pwd = getcwd;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    39
    my $dir = dirname $dst;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    40
    my_chdir $dir;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    41
    link $src, $dst
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    42
        or fatal "Can't create hardlink `$src' -> `$dst': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    43
    my_chdir $pwd;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    44
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    45
sub my_copy {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    46
    my ($src, $dst) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    47
    copy $src, $dst
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    48
        or fatal "Can't copy `$src' to `$dst': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    49
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    50
sub my_chown {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    51
    my ($u, $g, $path) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    52
    my $uid = getpwnam $u;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    53
    my $gid = getgrnam $g;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    54
    chown $uid, $gid, $path
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    55
         or fatal "Can't chown ($u.$g) `$path': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    56
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    57
sub my_chmod {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    58
    my ($mode, $path) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    59
    chmod oct($mode), $path
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    60
        or fatal "Can't chmod ($mode) `$path': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    61
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    62
sub my_mkdir {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    63
    my ($path, $mode) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    64
    if (defined $mode) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    65
        mkdir $path, oct($mode)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    66
            or fatal "Can't create dir `$path' with mode `$mode': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    67
    } else{
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    68
        mkdir $path
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    69
            or fatal "Can't create dir `$path': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    70
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    71
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    72
sub uniq {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    73
    my ($array_ref) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    74
    my %hash = map { $_, 1 } @$array_ref;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    75
    @$array_ref = keys %hash;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    76
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    77
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    78
sub shell_exec {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    79
    my ($cmd) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    80
    blab "executing `$cmd'";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    81
    system($cmd);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    82
    if ($? == -1) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    83
        fatal "failed to execute: $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    84
    } elsif ($? & 127) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    85
        fatal (printf "child died with signal %d, %s coredump",
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    86
            ($? & 127),  ($? & 128) ? 'with' : 'without')
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    87
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    88
        my $rc = $? >> 8;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    89
        if ($rc != 0) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    90
            warning "child exited with value $rc";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    91
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    92
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    93
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    94
sub get_command_line {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    95
    my ($map_ref, $hash_ref) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    96
    my $res = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    97
    foreach my $k (keys %$map_ref) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    98
        $res .= " $$map_ref{$k} '$$hash_ref{$k}'" if exists $$hash_ref{$k};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
    99
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   100
    return $res;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   101
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   102
sub write_file {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   103
    my ($filename, $content) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   104
    blab "Writing file `$filename'";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   105
    if (open FD, '>', $filename) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   106
        print FD $content;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   107
        close FD;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   108
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   109
        fatal "Can't write to file `$filename': $!"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   110
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   111
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   112
sub write_script {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   113
    my ($filename, $content) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   114
    $content = "#!/bin/sh\nset -e\n$content";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   115
    write_file $filename, $content;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   116
    my_chmod '0555', $filename;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   117
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   118
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   119
sub get_output {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   120
    my ($cmd) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   121
    if (open OUT, "$cmd |") {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   122
        my @lines = <OUT>;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   123
        close OUT;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   124
        chomp @lines;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   125
        warning "Empty output from `$cmd'" unless @lines;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   126
        return \@lines;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   127
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   128
        fatal "Can't execute `$cmd': $!"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   129
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   130
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   131
sub get_output_line {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   132
    return (@{get_output @_})[0];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   133
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   134
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   135
sub trim {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   136
    # works with refs:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   137
    $$_ =~ s/^\s*(.*)\s*$/$1/ foreach @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   138
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   139
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   140
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   141
# Expected input for @PROTO_DIRS:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   142
# -d /root/oi-build/components/elinks/build/prototype/i386/mangled
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   143
# -d /root/oi-build/components/elinks/build/prototype/i386
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   144
# -d .
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   145
# -d /root/oi-build/components/elinks
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   146
# -d elinks-0.11.7
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   147
# (like debian/tmp)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   148
my @PROTO_DIRS = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   149
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   150
# Where to create debs prototypes
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   151
# (like debian/pkg-name)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   152
my $DEBS_DIR = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   153
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   154
# If true, will use manifests from command line
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   155
# to resolve dependencies:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   156
my $BOOTSTRAP = 0;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   157
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   158
my $MAINTAINER = 'Nexenta Systems <[email protected]>';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   159
my $VERSION = '0.0.0';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   160
my $ARCH = 'solaris-i386';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   161
my $SOURCE = 'xxx'; # only for *.changes
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   162
my $DISTRIB = 'unstable'; # only for *.changes
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   163
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   164
# Mapping file => IPS FMRI, filled on bootstrap:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   165
my %PATHS = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   166
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   167
GetOptions (
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   168
    'd=s' => \@PROTO_DIRS,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   169
    'D=s' => \$DEBS_DIR,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   170
    'V=s' => \$VERSION,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   171
    'A=s' => \$ARCH,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   172
    'M=s' => \$MAINTAINER,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   173
    'S=s' => \$SOURCE,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   174
    'N=s' => \$DISTRIB,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   175
    'bootstrap!' => \$BOOTSTRAP,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   176
    'help|h' => sub {usage()},
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   177
) or usage();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   178
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   179
sub usage {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   180
    print <<USAGE;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   181
Usage: $0 [options] -D <output dir> -d <proto dir> [-d <proto dir> ... ] manifests
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   182
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   183
Options:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   184
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   185
    -d <proto dir>     where to find files (like debian/tmp)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   186
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   187
    -D <output dir>    where to create package structure and debs,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   188
                       <output dir>/pkg-name and
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   189
                       <output dir>/pkg-name*.deb will be created
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   190
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   191
    -V <version>       version of created packages (default is `$VERSION'),
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   192
                       may be 'ips' to use the same as for IPS system.
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   193
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   194
    -A <architecture>  package architecture, default is `$ARCH'
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   195
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   196
    -S <source name>   package source name to make reprepro happy
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   197
                       with *.changes files, default is `$SOURCE'
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   198
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   199
    -N <dist name>     distribution  name to make reprepro happy
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   200
                       with *.changes files, default is `$DISTRIB'
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   201
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   202
    -M <maintainer>    Package maintainer - mandatory for debs,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   203
                       default is `$MAINTAINER'
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   204
   
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   205
    --bootstrap        Search for dependencies within listed manifests,
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   206
                       not within installed system (for bootstraping)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   207
                       ** not implemented yet **
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   208
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   209
    -h, --help         Show help info
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   210
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   211
USAGE
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   212
    exit 1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   213
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   214
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   215
sub parse_keys {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   216
    my ($line) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   217
    # parse:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   218
    # name=pkg.summary value="advanced text-mode WWW browser"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   219
    # into:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   220
    # 'name' => pkg.summary
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   221
    # 'value' => "advanced text-mode WWW browser"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   222
    # http://stackoverflow.com/questions/168171/regular-expression-for-parsing-name-value-pairs
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   223
    # TODO: add support for dublicates: dir=dir1 dir=dir2
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   224
    my %pairs = ($line =~ m/((?:\\.|[^= ]+)*)=("(?:\\.|[^"\\]+)*"|(?:\\.|[^ "\\]+)*)/g);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   225
    foreach my $k (keys %pairs) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   226
        $pairs{$k} =~ s/^"(.+)"$/$1/;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   227
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   228
    return \%pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   229
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   230
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   231
sub read_manifest {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   232
    my ($filename) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   233
    my %data = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   234
    $data{'dir'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   235
    $data{'file'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   236
    $data{'link'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   237
    $data{'hardlink'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   238
    $data{'depend'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   239
    $data{'legacy'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   240
    $data{'group'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   241
    $data{'user'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   242
    $data{'license'} = [];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   243
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   244
    if (open IN, '<', $filename) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   245
        while (<IN>) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   246
            study; chomp;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   247
            if (/^set +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   248
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   249
                $data{$$pairs{'name'}} = $$pairs{'value'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   250
            } elsif (/^dir +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   251
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   252
                push @{$data{'dir'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   253
            } elsif (/^file +(\S+) +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   254
                my $maybe_src = $1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   255
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   256
                $$pairs{'src'} = $maybe_src if $maybe_src ne 'NOHASH';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   257
                push @{$data{'file'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   258
            } elsif (/^link +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   259
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   260
                push @{$data{'link'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   261
            } elsif (/^hardlink +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   262
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   263
                push @{$data{'hardlink'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   264
            } elsif (/^depend +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   265
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   266
                push @{$data{'depend'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   267
            } elsif (/^legacy +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   268
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   269
                push @{$data{'legacy'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   270
            } elsif (/^group +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   271
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   272
                push @{$data{'group'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   273
            } elsif (/^user +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   274
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   275
                push @{$data{'user'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   276
            } elsif (/^license +(\S+) +/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   277
                my $maybe_src = $1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   278
                my $pairs = parse_keys $_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   279
                $$pairs{'src'} = $maybe_src if $maybe_src !~ /=/;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   280
                push @{$data{'license'}}, $pairs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   281
            } elsif (/^\s*$/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   282
                # Skip empty lines
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   283
            } elsif (/^\s*#/) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   284
                # Skip comments
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   285
            } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   286
                warning "Unknown action: `$_'";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   287
            }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   288
            # TODO:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   289
            # user - to create users (in postinstall?)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   290
            # restart_fmri - restart SMF
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   291
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   292
        close IN;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   293
        return \%data;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   294
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   295
        fatal "Can't open `$filename': $!";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   296
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   297
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   298
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   299
sub get_debpkg_names {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   300
#    pkg:/web/browser/[email protected],5.11-1.1
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   301
# => web-browser-elinks
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   302
#        browser-elinks
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   303
#                elinks
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   304
    my ($fmri) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   305
    my @names = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   306
    if ($fmri =~ m,^(?:pkg:/)?([^@]+)(?:@.+)?$,) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   307
        my $pkg = $1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   308
        my @parts = split /\//, $pkg;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   309
        while (@parts) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   310
            push @names, (join '-', @parts);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   311
            shift @parts;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   312
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   313
        return @names;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   314
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   315
        fatal "Can't parse FMRI to get dpkg name: `$fmri'";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   316
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   317
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   318
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   319
sub get_ips_version {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   320
#    pkg:/web/browser/[email protected],5.11-1.1
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   321
# => 0.11.5-5.11-1.1
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   322
    my ($fmri) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   323
    if ($fmri =~ m,^(?:pkg:/)?[^@]+@(.+)$,) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   324
        my $ips = $1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   325
        $ips =~ s/[,:]/-/g;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   326
        return $ips;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   327
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   328
        fatal "Can't parse FMRI to get IPS version: `$fmri'";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   329
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   330
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   331
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   332
sub get_pkg_section {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   333
    my ($pkgname) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   334
    if ($pkgname =~ m,^([^-@]+)-.*,) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   335
        return (split /-/, $pkgname)[0];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   336
    } elsif ($pkgname =~ m,^pkg:/([^/]+)/.*,) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   337
        return $1;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   338
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   339
        fatal "Can't get section for package `$pkgname'"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   340
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   341
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   342
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   343
sub get_dir_size {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   344
    my ($path) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   345
    # We get size just after files are copied
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   346
    # and need sync() to get proper sizes:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   347
    my $out = get_output("sync && du -sk $path | cut -f 1");
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   348
    return $$out[0];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   349
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   350
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   351
sub find_pkgs_with_paths {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   352
    my @paths = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   353
    s,^/+,,g foreach @paths;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   354
    my $dpkg = get_output('dpkg-query --search -- ' . join(' ',  @paths) . ' | cut -d: -f1');
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   355
    return $dpkg;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   356
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   357
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   358
sub guess_required_deps {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   359
    my ($path) = @_;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   360
    my $elfs = get_output("find $path -type f -exec file {} \\; | grep ELF | cut -d: -f1");
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   361
    my @deps = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   362
    if (@$elfs) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   363
    #   my $libs = get_output('ldd ' . join(' ', @$elfs) . ' | grep "=>"');
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   364
        my $libs = get_output('elfdump -d ' . join(' ', @$elfs) . ' | grep NEEDED | awk \'{print $4}\'');
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   365
        uniq $libs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   366
        my $pkgs = find_pkgs_with_paths @$libs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   367
        push @deps, @$pkgs;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   368
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   369
    return \@deps;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   370
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   371
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   372
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   373
if (!$DEBS_DIR) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   374
    fatal "Output dir is not set. Use -D option."
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   375
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   376
if (! -d $DEBS_DIR) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   377
    fatal "Not a directory: `$DEBS_DIR'"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   378
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   379
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   380
# Walk through all manifests
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   381
# and collect files, symlinks, hardlink
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   382
# mapping them to package names:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   383
if ($BOOTSTRAP) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   384
    blab "Bootstrap: collecting paths ...";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   385
    foreach my $manifest_file (@ARGV) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   386
        my $manifest_data = read_manifest $manifest_file;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   387
        my $fmri = $$manifest_data{'pkg.fmri'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   388
        my @items = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   389
        if (my @files = @{$$manifest_data{'file'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   390
            push @items, @files;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   391
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   392
        if (my @symlinks = @{$$manifest_data{'link'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   393
            push @items, @symlinks;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   394
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   395
        if (my @hardlinks = @{$$manifest_data{'hardlink'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   396
            push @items, @hardlinks;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   397
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   398
        foreach my $item (@items) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   399
            my $path = $$item{'path'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   400
            if (exists $PATHS{$path}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   401
                warning "`$path' already present in `$PATHS{$path}' and now found in `$fmri' (manifest `$manifest_file')"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   402
            } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   403
                $PATHS{$path} = $fmri;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   404
            }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   405
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   406
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   407
    blab 'Bootstrap: ' . (keys %PATHS) . ' known paths'
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   408
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   409
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   410
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   411
my %changes = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   412
$changes{'Date'} = strftime '%a, %d %b %Y %T %z', localtime; # Sat, 11 Jun 2011 17:08:17 +0200
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   413
$changes{'Architecture'} = $ARCH;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   414
$changes{'Format'} = '1.8';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   415
$changes{'Maintainer'} = $MAINTAINER;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   416
$changes{'Source'} = lc $SOURCE;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   417
$changes{'Version'} = $VERSION;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   418
$changes{'Distribution'} = $DISTRIB;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   419
$changes{'Changes'} = 'Everything has changed';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   420
$changes{'Description'} = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   421
$changes{'Checksums-Sha1'} = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   422
$changes{'Checksums-Sha256'} = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   423
$changes{'Files'} = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   424
$changes{'Binary'} = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   425
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   426
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   427
foreach my $manifest_file (@ARGV) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   428
    blab "****** Manifest: `$manifest_file'";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   429
    my $manifest_data = read_manifest $manifest_file;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   430
    my @provides = get_debpkg_names $$manifest_data{'pkg.fmri'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   431
    my $debname = shift @provides; # main name (web-browser-elinks)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   432
    my $debsection = get_pkg_section $debname;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   433
    my $debpriority = exists $$manifest_data{'pkg.priority'} ?  $$manifest_data{'pkg.priority'} : 'optional';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   434
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   435
    foreach my $l (@{$$manifest_data{'legacy'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   436
        push @provides, $$l{'pkg'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   437
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   438
    my $provides_str = join(', ', @provides);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   439
    my $pkgdir = "$DEBS_DIR/$debname";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   440
    blab "Main package name: $debname";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   441
    blab "Other names: $provides_str";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   442
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   443
    my $ipsversion = get_ips_version $$manifest_data{'pkg.fmri'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   444
    my $debversion = undef;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   445
    if ($VERSION eq 'ips') {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   446
        blab "Using IPS version scheme: $ipsversion";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   447
        $debversion = $ipsversion;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   448
    } else {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   449
        blab "Using given version: $VERSION";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   450
        $debversion = $VERSION;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   451
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   452
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   453
    # Make sure to work with empty tree:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   454
    # mkdir will fail if dir exists
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   455
    my_mkdir $pkgdir;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   456
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   457
    # Believe that dirs are listed in proper order:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   458
    # usr, usr/bin, etc
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   459
    if (my @dirs = @{$$manifest_data{'dir'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   460
        blab "Making dirs ...";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   461
        foreach my $dir (@dirs) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   462
            my $dir_name = "$pkgdir/$$dir{'path'}";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   463
            my_mkdir $dir_name, $$dir{'mode'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   464
            my_chown $$dir{'owner'}, $$dir{'group'}, $dir_name;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   465
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   466
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   467
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   468
    my @conffiles = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   469
    if (my @files = @{$$manifest_data{'file'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   470
        blab "Copying files ...";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   471
        foreach my $file (@files) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   472
            my $dst = "$pkgdir/$$file{'path'}";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   473
            my $src = exists $$file{'src'} ? $$file{'src'} : $$file{'path'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   474
            # find $src in @PROTO_DIRS:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   475
            my $src_dir = undef;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   476
            foreach my $d (@PROTO_DIRS) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   477
                # http://stackoverflow.com/questions/2238576/what-is-the-default-scope-of-foreach-loop-in-perl
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   478
                $src_dir = $d;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   479
                last if -f "$src_dir/$src";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   480
            }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   481
            fatal "file `$src' not found in ", join(', ', @PROTO_DIRS)
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   482
                unless $src_dir;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   483
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   484
            $src = "$src_dir/$src";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   485
            my_copy $src, $dst;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   486
            my_chown $$file{'owner'}, $$file{'group'}, $dst;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   487
            my_chmod $$file{'mode'}, $dst;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   488
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   489
            push @conffiles, $$file{'path'} if exists $$file{'preserve'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   490
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   491
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   492
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   493
    if (my @hardlinks = @{$$manifest_data{'hardlink'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   494
        blab "Creating hardlinks ...";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   495
        foreach my $link (@hardlinks) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   496
            my_hardlink $$link{'target'}, "$pkgdir/$$link{'path'}";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   497
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   498
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   499
    if (my @symlinks = @{$$manifest_data{'link'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   500
        blab "Creating symlinks ...";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   501
        foreach my $link (@symlinks) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   502
            my_symlink $$link{'target'}, "$pkgdir/$$link{'path'}";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   503
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   504
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   505
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   506
    if (my @license = @{$$manifest_data{'license'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   507
        # FIXME: install in usr/share/doc/<pkg>/copyright
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   508
        # what are the owner, permissions?
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   509
        # multiple licenses?
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   510
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   511
    my $installed_size = get_dir_size($pkgdir);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   512
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   513
    my @depends = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   514
    my @predepends = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   515
    my @recommends = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   516
    my @conflicts = ();
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   517
    blab "Getting dependencies ...";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   518
    foreach my $dep (@{$$manifest_data{'depend'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   519
        if ($$dep{'fmri'} ne '__TBD') {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   520
            my $dep_pkg = (get_debpkg_names($$dep{'fmri'}))[0];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   521
            blab "Dependency: $dep_pkg ($$dep{'type'})";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   522
            push @depends,    $dep_pkg if $$dep{'type'} eq 'require';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   523
            push @predepends, $dep_pkg if $$dep{'type'} eq 'origin';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   524
            # push @recommends, $dep_pkg if $$dep{'type'} eq 'optional';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   525
            push @conflicts,  $dep_pkg if $$dep{'type'} eq 'exclude';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   526
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   527
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   528
    push @depends, @{guess_required_deps($pkgdir)};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   529
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   530
    uniq \@depends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   531
    # When a program and a library are in the same package:
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   532
    @depends = grep {$_ ne $debname} @depends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   533
    uniq \@predepends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   534
    uniq \@recommends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   535
    uniq \@conflicts;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   536
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   537
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   538
    my $control = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   539
    $control .= "Package: $debname\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   540
    $control .= "Source: $changes{Source}\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   541
    $control .= "Version: $debversion\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   542
    $control .= "Section: $debsection\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   543
    $control .= "Priority: $debpriority\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   544
    $control .= "Maintainer: $MAINTAINER\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   545
    $control .= "Architecture: $ARCH\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   546
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   547
    $control .= "Description: $$manifest_data{'pkg.summary'}\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   548
    $changes{'Description'} .= "\n $debname - $$manifest_data{'pkg.summary'}";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   549
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   550
    $control .= wrap(' ', ' ', $$manifest_data{'pkg.description'}) . "\n"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   551
        if exists $$manifest_data{'pkg.description'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   552
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   553
    $control .= "Provides: $provides_str\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   554
    $control .= 'Depends: ' . join(', ', @depends) . "\n" if @depends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   555
    $control .= 'Pre-Depends: ' . join(', ', @predepends) . "\n" if @predepends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   556
    $control .= 'Recommends: ' . join(', ', @recommends) . "\n" if @recommends;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   557
    $control .= 'Conflicts: ' . join(', ', @conflicts) . "\n" if @conflicts;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   558
    $control .= "Installed-Size: $installed_size\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   559
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   560
    $control .= "Origin: $$manifest_data{'info.upstream_url'}\n"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   561
        if exists $$manifest_data{'info.upstream_url'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   562
    $control .= "X-Source-URL: $$manifest_data{'info.source_url'}\n"
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   563
        if exists $$manifest_data{'info.source_url'};
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   564
    $control .= "X-FMRI: $$manifest_data{'pkg.fmri'}\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   565
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   566
    my_mkdir "$pkgdir/DEBIAN";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   567
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   568
    write_file "$pkgdir/DEBIAN/control", $control;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   569
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   570
    if (@conffiles) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   571
       write_file "$pkgdir/DEBIAN/conffiles", (join "\n", @conffiles);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   572
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   573
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   574
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   575
    my $preinst = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   576
    my $postinst = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   577
    my $prerm = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   578
    my $postrm = '';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   579
    if (my @groups = @{$$manifest_data{'group'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   580
        foreach my $g (@groups) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   581
            my $cmd = "if ! getent group $$g{'groupname'} >/dev/null; then\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   582
            $cmd .= "echo Adding group $$g{'groupname'}\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   583
            $cmd .= 'groupadd';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   584
            $cmd .= get_command_line {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   585
                'gid' => '-g'
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   586
                }, $g;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   587
            $cmd .= " $$g{'groupname'} || true\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   588
            $cmd .= "fi\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   589
            $preinst .= $cmd;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   590
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   591
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   592
    if (my @users = @{$$manifest_data{'user'}}) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   593
        foreach my $u (@users) {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   594
            my $cmd = "if ! getent passwd $$u{'username'} >/dev/null; then\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   595
            $cmd .= "echo Adding user $$u{'username'}\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   596
            $cmd .= 'useradd';
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   597
            $cmd .= get_command_line {
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   598
                'uid' => '-u',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   599
                'group' => '-g',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   600
                'gcos-field' => '-c',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   601
                'home-dir' => '-d',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   602
                'uid' => '-u',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   603
                'login-shell' => '-s',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   604
                'group-list' => '-G',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   605
                'inactive' => '-f',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   606
                'expire' => '-e',
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   607
                }, $u;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   608
            $cmd .= " $$u{'username'} || true\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   609
            $cmd .= "fi\n";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   610
            $preinst .= $cmd;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   611
        }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   612
    }
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   613
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   614
    write_script "$pkgdir/DEBIAN/preinst", $preinst if $preinst;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   615
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   616
    my $pkg_deb = "${pkgdir}_${debversion}_${ARCH}.deb";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   617
    # FIXME: we need GNU tar
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   618
    shell_exec(qq|PATH=/usr/gnu/bin:/usr/bin dpkg-deb -b "$pkgdir" "$pkg_deb"|);
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   619
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   620
    my $sha1   = get_output_line "sha1sum $pkg_deb | cut -d' ' -f1";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   621
    my $sha256 = get_output_line "sha256sum $pkg_deb | cut -d' ' -f1";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   622
    my $md5sum = get_output_line "md5sum $pkg_deb | cut -d' ' -f1";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   623
    my $size   = (stat $pkg_deb)[7];
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   624
    my $pkg_deb_base = basename $pkg_deb;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   625
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   626
    $changes{'Checksums-Sha1'} .= "\n $sha1 $size $pkg_deb_base";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   627
    $changes{'Checksums-Sha256'} .= "\n $sha256 $size $pkg_deb_base";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   628
    $changes{'Files'} .= "\n $md5sum $size $debsection $debpriority $pkg_deb_base";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   629
    $changes{'Binary'} .= " $debname";
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   630
}
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   631
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   632
my $changes_cnt = join "\n", map {"$_: $changes{$_}"} sort keys %changes;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   633
write_file "$DEBS_DIR/$changes{'Source'}.changes", $changes_cnt;
44ca7c055bea Integrated debmaker.pl
Igor Pashev <igor.pashev@nexenta.com>
parents:
diff changeset
   634