| Index: installer/linux/build.scons
 | 
| ===================================================================
 | 
| --- installer/linux/build.scons	(revision 30708)
 | 
| +++ installer/linux/build.scons	(working copy)
 | 
| @@ -1,208 +0,0 @@
 | 
| -# Copyright 2009, Google Inc.
 | 
| -# 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 Google Inc. 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 COPYRIGHT
 | 
| -# OWNER 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.
 | 
| -
 | 
| -import os
 | 
| -import subprocess
 | 
| -import SCons
 | 
| -
 | 
| -Import('env')
 | 
| -
 | 
| -# Check if Debian packaging tools are installed. If so, make a .deb package.
 | 
| -if subprocess.Popen(["which", "dpkg-buildpackage"],
 | 
| -    stdout=open(os.devnull, "w")).wait() == 0:
 | 
| -
 | 
| -  print('Found dpkg-buildpackage in PATH; will create Debian packages.');
 | 
| -
 | 
| -  current_source_dir = os.path.join(env['SCONSTRUCT_DIR'], 'installer/linux')
 | 
| -
 | 
| -  def OutputFromShellCommand(command):
 | 
| -    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
 | 
| -    return process.communicate()[0].strip()
 | 
| -
 | 
| -  def _InternalBuildDebianPackage(env, src_dir, obj_dir, debian_files,
 | 
| -      package_files, output_dir=None, force_version=None):
 | 
| -    """Creates build rules to build a Debian package from the specified sources.
 | 
| -
 | 
| -    Args:
 | 
| -      env: SCons Environment.
 | 
| -      src_dir: Current source path, to which the debian_files are
 | 
| -          relative.
 | 
| -      obj_dir: Directory to place object files in.
 | 
| -      debian_files: Array of the Debian control file sources that should be
 | 
| -          copied into the package source tree, e.g., changelog, control, rules,
 | 
| -          etc. Must be relative to current source dir.
 | 
| -      package_files: An array of 2-tuples listing the files that should be
 | 
| -          copied into the package source tree.
 | 
| -          The first element is the path where the file should be placed for the
 | 
| -              .install control file to find it, relative to the generated debian
 | 
| -              package source directory.
 | 
| -          The second element is the file source.
 | 
| -      output_dir: An optional directory to place the files in. If omitted, the
 | 
| -          current output directory is used.
 | 
| -      force_version: Optional. Forces the version of the package to start with
 | 
| -          this version string if specified. If the last entry in the changelog
 | 
| -          is not for a version that starts with this then a dummy entry is
 | 
| -          generated with this version and a ~prerelease suffix (so that the
 | 
| -          final version will compare as greater).
 | 
| -
 | 
| -    Return:
 | 
| -      A list of the targets (at least two).
 | 
| -    """
 | 
| -    # Read the control file and changelog file to determine the package name,
 | 
| -    # version, and arch that the Debian build tools will use to name the
 | 
| -    # generated files.
 | 
| -    control_file = None
 | 
| -    changelog_file = None
 | 
| -    for file in debian_files:
 | 
| -      if os.path.basename(file) == "control":
 | 
| -        control_file = os.path.join(src_dir, file)
 | 
| -      elif os.path.basename(file) == "changelog":
 | 
| -        changelog_file = os.path.join(src_dir, file)
 | 
| -    if control_file == None:
 | 
| -      raise Exception("Need to have a control file")
 | 
| -    if changelog_file == None:
 | 
| -      raise Exception("Need to have a changelog file")
 | 
| -    source = OutputFromShellCommand(
 | 
| -        "awk '/^Source:/ { print $2; }' " + control_file)
 | 
| -    packages = OutputFromShellCommand(
 | 
| -        "awk '/^Package:/ { print $2; }' " + control_file).split("\n")
 | 
| -    version = OutputFromShellCommand(
 | 
| -        "sed -nr '1 { s/.*\\((.*)\\).*/\\1/; p }' " + changelog_file)
 | 
| -    arch = OutputFromShellCommand(
 | 
| -        "awk '/^Architecture:/ { print $2; }' %s | head -n 1" % control_file)
 | 
| -    add_dummy_changelog_entry = False
 | 
| -    if force_version != None and not version.startswith(force_version):
 | 
| -      print('Warning: no entry in ' + changelog_file + ' for version ' +
 | 
| -          force_version + ' (last is ' + version +'). A dummy entry will be ' +
 | 
| -          'generated. Remember to add the real changelog entry before ' +
 | 
| -          'releasing.');
 | 
| -      version = force_version + '~prerelease'
 | 
| -      add_dummy_changelog_entry = True
 | 
| -    source_dir_name = source + "_" + version + "_" + arch
 | 
| -    target_file_names = [ source_dir_name + ".changes" ]
 | 
| -    for package in packages:
 | 
| -      package_file_name = package + "_" + version + "_" + arch + ".deb"
 | 
| -      target_file_names.append(package_file_name)
 | 
| -    # The targets
 | 
| -    if output_dir != None:
 | 
| -      targets = [os.path.join(output_dir, s) for s in target_file_names]
 | 
| -    else:
 | 
| -      targets = target_file_names
 | 
| -    # Path to where we will construct the debian build tree.
 | 
| -    deb_build_tree = os.path.join(obj_dir, source_dir_name, "deb_build_tree")
 | 
| -    # First copy the files.
 | 
| -    for file in package_files:
 | 
| -      env.Command(os.path.join(deb_build_tree, file[0]), file[1],
 | 
| -          SCons.Defaults.Copy('$TARGET', '$SOURCE'))
 | 
| -      env.Depends(targets, os.path.join(deb_build_tree, file[0]))
 | 
| -    # Now copy the Debian metadata sources. We have to do this all at once so
 | 
| -    # that we can remove the target directory before copying, because there
 | 
| -    # can't be any other stale files there or else dpkg-buildpackage may use
 | 
| -    # them and give incorrect build output.
 | 
| -    copied_debian_files_paths = []
 | 
| -    for file in debian_files:
 | 
| -      copied_debian_files_paths.append(os.path.join(deb_build_tree, "debian",
 | 
| -          os.path.basename(file)))
 | 
| -    copy_commands = [
 | 
| -        """dir=$$(dirname $TARGET) && \
 | 
| -            rm -Rf $$dir && \
 | 
| -            mkdir -p $$dir && \
 | 
| -            cp $SOURCES $$dir && \
 | 
| -            chmod -R u+w $$dir"""
 | 
| -    ]
 | 
| -    if add_dummy_changelog_entry:
 | 
| -      copy_commands += [
 | 
| -          """debchange -c $$(dirname $TARGET)/changelog --newversion %s \
 | 
| -              --distribution UNRELEASED \
 | 
| -              'Developer preview build. (This entry was auto-generated.)'""" %
 | 
| -          version
 | 
| -      ]
 | 
| -    env.Command(copied_debian_files_paths, debian_files, copy_commands)
 | 
| -    env.Depends(targets, copied_debian_files_paths)
 | 
| -    # TODO(tschmelcher): Change this to sign the package for Google builds once
 | 
| -    # we start putting out Linux releases.
 | 
| -    # Must explicitly specify -a because otherwise cross-builds won't work.
 | 
| -    # Must explicitly specify -D because -a disables it.
 | 
| -    # Must explicitly specify fakeroot because old dpkg tools don't assume that.
 | 
| -    env.Command(targets, None,
 | 
| -        """dir=%(dir)s && \
 | 
| -            cd $$dir && \
 | 
| -            dpkg-buildpackage -b -uc -a%(arch)s -D -rfakeroot && \
 | 
| -            cd $$OLDPWD && \
 | 
| -            for file in %(targets)s; do \
 | 
| -              mv $$dir/../$$file $$(dirname $TARGET); \
 | 
| -            done""" %
 | 
| -        {'dir':env.Dir(deb_build_tree).path,
 | 
| -         'arch':arch,
 | 
| -         'targets':" ".join(target_file_names)})
 | 
| -    return targets
 | 
| -
 | 
| -  def BuildDebianPackage(debian_files, package_files, output_dir=None,
 | 
| -      force_version=None):
 | 
| -    return _InternalBuildDebianPackage(env, current_source_dir, ".",
 | 
| -        debian_files, package_files, output_dir, force_version)
 | 
| -
 | 
| -  # Build amd64 package.
 | 
| -  BuildDebianPackage(["debian_common/changelog",
 | 
| -                      "debian_amd64/control",
 | 
| -                      "debian_amd64/google-o3d.install",
 | 
| -                      "debian_common/links",
 | 
| -                      "debian_amd64/postinst",
 | 
| -                      "debian_amd64/prerm",
 | 
| -                      "debian_amd64/rules"
 | 
| -                     ],
 | 
| -                     [("libnpo3dautoplugin.so",
 | 
| -                           '$ARTIFACTS_DIR/libnpo3dautoplugin.so'),
 | 
| -                      ("libGLEW.so.1.5", '$ARTIFACTS_DIR/libGLEW.so.1.5'),
 | 
| -                      ("libCg.so", '$ARTIFACTS_DIR/libCg.so'),
 | 
| -                      ("libCgGL.so", '$ARTIFACTS_DIR/libCgGL.so')
 | 
| -                     ],
 | 
| -                     output_dir='$ARTIFACTS_DIR',
 | 
| -                     force_version=env.get('O3D_PLUGIN_VERSION'))
 | 
| -
 | 
| -  # Build i386 package.
 | 
| -  BuildDebianPackage(["debian_common/changelog",
 | 
| -                      "debian_i386/control",
 | 
| -                      "debian_i386/google-o3d.install",
 | 
| -                      "debian_common/links",
 | 
| -                      "debian_i386/rules"
 | 
| -                     ],
 | 
| -                     [("libnpo3dautoplugin.so",
 | 
| -                           '$ARTIFACTS_DIR/libnpo3dautoplugin.so'),
 | 
| -                      ("libCg.so", '$ARTIFACTS_DIR/libCg.so'),
 | 
| -                      ("libCgGL.so", '$ARTIFACTS_DIR/libCgGL.so')
 | 
| -                     ],
 | 
| -                     output_dir='$ARTIFACTS_DIR',
 | 
| -                     force_version=env.get('O3D_PLUGIN_VERSION'))
 | 
| -
 | 
| -else:
 | 
| -  print('dpkg-buildpackage not found in PATH; Debian packages will not be '
 | 
| -      'built.');
 | 
| -
 | 
| -# TODO(tschmelcher): Also build an RPM and a tgz.
 | 
| 
 |