Bash build script: Difference between revisions

From MozillaZine Knowledge Base
Jump to navigationJump to search
(new version; including chrome.manifest preprocessing!)
mNo edit summary
Line 37: Line 37:
KEEP_JAR=1          # leave the jar when done?
KEEP_JAR=1          # leave the jar when done?
ROOT_FILES="readme.txt" # put these files in root of xpi
ROOT_FILES="readme.txt" # put these files in root of xpi
BEFORE_BUILD=./update_builddate.sh # run this before building
AFTER_BUILD=                      # and this after the build
#### editable items end
#### editable items end


Line 50: Line 52:
rm files
rm files
rm -rf $TMP_DIR
rm -rf $TMP_DIR
$BEFORE_BUILD


mkdir --parents --verbose $TMP_DIR/chrome
mkdir --parents --verbose $TMP_DIR/chrome
Line 88: Line 92:


cd $TMP_DIR
cd $TMP_DIR
# XXXenh Preprocess install.rdf (insert current date)
# XXXenh preprocess customizable set of files (about.xul)
# (can't do this atm, as install.rdf at this location is now read by EM)
#if [ -f "install.rdf" ]; then
#  echo "Preprocessing install.rdf..."
#  cat install.rdf | sed s/__VERSION__/$VERSION.`date "+%Y%m%d"`/ > install.rdf
#fi


if [ -f "chrome.manifest" ]; then
if [ -f "chrome.manifest" ]; then
Line 124: Line 121:
rm -rf $TMP_DIR
rm -rf $TMP_DIR
echo "Done!"
echo "Done!"
$AFTER_BUILD
</pre>
</pre>


[[Category:Development]]
[[Category:Development]]

Revision as of 12:20, 29 April 2005

This page is part of the extension development documentation project.

Ask your questions in MozillaZine Forums. Also try browsing example code.

Note: development documentation is in process of being moved to Mozilla Development Center (MDC).

Here is a bash script I'm using to package my extensions (under Cygwin). See also Windows build script.

#!/bin/bash
# build.sh -- builds JAR and XPI files for mozilla extensions
#   by Nickolay Ponomarev <asqueella@gmail.com>
#   based on Nathan Yergler's build script
# Most recent version is at <http://kb.mozillazine.org/Bash_build_script>

# 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/    (only if $HAS_DEFAULTS=1)
#   components/  (only if $HAS_COMPONENTS=1)
#
# It uses a temporary directory ./build; don't use that!
# Its output is:
# ./$APP_NAME.xpi
# ./$APP_NAME.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.jar!/*

#### editable items (none of these can be blank)
APP_NAME=helloworld  # short-name, jar and xpi files name
CHROME_PROVIDERS="content locale skin" # which chrome providers we have
HAS_DEFAULTS=0       # whether to package defaults/
HAS_COMPONENTS=0     # same for components/
KEEP_JAR=1           # leave the jar when done?
ROOT_FILES="readme.txt" # put these files in root of xpi
BEFORE_BUILD=./update_builddate.sh # run this before building
AFTER_BUILD=                       # and this after the build
#### editable items end

ROOT_DIR=`pwd`
TMP_DIR=build

#uncomment to debug
#set -x

# remove any left-over files from previous build
rm $APP_NAME.jar
rm $APP_NAME.xpi
rm files
rm -rf $TMP_DIR

$BEFORE_BUILD

mkdir --parents --verbose $TMP_DIR/chrome

# generate the JAR file, excluding CVS and temporary files
JAR_FILE=$TMP_DIR/chrome/$APP_NAME.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 to $TMP_DIR folder..."
if [ $HAS_COMPONENTS = 1 ]; then
  mkdir $TMP_DIR/components
  COMPONENT_FILES="`find components -path '*CVS*' -prune -o -type f -print | grep -v \~`"
  echo $COMPONENT_FILES >> files
  cp --verbose --parents $COMPONENT_FILES $TMP_DIR
fi

if [ $HAS_DEFAULTS = 1 ]; then
  DEFAULT_FILES="`find defaults -path '*CVS*' -prune -o -type f -print | grep -v \~`"
  echo $DEFAULT_FILES >> files
  cp --verbose --parents $DEFAULT_FILES $TMP_DIR
fi

# Copy other files to the root of future XPI.
for ROOT_FILE in $ROOT_FILES install.rdf chrome.manifest; do
  cp --verbose $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 -i -r s/^\(content\\s+\\S*\\s+\)\(\\S*\\/\)$/\\1jar:chrome\\/$APP_NAME\\.jar!\\/\\2/ chrome.manifest
  sed -i -r s/^\(skin\|locale\)\(\\s+\\S*\\s+\\S*\\s+\)\(.*\\/\)$/\\1\\2jar:chrome\\/$APP_NAME\\.jar!\\/\\3/ chrome.manifest

  # (it simply adds jar:chrome/whatever.jar!/ at appropriate positions of chrome.manifest)
fi

# generate the XPI file
echo "Generating $APP_NAME.xpi..."
zip -r ../$APP_NAME.xpi *

cd $ROOT_DIR

echo "Cleanup..."
if [ $KEEP_JAR = 1 ]; then
  # save the jar file
  mv $TMP_DIR/chrome/$APP_NAME.jar .
fi

# remove the working files
rm -rf $TMP_DIR
echo "Done!"

$AFTER_BUILD