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 -e "s#@@SXS_USER_DATA_DIR@@#${SXS_USER_DATA_DIR:-}#g" \ 80 -e "s#@@USR_BIN_SYMLINK_NAME@@#${USR_BIN_SYMLINK_NAME:-}#g" \ 81 > "$TMPLOUT" <<< "$TMPLINCL" 82 ) 83 84 # Setup the installation directory hierachy in the package staging area. 85 prep_staging_common() { 86 install -m 755 -d "${STAGEDIR}/${INSTALLDIR}" \ 87 "${STAGEDIR}/usr/bin" \ 88 "${STAGEDIR}/usr/share/applications" \ 89 "${STAGEDIR}/usr/share/gnome-control-center/default-apps" \ 90 "${STAGEDIR}/usr/share/man/man1" 91 } 92 93 get_version_info() { 94 source "${BUILDDIR}/installer/version.txt" 95 VERSION="${MAJOR}.${MINOR}.${BUILD}.${PATCH}" 96 # TODO(phajdan.jr): Provide a mechanism to pass a different package 97 # release number if needed. The meaning of it is to bump it for 98 # packaging-only changes while the underlying software has the same version. 99 # This corresponds to the Release field in RPM spec files and debian_revision 100 # component of the Version field for DEB control file. 101 # Generally with Chrome's fast release cycle it'd be more hassle to try 102 # to bump this number between releases. 103 PACKAGE_RELEASE="1" 104 } 105 106 stage_install_common() { 107 echo "Staging common install files in '${STAGEDIR}'..." 108 109 # TODO(mmoss) This assumes we built the static binaries. To support shared 110 # builds, we probably want an install target in scons so it can give us all 111 # the right files. See also: 112 # http://code.google.com/p/chromium/issues/detail?id=4451 113 # 114 # app 115 # We need to add the debug link so gdb knows to look for the symbols. 116 DEBUGFILE="${BUILDDIR}/${PROGNAME}.debug" 117 STRIPPEDFILE="${BUILDDIR}/${PROGNAME}.stripped" 118 "${BUILDDIR}/installer/common/eu-strip" -o "${STRIPPEDFILE}" -f "${DEBUGFILE}" "${BUILDDIR}/${PROGNAME}" 119 install -m 755 "${STRIPPEDFILE}" "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}" 120 rm "${DEBUGFILE}" "${STRIPPEDFILE}" 121 122 # resources 123 install -m 644 "${BUILDDIR}/resources.pak" "${STAGEDIR}/${INSTALLDIR}/" 124 # TODO(mmoss): This has broken a couple times on adding new .pak files. Maybe 125 # we should flag all installer files in FILES.cfg and get them from there, so 126 # there's only one place people need to keep track of such things (and in 127 # only the public repository). 128 if [ -r "${BUILDDIR}/chrome_100_percent.pak" ]; then 129 install -m 644 "${BUILDDIR}/chrome_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/" 130 else 131 install -m 644 "${BUILDDIR}/theme_resources_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/" 132 install -m 644 "${BUILDDIR}/ui_resources_100_percent.pak" "${STAGEDIR}/${INSTALLDIR}/" 133 fi 134 135 # ICU data file; only necessary when icu_use_data_file_flag is set to 1 136 # in build/common.gypi. 137 install -m 644 "${BUILDDIR}/icudtl.dat" "${STAGEDIR}/${INSTALLDIR}/" 138 139 # sandbox 140 # Rename sandbox binary with hyphen instead of underscore because that's what 141 # the code looks for, but the build targets can't use hyphens (scons bug?) 142 install -m 4755 -s "${BUILDDIR}/${PROGNAME}_sandbox" \ 143 "${STAGEDIR}/${INSTALLDIR}/${PROGNAME}-sandbox" 144 145 # l10n paks 146 cp -a "${BUILDDIR}/locales" "${STAGEDIR}/${INSTALLDIR}/" 147 find "${STAGEDIR}/${INSTALLDIR}/locales" -type f -exec chmod 644 '{}' \; 148 find "${STAGEDIR}/${INSTALLDIR}/locales" -type d -exec chmod 755 '{}' \; 149 150 # ffmpeg libs 151 install -m 644 -s "${BUILDDIR}/libffmpegsumo.so" "${STAGEDIR}/${INSTALLDIR}/" 152 153 # Widevine CDM. 154 if [ -f "${BUILDDIR}/libwidevinecdmadapter.so" ]; then 155 install -m 644 -s "${BUILDDIR}/libwidevinecdmadapter.so" "${STAGEDIR}/${INSTALLDIR}/" 156 install -m 644 "${BUILDDIR}/libwidevinecdm.so" "${STAGEDIR}/${INSTALLDIR}/" 157 fi 158 159 # Pepper Flash. 160 PEPPERFLASH_SRCDIR="${BUILDDIR}/PepperFlash" 161 PEPPERFLASH_DESTDIR="${STAGEDIR}/${INSTALLDIR}/PepperFlash" 162 install -m 755 -d "${PEPPERFLASH_DESTDIR}" 163 install -m 644 -s "${PEPPERFLASH_SRCDIR}/libpepflashplayer.so" \ 164 "${PEPPERFLASH_DESTDIR}/" 165 install -m 644 "${PEPPERFLASH_SRCDIR}/manifest.json" \ 166 "${PEPPERFLASH_DESTDIR}/" 167 168 # pdf plugin 169 if [ -f "${BUILDDIR}/libpdf.so" ]; then 170 install -m 644 -s "${BUILDDIR}/libpdf.so" "${STAGEDIR}/${INSTALLDIR}/" 171 fi 172 173 # peerconnection shared library 174 if [ -f "${BUILDDIR}/lib/libpeerconnection.so" ]; then 175 install -m 755 -d "${STAGEDIR}/${INSTALLDIR}/lib/" 176 177 install -m 644 -s "${BUILDDIR}/lib/libpeerconnection.so" "${STAGEDIR}/${INSTALLDIR}/lib/" 178 fi 179 180 # nacl_helper and nacl_helper_bootstrap 181 # Don't use "-s" (strip) because this runs binutils "strip", which 182 # mangles the special ELF program headers of nacl_helper_bootstrap. 183 # Explicitly use eu-strip instead, because it doesn't have that problem. 184 for file in nacl_helper nacl_helper_bootstrap; do 185 buildfile="${BUILDDIR}/${file}" 186 if [ -f "${buildfile}" ]; then 187 strippedfile="${buildfile}.stripped" 188 debugfile="${buildfile}.debug" 189 "${BUILDDIR}/installer/common/eu-strip" -o "${strippedfile}" -f "${debugfile}" "${buildfile}" 190 install -m 755 "${strippedfile}" "${STAGEDIR}/${INSTALLDIR}/${file}" 191 fi 192 done 193 # Don't use "-s" (strip) because this would use the Linux toolchain to 194 # strip the NaCl binary, which has the potential to break it. It 195 # certainly resets the OSABI and ABIVERSION fields to non-NaCl values, 196 # although the NaCl IRT loader doesn't care about these fields. In any 197 # case, the IRT binaries are already stripped by NaCl's build process. 198 for filename in ${BUILDDIR}/nacl_irt_*.nexe; do 199 # Re-check the filename in case globbing matched nothing. 200 if [ -f "$filename" ]; then 201 install -m 644 "$filename" "${STAGEDIR}/${INSTALLDIR}/`basename "$filename"`" 202 fi 203 done 204 205 # default apps 206 if [ -d "${BUILDDIR}/default_apps" ]; then 207 cp -a "${BUILDDIR}/default_apps" "${STAGEDIR}/${INSTALLDIR}/" 208 find "${STAGEDIR}/${INSTALLDIR}/default_apps" -type d -exec chmod 755 '{}' \; 209 find "${STAGEDIR}/${INSTALLDIR}/default_apps" -type f -exec chmod 644 '{}' \; 210 fi 211 212 # launcher script and symlink 213 process_template "${BUILDDIR}/installer/common/wrapper" \ 214 "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}" 215 chmod 755 "${STAGEDIR}/${INSTALLDIR}/${PACKAGE}" 216 if [ ! -f "${STAGEDIR}/${INSTALLDIR}/google-chrome" ]; then 217 ln -sn "${INSTALLDIR}/${PACKAGE}" \ 218 "${STAGEDIR}/${INSTALLDIR}/google-chrome" 219 fi 220 ln -snf "${INSTALLDIR}/${PACKAGE}" \ 221 "${STAGEDIR}/usr/bin/${USR_BIN_SYMLINK_NAME}" 222 223 # app icons 224 install -m 644 \ 225 "${BUILDDIR}/installer/theme/product_logo_"*.png \ 226 "${BUILDDIR}/installer/theme/product_logo_32.xpm" \ 227 "${STAGEDIR}/${INSTALLDIR}/" 228 229 # desktop integration 230 install -m 755 "${BUILDDIR}/xdg-mime" "${STAGEDIR}${INSTALLDIR}/" 231 install -m 755 "${BUILDDIR}/xdg-settings" "${STAGEDIR}${INSTALLDIR}/" 232 process_template "${BUILDDIR}/installer/common/desktop.template" \ 233 "${STAGEDIR}/usr/share/applications/${PACKAGE}.desktop" 234 chmod 644 "${STAGEDIR}/usr/share/applications/${PACKAGE}.desktop" 235 process_template "${BUILDDIR}/installer/common/default-app.template" \ 236 "${STAGEDIR}/usr/share/gnome-control-center/default-apps/${PACKAGE}.xml" 237 chmod 644 "${STAGEDIR}/usr/share/gnome-control-center/default-apps/${PACKAGE}.xml" 238 process_template "${BUILDDIR}/installer/common/default-app-block.template" \ 239 "${STAGEDIR}${INSTALLDIR}/default-app-block" 240 chmod 644 "${STAGEDIR}${INSTALLDIR}/default-app-block" 241 242 # documentation 243 install -m 755 "${BUILDDIR}/${PROGNAME}.1" \ 244 "${STAGEDIR}/usr/share/man/man1/${PACKAGE}.1" 245 } 246