Refactor sync-all a bit
[ghc-hetmet.git] / boot-pkgs
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 use File::Path 'rmtree';
6 use File::Basename;
7
8 my @library_dirs = ();
9 my @tarballs = glob("libraries/tarballs/*");
10
11 my $tarball;
12 my $package;
13 my $stamp;
14
15 for $tarball (@tarballs) {
16     $package = $tarball;
17     $package =~ s#^libraries/tarballs/##;
18     $package =~ s/-[0-9.]*(-snapshot)?\.tar\.gz$//;
19
20     # Sanity check, so we don't rmtree the wrong thing below
21     if (($package eq "") || ($package =~ m#[/.\\]#)) {
22         die "Bad package name: $package";
23     }
24
25     if (-d "libraries/$package/_darcs") {
26         print "Ignoring libraries/$package as it looks like a darcs checkout\n"
27     }
28     elsif (-d "libraries/$package/.git") {
29         print "Ignoring libraries/$package as it looks like a git checkout\n"
30     }
31     else {
32         if (! -d "libraries/stamp") {
33             mkdir "libraries/stamp";
34         }
35         $stamp = "libraries/stamp/$package";
36         if ((! -d "libraries/$package") || (! -f "$stamp")
37          || ((-M "libraries/stamp/$package") > (-M $tarball))) {
38             print "Unpacking $package\n";
39             if (-d "libraries/$package") {
40                 &rmtree("libraries/$package")
41                     or die "Can't remove libraries/$package: $!";
42             }
43             mkdir "libraries/$package"
44                 or die "Can't create libraries/$package: $!";
45             system ("sh", "-c", "cd 'libraries/$package' && { cat ../../$tarball | gzip -d | tar xf - ; } && mv */* .") == 0
46                 or die "Failed to unpack $package";
47             open STAMP, "> $stamp"
48                 or die "Failed to open stamp file: $!";
49             close STAMP
50                 or die "Failed to close stamp file: $!";
51         }
52     }
53 }
54
55 for $package (glob "libraries/*/") {
56     $package =~ s/\/$//;
57     my $pkgs = "$package/ghc-packages";
58     if (-f $pkgs) {
59         open PKGS, "< $pkgs"
60             or die "Failed to open $pkgs: $!";
61         while (<PKGS>) {
62             chomp;
63             s/\r//g;
64             if (/.+/) {
65                 push @library_dirs, "$package/$_";
66             }
67         }
68     }
69     else {
70         push @library_dirs, $package;
71     }
72 }
73
74 for $package (@library_dirs) {
75     my $dir = &basename($package);
76     my @cabals = glob("$package/*.cabal");
77     if ($#cabals > 0) {
78         die "Too many .cabal file in $package\n";
79     }
80     if ($#cabals eq 0) {
81         my $cabal = $cabals[0];
82         my $pkg;
83         my $top;
84         if (-f $cabal) {
85             $pkg = $cabal;
86             $pkg =~ s#.*/##;
87             $pkg =~ s/\.cabal$//;
88             $top = $package;
89             $top =~ s#[^/]+#..#g;
90             $dir = $package;
91             $dir =~ s#^libraries/##g;
92
93             print "Creating $package/ghc.mk\n";
94             open GHCMK, "> $package/ghc.mk"
95                 or die "Opening $package/ghc.mk failed: $!";
96             print GHCMK "${package}_PACKAGE = ${pkg}\n";
97             print GHCMK "${package}_dist-install_GROUP = libraries\n";
98             print GHCMK "\$(eval \$(call build-package,${package},dist-install,\$(if \$(filter ${dir},\$(STAGE2_PACKAGES)),2,1)))\n";
99             close GHCMK
100                 or die "Closing $package/ghc.mk failed: $!";
101
102             print "Creating $package/GNUmakefile\n";
103             open GNUMAKEFILE, "> $package/GNUmakefile"
104                 or die "Opening $package/GNUmakefile failed: $!";
105             print GNUMAKEFILE "dir = ${package}\n";
106             print GNUMAKEFILE "TOP = ${top}\n";
107             print GNUMAKEFILE "include \$(TOP)/mk/sub-makefile.mk\n";
108             print GNUMAKEFILE "FAST_MAKE_OPTS += stage=0\n";
109             close GNUMAKEFILE
110                 or die "Closing $package/GNUmakefile failed: $!";
111         }
112     }
113 }
114