Home | History | Annotate | Download | only in common
      1 # Recursively replace @@include@@ template variables with the referenced file,
      2 # and write the resulting text to stdout.
      3 process_template_includes() {
      4   INCSTACK+="$1->"
      5   # Includes are relative to the file that does the include.
      6   INCDIR=$(dirname $1)
      7   # Clear IFS so 'read' doesn't trim whitespace
      8   local OLDIFS="$IFS"
      9   IFS=''
     10   while read -r LINE
     11   do
     12     INCLINE=$(sed -e '/^[[:space:]]*@@include@@/!d' <<<$LINE)
     13     if [ -n "$INCLINE" ]; then
     14       INCFILE=$(echo $INCLINE | sed -e "s#@@include@@\(.*\)#\1#")
     15       # Simple filename match to detect cyclic includes.
     16       CYCLE=$(sed -e "\#$INCFILE#"'!d' <<<$INCSTACK)
     17       if [ "$CYCLE" ]; then
     18         echo "ERROR: Possible cyclic include detected." 1>&2
     19         echo "$INCSTACK$INCFILE" 1>&2
     20         exit 1
     21       fi
     22       if [ ! -r "$INCDIR/$INCFILE" ]; then
     23         echo "ERROR: Couldn't read include file: $INCDIR/$INCFILE" 1>&2
     24         exit 1
     25       fi
     26       process_template_includes "$INCDIR/$INCFILE"
     27     else
     28       echo "$LINE"
     29     fi
     30   done < "$1"
     31   IFS="$OLDIFS"
     32   INCSTACK=${INCSTACK%"$1->"}
     33 }
     34 
     35 # Replace template variables (@@VARNAME@@) in the given template file. If a
     36 # second argument is given, save the processed text to that filename, otherwise
     37 # modify the template file in place.
     38 process_template() (
     39   # Don't worry if some of these substitution variables aren't set.
     40   # Note that this function is run in a sub-shell so we don't leak this
     41   # setting, since we still want unbound variables to be an error elsewhere.
     42   set +u
     43 
     44   local TMPLIN="$1"
     45   if [ -z "$2" ]; then
     46     local TMPLOUT="$TMPLIN"
     47   else
     48     local TMPLOUT="$2"
     49   fi
     50   # Process includes first so included text also gets substitutions.
     51   TMPLINCL="$(process_template_includes "$TMPLIN")"
     52   sed \
     53     -e "s#@@PACKAGE@@#${PACKAGE}#g" \
     54     -e "s#@@PACKAGE_FILENAME@@#${PACKAGE_FILENAME}#g" \
     55     -e "s#@@PROGNAME@@#${PROGNAME}#g" \
     56     -e "s#@@CHANNEL@@#${CHANNEL}#g" \
     57     -e "s#@@COMPANY_FULLNAME@@#${COMPANY_FULLNAME}#g" \
     58     -e "s#@@VERSION@@#${VERSION}#g" \
     59     -e "s#@@PACKAGE_RELEASE@@#${PACKAGE_RELEASE}#g" \
     60     -e "s#@@VERSIONFULL@@#${VERSIONFULL}#g" \
     61     -e "s#@@INSTALLDIR@@#${INSTALLDIR}#g" \
     62     -e "s#@@BUILDDIR@@#${BUILDDIR}#g" \
     63     -e "s#@@STAGEDIR@@#${STAGEDIR}#g" \
     64     -e "s#@@SCRIPTDIR@@#${SCRIPTDIR}#g" \
     65     -e "s#@@MENUNAME@@#${MENUNAME}#g" \
     66     -e "s#@@PRODUCTURL@@#${PRODUCTURL}#g" \
     67     -e "s#@@PREDEPENDS@@#${PREDEPENDS}#g" \
     68     -e "s#@@DEPENDS@@#${DEPENDS}#g" \
     69     -e "s#@@PROVIDES@@#${PROVIDES}#g" \
     70     -e "s#@@REPLACES@@#${REPLACES}#g" \
     71     -e "s#@@CONFLICTS@@#${CONFLICTS}#g" \
     72     -e "s#@@ARCHITECTURE@@#${ARCHITECTURE}#g" \
     73     -e "s#@@MAINTNAME@@#${MAINTNAME}#g" \
     74     -e "s#@@MAINTMAIL@@#${MAINTMAIL}#g" \
     75     -e "s#@@REPOCONFIG@@#${REPOCONFIG}#g" \
     76     -e "s#@@SHORTDESC@@#${SHORTDESC}#g" \
     77     -e "s#@@FULLDESC@@#${FULLDESC}#g" \
     78     -e "s#@@DEFAULT_FLAGS@@#${DEFAULT_FLAGS:-}#g" \
     79     > "$TMPLOUT" <<< "$TMPLINCL"
     80 )
     81 
     82 # Setup the installation directory hierachy in the package staging area.
     83 prep_staging_common() {
     84   install -m 755 -d "${STAGEDIR}/${INSTALLDIR}" \
     85     "${STAGEDIR}/usr/bin" \
     86     "${STAGEDIR}/usr/share/applications" \
     87     "${STAGEDIR}/usr/share/gnome-control-center/default-apps" \
     88     "${STAGEDIR}/usr/share/man/man1"
     89 }
     90 
     91 get_version_info() {
     92   source "${BUILDDIR}/installer/version.txt"
     93   VERSION="${MAJOR}.${MINOR}.${BUILD}.${PATCH}"
     94   # TODO(phajdan.jr): Provide a mechanism to pass a different package
     95   # release number if needed. The meaning of it is to bump it for
     96   # packaging-only changes while the underlying software has the same version.
     97   # This corresponds to the Release field in RPM spec files and debian_revision
     98   # component of the Version field for DEB control file.
     99   # Generally with Chrome's fast release cycle it'd be more hassle to try
    100   # to bump this number between releases.
    101   PACKAGE_RELEASE="1"
    102 }
    103 
    104 stage_install_common() {
    105   echo "Staging common install files in '${STAGEDIR}'..."
    106 
    107   # TODO(mmoss) This assumes we built the static binaries. To support shared
    108   # builds, we probably want an install target in scons so it can give us all
    109   # the right files. See also:
    110   # http://code.google.com/p/chromium/issues/detail?id=4451
    111   #
    112   # app
    113   # We need to add the debug link so gdb knows to look for the symbols.
    114   DEBUGFILE="${BUILDDIR}/${PROGNAME}.debug"
    115   STRIPPEDFILE="${BUILDDIR}/${PROGNAME}.stripped"
    116   eu-strip -o "${STRIPPEDFILE}" -f "${DEBUGFILE}" "${BUILDDIR}/${PROGNAME}"
    117   install -m 755 "${STRIPPEDFILE}" "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}"
    118   rm "${DEBUGFILE}" "${STRIPPEDFILE}"
    119 
    120   # resources
    121   install -m 644 "${BUILDDIR}/${PROGNAME}.pak" "${STAGEDIR}/${INSTALLDIR}/"
    122   install -m 644 "${BUILDDIR}/resources.pak" "${STAGEDIR}/${INSTALLDIR}/"
    123   # TODO(mmoss): This has broken a couple times on adding new .pak files. Maybe
    124   # we should flag all installer files in FILES.cfg and get them from there, so
    125   # there's only one place people need to keep track of such things (and in
    126   # only the public repository).
    127   if [ -r "${BUILDDIR}/chrome_100_percent.pak" ]; then
    128     install -m 644 "${BUILDDIR}/chrome_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/"
    129   else
    130     install -m 644 "${BUILDDIR}/theme_resources_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/"
    131     install -m 644 "${BUILDDIR}/ui_resources_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/"
    132   fi
    133 
    134   # sandbox
    135   # Rename sandbox binary with hyphen instead of underscore because that's what
    136   # the code looks for, but the build targets can't use hyphens (scons bug?)
    137   install -m 4755 -s "${BUILDDIR}/${PROGNAME}_sandbox" \
    138     "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}-sandbox"
    139 
    140   # l10n paks
    141   cp -a "${BUILDDIR}/locales" "${STAGEDIR}/${INSTALLDIR}/"
    142   find "${STAGEDIR}/${INSTALLDIR}/locales" -type f -exec chmod 644 '{}' \;
    143   find "${STAGEDIR}/${INSTALLDIR}/locales" -type d -exec chmod 755 '{}' \;
    144 
    145   # ffmpeg libs
    146   install -m 644 -s "${BUILDDIR}/libffmpegsumo.so" "${STAGEDIR}/${INSTALLDIR}/"
    147 
    148   # Widevine CDM.
    149   if [ -f "${BUILDDIR}/libwidevinecdmadapter.so" ]; then
    150     install -m 644 -s "${BUILDDIR}/libwidevinecdmadapter.so" "${STAGEDIR}/${INSTALLDIR}/"
    151     install -m 644 "${BUILDDIR}/libwidevinecdm.so" "${STAGEDIR}/${INSTALLDIR}/"
    152   fi
    153 
    154   # Pepper Flash.
    155   PEPPERFLASH_SRCDIR="${BUILDDIR}/PepperFlash"
    156   PEPPERFLASH_DESTDIR="${STAGEDIR}/${INSTALLDIR}/PepperFlash"
    157   install -m 755 -d "${PEPPERFLASH_DESTDIR}"
    158   install -m 644 -s "${PEPPERFLASH_SRCDIR}/libpepflashplayer.so" \
    159     "${PEPPERFLASH_DESTDIR}/"
    160   install -m 644 "${PEPPERFLASH_SRCDIR}/manifest.json" \
    161     "${PEPPERFLASH_DESTDIR}/"
    162 
    163   # pdf plugin
    164   if [ -f "${BUILDDIR}/libpdf.so" ]; then
    165     install -m 644 -s "${BUILDDIR}/libpdf.so" "${STAGEDIR}/${INSTALLDIR}/"
    166   fi
    167 
    168   # peerconnection shared library
    169   if [ -f "${BUILDDIR}/lib/libpeerconnection.so" ]; then
    170     install -m 755 -d "${STAGEDIR}/${INSTALLDIR}/lib/"
    171     install -m 644 -s "${BUILDDIR}/lib/libpeerconnection.so" "${STAGEDIR}/${INSTALLDIR}/lib/"
    172   fi
    173 
    174   # nacl pepper plugin
    175   if [ -f "${BUILDDIR}/libppGoogleNaClPluginChrome.so" ]; then
    176     install -m 644 -s "${BUILDDIR}/libppGoogleNaClPluginChrome.so" "${STAGEDIR}/${INSTALLDIR}/"
    177   fi
    178 
    179   # nacl_helper and nacl_helper_bootstrap
    180   # Don't use "-s" (strip) because this runs binutils "strip", which
    181   # mangles the special ELF program headers of nacl_helper_bootstrap.
    182   # Explicitly use eu-strip instead, because it doesn't have that problem.
    183   for file in nacl_helper nacl_helper_bootstrap; do
    184     buildfile="${BUILDDIR}/${file}"
    185     if [ -f "${buildfile}" ]; then
    186       strippedfile="${buildfile}.stripped"
    187       debugfile="${buildfile}.debug"
    188       eu-strip -o "${strippedfile}" -f "${debugfile}" "${buildfile}"
    189       install -m 755 "${strippedfile}" "${STAGEDIR}/${INSTALLDIR}/${file}"
    190     fi
    191   done
    192   # Don't use "-s" (strip) because this would use the Linux toolchain to
    193   # strip the NaCl binary, which has the potential to break it.  It
    194   # certainly resets the OSABI and ABIVERSION fields to non-NaCl values,
    195   # although the NaCl IRT loader doesn't care about these fields.  In any
    196   # case, the IRT binaries are already stripped by NaCl's build process.
    197   for filename in ${BUILDDIR}/nacl_irt_*.nexe; do
    198     # Re-check the filename in case globbing matched nothing.
    199     if [ -f "$filename" ]; then
    200       install -m 644 "$filename" "${STAGEDIR}/${INSTALLDIR}/`basename "$filename"`"
    201     fi
    202   done
    203 
    204   # default apps
    205   if [ -d "${BUILDDIR}/default_apps" ]; then
    206     cp -a "${BUILDDIR}/default_apps" "${STAGEDIR}/${INSTALLDIR}/"
    207     find "${STAGEDIR}/${INSTALLDIR}/default_apps" -type d -exec chmod 755 '{}' \;
    208     find "${STAGEDIR}/${INSTALLDIR}/default_apps" -type f -exec chmod 644 '{}' \;
    209   fi
    210 
    211   # launcher script and symlink
    212   process_template "${BUILDDIR}/installer/common/wrapper" \
    213     "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}"
    214   chmod 755 "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}"
    215   pushd "${STAGEDIR}/usr/bin/"
    216   ln -snf "${INSTALLDIR}/${PACKAGE}" "${PACKAGE}"
    217   popd
    218 
    219   # app icons
    220   install -m 644 \
    221     "${BUILDDIR}/installer/theme/product_logo_"*.png \
    222     "${BUILDDIR}/installer/theme/product_logo_32.xpm" \
    223     "${STAGEDIR}/${INSTALLDIR}/"
    224 
    225   # desktop integration
    226   install -m 755 "${BUILDDIR}/xdg-mime" "${STAGEDIR}${INSTALLDIR}/"
    227   install -m 755 "${BUILDDIR}/xdg-settings" "${STAGEDIR}${INSTALLDIR}/"
    228   process_template "${BUILDDIR}/installer/common/desktop.template" \
    229     "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}.desktop"
    230   chmod 644 "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}.desktop"
    231   process_template "${BUILDDIR}/installer/common/default-app.template" \
    232     "${STAGEDIR}/usr/share/gnome-control-center/default-apps/${PACKAGE}.xml"
    233   chmod 644 "${STAGEDIR}/usr/share/gnome-control-center/default-apps/${PACKAGE}.xml"
    234   process_template "${BUILDDIR}/installer/common/default-app-block.template" \
    235     "${STAGEDIR}${INSTALLDIR}/default-app-block"
    236   chmod 644 "${STAGEDIR}${INSTALLDIR}/default-app-block"
    237 
    238   # documentation
    239   install -m 755 "${BUILDDIR}/${PROGNAME}.1" \
    240     "${STAGEDIR}/usr/share/man/man1/${PACKAGE}.1"
    241 }
    242