blob: 554794a54ef4942a8a3132c4d6536a62e50f1c9f [file] [log] [blame]
#!/usr/bin/python2.4
#
# Copyright 2009-2010 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========================================================================
""" Build enterprise installers examples.
This file contains the product-specific information for building an
MSI for remote installation in the enterprise. Product teams should only
need to modify this file.
APPTEAMS:
There are two ways to build such an MSI depending on whether the product's
installer is or contains an MSI.
"""
Import('env')
import urllib
from enterprise.installer import build_enterprise_installer
# APPTEAMS: Change this value to False.
# Build the installer using build rules specific to Google Update builds.
BUILDING_WITH_GOOGLE_UPDATE = True
# APPTEAMS:
# Note about versions: Each released build needs to have a different Build
# number in the version "Major.Minor.Build.Qfe". The Qfe is ignored by MSI and
# only increasing it may cause both the old and new versions of the this MSI
# to exist side-by-side (http://msdn.microsoft.com/en-us/library/aa370859.aspx).
#
# Applications with EXE installers
#
# Use this section to build an MSI that contains Google Update and a product's
# EXE installer. The EXE may not use an MSI installer internally.
# MSI installers cannot be wrapped in this way because nested MSI installs are
# discouraged, problematic, and deprecated from WiX.
# APPTEAMS: Make appropriate call to BuildEnterpriseInstaller(). Example below.
# This sample:
# * Builds multiple "products" (each product is actually a different version).
# Products are specified in an array of structures, which specify the values
# for each product.
# * Builds multiple pre-tagged brands and ap values for each "product."
def _BuildSampleForTest():
ENTERPRISE_INSTALLER_PRODUCTS = [
('Save Arguments', '0.1.2.0', '{7DD1EF7B-D075-47c0-BD51-F624ED87CCF0}',
'&brand=mkfi',
'$MAIN_DIR/testing/unittest_support/SaveArguments.exe',
'/install 0.1.2.0', '/donotregister', '/silentuninstall 0.1.2.0',
'SaveArguments_Enterprise_Installer_0.1.2.0'),
('Save Arguments', '0.1.3.0', '{7DD1EF7B-D075-47c0-BD51-F624ED87CCF0}',
'&brand=mkfi',
'$MAIN_DIR/testing/unittest_support/SaveArguments.exe',
'/install 0.1.3.0', '/donotregister', '/silentuninstall 0.1.3.0',
'SaveArguments_Enterprise_Installer_0.1.3.0'),
]
# Example of calling BuildEnterpriseInstaller with multiple brands and ap
# value combinations for each product.
BRAND_AP_COMBINATIONS = [
('FOOB', 'foobar'),
#('ENTA', 'enterprise'),
#('ENTB', 'enterprise'),
]
# Omaha only: Build the enterprise installer for each version of Omaha.
for omaha_version_info in env['omaha_versions_info']:
prefix = omaha_version_info.filename_prefix
for combo in BRAND_AP_COMBINATIONS:
for product in ENTERPRISE_INSTALLER_PRODUCTS:
(product_name, product_version, product_guid,
product_custom_params,
product_installer_path,
product_installer_install_command,
product_installer_disable_update_registration_arg,
product_uninstaller_additional_args,
msi_base_name) = product
product_custom_params = '&brand=' + combo[0] + '&ap=' + combo[1]
build_enterprise_installer.BuildEnterpriseInstaller(
env,
product_name, product_version, product_guid,
product_custom_params,
product_installer_path,
product_installer_install_command,
product_installer_disable_update_registration_arg,
product_uninstaller_additional_args,
prefix + msi_base_name + '_' + combo[0],
'$MAIN_DIR/enterprise/installer',
'$STAGING_DIR/%sGoogleUpdateSetup.exe' % prefix,
output_dir = '$TARGET_ROOT/Test_Installers'
)
# Builds a sample enterprise installer based on a standalone installer.
# TODO(omaha): Use a standalone installer that does not wrap an MSI. This
# mechanism is not intended to be used for apps that use MSI installers.
# As is, Omaha tries to install the MSI but fails because the Windows
# Installer is busy. It takes a long time to fail because Omaha retries.
# TODO(omaha): This is a bad example because it uses MSI. See above.
def _BuildSampleStandaloneForTest():
# Omaha only: Build the enterprise installer for each version of Omaha.
for omaha_version_info in env['omaha_versions_info']:
prefix = omaha_version_info.filename_prefix
msi_base_name = 'TestFoo_Standalone_Enterprise_Installer_1.0.101.0'
BRAND = 'ENTC'
AP = 'enterprise-C'
product_custom_params = '&brand=' + BRAND + '&ap=' + AP
# Sample installer data, encoded for the command line. This sample uses a
# JSON format but the format is app-specific.
product_installer_data = (
'{"enterprise":{"param1":true,"param2":true},"value1":"foo"}')
product_installer_data = urllib.quote(product_installer_data)
build_enterprise_installer.BuildEnterpriseInstallerFromStandaloneInstaller(
env,
'Test Foo',
'1.0.101.0',
'{D6B08267-B440-4c85-9F79-E195E80D9937}',
product_custom_params,
'/silentuninstall',
product_installer_data,
('$TARGET_ROOT/Test_Installers/' +
'%sUNOFFICIAL_TestFooStandaloneInstaller.exe' % (prefix)),
prefix + msi_base_name + '_' + BRAND,
'$MAIN_DIR/enterprise/installer',
output_dir = '$TARGET_ROOT/Test_Installers'
)
if BUILDING_WITH_GOOGLE_UPDATE:
_BuildSampleForTest()
_BuildSampleStandaloneForTest()
#
# Applications with MSI installers
#
# To bundle Google Update with a product that has an MSI installer:
# * Build a .wixobj that contains the Google Update installation fragment
# by calling BuildGoogleUpdateFragment().
# * Include the ComponentGoogleUpdate component in the appropriate feature in
# the product's WiX code.
#
# For an example, see instances of "enterprise" in the following files:
# omaha/test/test_foo.wxs.xml
# omaha/test/build.scons