* We no longer use nix-populate standalone, rather we use it as a

build action for `system' packages (like system.fix) that have
  dependencies on all packages we want to activate.

  So the command sequence to switch to a new activation configuration
  of the system would be:

    $ fix -i .../fixdescriptors/system.fix
    ...
    system.fix -> 89cf4713b37cc66989304abeb9ea189f

    $ nix-switch 89cf4713b37cc66989304abeb9ea189f

* A nix-profile.sh script that can be included in .bashrc.
This commit is contained in:
Eelco Dolstra 2003-04-09 12:26:48 +00:00
parent f56b7312b2
commit aa8fda4b54
8 changed files with 85 additions and 42 deletions

View File

@ -1 +1 @@
SUBDIRS = src SUBDIRS = src scripts

View File

@ -10,5 +10,5 @@ AC_CANONICAL_HOST
AC_PROG_CC AC_PROG_CC
AC_PROG_CXX AC_PROG_CXX
AC_CONFIG_FILES([Makefile src/Makefile]) AC_CONFIG_FILES([Makefile src/Makefile scripts/Makefile])
AC_OUTPUT AC_OUTPUT

5
scripts/Makefile.am Normal file
View File

@ -0,0 +1,5 @@
bin_SCRIPTS = nix-generate-regscript nix-switch
install-exec-local:
$(INSTALL) -d $(sysconfdir)/profile.d
$(INSTALL_PROGRAM) nix-profile.sh $(sysconfdir)/profile.d/nix.sh

View File

@ -1,23 +1,16 @@
#! /usr/bin/perl -w #! /usr/bin/perl -w
use strict; use strict;
use Cwd;
my $selfdir = cwd;
my $pkglist = $ENV{"NIX_ACTIVATIONS"};
$pkglist or die "NIX_ACTIVATIONS not set";
my $linkdir = $ENV{"NIX_LINKS"};
$linkdir or die "NIX_LINKS not set";
my @dirs = ("bin", "sbin", "lib", "include"); my @dirs = ("bin", "sbin", "lib", "include");
# Figure out a generation number.
my $nr = 1;
while (-e "$linkdir/$nr") { $nr++; }
my $gendir = "$linkdir/$nr";
print "populating $gendir\n";
# Create the subdirectories. # Create the subdirectories.
mkdir $gendir; mkdir $selfdir;
foreach my $dir (@dirs) { foreach my $dir (@dirs) {
mkdir "$gendir/$dir"; mkdir "$selfdir/$dir";
} }
# For each activated package, create symlinks. # For each activated package, create symlinks.
@ -51,39 +44,15 @@ sub createLinks {
} }
} }
foreach my $name (keys %ENV) {
open PKGS, "< $pkglist"; next unless ($name =~ /^act.*$/);
while (<PKGS>) { my $pkgdir = $ENV{$name};
chomp;
my $hash = $_;
my $pkgdir = `nix getpkg $hash`;
if ($?) { die "`nix getpkg' failed"; }
chomp $pkgdir;
print "merging $pkgdir\n"; print "merging $pkgdir\n";
foreach my $dir (@dirs) { foreach my $dir (@dirs) {
createLinks("$pkgdir/$dir", "$gendir/$dir"); createLinks("$pkgdir/$dir", "$selfdir/$dir");
} }
} }
close PKGS;
# Make $gendir the current generation by pointing $linkdir/current to
# it. The rename() system call is supposed to be essentially atomic
# on Unix. That is, if we have links `current -> X' and `new_current
# -> Y', and we rename new_current to current, a process accessing
# current will see X or Y, but never a file-not-found or other error
# condition. This is sufficient to atomically switch the current link
# tree.
my $current = "$linkdir/current";
print "switching $current to $gendir\n";
my $tmplink = "$linkdir/new_current";
symlink($gendir, $tmplink) or die "cannot create $tmplink";
rename($tmplink, $current) or die "cannot rename $tmplink";

15
scripts/nix-profile.sh Normal file
View File

@ -0,0 +1,15 @@
if test -z "$NIX_SET"; then
export NIX_SET=1
NIX_LINKS=/nix/var/nix/links/current
export PATH=$NIX_LINKS/bin:/nix/bin:$PATH
export LD_LIBRARY_PATH=$NIX_LINKS/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=$NIX_LINKS/lib:$LIBRARY_PATH
export C_INCLUDE_PATH=$NIX_LINKS/include:$C_INCLUDE_PATH
fi

42
scripts/nix-switch Executable file
View File

@ -0,0 +1,42 @@
#! /usr/bin/perl -w
use strict;
my $hash = $ARGV[0];
$hash || die "no package hash specified";
my $prefix = $ENV{"NIX"} || "/nix"; # !!! use prefix
my $linkdir = "$prefix/var/nix/links";
# Build the specified package, and all its dependencies.
my $pkgdir = `nix getpkg $hash`;
if ($?) { die "`nix getpkg' failed"; }
chomp $pkgdir;
my $id = `nix info $hash | cut -c 34-`;
if ($?) { die "`nix info' failed"; }
chomp $id;
# Figure out a generation number.
my $nr = 0;
while (-e "$linkdir/$id-$nr") { $nr++; }
my $link = "$linkdir/$id-$nr";
print "$pkgdir\n";
# Create a symlink from $link to $pkgdir.
symlink($pkgdir, $link) or die "cannot create $link";
# Make $link the current generation by pointing $linkdir/current to
# it. The rename() system call is supposed to be essentially atomic
# on Unix. That is, if we have links `current -> X' and `new_current
# -> Y', and we rename new_current to current, a process accessing
# current will see X or Y, but never a file-not-found or other error
# condition. This is sufficient to atomically switch the current link
# tree.
my $current = "$linkdir/current";
print "switching $current to $link\n";
my $tmplink = "$linkdir/new_current";
symlink($link, $tmplink) or die "cannot create $tmplink";
rename($tmplink, $current) or die "cannot rename $tmplink";

View File

@ -12,5 +12,6 @@ install-data-local:
$(INSTALL) -d $(localstatedir)/nix $(INSTALL) -d $(localstatedir)/nix
$(INSTALL) -d $(localstatedir)/nix/descriptors $(INSTALL) -d $(localstatedir)/nix/descriptors
$(INSTALL) -d $(localstatedir)/nix/sources $(INSTALL) -d $(localstatedir)/nix/sources
$(INSTALL) -d $(localstatedir)/nix/links
$(INSTALL) -d $(prefix)/pkg $(INSTALL) -d $(prefix)/pkg
$(bindir)/nix init $(bindir)/nix init

View File

@ -0,0 +1,11 @@
Descr(
[ Bind("pkgId", Str("system"))
, Bind("releaseId", Str("1"))
, Bind("actATerm", Pkg(Fix("./aterm-2.0.fix")))
, Bind("actPkgConfig", Pkg(Fix("./pkgconfig-0.15.0.fix")))
, Bind("actGlib", Pkg(Fix("./glib-2.2.1.fix")))
, Bind("build", File(Local("../../scripts/nix-populate")))
]
)