#!/usr/bin/perl -w use strict; use Cwd; use File::Basename; use File::Copy; use Getopt::Long; # An array of relative file paths in which a version number should be updated my @VERSION_FILES = qw/chrome\\content\\about.xul install.rdf/; my $jarFile = "googlebarlite.jar"; my $outputFilename = "googlebarlite.xpi"; my $version = ''; GetOptions("output=s" => \$outputFilename, "version=s" => \$version, "help" => sub { usageMessage() }); print "+--------------------------------+\n"; print "| Firefox Extension Build Script |\n"; print "| Written by Jonah Bishop |\n"; print "+--------------------------------+\n"; print "Building extension...\n"; my $homeDir = getcwd(); if (!$version) { print "Skipping version update.\n"; } else { updateVersion(); } # We need to modify the chrome manifest for distribution, since we now use that exclusively # Temporarily rename the chrome manifest that we use for dynamic development purposes print "Modifying chrome manifest...\n"; print " + Backing up development chrome manifest\n"; rename("chrome.manifest", "chrome.manifest.dev") or die "Could not rename chrome manifest: $!"; print " + Updating chrome manifest for distribution\n"; open INPUT, "< chrome.manifest.dev" or die "Could not open chrome.manifest.dev: $!"; my @cmLines = ; close INPUT; open OUT, "> chrome.manifest" or die "Cannot open chrome.manifest: $!"; foreach (@cmLines) { chomp; if (m/^content/ || m/^skin/ || m/^locale/) { s#chrome/#jar:chrome/${jarFile}!/#; } print OUT "$_\n"; } close OUT; chdir "$homeDir/chrome" or die "Cannot change to $homeDir/chrome: $!"; # Create the JAR file print "Creating JAR file...\n"; system("zip -r $jarFile -\@ < jarzip.txt"); chdir "$homeDir" or die "Cannot change to $homeDir: $!"; # Now create the XPI file print "\nCreating XPI file...\n"; system("zip -r $outputFilename -\@ < xpizip.txt"); # Remove the chrome manifest that we hacked for distribution print "\nRestoring the development chrome manifest...\n"; unlink "chrome.manifest"; # Restore the development copy of the chrome manifest rename("chrome.manifest.dev", "chrome.manifest") or die "Could not rename chrome.manifest.dev: $!"; # ====================================================================== # End Main Script --- Begin Subroutines # ====================================================================== sub parseVersionFile { my $filename = shift; open INPUT, "< $filename" or die "Cannot open input ($filename): $!"; my @lines = ; close INPUT; open OUTPUT, "> new_$filename" or die "Cannot open output (new_$filename): $!"; foreach my $statement (@lines) { chomp $statement; if ($statement =~ m/^(\s*?)/) { my $whitespace = $1; print OUTPUT "$whitespace$version\n"; } elsif($statement =~ m/value="Version [0-9\.]+?"/) { $statement =~ s/value="[^"]+?"/value="Version $version"/; print OUTPUT "$statement\n"; } else { print OUTPUT "$statement\n"; } } close OUTPUT; } sub updateVersion { foreach my $file (@VERSION_FILES) { print "Updating version information in $file\n"; my $dirname = dirname($file); my $basename = basename($file); chdir $dirname or die "Cannot change to $dirname: $!"; &parseVersionFile($basename); print " - Removing $basename\n"; unlink $basename; print " - Renaming new_$basename\n\n"; rename ("new_$basename", $basename); chdir $homeDir or die "Cannot change to $homeDir: $!"; } } sub usageMessage { print "Options:\n"; print " --output \n"; print " Specify the output XPI filename\n\n"; print " --version \n"; print " Specify the version string to use for this extension\n"; exit(); }