add support for hetmet_flatten casting variable
[ghc-hetmet.git] / boot-pkgs
index 91da9a3..de3008c 100644 (file)
--- a/boot-pkgs
+++ b/boot-pkgs
-#! /bin/sh
-set -e
+#!/usr/bin/perl -w
 
-libraries=
+use strict;
 
-tarred=`ls -1 libraries/tarballs | sed "s/-[0-9.]*\(-snapshot\)\{0,1\}.tar.gz//"`
+use File::Path 'rmtree';
+use File::Basename;
 
-for p in $tarred
-do
-    libraries="$libraries libraries/$p"
-    if [ -d "libraries/$p/_darcs" ]
-    then
-        echo Ignoring libraries/$p as it looks like a darcs checkout
-    else
-        tarball=libraries/tarballs/$p-*.tar.gz
-        stamp="libraries/stamp/$p"
-        if [ ! -d "libraries/$p" ] ||
-           [ ! -f "$stamp" ] ||
-           [ "libraries/stamp/$p" -ot $tarball ]
-        then
-            rm -rf "libraries/$p"
-            mkdir "libraries/$p"
-            (
-                cd "libraries/$p"
-                tar -zxf ../../$tarball
-                mv */* .
-            )
-            touch "$stamp"
-        fi
-    fi
-done
+my @library_dirs = ();
+my @tarballs = glob("libraries/tarballs/*");
 
-for f in libraries/*; do
-  pkgs=$f/ghc-packages
-  if test -f $pkgs; then
-    for p in `cat $pkgs`; do
-      libraries="$libraries $f/$p"
-    done
-  else
-    libraries="$libraries $f"
-  fi
-done
+my $tarball;
+my $package;
+my $stamp;
+
+for $tarball (@tarballs) {
+    $package = $tarball;
+    $package =~ s#^libraries/tarballs/##;
+    $package =~ s/-[0-9.]*(-snapshot)?\.tar\.gz$//;
+
+    # Sanity check, so we don't rmtree the wrong thing below
+    if (($package eq "") || ($package =~ m#[/.\\]#)) {
+        die "Bad package name: $package";
+    }
+
+    if (-d "libraries/$package/_darcs") {
+        print "Ignoring libraries/$package as it looks like a darcs checkout\n"
+    }
+    elsif (-d "libraries/$package/.git") {
+        print "Ignoring libraries/$package as it looks like a git checkout\n"
+    }
+    else {
+        if (! -d "libraries/stamp") {
+            mkdir "libraries/stamp";
+        }
+        $stamp = "libraries/stamp/$package";
+        if ((! -d "libraries/$package") || (! -f "$stamp")
+         || ((-M "libraries/stamp/$package") > (-M $tarball))) {
+            print "Unpacking $package\n";
+            if (-d "libraries/$package") {
+                &rmtree("libraries/$package")
+                    or die "Can't remove libraries/$package: $!";
+            }
+            mkdir "libraries/$package"
+                or die "Can't create libraries/$package: $!";
+            system ("sh", "-c", "cd 'libraries/$package' && { cat ../../$tarball | gzip -d | tar xf - ; } && mv */* .") == 0
+                or die "Failed to unpack $package";
+            open STAMP, "> $stamp"
+                or die "Failed to open stamp file: $!";
+            close STAMP
+                or die "Failed to close stamp file: $!";
+        }
+    }
+}
+
+for $package (glob "libraries/*/") {
+    $package =~ s/\/$//;
+    my $pkgs = "$package/ghc-packages";
+    if (-f $pkgs) {
+        open PKGS, "< $pkgs"
+            or die "Failed to open $pkgs: $!";
+        while (<PKGS>) {
+            chomp;
+            s/\r//g;
+            if (/.+/) {
+                push @library_dirs, "$package/$_";
+            }
+        }
+    }
+    else {
+        push @library_dirs, $package;
+    }
+}
+
+for $package (@library_dirs) {
+    my $dir = &basename($package);
+    my @cabals = glob("$package/*.cabal");
+    if ($#cabals > 0) {
+        die "Too many .cabal file in $package\n";
+    }
+    if ($#cabals eq 0) {
+        my $cabal = $cabals[0];
+        my $pkg;
+        my $top;
+        if (-f $cabal) {
+            $pkg = $cabal;
+            $pkg =~ s#.*/##;
+            $pkg =~ s/\.cabal$//;
+            $top = $package;
+            $top =~ s#[^/]+#..#g;
+            $dir = $package;
+            $dir =~ s#^libraries/##g;
+
+            print "Creating $package/ghc.mk\n";
+            open GHCMK, "> $package/ghc.mk"
+                or die "Opening $package/ghc.mk failed: $!";
+            print GHCMK "${package}_PACKAGE = ${pkg}\n";
+            print GHCMK "${package}_dist-install_GROUP = libraries\n";
+            print GHCMK "\$(eval \$(call build-package,${package},dist-install,\$(if \$(filter ${dir},\$(STAGE2_PACKAGES)),2,1)))\n";
+            close GHCMK
+                or die "Closing $package/ghc.mk failed: $!";
+
+            print "Creating $package/GNUmakefile\n";
+            open GNUMAKEFILE, "> $package/GNUmakefile"
+                or die "Opening $package/GNUmakefile failed: $!";
+            print GNUMAKEFILE "dir = ${package}\n";
+            print GNUMAKEFILE "TOP = ${top}\n";
+            print GNUMAKEFILE "include \$(TOP)/mk/sub-makefile.mk\n";
+            print GNUMAKEFILE "FAST_MAKE_OPTS += stage=0\n";
+            close GNUMAKEFILE
+                or die "Closing $package/GNUmakefile failed: $!";
+        }
+    }
+}
 
-for f in $libraries; do
-   dir=`basename $f`
-   cabals=`echo $f/*.cabal`
-   if test -f $cabals; then
-       echo "Creating $f/ghc.mk"
-       rm -f $f/ghc.mk
-       pkg=`echo "$cabals" | sed -e 's#.*/##' -e 's#\.cabal$##'`
-       if test -f $f/ghc-stage; then
-           stage=`cat $f/ghc-stage`
-       else
-           stage=1
-       fi
-       top=`echo $f | sed 's#[^/]\+#..#g'`
-       echo "${f}_PACKAGE = ${pkg}" >> $f/ghc.mk
-       echo "${f}_dist-install_GROUP = libraries" >> $f/ghc.mk
-       echo "\$(eval \$(call build-package,${f},dist-install,${stage}))" >> $f/ghc.mk
-       rm -f $f/GNUmakefile
-       echo "Creating $f/GNUmakefile"
-       echo "dir = ${f}" >> $f/GNUmakefile
-       echo "TOP = ${top}" >> $f/GNUmakefile
-       echo "include \$(TOP)/mk/sub-makefile.mk" >> $f/GNUmakefile
-   fi
-done