#!/bin/bash # build.sh -- builds JAR and XPI files for mozilla extensions # by Nickolay Ponomarev # (original version based on Nathan Yergler's build script) # Most recent version is at # This script assumes the following directory structure: # ./ # chrome.manifest (optional - for newer extensions) # install.rdf # (other files listed in $ROOT_FILES) # # content/ | # locale/ |} these can be named arbitrary and listed in $CHROME_PROVIDERS # skin/ | # # defaults/ | # components/ |} these must be listed in $ROOT_DIRS in order to be packaged # ... | # # It uses a temporary directory ./build when building; don't use that! # Script's output is: # ./$APP_NAME-$VERSION.xpi # ./$APP_NAME-$VERSION.jar (only if $KEEP_JAR=1) # ./files -- the list of packaged files # # Note: It modifies chrome.manifest when packaging so that it points to # chrome/$APP_NAME-$VERSION.jar!/* # # default configuration file is ./config_build.sh, unless another file is # specified in command-line. Available config variables: APP_NAME= # short-name, jar and xpi files name. Must be lowercase with no spaces CHROME_PROVIDERS= # which chrome providers we have (space-separated list) CLEAN_UP= # delete the jar / "files" when done? (1/0) ROOT_FILES= # put these files in root of xpi (space separated list of leaf filenames) ROOT_DIRS= # ...and these directories (space separated list) BEFORE_BUILD= # run this before building (bash command) AFTER_BUILD= # ...and this after the build (bash command) if [ -z $1 ]; then . ./config_build.sh else . $1 fi if [ -z $APP_NAME ]; then echo "You need to create build config file first!" echo "Read comments at the beginning of this script for more info." exit; fi ROOT_DIR=`pwd` TMP_DIR=build #uncomment to debug #set -x # remove any left-over files from previous build rm -f $APP_NAME*.jar $APP_NAME*.xpi files rm -rf $TMP_DIR $BEFORE_BUILD mkdir -p -v $TMP_DIR/chrome # generate the JAR file, excluding CVS and temporary files VERSION=`egrep "em:version" install.rdf | sed "s/.*>\([^<]*\)<.*/\\1/"` JAR_FILE=$TMP_DIR/chrome/$APP_NAME-$VERSION.jar echo "Generating $JAR_FILE..." for CHROME_SUBDIR in $CHROME_PROVIDERS; do find $CHROME_SUBDIR -path '*CVS*' -prune -o -type f -print | grep -v \~ >> files done zip -0 -r $JAR_FILE `cat files` # The following statement should be used instead if you don't wish to use the JAR file #cp --verbose --parents `cat files` $TMP_DIR/chrome # prepare components and defaults echo "Copying various files from $ROOT_DIRS to $TMP_DIR folder..." for DIR in $ROOT_DIRS; do mkdir $TMP_DIR/$DIR FILES="`find $DIR -path '*CVS*' -prune -o -type f -print | grep -v \~`" echo $FILES >> files cp -Rv $DIR $TMP_DIR done # Copy other files to the root of future XPI. for ROOT_FILE in $ROOT_FILES install.rdf chrome.manifest; do cp -v $ROOT_FILE $TMP_DIR if [ -f $ROOT_FILE ]; then echo $ROOT_FILE >> files fi done cd $TMP_DIR if [ -f "chrome.manifest" ]; then echo "Preprocessing chrome.manifest..." # You think this is scary? #s/^(content\s+\S*\s+)(\S*\/)$/\1jar:chrome\/$APP_NAME\.jar!\/\2/ #s/^(skin|locale)(\s+\S*\s+\S*\s+)(.*\/)$/\1\2jar:chrome\/$APP_NAME\.jar!\/\3/ # # Then try this! (Same, but with characters escaped for bash :) sed -E -i.bak 's/^(content[[:space:]]+[^[:space:]]*[[:space:]]+)([^[:space:]]*\/)[[:space:]]*$/\1jar:chrome\/'$APP_NAME-$VERSION'\.jar!\/\2/' chrome.manifest sed -E -i.bak 's/^(skin|locale)([[:space:]]+[^[:space:]]*[[:space:]]+[^[:space:]]*[[:space:]]+)(.*\/)[[:space:]]*$/\1\2jar:chrome\/'$APP_NAME-$VERSION'\.jar!\/\3/' chrome.manifest rm chrome.manifest.bak # (it simply adds jar:chrome/whatever.jar!/ at appropriate positions of chrome.manifest) fi # generate the XPI file echo "Generating $APP_NAME-$VERSION.xpi..." zip -r ../$APP_NAME-$VERSION.xpi * cd "$ROOT_DIR" echo "Cleanup..." if [ $CLEAN_UP = 0 ]; then # save the jar file mv $TMP_DIR/chrome/$APP_NAME-$VERSION.jar . else rm ./files fi # remove the working files rm -rf $TMP_DIR echo "Done!" $AFTER_BUILD