#!/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 one need to the tarball to follow the # Debian naming rules upstream tar files. # # $ 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 from os import listdir from os.path import join, split, abspath import utils HOST_OS = utils.GuessOS() DART_DIR = abspath(join(__file__, '..', '..')) # Flags. verbose = False # Name of the dart directory when unpacking the tarball. versiondir = '' # Ignore Git/SVN files, checked-in binaries, backup files, etc.. ignoredPaths = [ '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") result.add_option("--tar_filename", default=None, help="The output file.") return result def Filter(tar_info): # Get the name of the file relative to the dart directory. Note the # name from the TarInfo does not include a leading slash. assert tar_info.name.startswith(DART_DIR[1:]) original_name = tar_info.name[len(DART_DIR):] _, tail = split(original_name) if tail in ignoredDirs: return None for path in ignoredPaths: if original_name.startswith(path): return None for ending in ignoredEndings: if original_name.endswith(ending): return None # Add the dart directory name with version. 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', original_name) if verbose: print 'Adding %s as %s' % (original_name, tar_info.name) return tar_info def GenerateCopyright(filename): with open(join(DART_DIR, 'LICENSE')) as lf: license_lines = lf.readlines() with open(filename, 'w') as f: 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' % line) # Line already contains trailing \n. def GenerateChangeLog(filename, version): with open(filename, 'w') as f: 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')) def GenerateEmpty(filename): f = open(filename, 'w') f.close() def GenerateGitRevision(filename, git_revision): with open(filename, 'w') as f: f.write(str(git_revision)) def CreateTarball(tarfilename): global ignoredPaths # Used for adding the output directory. # Generate the name of the tarfile version = utils.GetVersion() global versiondir versiondir = 'dart-%s' % version debian_dir = 'tools/linux_dist_support/debian' # Don't include the build directory in the tarball (ignored paths # are relative to DART_DIR). builddir = utils.GetBuildDir(HOST_OS) ignoredPaths.append(builddir) print 'Creating tarball: %s' % tarfilename with tarfile.open(tarfilename, mode='w:gz') as tar: for f in listdir(DART_DIR): tar.add(join(DART_DIR, f), filter=Filter) for f in listdir(join(DART_DIR, debian_dir)): tar.add( join(DART_DIR, debian_dir, f), arcname='%s/debian/%s' % (versiondir, f)) with utils.TempDir() as temp_dir: # Generate and add debian/copyright copyright_file = join(temp_dir, 'copyright') GenerateCopyright(copyright_file) tar.add(copyright_file, 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 generated version file build dependency, add fake git reflog. empty = join(temp_dir, 'empty') GenerateEmpty(empty) tar.add(empty, arcname='%s/dart/.git/logs/HEAD' % versiondir) # For bleeding_edge add the GIT_REVISION file. if utils.GetChannel() == 'be': git_revision = join(temp_dir, 'GIT_REVISION') GenerateGitRevision(git_revision, utils.GetGitRevision()) tar.add( git_revision, arcname='%s/dart/tools/GIT_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 tar_filename = options.tar_filename if not tar_filename: tar_filename = join(DART_DIR, utils.GetBuildDir(HOST_OS), 'dart-%s.tar.gz' % utils.GetVersion()) CreateTarball(tar_filename) if __name__ == '__main__': sys.exit(Main())