CodeSnippet/conkeror/contrib/build.sh

346 lines
8.7 KiB
Bash
Executable File

#! /bin/bash
# (C) Copyright 2004-2007 Shawn Betts
# (C) Copyright 2007-2008 John J. Foerch
# (C) Copyright 2007-2008 Jeremy Maitin-Shepard
#
# Use, modification, and distribution are subject to the terms specified in the
# COPYING file.
SDK_DIR="/usr/lib/xulrunner"
XPIDL="${SDK_DIR}/xpidl"
XPIDL_INCLUDE="${SDK_DIR}/idl"
TARGET='help'
## ETAGSDIR
##
## This variable is for target `etags'. It specifies the destination
## directory for the TAGS file.
##
ETAGSDIR=""
case "$1" in
xulapp)
TARGET=xulapp ;;
dist-tar)
TARGET=dist-tar ;;
release)
TARGET=release ;;
announce)
TARGET=announce ;;
etags)
TARGET=etags
ETAGSDIR="$2"
shift ;;
notes)
TARGET=notes ;;
help|-help|--help)
TARGET=help ;;
*)
echo 'bad usage. please read the source.'
exit 1
esac
shift
VERSION=$(grep '^Version=' application.ini | cut -d '=' -f 2)
## if this is not an official release, tag on a build date.
##
## if this is an official release, strip the subminor.
##
MILESTONE="${VERSION##*.}"
BUILD_DATE=$(date +%Y%m%d)
SHORT_VERSION="$VERSION"
case "$TARGET" in
release|announce)
VERSION="${VERSION%.*}" ;;
*)
VERSION="$VERSION.$BUILD_DATE"
esac
echo "build target: $TARGET, $VERSION"
### UTILITIES
###
###
## SCRATCH
##
## Temporary directory for build process.
##
SCRATCH=""
function get_scratch () {
if [[ -z "$SCRATCH" ]]; then
SCRATCH=$(mktemp -d conkeror-XXXXXX)
fi
}
function do_cleanup () {
if [[ -n "$SCRATCH" ]]; then
rm -r "$SCRATCH"
SCRATCH=""
fi
}
function assert_conkeror_src () {
if [[ ! -e application.ini ]]; then
echo "The current directory does not appear to contain the Conkeror source code."
exit 1
fi
}
function copy_tree_sans_boring () {
src="$1"
dest="$2"
mkdir -p "$dest"
O=$IFS
IFS=$'\n'
( cd "$src"; find . -type d -and \! -name '*[~#]' -print0 ) \
| ( cd "$dest"; xargs -0 mkdir -p )
files=($( cd "$src"; find . -type f -and \! -name '*[~#]' -print ))
for file in "${files[@]}" ; do cp "$src/$file" "$dest/$file" ; done
IFS=$O
}
function do_check_milestone_for_release ()
{
if [[ "$MILESTONE" = "0" ]]; then
return
fi
dest=VERSION
proposed="${VERSION%.*}".$(( ${VERSION#*.} + 1 )).0
echo "The version given in the file $dest does not have 0 as its last component."
echo -n "Shall I rewrite \`VERSION=$VERSION.$MILESTONE' to \`VERSION=$proposed'? [yN] "
read
if [[ "$REPLY" = [Yy]* ]]; then
perl -pi -e 's/^VERSION='$VERSION'\.'$MILESTONE'$/VERSION='$proposed'/' "$dest"
echo "Version changed in $dest. Please run this build program again."
exit
else
echo "Leaving $dest untouched. Continuing with build."
fi
}
function diff_wrapper () {
scratch="$1"
dest="$2"
perlexp="$3"
scratchfile="${scratch}/$dest"
patchfile="${scratch}/$dest.patch"
echo -n "Processing $dest ..."
perl -0777 -p -e "$perlexp" "$dest" > "$scratchfile"
echo ok
if cmp "$dest" "$scratchfile" ; then
echo "$dest does not need to be updated"
else
diff -u "$dest" "$scratchfile" | tee "$patchfile"
echo -n "Apply this patch to $dest? [yN] "
read
if [[ "$REPLY" = [Yy]* ]]; then
patch < "$patchfile"
else
echo "Leaving $dest untouched"
fi
fi
}
### TARGETS
###
###
function do_target_xulapp () {
echo -n Building XULRunner Application...
#build the conkeror-spawn-helper
make
get_scratch
mkdir -p "$SCRATCH/chrome"
cp application.ini "$SCRATCH"
if [ -n "$CONKEROR_APP_NAME" ]; then
sed -i -e "s/Name=conkeror/Name=${CONKEROR_APP_NAME}/" "${SCRATCH}/application.ini"
fi
for x in branding chrome components content defaults locale modules search-engines help style; do
copy_tree_sans_boring "$x" "$SCRATCH/$x"
done
cp conkeror-spawn-helper "${SCRATCH}"
if [ -d idl ]; then
for x in idl/*; do
name="$(basename "$x")"
"${XPIDL}" -w -v -m typelib -I "${XPIDL_INCLUDE}" -e "$SCRATCH/components/${name%.idl}.xpt" "$x"
done
fi
BUILD_ID=$(git rev-parse HEAD 2> /dev/null)
if [ "$?" != 0 ]; then
BUILD_ID="git"
fi
pushd "$SCRATCH" > /dev/null
## begin preprocessing
##
perl -pi -e 's/BuildID=git/BuildID='${BUILD_ID}'/g' application.ini
##
## end preprocessing
zip -r ../conkeror.xulapp * > /dev/null
popd > /dev/null
do_cleanup
echo ok
}
function do_target_dist_tar () {
do_target_xulapp
get_scratch
## now we have conkeror.xulapp
## package it with install.sh
##
## some other files should probably go in here.. NEWS, for example
mkdir "$SCRATCH/conkeror-$VERSION"
mv conkeror.xulapp "$SCRATCH/conkeror-$VERSION/"
cp install.sh "$SCRATCH/conkeror-$VERSION/"
pushd "$SCRATCH" > /dev/null
tar c conkeror-$VERSION | gzip > conkeror-$VERSION.tar.gz
popd > /dev/null
mv "$SCRATCH/conkeror-$VERSION.tar.gz" .
echo -n "Making conkeror-$VERSION.tar.gz ..."
do_cleanup
echo ok
}
function do_target_release () {
do_check_milestone_for_release
## Make any and all release archives.
##
## Right now, we just make a tar.gz archive that includes an install
## script. In the future, we could consider making an OSX App, a Windows
## Installer EXE, and a Mozilla XPI Installer.
##
do_target_dist_tar
echo -n Putting conkeror-$VERSION.tar.gz in downloads directory ...
mv conkeror-$VERSION.tar.gz ../downloads
echo ok
}
function do_target_announce () {
do_check_milestone_for_release
echo Entering ../www/ ... ok
pushd ../www/ > /dev/null
scratch=$(mktemp -d conkeror-XXXXXX)
perlexp='s/(?<=<!--\scontrolled\scontent\sinsertion\spoint::whatsnew\s-->\n) ()(?!.*'$VERSION'.*$)/<li>'$VERSION' released! \('"$(date '+%b %d, %Y')"'\)<\/li>\n/mxg'
diff_wrapper "$scratch" index.html "$perlexp"
perlexp='s/(?<=<!-- begin controlled content. do not edit manually. id:newestlink -->).*?(?=<!-- end controlled content. -->)/<a href="http:\/\/downloads.mozdev.org\/conkeror\/conkeror-'$VERSION'.tar.gz">conkeror-'$VERSION'.tar.gz<\/a>/g'
diff_wrapper "$scratch" installation.html "$perlexp"
rm -r "$scratch"
popd > /dev/null
}
function do_target_etags () {
if [[ -z "$ETAGSDIR" ]]; then
ETAGSDIR=.
fi
ETAGSDIR="${ETAGSDIR%/}/TAGS"
echo -n "Building $ETAGSDIR ..."
etags -o "$ETAGSDIR" $(find -name \*.js -and \! -name '*[~#]*')
echo ok
}
function do_target_notes () {
FILES=($(find conkeror -name \*.js))
for file in "${FILES[@]}"; do
fileo="${file//\//\/}"
perl -0777 -ne 's/## BLOCK COMMENTS
(.*\/\*\s*[A-Z][A-Z].*:.*$
(\n.*$)*?
(\n.*\*\/)
(?{ $p = pos(); })) |
## LINE COMMENTS
(.*\/\/\s*[A-Z][A-Z].*:.*$
((\n.*\/\/.*$)*)
(?{ $p = pos(); }))
/print "'$fileo':$p\n" . $& . "\n\n"/mexg' < "$file"
done
}
function do_target_help () {
echo "For this script to work, your current working directory must"
echo "be \`<CONKEROR>/src' where <CONKEROR> is the project root."
echo "This script expects to find the subdirectory structure,"
echo "\`conkeror/content', and VERSION in the current directory,"
echo "\`downloads' and \`www' in the parent directory, and possibly"
echo "other files."
echo
echo 'Usage: bash build.sh <TARGET>'
echo 'where <TARGET> is one of:'
echo
echo ' xulapp'
echo
echo ' dist-tar'
echo
echo ' release Builds a release xpi and puts it in ../downloads.'
echo
echo ' announce Modify the website in ../www to announce a release.'
echo
echo ' etags [DIR] Build TAGS file in etags format. If a'
echo ' directory is given, TAGS will be made in'
echo ' that directory.'
echo
echo ' notes Shows specially formatted comments in'
echo " \`conkeror/content/*.js' Modifies no files."
echo
echo ' help Shows this help message. Modifies no files.'
echo
}
### MAIN
###
###
assert_conkeror_src
case "$TARGET" in
xulapp) do_target_xulapp ;;
dist-tar) do_target_dist_tar ;;
release) do_target_release ;;
announce) do_target_announce ;;
etags) do_target_etags ;;
notes) do_target_notes ;;
help) do_target_help ;;
esac
do_cleanup