blob: ac8205bad979be65f51be2fd222a537332422435 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (c) 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import glob
import optparse
import os.path
import re
import subprocess
import sys
import utils
# FIXME: integrate this helper script into the build instead of hardcoding
# these paths.
RESOURCE_AAR_PATTERN = 'content_shell_apk/resource_aar/*.aar'
CONTENT_SHELL_APK_AAR = 'content_shell_apk/content_shell_apk.aar'
SRC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"..", "..", "..")
DART_DIR = os.path.join(SRC_PATH, 'dart')
CHROME_VERSION_PATH = os.path.join(SRC_PATH, 'chrome', 'VERSION')
def main():
parser = optparse.OptionParser()
parser.add_option('--mode', dest='mode',
action='store', type='string',
help='Build mode (Debug or Release)')
parser.add_option('--repo', action='store', type='string',
help='Local Maven repository (defaults to ~/.m2)')
(options, args) = parser.parse_args()
mode = options.mode
version = GetVersion()
if not (mode in ['debug', 'release']):
raise Exception('Invalid build mode')
mode = 'Debug' if mode == 'debug' else 'Release'
build_root = os.path.join('out', mode)
aars = glob.glob(os.path.join(build_root, RESOURCE_AAR_PATTERN))
aars.append(os.path.join(build_root, CONTENT_SHELL_APK_AAR))
flags = [
'-DgroupId=org.dartlang',
'-Dversion=%s' % version,
'-Dpackaging=aar'
]
if options.repo:
flags.append('-DlocalRepositoryPath=%s' % options.repo)
for aar_file in aars:
artifact_id = os.path.splitext(os.path.basename(aar_file))[0]
cmd = [
'mvn',
'install:install-file',
'-Dfile=%s' % aar_file,
'-DartifactId=%s' % artifact_id,
]
cmd.extend(flags)
utils.runCommand(cmd)
def GetVersion():
version = GetChromeVersion()
return '%d.%d.%d-%05d-%06d' % (
version[0],
version[1],
version[2],
version[3],
GetDartSVNRevision())
def GetChromeVersion():
version = []
for line in file(CHROME_VERSION_PATH).readlines():
version.append(int(line.strip().split('=')[1]))
return version
def GetDartSVNRevision():
# 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 int(fd.read())
except:
pass
custom_env = dict(os.environ)
custom_env['LC_MESSAGES'] = 'en_GB'
p = subprocess.Popen(['svn', 'info'], stdout = subprocess.PIPE,
stderr = subprocess.STDOUT, shell = IsWindows(),
env = custom_env,
cwd = DART_DIR)
output, _ = p.communicate()
revision = ParseSvnInfoOutput(output)
if revision:
return int(revision)
# Check for revision using git (Note: we can't use git-svn because in a
# pure-git checkout, "git-svn anyCommand" just hangs!). We look an arbitrary
# number of commits backwards (100) to get past any local commits.
p = subprocess.Popen(['git', 'log', '-100'], stdout = subprocess.PIPE,
stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
output, _ = p.communicate()
revision = ParseGitInfoOutput(output)
if revision:
return int(revision)
# In the rare off-chance that git log -100 doesn't have a svn repo number,
# attempt to use "git svn info."
p = subprocess.Popen(['git', 'svn', 'info'], stdout = subprocess.PIPE,
stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
output, _ = p.communicate()
revision = ParseSvnInfoOutput(output)
if revision:
return int(revision)
# Only fail on the buildbot in case of a SVN client version mismatch.
user = GetUserName()
return '0'
def ParseGitInfoOutput(output):
"""Given a git log, determine the latest corresponding svn revision."""
for line in output.split('\n'):
tokens = line.split()
if len(tokens) > 0 and tokens[0] == 'git-svn-id:':
return tokens[1].split('@')[1]
return None
def ParseSvnInfoOutput(output):
revision_match = re.search('Last Changed Rev: (\d+)', output)
if revision_match:
return revision_match.group(1)
return None
def IsWindows():
return (sys.platform=='win32')
if __name__ == '__main__':
main()