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. |