From 9898746ef3732979bf30e9048021b6232ddf15ac Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 19 Nov 2003 17:27:16 +0000 Subject: * nix-env: a tool to manage user environments. * Replace all directory reading code by a generic readDirectory() function. --- corepkgs/buildenv/builder.pl | 72 +++++++++++++++++++++++++++++++++++++++++++ corepkgs/buildenv/default.nix | 9 ++++++ 2 files changed, 81 insertions(+) create mode 100755 corepkgs/buildenv/builder.pl create mode 100644 corepkgs/buildenv/default.nix (limited to 'corepkgs') diff --git a/corepkgs/buildenv/builder.pl b/corepkgs/buildenv/builder.pl new file mode 100755 index 000000000000..144ad3374b83 --- /dev/null +++ b/corepkgs/buildenv/builder.pl @@ -0,0 +1,72 @@ +#! /usr/bin/perl -w + +use strict; +use Cwd; + +my $selfdir = $ENV{"out"}; +mkdir "$selfdir", 0755 || die "error creating $selfdir"; + +# For each activated package, create symlinks. + +sub createLinks { + my $srcdir = shift; + my $dstdir = shift; + + my @srcfiles = glob("$srcdir/*"); + + foreach my $srcfile (@srcfiles) { + my $basename = $srcfile; + $basename =~ s/^.*\///g; # strip directory + my $dstfile = "$dstdir/$basename"; + if ($srcfile =~ /\/envpkgs$/) { + } elsif (-d $srcfile) { + # !!! hack for resolving name clashes + if (!-e $dstfile) { + mkdir $dstfile, 0755 || + die "error creating directory $dstfile"; + } + -d $dstfile or die "$dstfile is not a directory"; + createLinks($srcfile, $dstfile); + } elsif (-l $dstfile) { + my $target = readlink($dstfile); + die "collission between $srcfile and $target"; + } else { +# print "linking $dstfile to $srcfile\n"; + symlink($srcfile, $dstfile) || + die "error creating link $dstfile"; + } + } +} + +my %done; + +sub addPkg { + my $pkgdir = shift; + + return if (defined $done{$pkgdir}); + $done{$pkgdir} = 1; + +# print "merging $pkgdir\n"; + + createLinks("$pkgdir", "$selfdir"); + +# if (-f "$pkgdir/envpkgs") { +# my $envpkgs = `cat $pkgdir/envpkgs`; +# chomp $envpkgs; +# my @envpkgs = split / +/, $envpkgs; +# foreach my $envpkg (@envpkgs) { +# addPkg($envpkg); +# } +# } +} + +my @args = split ' ', $ENV{"derivations"}; + +while (scalar @args > 0) { + my $drvpath = shift @args; + print "adding $drvpath\n"; + addPkg($drvpath); +} + +symlink($ENV{"manifest"}, "$selfdir/manifest") or die "cannot create manifest"; + diff --git a/corepkgs/buildenv/default.nix b/corepkgs/buildenv/default.nix new file mode 100644 index 000000000000..9bc704d8d511 --- /dev/null +++ b/corepkgs/buildenv/default.nix @@ -0,0 +1,9 @@ +{system, derivations, manifest}: + +derivation { + name = "user-environment"; + system = system; + builder = ./builder.pl; + derivations = derivations; + manifest = manifest; +} -- cgit 1.4.1