From aa8fda4b54fbd84b7bc6b11904c156367683e8f6 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 9 Apr 2003 12:26:48 +0000 Subject: [PATCH] * 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. --- Makefile.am | 2 +- configure.ac | 2 +- scripts/Makefile.am | 5 ++++ scripts/nix-populate | 49 +++++++--------------------------- scripts/nix-profile.sh | 15 +++++++++++ scripts/nix-switch | 42 +++++++++++++++++++++++++++++ src/Makefile.am | 1 + test/fixdescriptors/system.fix | 11 ++++++++ 8 files changed, 85 insertions(+), 42 deletions(-) create mode 100644 scripts/Makefile.am create mode 100644 scripts/nix-profile.sh create mode 100755 scripts/nix-switch create mode 100644 test/fixdescriptors/system.fix diff --git a/Makefile.am b/Makefile.am index af437a64d..83a04399a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1 +1 @@ -SUBDIRS = src +SUBDIRS = src scripts diff --git a/configure.ac b/configure.ac index a1dc0f72f..a25ea785c 100644 --- a/configure.ac +++ b/configure.ac @@ -10,5 +10,5 @@ AC_CANONICAL_HOST AC_PROG_CC AC_PROG_CXX -AC_CONFIG_FILES([Makefile src/Makefile]) +AC_CONFIG_FILES([Makefile src/Makefile scripts/Makefile]) AC_OUTPUT diff --git a/scripts/Makefile.am b/scripts/Makefile.am new file mode 100644 index 000000000..4e2eada86 --- /dev/null +++ b/scripts/Makefile.am @@ -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 diff --git a/scripts/nix-populate b/scripts/nix-populate index 50819d666..d375caa7d 100755 --- a/scripts/nix-populate +++ b/scripts/nix-populate @@ -1,23 +1,16 @@ #! /usr/bin/perl -w 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"); -# Figure out a generation number. -my $nr = 1; -while (-e "$linkdir/$nr") { $nr++; } -my $gendir = "$linkdir/$nr"; -print "populating $gendir\n"; - # Create the subdirectories. -mkdir $gendir; +mkdir $selfdir; foreach my $dir (@dirs) { - mkdir "$gendir/$dir"; + mkdir "$selfdir/$dir"; } # 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 () { - chomp; - my $hash = $_; - - my $pkgdir = `nix getpkg $hash`; - if ($?) { die "`nix getpkg' failed"; } - chomp $pkgdir; + my $pkgdir = $ENV{$name}; print "merging $pkgdir\n"; 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"; - diff --git a/scripts/nix-profile.sh b/scripts/nix-profile.sh new file mode 100644 index 000000000..977210165 --- /dev/null +++ b/scripts/nix-profile.sh @@ -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 \ No newline at end of file diff --git a/scripts/nix-switch b/scripts/nix-switch new file mode 100755 index 000000000..74bcef856 --- /dev/null +++ b/scripts/nix-switch @@ -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"; diff --git a/src/Makefile.am b/src/Makefile.am index 2113b9620..d6dbdcb73 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,5 +12,6 @@ install-data-local: $(INSTALL) -d $(localstatedir)/nix $(INSTALL) -d $(localstatedir)/nix/descriptors $(INSTALL) -d $(localstatedir)/nix/sources + $(INSTALL) -d $(localstatedir)/nix/links $(INSTALL) -d $(prefix)/pkg $(bindir)/nix init diff --git a/test/fixdescriptors/system.fix b/test/fixdescriptors/system.fix new file mode 100644 index 000000000..e864cfac3 --- /dev/null +++ b/test/fixdescriptors/system.fix @@ -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"))) + ] +)