From 8128bd9373450370c1746a7e2d16344f86837a3b Mon Sep 17 00:00:00 2001 From: "sgjesse@google.com" Date: Thu, 6 Feb 2014 14:37:45 +0000 Subject: [PATCH] Add script for generating a source tarball and rules for bilding a Debian package R=ricow@google.com, kusternamm@google.com BUG= Review URL: https://codereview.chromium.org//154073002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@32359 260f80e4-7a28-3924-810f-c04153c831b5 --- tools/create_tarball.py | 221 ++++++++++++++++++ tools/linux_dist_support/debian/compat | 1 + tools/linux_dist_support/debian/control | 16 ++ tools/linux_dist_support/debian/dart.install | 2 + tools/linux_dist_support/debian/dart.links | 2 + tools/linux_dist_support/debian/rules | 51 ++++ tools/linux_dist_support/debian/source/format | 1 + tools/utils.py | 8 + 8 files changed, 302 insertions(+) create mode 100755 tools/create_tarball.py create mode 100644 tools/linux_dist_support/debian/compat create mode 100644 tools/linux_dist_support/debian/control create mode 100644 tools/linux_dist_support/debian/dart.install create mode 100644 tools/linux_dist_support/debian/dart.links create mode 100755 tools/linux_dist_support/debian/rules create mode 100644 tools/linux_dist_support/debian/source/format diff --git a/tools/create_tarball.py b/tools/create_tarball.py new file mode 100755 index 00000000000..97e1bcb72b1 --- /dev/null +++ b/tools/create_tarball.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python +# +# Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +# for details. All rights reserved. Use of this source code is governed by a +# BSD-style license that can be found in the LICENSE file. +# + +# Script to build a tarball of the Dart source. +# +# The tarball includes all the source needed to build Dart. This +# includes source in third_party. As part of creating the tarball the +# files used to build Debian packages are copied to a top-level debian +# directory. This makes it easy to build Debian packages from the +# tarball. +# +# For building a Debian package renaming the tarball to follow the +# Debian is needed. +# +# $ mv dart-XXX.tar.gz dart_XXX.orig.tar.gz +# $ tar xf dart_XXX.orig.tar.gz +# $ cd dart_XXX +# $ debuild -us -uc + +import datetime +import optparse +import sys +import tarfile +import tempfile +import utils + +from os import listdir, makedirs, remove, rmdir +from os.path import basename, dirname, join, realpath, exists, isdir, split + +HOST_OS = utils.GuessOS() + +# TODO (16582): Remove this when the LICENSE file becomes part of +# all checkouts. +license = [ + 'This license applies to all parts of Dart that are not externally', + 'maintained libraries. The external maintained libraries used by', + 'Dart are:', + '', + '7-Zip - in third_party/7zip', + 'JSCRE - in runtime/third_party/jscre', + 'Ant - in third_party/apache_ant', + 'args4j - in third_party/args4j', + 'bzip2 - in third_party/bzip2', + 'Commons IO - in third_party/commons-io', + 'Commons Lang in third_party/commons-lang', + 'dromaeo - in samples/third_party/dromaeo', + 'Eclipse - in third_party/eclipse', + 'gsutil - in third_party/gsutil', + 'Guava - in third_party/guava', + 'hamcrest - in third_party/hamcrest', + 'Httplib2 - in samples/third_party/httplib2', + 'JSON - in third_party/json', + 'JUnit - in third_party/junit', + 'Oauth - in samples/third_party/oauth2client', + 'weberknecht - in third_party/weberknecht', + 'fest - in third_party/fest', + 'mockito - in third_party/mockito', + '', + 'The libraries may have their own licenses; we recommend you read them,', + 'as their terms may differ from the terms below.', + '', + 'Copyright 2012, the Dart project authors. 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.' +] + +# Flags. +verbose = False + +# Name of the dart directory when unpacking the tarball. +versiondir = '' + +# Ignore Git/SVN files, checked-in binaries, backup files, etc.. +ignoredPaths = ['out', 'tools/testing/bin' + 'third_party/7zip', 'third_party/android_tools', + 'third_party/clang', 'third_party/d8', + 'third_party/firefox_jsshell'] +ignoredDirs = ['.svn', '.git'] +ignoredEndings = ['.mk', '.pyc', 'Makefile', '~'] + +def BuildOptions(): + result = optparse.OptionParser() + result.add_option("-v", "--verbose", + help='Verbose output.', + default=False, action="store_true") + return result + +def Filter(tar_info): + _, tail = split(tar_info.name) + if tail in ignoredDirs: + return None + for path in ignoredPaths: + if tar_info.name.startswith(path): + return None + for ending in ignoredEndings: + if tar_info.name.endswith(ending): + return None + # Add the dart directory name with version. + original_name = tar_info.name + # Place the debian directory one level over the rest which are + # placed in the directory 'dart'. This enables building the Debian + # packages out-of-the-box. + tar_info.name = join(versiondir, 'dart', tar_info.name) + if verbose: + print 'Adding %s as %s' % (original_name, tar_info.name) + return tar_info + +def GenerateCopyright(filename): + license_lines = license + try: + # Currently the LICENSE file is part of a svn-root checkout. + lf = open('../LICENSE', 'r') + license_lines = lf.read().splitlines() + print license_lines + lf.close() + except: + pass + + f = open(filename, 'w') + f.write('Name: dart\n') + f.write('Maintainer: Dart Team \n') + f.write('Source: https://code.google.com/p/dart/\n') + f.write('License:\n') + for line in license_lines: + f.write(' %s\n' % line) + f.close() + +def GenerateChangeLog(filename, version): + f = open(filename, 'w') + f.write('dart (%s-1) UNRELEASED; urgency=low\n' % version) + f.write('\n') + f.write(' * Generated file.\n') + f.write('\n') + f.write(' -- Dart Team %s\n' % + datetime.datetime.utcnow().strftime('%a, %d %b %Y %X +0000')) + f.close() + +def GenerateSvnRevision(filename, svn_revision): + f = open(filename, 'w') + f.write(svn_revision) + f.close() + + +def CreateTarball(): + # Generate the name of the tarfile + version = utils.GetVersion() + global versiondir + versiondir = 'dart-%s' % version + tarname = '%s.tar.gz' % versiondir + debian_dir = 'tools/linux_dist_support/debian' + # Create the tar file in the out directory. + tardir = utils.GetBuildDir(HOST_OS, HOST_OS) + if not exists(tardir): + makedirs(tardir) + tarfilename = join(tardir, tarname) + print 'Creating tarball: %s' % (tarfilename) + with tarfile.open(tarfilename, mode='w:gz') as tar: + for f in listdir('.'): + tar.add(f, filter=Filter) + for f in listdir(debian_dir): + tar.add(join(debian_dir, f), + arcname='%s/debian/%s' % (versiondir, f)) + + with utils.TempDir() as temp_dir: + # Generate and add debian/copyright + copyright = join(temp_dir, 'copyright') + GenerateCopyright(copyright) + tar.add(copyright, arcname='%s/debian/copyright' % versiondir) + + # Generate and add debian/changelog + change_log = join(temp_dir, 'changelog') + GenerateChangeLog(change_log, version) + tar.add(change_log, arcname='%s/debian/changelog' % versiondir) + + # For bleeding_edge add the SVN_REVISION file. + if utils.GetChannel() == 'be': + svn_revision = join(temp_dir, 'SVN_REVISION') + GenerateSvnRevision(svn_revision, utils.GetSVNRevision()) + tar.add(svn_revision, arcname='%s/dart/tools/SVN_REVISION' % versiondir) + +def Main(): + if HOST_OS != 'linux': + print 'Tarball can only be created on linux' + return -1 + + # Parse the options. + parser = BuildOptions() + (options, args) = parser.parse_args() + if options.verbose: + global verbose + verbose = True + + CreateTarball() + +if __name__ == '__main__': + sys.exit(Main()) diff --git a/tools/linux_dist_support/debian/compat b/tools/linux_dist_support/debian/compat new file mode 100644 index 00000000000..7f8f011eb73 --- /dev/null +++ b/tools/linux_dist_support/debian/compat @@ -0,0 +1 @@ +7 diff --git a/tools/linux_dist_support/debian/control b/tools/linux_dist_support/debian/control new file mode 100644 index 00000000000..bc8c5703e42 --- /dev/null +++ b/tools/linux_dist_support/debian/control @@ -0,0 +1,16 @@ +Source: dart +Maintainer: Soren Gjesse +Section: misc +Priority: optional +Standards-Version: 3.9.2 +Build-Depends: debhelper (>= 9), + subversion, + python, + g++-4.6, + openjdk-6-jdk + +Package: dart +Architecture: amd64 i386 +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Dart SDK + diff --git a/tools/linux_dist_support/debian/dart.install b/tools/linux_dist_support/debian/dart.install new file mode 100644 index 00000000000..0ea869a3aa6 --- /dev/null +++ b/tools/linux_dist_support/debian/dart.install @@ -0,0 +1,2 @@ +debian/tmp/out/dart usr/lib + diff --git a/tools/linux_dist_support/debian/dart.links b/tools/linux_dist_support/debian/dart.links new file mode 100644 index 00000000000..30c3b93ec3f --- /dev/null +++ b/tools/linux_dist_support/debian/dart.links @@ -0,0 +1,2 @@ +usr/lib/dart/bin/dart usr/bin/dart + diff --git a/tools/linux_dist_support/debian/rules b/tools/linux_dist_support/debian/rules new file mode 100755 index 00000000000..e7338112e3d --- /dev/null +++ b/tools/linux_dist_support/debian/rules @@ -0,0 +1,51 @@ +#!/usr/bin/make -f +export DH_VERBOSE = 1 + +# Use DEB_BUILD_OPTIONS's parallel=n option (see Policy 4.9.1) +ifneq (,$(findstring parallel,$(DEB_BUILD_OPTIONS))) +PARALLEL_JOBS := $(shell echo $(DEB_BUILD_OPTIONS) | \ + sed -e 's/.*parallel=\([0-9]\+\).*/\1/') +else +PARALLEL_JOBS := 1 +endif + +DEB_HOST_ARCH_CPU := $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU) +ifeq (amd64,$(DEB_HOST_ARCH_CPU)) +BUILD_TYPE += ReleaseX64 +else +ifeq (i386,$(DEB_HOST_ARCH_CPU)) +BUILD_TYPE += ReleaseIA32 +else +$(warning unsupported target arch $(DEB_HOST_ARCH_CPU) - continuing anyway) +endif +endif + +# Verbose? +ifeq (1,$(DH_VERBOSE)) +BUILD_ARGS += V=1 +endif + +%: + dh $@ + +override_dh_auto_clean: + echo $(DEB_BUILD_OPTIONS) + rm -fr dart/out dart/Makefile + find . -name *.tmp -execdir rm -f {} \; + find . -name *.pyc -execdir rm -f {} \; + find . -name *.mk -execdir rm -f {} \; + find . -name *.Makefile -execdir rm -f {} \; + +override_dh_auto_configure: + GYP_GENERATORS=make python dart/tools/gyp_dart.py all + +override_dh_auto_build: + make -C dart -j$(PARALLEL_JOBS) \ + BUILDTYPE=$(BUILD_TYPE) $(BUILD_ARGS) create_sdk + +override_dh_auto_install: + mkdir -p debian/tmp/out + cp -R dart/out/$(BUILD_TYPE)/dart-sdk debian/tmp/out + mv debian/tmp/out/dart-sdk debian/tmp/out/dart + dh_install + dh_link diff --git a/tools/linux_dist_support/debian/source/format b/tools/linux_dist_support/debian/source/format new file mode 100644 index 00000000000..163aaf8d82b --- /dev/null +++ b/tools/linux_dist_support/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/tools/utils.py b/tools/utils.py index 1c460fcf24d..22c937b5192 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -339,6 +339,14 @@ def GetSVNRevision(): if revision: return revision + # When building from tarball use tools/SVN_REVISION + svn_revision_file = os.path.join(DART_DIR, 'tools', 'SVN_REVISION') + try: + with open(svn_revision_file) as fd + return fd.read() + except: + pass + # Only fail on the buildbot in case of a SVN client version mismatch. user = GetUserName() if user != 'chrome-bot':