about summary refs log blame commit diff
path: root/corepkgs/buildenv/builder.pl.in
blob: e53b383f19c8cea810025d99e6eb94a435c6f512 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
            


           





                                                
 



                                              










                                                       

                                           





















                                                                                              
             















                                                              



         
 


            
                       
 

                                       
 
                                   

 
 


                                          


                              

 
 
                                                                           
#! @perl@ -w

use strict;
use Cwd;
use IO::Handle;

STDOUT->autoflush(1);

my $out = $ENV{"out"};
mkdir "$out", 0755 || die "error creating $out";


# 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 =~ /\/propagated-build-inputs$/ ||
            $srcFile =~ /\/nix-support$/ ||
            $srcFile =~ /\/log$/)
        {
            # Do noting.
	}

        elsif (-d $srcFile) {

            lstat $dstFile;
            
            if (-d _) {
                createLinks($srcFile, $dstFile);
            }

            elsif (-l _) {
                my $target = readlink $dstFile or die;
                if (!-d $target) {
                    die "collission between directory `$srcFile' and non-directory `$target'";
                }
                unlink $dstFile or die "error unlinking `$dstFile': $!";
                mkdir $dstFile, 0755 || 
                    die "error creating directory `$dstFile': $!";
                createLinks($target, $dstFile);
                createLinks($srcFile, $dstFile);
            }

            else {
                symlink($srcFile, $dstFile) ||
                    die "error creating link `$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;

    createLinks("$pkgDir", "$out");
}


my @args = split ' ', $ENV{"derivations"};

while (scalar @args > 0) {
    my $drvPath = shift @args;
    print "adding $drvPath\n";
    addPkg($drvPath);
}


symlink($ENV{"manifest"}, "$out/manifest") or die "cannot create manifest";