Ignore:
Timestamp:
2014-12-05T18:12:23+13:00 (9 years ago)
Author:
Jeremy Symon
Message:

Working on a more flexible generation system. Only working for pacman so far, so if you want to generate packages you'll need to check out an old revision. The reason behind this change is that I discovered that the greenstone user database really needs to be owned by the tomcat user rather than root (things such as edit mode don't work properly otherwise), and setting file ownership requires .install files, which was not really possible with the existing system. At this point it would certainly have been faster to just write all the scripts by hand, but this way I get to learn perl.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/package-kits/linux/generate

    r29526 r29536  
    22
    33# Generates Makefiles for different systems and packages
    4 # Uses a hashmap to do config variables  (see readvar for how variables are
    5 #  read in and an example of how they are resolved / used)
    64
    75use strict;
     
    97use utf8;
    108use File::Basename;
    11 use File::Path 'make_path';
    12 use File::Copy 'cp';
    13 use Storable 'dclone';
    14 use Digest::MD5;
    15 
     9use lib 'perllib';
     10use Greenstone::Helpers;
     11use Greenstone::Package;
    1612
    1713my $USAGE = "Usage: " . basename($0) . " <distros> <packages>
     
    2420$#ARGV == 1 or die $USAGE;
    2521
    26 sub globbify {
    27     my ($dir, $files) = @_;
    28     $files =~ /^all$/i and return glob "$dir/*";
    29     my @list = glob "$dir/{$files}";
    30     for (@list) {
    31         -f or die "Could not find '", $_, "'";
    32     }
    33     return @list;
    34 }
     22my @distros  = lsfiles "distros",  shift;
     23my @packages = lsfiles "packages", shift;
    3524
    36 sub empty {
    37     shift =~ /^\s*$/ and return 1;
    38 }
    39 
    40 sub comment {
    41     shift =~ /^\s*#/ and return 1;
    42 }
    43 
    44 sub trim {
    45     for (@_) {
    46         s/^\s+|\s+$//g;
    47     }
    48     return @_;
    49 }
    50 
    51 sub add {
    52     my ($src, $dst, $subst) = @_;
    53     $dst =~ s/@([\w]+)@/$subst->{$1}/g;
    54 
    55     if (-d $src) {
    56         mkdir $dst;
    57         opendir my $DIRFH, $src or die "Could not open '$src': $!";
    58         while (readdir $DIRFH) {
    59             next if ($_ eq '.' or $_ eq '..');
    60             add ("$src/$_", "$dst/$_", $subst);
    61         }
    62         closedir $DIRFH;
    63     } else {
    64         print '    - ', $dst, "\n";
    65         if (-B $src or $src =~ /\.patch$/i) {
    66             # copy binary file
    67             cp $src, $dst or die "Failed to copy '$src': $!";
    68         } else {
    69             # copy normal file
    70             open IN, '<', $src
    71                 or die "Failed to open '$src' for reading: $!";
    72             open OUT, '>', $dst
    73                 or die "Failed to open '$dst' for writing: $!";
    74             while (<IN>) {
    75                 s/@([\w]+)@/$subst->{$1}/g;
    76                 print OUT;
    77             }
    78             my $perms = (stat IN)[2] & 07777;
    79             close IN;
    80             close OUT;
    81             chmod ($perms | 0600, $dst);
    82         }
     25for my $distro (@distros) {
     26    print $distro, "\n";
     27    for my $package (@packages) {
     28        print "  - ", $package, "\n";
     29        makepkg (
     30            package => $package,
     31            distro  => $distro
     32        );
    8333    }
    8434}
    85 
    86 my %escape = (
    87     "n" => "\n",
    88     "\\" => "\\",
    89     " " => " "
    90 );
    91 
    92 sub readvar {
    93     my ($vars, $line) = @_;
    94     my ($var, $val) = trim (split ":", $line, 2);
    95     defined $var and defined $val or die "Invalid variable assignment: '$line'";
    96     local $/ = '';
    97     $val =~ s/@([\w]+)@/$vars->{$1}/g;
    98     $val =~ s/\\([ \\n]|$)/$escape{$1}/g;
    99     $vars->{$var} = $val;
    100 }
    101 
    102 sub addsource {
    103     my ($vars, $source) = @_;
    104     my $md5 = Digest::MD5->new;
    105     open my $MD5FH, '<', $source;
    106     binmode $MD5FH;
    107     $md5->addfile ($MD5FH);
    108     my $field_separator = $vars->{'FIELD_SEPARATOR'};
    109     $vars->{'SOURCES'} .= $field_separator . basename($source);
    110     $vars->{'SOURCE_SUMS'} .= $field_separator . $md5->hexdigest;
    111     close $MD5FH;
    112 }
    113 
    114 my @distros  = globbify "distros",  shift;
    115 my @packages = globbify "packages", shift;
    116 
    117 for my $dconf (@distros) {
    118     my $distro = basename $dconf;
    119     print "$distro\n";
    120 
    121     open DISTRO, '<', $dconf;
    122     my %distro_vars;
    123     while (my $var = <DISTRO>) {
    124         chomp $var;
    125         (comment $var or empty $var) and next;
    126         readvar \%distro_vars, $var;
    127     }
    128     close DISTRO;
    129 
    130     for my $pconf (@packages) {
    131         my $package = basename $pconf;
    132         print " - $package\n";
    133         my $package_path = "build/$distro/$package";
    134         make_path $package_path;
    135 
    136         open PACKAGE, '<', $pconf;
    137         my %package_vars = %{dclone \%distro_vars};
    138         while (my $var = <PACKAGE>) {
    139             chomp $var;
    140             empty $var and last;
    141             comment $var and next;
    142             readvar \%package_vars, $var;
    143         }
    144         for (keys %package_vars) {
    145             defined $package_vars{$_} or $package_vars{$_} = ' ';
    146             # print "$_ = $package_vars{$_}\n";
    147         }
    148 
    149         while (my $file = <PACKAGE>) {
    150             chomp $file;
    151             empty $file and last;
    152             comment $file and next;
    153             add ("files/$file", "$package_path/$file", \%package_vars);
    154             addsource (\%package_vars, "$package_path/$file");
    155         }
    156 
    157         # write the makefile
    158         my $outfile = "$package_path/Makefile";
    159         print "    - $outfile\n";
    160         open MAKEFILE, '>', $outfile
    161             or die "Failed to open '$outfile' for writing: $!";
    162         while (my $segment = <PACKAGE>) {
    163             chomp $segment;
    164             empty $segment and last;
    165             comment $segment and next;
    166             open IN, '<', "segments/$segment"
    167                 or die "Failed to open 'segments/$segment' for reading: $!";
    168             while (<IN>) {
    169                 s/@([\w]+)@/$package_vars{$1}/g;
    170                 print MAKEFILE;
    171             }
    172             close IN;
    173             print MAKEFILE "\n";
    174         }
    175         close PACKAGE;
    176         # add a target for packaging
    177         if (open IN, '<', "segments/$distro_vars{'MANAGER'}") {
    178             while (<IN>) {
    179                 s/@([\w]+)@/$package_vars{$1}/g;
    180                 print MAKEFILE;
    181             }
    182             close IN;
    183         }
    184         close MAKEFILE;
    185         addsource \%package_vars, $outfile;
    186 
    187         # write the package manager files
    188         add ("managers/$distro_vars{'MANAGER'}", $package_path, \%package_vars);
    189     }
    190 }
Note: See TracChangeset for help on using the changeset viewer.