about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac2
-rw-r--r--scripts/Makefile.am5
-rwxr-xr-xscripts/nix-populate49
-rw-r--r--scripts/nix-profile.sh15
-rwxr-xr-xscripts/nix-switch42
-rw-r--r--src/Makefile.am1
-rw-r--r--test/fixdescriptors/system.fix11
8 files changed, 85 insertions, 42 deletions
diff --git a/Makefile.am b/Makefile.am
index af437a64d6d8..83a04399a926 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1 @@
-SUBDIRS = src
+SUBDIRS = src scripts
diff --git a/configure.ac b/configure.ac
index a1dc0f72fc4a..a25ea785c287 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 000000000000..4e2eada86b9d
--- /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 50819d6664d4..d375caa7d3d0 100755
--- a/scripts/nix-populate
+++ b/scripts/nix-populate
@@ -1,23 +1,16 @@
 #! /usr/bin/perl -w
 
 use strict;
+use 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 $selfdir = cwd;
 
-# Figure out a generation number.
-my $nr = 1;
-while (-e "$linkdir/$nr") { $nr++; }
-my $gendir = "$linkdir/$nr";
-print "populating $gendir\n";
+my @dirs = ("bin", "sbin", "lib", "include");
 
 # 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 (<PKGS>) {
-    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 000000000000..977210165bda
--- /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 000000000000..74bcef8566f9
--- /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 2113b9620a8c..d6dbdcb734e0 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 000000000000..e864cfac3b40
--- /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")))
+  ]
+)