1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#!/bin/perl -w
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# Cute little builder for perl 
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# Total waste of development time...
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# This will build all the object files and then the archive .a file
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# requires GCC, GNU make and a sense of humour.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# Tom St Denis
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectuse strict;
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy $count = 0;
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy $starttime = time;
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy $rate  = 0;
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Scanning for source files...\n";
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectforeach my $filename (glob "*.c") {
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       ++$count;
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Source files to build: $count\nBuilding...\n";
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy $i = 0;
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy $lines = 0;
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmy $filesbuilt = 0;
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectforeach my $filename (glob "*.c") {
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       printf("Building %3.2f%%, ", (++$i/$count)*100.0);
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if ($i % 4 == 0) { print "/, "; }
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if ($i % 4 == 1) { print "-, "; }
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if ($i % 4 == 2) { print "\\, "; }
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if ($i % 4 == 3) { print "|, "; }
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if ($rate > 0) {
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           my $tleft = ($count - $i) / $rate;
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           my $tsec  = $tleft%60;
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           my $tmin  = ($tleft/60)%60;
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           my $thour = ($tleft/3600)%60;
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project           printf("%2d:%02d:%02d left, ", $thour, $tmin, $tsec);
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       my $cnt = ($i/$count)*30.0;
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       my $x   = 0;
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       print "[";
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (; $x < $cnt; $x++) { print "#"; }
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       for (; $x < 30; $x++)   { print " "; }
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       print "]\r";
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       my $tmp = $filename;
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       $tmp =~ s/\.c/".o"/ge;
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if (open(SRC, "<$tmp")) {
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          close SRC;
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       } else {
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          !system("make $tmp > /dev/null 2>/dev/null") or die "\nERROR: Failed to make $tmp!!!\n";
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          open( SRC, "<$filename" ) or die "Couldn't open $filename for reading: $!";
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ++$lines while (<SRC>);
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          close SRC or die "Error closing $filename after reading: $!";
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          ++$filesbuilt;
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }      
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       # update timer 
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if (time != $starttime) {
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          my $delay = time - $starttime;
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          $rate = $i/$delay;
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project# finish building the library 
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprintf("\nFinished building source (%d seconds, %3.2f files per second).\n", time - $starttime, $rate);
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Compiled approximately $filesbuilt files and $lines lines of code.\n";
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "Doing final make (building archive...)\n";
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project!system("make > /dev/null 2>/dev/null") or die "\nERROR: Failed to perform last make command!!!\n";
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectprint "done.\n";