#!/bin/sh # ####################################################################### # buildPackage - Build TclTk Aqua installer package # # FILE: "buildPackage" # created: 30/10/02 1:11:07 EST # # Author: Daniel A. Steffen # E-mail: # mail: Mathematics Departement # Macquarie University NSW 2109 Australia # www: # # RCS: @(#) $Id: buildPackage,v 1.10 2005/05/04 14:20:56 das Exp $ # # BSD License: c.f. # # Copyright (c) 2002-2005, Daniel A. Steffen # All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # * Redistributions of source code must retain the above # copyright notice, this list of conditions and the # following disclaimer. # # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials # provided with the distribution. # # * Neither the name of Macquarie University nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # ####################################################################### # Acknowledgments: # Installer package building technique inspired by code in '/usr/bin/package' # shipped with Mac OS X 10.2 # #---------------------------------------------------------------------------------------- USAGE="usage: $(basename "$0") [-n name] [-v version] [-s shortvers] [-d destdir] [-b basedir] [-w welcome] [-r readme] [-l license] [-t tardir] [-p preflight] [-o postflight] [-f otherInstFile] [-i bundleident] [-m] [-a] [-q] [-u] [-c] [-g] target" USAGE1="# -m: metapackage; -a: register apps; -q: required; -u: no authorization: -c relocatable; -g: use gnutar instead of pax" TMP="${TMP:-${TMP_DIR:-$(pwd)}/tmp}" D="$(cd $(dirname $0); pwd)" I="${D}/../Installer" PACKAGES=../Packages #---------------------------------------------------------------------------------------- while getopts n:v:s:d:b:w:r:l:t:p:o:i:f:maqucg o; do case $o in n) name=$OPTARG;; v) version=$OPTARG;; s) shortvers=$OPTARG;; d) destdir=$OPTARG;; b) basedir=$OPTARG;; w) welcome=$OPTARG;; r) readme=$OPTARG;; l) license=$OPTARG;; t) tardir=$OPTARG;; p) preflight=$OPTARG;; o) postflight=$OPTARG;; i) bundleIdent=$OPTARG;; f) otherInstFile=$OPTARG;; m) meta=1;; a) app=YES;; q) required=YES;; u) needsauth=NO;; c) reloc=YES; rootvol=NO;; g) usetar=1;; \?) echo $USAGE; echo $USAGE1; exit 2;; esac done shift $(($OPTIND - 1)) if [ -z "${meta}" -a $# -lt 1 ] ; then echo $USAGE; echo $USAGE1; exit 2 fi targets=$@ : ${destdir:=.} : ${basedir:=/} : ${name:=$(echo $1 | awk '{print toupper(substr($0,1,1))substr($0,2)}')} : ${shortvers:=${version}} : ${app:=NO} : ${required:=NO} : ${needsauth:=YES} : ${reloc:=NO} : ${rootvol:=YES} : ${bundleIdent:=tk.tcl} if [ -z "${welcome}" ] ; then if [ -e "${I}/Welcome.rtfd" ] ; then welcome="${I}/Welcome.rtfd" elif [ -e "${I}/Welcome.rtf" ] ; then welcome="${I}/Welcome.rtf" fi fi #---------------------------------------------------------------------------------------- if [ -z "${meta}" ] ; then ext=pkg echo "$(basename "$0"): building installer package for target(s) \"${targets}\" as \"${name}.${ext}\"" else ext=mpkg echo "$(basename "$0"): building meta-installer package \"${name}.${ext}\"" fi echo #---------------------------------------------------------------------------------------- fixFilePerms ( ) { chmod -R a-w "$1" } finalizeFile ( ) { fixFilePerms "$1" pkgsize=$((${pkgsize} + $(du -k -s "$1" | awk '{print $1}'))) } toRtf ( ) { awk -v s='{\\rtf1\\ansi{\\fonttbl\\f0\\fnil\\fcharset77 Geneva;}\\f0\\fs18' \ -v e='}' 'BEGIN {print s}; {gsub(/{|}|\\/,"\\\\&"); print $0"\\"}; END {print e}' "$1" > "$2" } substATSeqs ( ) { if (echo "$1" | egrep -q '\.rtfd$') ; then f="$1/TXT.rtf" rm -rf "$1/CVS" else f="$1" fi cvsdate=$(awk "/^(${targets}|defaultdate)( |\\t)/ {gsub(\"\\\"|\\\\\(|\\\\)\",\"\"); if(sub(/^[0-9A-Za-z]+( |\\t)+.*-D( |\\t)+/,\"\")) print}" \ ${D}/../cvsTag.conf | head -1) date=$(date -u '+%e/%b/%Y') os=$(awk '/ProductVersion/ {getline; split($0,a,"<[^>]*>"); split(a[2],b,"\."); print b[1]"."b[2]}' \ /System/Library/CoreServices/SystemVersion.plist) if [ -z "${cvsdate}" ]; then cvsdate="${date}"; fi sed -e "s|@DATE@|${date}|g" -e "s|@CVSDATE@|${cvsdate}|g" \ -e "s|@VERS@|${version}|g" -e "s|@SHORTVERS@|${shortvers}|g" \ -e "s|@PROJ@|${name}|g" -e "s|@OS@|${os}|g" "${f}" > "${f}.1" mv -f "${f}.1" "${f}" } transferTextFile ( ) { if [ -n "$1" ]; then if (echo "$1" | egrep -q '\.(html|rtf|rtfd)$') ; then x=$(echo "$1" | awk -F\. '{print $NF}') echo " copying \"$(basename "$1")\" to \"$2.${x}\"" pkgtxtf="${pkgrsrc}/$2.${x}" cp -RH "$1" "${pkgtxtf}" substATSeqs "${pkgtxtf}" else echo " converting \"$(basename "$1")\" to \"$2.rtf\"" pkgtxtf="${pkgrsrc}/$2.rtf" toRtf "$1" "${pkgtxtf}" fi finalizeFile "${pkgtxtf}" fi } transferInstallerFile ( ) { if [ -n "$3" -a \( -n "$2" -a -e "${I}/${name}/$1" -o \ -n "$2" -a -e "${I}/$1" -o \ -e "${I}/${name}/$1" -a -e "${I}/$1" \) ]; then # concatenate multiple installer scripts instf="/tmp/$1" rm -f "${instf}" for f in "${I}/$1" "${I}/${name}/$1" "$2"; { if [ -e "${f}" ]; then sed -e 's/^exit 0$//' "${f}" >> "${instf}" fi } echo 'exit 0' >> "${instf}" else instf="$2" if [ -z "${instf}" -a -e "${I}/${name}/$1" ]; then instf="${I}/${name}/$1" elif [ -z "${instf}" -a -e "${I}/$1" ]; then instf="${I}/$1" fi fi if [ -n "${instf}" -a -r "${instf}" ]; then echo " copying \"$1\"" pkginstf="${pkgrsrc}/$1" cp -RH "${instf}" "${pkginstf}" if $(echo "$1" | egrep -q -v '\.(tiff|jpg|png|gif)$'); then substATSeqs "${pkginstf}" chmod -R a+x "${pkginstf}" fi finalizeFile "${pkginstf}" fi if [ -n "$3" -a -e "/tmp/$1" ]; then rm -f "/tmp/$1"; fi } #---------------------------------------------------------------------------------------- echo "Building package \"${name}.${ext}\"" mkdir -p "${destdir}" pkg="${destdir}/${name}.${ext}" if [ -e "${pkg}" ] ; then chmod -R a+w "${pkg}" rm -rf "${pkg}" fi pkgrsrc="${pkg}/Contents/Resources" mkdir -p -m 755 "${pkgrsrc}" #---------------------------------------------------------------------------------------- echo " writing \"PkgInfo\"" pkgpinfo="${pkg}/Contents/PkgInfo" echo -n pmkrpkg1 > "${pkgpinfo}" finalizeFile "${pkgpinfo}" #---------------------------------------------------------------------------------------- echo " writing \"Info.plist\"" pkgplist="${pkg}/Contents/Info.plist" cat > "${pkgplist}" < CFBundleGetInfoString ${name} ${version} CFBundleIdentifier ${bundleIdent}.${name} CFBundleName ${name} CFBundleShortVersionString ${version} EOF finalizeFile "${pkgplist}" #---------------------------------------------------------------------------------------- echo " writing \"${name}.info\"" pkginfo="${pkgrsrc}/${name}.info" cat > "${pkginfo}" <> "${pkginfo}" <> "${pkginfo}" < "${pkgarch}" else echo " building \"${name}.tar.gz\"" pkgarch="${pkgrsrc}/${name}.tar.gz" (cd "${TMP}${basedir}"; gnutar zcf "${pkgarch}" .) fi fixFilePerms "${pkgarch}" echo " building \"${name}.bom\"" pkgbom="${pkgrsrc}/${name}.bom" mkbom "${TMP}${basedir}" "${pkgbom}" 2>&1 >/dev/null finalizeFile "${pkgbom}" echo " writing \"${name}.sizes\"" pkgsizes="${pkgrsrc}/${name}.sizes" echo NumFiles $(lsbom -s "${pkgbom}" | wc -l) > "${pkgsizes}" # add 1KB each for sizes, location, status files echo InstalledSize $(($(du -k -s "${TMP}${basedir}" | awk '{print $1}')+${pkgsize}+3)) >> "${pkgsizes}" echo CompressedSize $(($(du -k -s "${pkg}" | awk '{print $1}')+3)) >> "${pkgsizes}" fixFilePerms "${pkgsizes}" if [ -n "${tardir:-}" ]; then echo "Tarring" mkdir -p "${tardir}" (cd "${destdir}" && gnutar cf "${tardir}/${name}.${ext}.tar" "${name}.${ext}" && bzip2 -f "${tardir}/${name}.${ext}.tar") fi else echo " building \"${name}.list\"" pkglist="${pkgrsrc}/${name}.list" touch "${pkglist}" pkgreadme="$(ls -d "${pkgrsrc}"/ReadMe.* 2>&-)" echo " adding package list to \"$(basename "${pkgreadme}")\"" chmod -R a+w "${pkgreadme}" if (echo "${pkgreadme}" | egrep -q '\.rtfd$') ; then f="${pkgreadme}/TXT.rtf" else f="${pkgreadme}" fi awk '/@PACKAGES@/ {nextfile}; {print}' "${f}" > "${f}.1" for p in $(ls -dtr "${pkg}/${PACKAGES}"/*.pkg "${pkg}/${PACKAGES}"/*.mpkg 2>&-); { n="$(basename "${p}")" if [ "${n}" = "Sampleextension.pkg" ]; then s="Unselected" else s="Selected" echo " $(echo "${n}" | awk -F\. '{print $1}') $(awk '/Version/ {sub("Version *",""); print}' ${p}/Contents/Resources/*.info)\\" >> "${f}.1" fi echo "${n}:${s}" >> "${pkglist}" } awk 's==1 {print}; /@PACKAGES@/ {s=1}' "${f}" >> "${f}.1" mv -f "${f}.1" "${f}" fixFilePerms "${pkgreadme}" finalizeFile "${pkglist}" fi echo "Done." echo