blob: a1197737340a672317bf5459890948e0722ef330 [file] [log] [blame]
#!/bin/bash
#
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -e
if [ "$VERBOSE" ]; then
set -x
fi
set -u
# Create the Debian changelog file needed by dpkg-gencontrol. This just adds a
# placeholder change, indicating it is the result of an automatic build.
gen_changelog() {
rm -f "${DEB_CHANGELOG}"
process_template "${SCRIPTDIR}/changelog.template" "${DEB_CHANGELOG}"
debchange -a --nomultimaint -m --changelog "${DEB_CHANGELOG}" \
--distribution UNRELEASED "automatic build"
}
# Create the Debian control file needed by dpkg-deb.
gen_control() {
dpkg-gencontrol -v"${VERSIONFULL}" -c"${DEB_CONTROL}" -l"${DEB_CHANGELOG}" \
-f"${DEB_FILES}" -p"${PACKAGE}-${CHANNEL}" -P"${STAGEDIR}" -T"${DEB_SUBST}" \
-O > "${STAGEDIR}/DEBIAN/control"
rm -f "${DEB_CONTROL}"
}
# Create the Debian substvars file needed by dpkg-gencontrol.
gen_substvars() {
# dpkg-shlibdeps requires a control file in debian/control, so we're
# forced to prepare a fake debian directory.
mkdir "${SUBSTFILEDIR}/debian"
cp "${DEB_CONTROL}" "${SUBSTFILEDIR}/debian"
pushd "${SUBSTFILEDIR}" >/dev/null
dpkg-shlibdeps "${STAGEDIR}${APACHE_MODULEDIR}/mod_pagespeed.so" \
-O >> "${DEB_SUBST}" 2>/dev/null
dpkg-shlibdeps "${STAGEDIR}${APACHE_MODULEDIR}/mod_pagespeed_ap24.so" \
-O >> "${DEB_SUBST}" 2>/dev/null
popd >/dev/null
}
# Setup the installation directory hierachy in the package staging area.
prep_staging_debian() {
prep_staging_common
install -m 755 -d "${STAGEDIR}/DEBIAN" \
"${STAGEDIR}/etc/cron.daily" \
"${STAGEDIR}/etc/apache2/conf.d" \
"${STAGEDIR}/usr/bin"
}
# Put the package contents in the staging area.
stage_install_debian() {
prep_staging_debian
stage_install_common
echo "Staging Debian install files in '${STAGEDIR}'..."
process_template "${BUILDDIR}/install/common/repo.cron" \
"${STAGEDIR}/etc/cron.daily/${PACKAGE}"
chmod 755 "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
process_template "${BUILDDIR}/install/debian/postinst" \
"${STAGEDIR}/DEBIAN/postinst"
chmod 755 "${STAGEDIR}/DEBIAN/postinst"
process_template "${BUILDDIR}/install/debian/prerm" \
"${STAGEDIR}/DEBIAN/prerm"
chmod 755 "${STAGEDIR}/DEBIAN/prerm"
process_template "${BUILDDIR}/install/debian/postrm" \
"${STAGEDIR}/DEBIAN/postrm"
chmod 755 "${STAGEDIR}/DEBIAN/postrm"
install -m 644 "${BUILDDIR}/install/debian/conffiles" \
"${STAGEDIR}/DEBIAN/conffiles"
echo "/etc/cron.daily/${PACKAGE}" >> "${STAGEDIR}/DEBIAN/conffiles"
process_template "${BUILDDIR}/install/common/pagespeed.load.template" \
"${STAGEDIR}${APACHE_CONFDIR}/pagespeed.load"
chmod 644 "${STAGEDIR}${APACHE_CONFDIR}/pagespeed.load"
process_template "${BUILDDIR}/install/common/pagespeed.conf.template" \
"${STAGEDIR}${APACHE_CONFDIR}/pagespeed.conf"
install -m 755 "${BUILDDIR}/js_minify" \
"${STAGEDIR}/usr/bin/pagespeed_js_minify"
chmod 644 "${STAGEDIR}${APACHE_CONFDIR}/pagespeed.conf"
install -m 644 \
"${BUILDDIR}/../../net/instaweb/genfiles/conf/pagespeed_libraries.conf" \
"${STAGEDIR}${APACHE_CONF_D_DIR}/pagespeed_libraries.conf"
}
# Build the deb file within a fakeroot.
do_package_in_fakeroot() {
FAKEROOTFILE=$(mktemp -t fakeroot.tmp.XXXXXX) || exit 1
fakeroot -s "${FAKEROOTFILE}" -- \
chown -R ${APACHE_USER}:${APACHE_USER} ${STAGEDIR}${MOD_PAGESPEED_CACHE}
fakeroot -s "${FAKEROOTFILE}" -i "${FAKEROOTFILE}" -- \
chown -R ${APACHE_USER}:${APACHE_USER} ${STAGEDIR}${MOD_PAGESPEED_LOG}
fakeroot -i "${FAKEROOTFILE}" -- \
dpkg-deb -b "${STAGEDIR}" .
rm -f "${FAKEROOTFILE}"
}
# Actually generate the package file.
do_package() {
export HOST_ARCH="$1"
echo "Packaging ${HOST_ARCH}..."
PREDEPENDS="$COMMON_PREDEPS"
DEPENDS="${COMMON_DEPS}"
# Generate Conflicts: and Replaces: headers for the other channel to get
# dpkg to seamlessly switch channels on -i
case $CHANNEL in
stable )
CONFLICTS=mod-pagespeed-beta
;;
beta )
CONFLICTS=mod-pagespeed-stable
;;
* )
echo
echo "ERROR: '$CHANNEL' is not a valid channel type."
echo
exit 1
;;
esac
REPLACES="${CONFLICTS}"
gen_changelog
process_template "${SCRIPTDIR}/control.template" "${DEB_CONTROL}"
export DEB_HOST_ARCH="${HOST_ARCH}"
gen_substvars
if [ -f "${DEB_CONTROL}" ]; then
gen_control
fi
do_package_in_fakeroot
}
# Remove temporary files and unwanted packaging output.
cleanup() {
echo "Cleaning..."
rm -rf "${STAGEDIR}"
rm -rf "${TMPFILEDIR}"
rm -rf "${SUBSTFILEDIR}"
}
usage() {
echo "usage: $(basename $0) [-c channel] [-a target_arch] [-o 'dir'] [-b 'dir']"
echo "-c channel the package channel (unstable, beta, stable)"
echo "-a arch package architecture (ia32 or x64)"
echo "-o dir package output directory [${OUTPUTDIR}]"
echo "-b dir build input directory [${BUILDDIR}]"
echo "-h this help message"
}
# Check that the channel name is one of the allowable ones.
verify_channel() {
case $CHANNEL in
stable )
CHANNEL=stable
;;
testing|beta )
CHANNEL=beta
;;
* )
echo
echo "ERROR: '$CHANNEL' is not a valid channel type."
echo
exit 1
;;
esac
}
process_opts() {
while getopts ":o:b:c:a:h" OPTNAME
do
case $OPTNAME in
o )
OUTPUTDIR="$OPTARG"
mkdir -p "${OUTPUTDIR}"
;;
b )
BUILDDIR=$(readlink -f "${OPTARG}")
;;
c )
CHANNEL="$OPTARG"
;;
a )
TARGETARCH="$OPTARG"
;;
h )
usage
exit 0
;;
\: )
echo "'-$OPTARG' needs an argument."
usage
exit 1
;;
* )
echo "invalid command-line option: $OPTARG"
usage
exit 1
;;
esac
done
}
#=========
# MAIN
#=========
SCRIPTDIR=$(readlink -f "$(dirname "$0")")
OUTPUTDIR="${PWD}"
STAGEDIR=$(mktemp -d -t deb.build.XXXXXX) || exit 1
TMPFILEDIR=$(mktemp -d -t deb.tmp.XXXXXX) || exit 1
SUBSTFILEDIR=$(mktemp -d -t deb.subst.XXXXXX) || exit 1
DEB_CHANGELOG="${TMPFILEDIR}/changelog"
DEB_FILES="${TMPFILEDIR}/files"
DEB_CONTROL="${TMPFILEDIR}/control"
DEB_SUBST="${SUBSTFILEDIR}/debian/substvars"
CHANNEL="beta"
# Default target architecture to same as build host.
if [ "$(uname -m)" = "x86_64" ]; then
TARGETARCH="x64"
else
TARGETARCH="ia32"
fi
# call cleanup() on exit
trap cleanup 0
process_opts "$@"
if [ ! "$BUILDDIR" ]; then
BUILDDIR=$(readlink -f "${SCRIPTDIR}/../../out/Release")
fi
source ${BUILDDIR}/install/common/installer.include
get_version_info
VERSIONFULL="${VERSION}-r${REVISION}"
source "${BUILDDIR}/install/common/mod-pagespeed.info"
eval $(sed -e "s/^\([^=]\+\)=\(.*\)$/export \1='\2'/" \
"${BUILDDIR}/install/common/BRANDING")
REPOCONFIG="deb http://dl.google.com/linux/${PACKAGE#google-}/deb/ stable main"
verify_channel
# Some Debian packaging tools want these set.
export DEBFULLNAME="${MAINTNAME}"
export DEBEMAIL="${MAINTMAIL}"
# Make everything happen in the OUTPUTDIR.
cd "${OUTPUTDIR}"
COMMON_DEPS="apache2.2-common|apache2-api-20120211"
COMMON_PREDEPS="dpkg (>= 1.14.0)"
APACHE_MODULEDIR="/usr/lib/apache2/modules"
APACHE_CONFDIR="/etc/apache2/mods-available"
APACHE_CONF_D_DIR="/etc/apache2/conf.d"
MOD_PAGESPEED_CACHE="/var/cache/mod_pagespeed"
MOD_PAGESPEED_LOG="/var/log/pagespeed"
APACHE_USER="www-data"
COMMENT_OUT_DEFLATE=
SSL_CERT_DIR="/etc/ssl/certs"
SSL_CERT_FILE_COMMAND=
case "$TARGETARCH" in
ia32 )
stage_install_debian
do_package "i386"
;;
x64 )
stage_install_debian
do_package "amd64"
;;
* )
echo
echo "ERROR: Don't know how to build DEBs for '$TARGETARCH'."
echo
exit 1
;;
esac