1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-24 22:11:15 +02:00

* Prebuilt package sharing. We allow transparent binary deployment by

sharing package directories (i.e., the result of building a Nix
  descriptor).

  `nix-pull-prebuilts' obtains a list of all known prebuilts by
  consulting the paths and URLs specified in
  $prefix/etc/nix/prebuilts.conf.  The mappings ($pkghash,
  $prebuilthash) and ($prebuilthash, $location) are registered with
  Nix so that it can use the prebuilt with hash $prebuilthash when
  installing a package with hash $pkghash by downloading and unpacking
  $location.

  `nix-push-prebuilts' creates prebuilts for all packages for which no
  prebuilt is known to exist.  It can then optionally upload these
  to the network through rsync.

  `nix-[pull|push]-prebuilts' just provide a policy.  Nix provides the
  mechanism through the `nix [export|regprebuilt|regurl]' commands.
This commit is contained in:
Eelco Dolstra 2003-05-25 22:42:19 +00:00
parent 0ef4b6d0f8
commit 7dd91d3779
9 changed files with 230 additions and 79 deletions

View file

@ -1,5 +1,9 @@
bin_SCRIPTS = nix-generate-regscript nix-switch nix-collect-garbage
bin_SCRIPTS = nix-generate-regscript nix-switch nix-collect-garbage \
nix-pull-prebuilts nix-push-prebuilts
install-exec-local:
$(INSTALL) -d $(sysconfdir)/profile.d
$(INSTALL_PROGRAM) nix-profile.sh $(sysconfdir)/profile.d/nix.sh
$(INSTALL) -d $(sysconfdir)/nix
# !!! don't overwrite local modifications
$(INSTALL_PROGRAM) prebuilts.conf $(sysconfdir)/nix/prebuilts.conf

View file

@ -1,20 +0,0 @@
#! /usr/bin/perl -w
my $dir = shift @ARGV;
$dir || die "missing directory";
my $url = shift @ARGV;
$url || die "missing base url";
chdir $dir || die "cannot chdir to $dir";
foreach my $prebuilt (glob("*.tar.bz2")) {
$prebuilt =~ /-([a-z0-9]+)-([a-z0-9]+).tar.bz2$/
|| die "invalid file name: $prebuilt";
my $pkgHash = $1;
my $prebuiltHash = $2;
print "regprebuilt $pkgHash $prebuiltHash\n";
print "regurl $prebuiltHash $url/$prebuilt\n";
}

69
scripts/nix-pull-prebuilts Executable file
View file

@ -0,0 +1,69 @@
#! /usr/bin/perl -w
my $prefix = $ENV{"NIX"} || "/nix"; # !!! use prefix
my $etcdir = "$prefix/etc/nix";
my $knowns = "$prefix/var/nix/known-prebuilts";
my $tmpfile = "$prefix/var/nix/prebuilts.tmp";
my $conffile = "$etcdir/prebuilts.conf";
sub register {
my $fn = shift;
return unless $fn =~ /([^\/]*)-([0-9a-z]{32})-([0-9a-z]{32})\.tar\.bz2/;
my $id = $1;
my $pkghash = $2;
my $prebuilthash = $3;
print "$pkghash => $prebuilthash ($id)\n";
system "nix regprebuilt $pkghash $prebuilthash";
if ($?) { die "`nix regprebuilt' failed"; }
print KNOWNS "$pkghash\n";
}
open KNOWNS, ">$knowns";
open CONFFILE, "<$conffile";
while (<CONFFILE>) {
chomp;
if (/^\s*(\S+)\s*(\#.*)?$/) {
my $url = $1;
print "obtaining prebuilt list from $url...\n";
if ($url =~ /^\//) {
# It's a local path.
foreach my $fn (glob "$url/*") {
register $fn;
}
} else {
# It's a URL.
system "wget '$url' -O '$tmpfile' 2> /dev/null"; # !!! escape
if ($?) { die "`wget' failed"; }
open INDEX, "<$tmpfile";
while (<INDEX>) {
# Get all links to prebuilts, that is, file names of the
# form foo-HASH-HASH.tar.bz2.
next unless (/HREF=\"([^\"]*)\"/);
my $fn = $1;
next if $fn =~ /\.\./;
next if $fn =~ /\//;
register $fn;
}
close INDEX;
unlink $tmpfile;
}
}
}
close CONFFILE;
close KNOWNS;

40
scripts/nix-push-prebuilts Executable file
View file

@ -0,0 +1,40 @@
#! /usr/bin/perl -w
my $prefix = $ENV{"NIX"} || "/nix"; # !!! use prefix
my $etcdir = "$prefix/etc/nix";
my $exportdir = "$prefix/var/nix/prebuilts/exports";
my $knowns = "$prefix/var/nix/known-prebuilts";
# For performance, put the known hashes in an associative array.
my %knowns = ();
open KNOWNS, "<$knowns";
while (<KNOWNS>) {
next unless /([0-9a-z]{32})/;
$knowns{$1} = 1;
}
close KNOWNS;
# For each installed package, check whether a prebuilt is known.
open PKGS, "nix listinst|";
open KNOWNS, ">>$knowns";
while (<PKGS>) {
chomp;
next unless /([0-9a-z]{32})/;
my $pkghash = $1;
if (!defined $knowns{$1}) {
# No known prebuilt exists for this package; so export it.
print "exporting $pkghash...\n";
system "nix export '$exportdir' $pkghash";
if ($?) { die "`nix export' failed"; }
print KNOWNS "$pkghash\n";
}
}
close KNOWNS;
close PKGS;
# Push the prebuilts to the server. !!! FIXME
system "rsync -av -e ssh '$exportdir' losser:/home/eelco/public_html/nix-prebuilts/";

4
scripts/prebuilts.conf Normal file
View file

@ -0,0 +1,4 @@
# A list of URLs or local paths from where we obtain prebuilts.
/nix/var/nix/prebuilts/imports
/nix/var/nix/prebuilts/exports
http://losser.st-lab.cs.uu.nl/~eelco/nix-prebuilts/