blob: 4bec27c2bcdd90fc3bcd1c7e234b1ee8fbcd1516 [file] [log] [blame]
shenhan52e96222013-02-19 22:45:41 +00001#!/usr/bin/python
raymes49fd5a32013-02-15 04:55:27 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
raymes49fd5a32013-02-15 04:55:27 +00004"""Script to checkout the ChromeOS source.
5
6This script sets up the ChromeOS source in the given directory, matching a
7particular release of ChromeOS.
8"""
9
Luis Lozanof2a3ef42015-12-15 13:49:30 -080010__author__ = 'raymes@google.com (Raymes Khoury)'
raymes49fd5a32013-02-15 04:55:27 +000011
12import optparse
asharif8697d4e2013-02-15 09:18:09 +000013import os
asharif795af1d2013-02-16 02:11:01 +000014import shutil
raymes49fd5a32013-02-15 04:55:27 +000015import sys
kbaclawski20082a02013-02-16 02:12:57 +000016
17import build_chromeos
raymes49fd5a32013-02-15 04:55:27 +000018from utils import command_executer
19from utils import logger
kbaclawski20082a02013-02-16 02:12:57 +000020from utils import misc
raymes49fd5a32013-02-15 04:55:27 +000021
22cmd_executer = None
23
24
25def Usage(parser, message):
Luis Lozanof2a3ef42015-12-15 13:49:30 -080026 print 'ERROR: ' + message
raymes49fd5a32013-02-15 04:55:27 +000027 parser.print_help()
28 sys.exit(0)
29
30
asharif8697d4e2013-02-15 09:18:09 +000031def Main(argv):
raymes49fd5a32013-02-15 04:55:27 +000032 """Build Chrome browser."""
33 # Common initializations
34 global cmd_executer
35 cmd_executer = command_executer.GetCommandExecuter()
36
37 parser = optparse.OptionParser()
Luis Lozanof2a3ef42015-12-15 13:49:30 -080038 parser.add_option('--chromeos_root',
39 dest='chromeos_root',
40 help='Target directory for ChromeOS installation.')
41 parser.add_option('--version', dest='version')
42 parser.add_option('--clean',
43 dest='clean',
asharif795af1d2013-02-16 02:11:01 +000044 default=False,
Luis Lozanof2a3ef42015-12-15 13:49:30 -080045 action='store_true',
46 help=('Clean the /var/cache/chromeos-chrome/'
47 'chrome-src/src/out_$board dir'))
48 parser.add_option('--env',
49 dest='env',
50 default='',
51 help='Use the following env')
52 parser.add_option('--ebuild_version',
53 dest='ebuild_version',
54 help='Use this ebuild instead of the default one.')
55 parser.add_option('--cflags',
56 dest='cflags',
57 default='',
58 help='CFLAGS for the ChromeOS packages')
59 parser.add_option('--cxxflags',
60 dest='cxxflags',
61 default='',
62 help='CXXFLAGS for the ChromeOS packages')
63 parser.add_option('--ldflags',
64 dest='ldflags',
65 default='',
66 help='LDFLAGS for the ChromeOS packages')
67 parser.add_option('--board',
68 dest='board',
69 help='ChromeOS target board, e.g. x86-generic')
70 parser.add_option('--no_build_image',
71 dest='no_build_image',
72 default=False,
73 action='store_true',
74 help=('Skip build image after building browser.'
75 'Defaults to False.'))
76 parser.add_option('--label',
77 dest='label',
78 help='Optional label to apply to the ChromeOS image.')
79 parser.add_option('--build_image_args',
80 default='',
81 dest='build_image_args',
82 help='Optional arguments to build_image.')
83 parser.add_option('--cros_workon',
84 dest='cros_workon',
85 help='Build using external source tree.')
86 parser.add_option('--dev',
87 dest='dev',
88 default=False,
89 action='store_true',
90 help=('Build a dev (eg. writable/large) image. '
91 'Defaults to False.'))
92 parser.add_option('--debug',
93 dest='debug',
94 default=False,
95 action='store_true',
96 help=('Build chrome browser using debug mode. '
97 'This option implies --dev. Defaults to false.'))
98 parser.add_option('--verbose',
99 dest='verbose',
100 default=False,
101 action='store_true',
102 help='Build with verbose information.')
raymes49fd5a32013-02-15 04:55:27 +0000103
asharif8697d4e2013-02-15 09:18:09 +0000104 options = parser.parse_args(argv)[0]
raymes49fd5a32013-02-15 04:55:27 +0000105
106 if options.chromeos_root is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800107 Usage(parser, '--chromeos_root must be set')
raymes49fd5a32013-02-15 04:55:27 +0000108
109 if options.board is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800110 Usage(parser, '--board must be set')
raymes49fd5a32013-02-15 04:55:27 +0000111
raymes49fd5a32013-02-15 04:55:27 +0000112 if options.version is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800113 logger.GetLogger().LogOutput('No Chrome version given so '
114 'using the default checked in version.')
115 chrome_version = ''
raymes49fd5a32013-02-15 04:55:27 +0000116 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800117 chrome_version = 'CHROME_VERSION=%s' % options.version
raymes49fd5a32013-02-15 04:55:27 +0000118
shenhan52e96222013-02-19 22:45:41 +0000119 if options.dev and options.no_build_image:
120 logger.GetLogger().LogOutput(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800121 "\"--dev\" is meaningless if \"--no_build_image\" is given.")
shenhan52e96222013-02-19 22:45:41 +0000122
123 if options.debug:
124 options.dev = True
125
asharif52ff3072013-02-16 02:13:00 +0000126 options.chromeos_root = misc.CanonicalizePath(options.chromeos_root)
127
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800128 unmask_env = 'ACCEPT_KEYWORDS=~*'
asharif52ff3072013-02-16 02:13:00 +0000129 if options.ebuild_version:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800130 ebuild_version = '=%s' % options.ebuild_version
131 options.env = '%s %s' % (options.env, unmask_env)
asharif52ff3072013-02-16 02:13:00 +0000132 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800133 ebuild_version = 'chromeos-chrome'
asharif52ff3072013-02-16 02:13:00 +0000134
shenhan9213b832013-02-19 20:42:47 +0000135 if options.cros_workon and not (
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800136 os.path.isdir(options.cros_workon) and os.path.exists(os.path.join(
137 options.cros_workon, 'src/chromeos/chromeos.gyp'))):
138 Usage(parser, '--cros_workon must be a valid chromium browser checkout.')
shenhan9213b832013-02-19 20:42:47 +0000139
shenhan52e96222013-02-19 22:45:41 +0000140 if options.verbose:
141 options.env = misc.MergeEnvStringWithDict(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800142 options.env, {'USE': 'chrome_internal verbose'})
shenhan52e96222013-02-19 22:45:41 +0000143 else:
144 options.env = misc.MergeEnvStringWithDict(options.env,
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800145 {'USE': 'chrome_internal'})
shenhan52e96222013-02-19 22:45:41 +0000146 if options.debug:
147 options.env = misc.MergeEnvStringWithDict(options.env,
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800148 {'BUILDTYPE': 'Debug'})
shenhan52e96222013-02-19 22:45:41 +0000149
ashariffc4c06f2013-02-19 19:43:10 +0000150 if options.clean:
llozano3a428922013-02-19 21:36:47 +0000151 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
ashariffc4c06f2013-02-19 19:43:10 +0000152
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800153 chrome_origin = 'SERVER_SOURCE'
shenhan9213b832013-02-19 20:42:47 +0000154 if options.cros_workon:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800155 chrome_origin = 'LOCAL_SOURCE'
shenhan9213b832013-02-19 20:42:47 +0000156 command = 'cros_workon --board={0} start chromeos-chrome'.format(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800157 options.board)
Luis Lozano036c9232015-12-10 10:47:01 -0800158 ret = cmd_executer.ChrootRunCommandWOutput(options.chromeos_root, command)
shenhan9213b832013-02-19 20:42:47 +0000159
160 # cros_workon start returns non-zero if chromeos-chrome is already a
161 # cros_workon package.
162 if ret[0] and ret[2].find(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800163 'WARNING : Already working on chromeos-base/chromeos-chrome') == -1:
164 logger.GetLogger().LogFatal('cros_workon chromeos-chrome failed.')
shenhan9213b832013-02-19 20:42:47 +0000165
166 # Return value is non-zero means we do find the "Already working on..."
167 # message, keep the information, so later on we do not revert the
168 # cros_workon status.
169 cros_workon_keep = (ret[0] != 0)
170
raymes49fd5a32013-02-15 04:55:27 +0000171 # Emerge the browser
shenhan9213b832013-02-19 20:42:47 +0000172 emerge_browser_command = \
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800173 ('CHROME_ORIGIN={0} {1} '
shenhan9213b832013-02-19 20:42:47 +0000174 "CFLAGS=\"$(portageq-{2} envvar CFLAGS) {3}\" "
175 "LDFLAGS=\"$(portageq-{2} envvar LDFLAGS) {4}\" "
176 "CXXFLAGS=\"$(portageq-{2} envvar CXXFLAGS) {5}\" "
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800177 '{6} emerge-{2} --buildpkg {7}').format(
shenhan9213b832013-02-19 20:42:47 +0000178 chrome_origin, chrome_version, options.board, options.cflags,
179 options.ldflags, options.cxxflags, options.env, ebuild_version)
180
181 cros_sdk_options = ''
182 if options.cros_workon:
shenhan52e96222013-02-19 22:45:41 +0000183 cros_sdk_options = '--chrome_root={0}'.format(options.cros_workon)
shenhan9213b832013-02-19 20:42:47 +0000184
185 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
186 emerge_browser_command,
187 cros_sdk_options=cros_sdk_options)
raymes49fd5a32013-02-15 04:55:27 +0000188
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800189 logger.GetLogger().LogFatalIf(ret, 'build_packages failed')
raymes49fd5a32013-02-15 04:55:27 +0000190
shenhan9213b832013-02-19 20:42:47 +0000191 if options.cros_workon and not cros_workon_keep:
192 command = 'cros_workon --board={0} stop chromeos-chrome'.format(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800193 options.board)
shenhan9213b832013-02-19 20:42:47 +0000194 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
195 # cros_workon failed, not a fatal one, just report it.
196 if ret:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800197 print 'cros_workon stop chromeos-chrome failed.'
shenhan9213b832013-02-19 20:42:47 +0000198
shenhan52e96222013-02-19 22:45:41 +0000199 if options.no_build_image:
200 return ret
201
202 # Finally build the image
203 ret = cmd_executer.ChrootRunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800204 options.chromeos_root,
205 '{0} {1} {2} {3}'.format(unmask_env,
206 options.env,
207 misc.GetBuildImageCommand(options.board,
208 dev=options.dev),
209 options.build_image_args))
raymes49fd5a32013-02-15 04:55:27 +0000210
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800211 logger.GetLogger().LogFatalIf(ret, 'build_image failed')
raymes49fd5a32013-02-15 04:55:27 +0000212
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800213 flags_file_name = 'chrome_flags.txt'
214 flags_file_path = '{0}/src/build/images/{1}/latest/{2}'.format(
215 options.chromeos_root, options.board, flags_file_name)
216 flags_file = open(flags_file_path, 'wb')
217 flags_file.write('CFLAGS={0}\n'.format(options.cflags))
218 flags_file.write('CXXFLAGS={0}\n'.format(options.cxxflags))
219 flags_file.write('LDFLAGS={0}\n'.format(options.ldflags))
asharif8697d4e2013-02-15 09:18:09 +0000220 flags_file.close()
221
asharif8697d4e2013-02-15 09:18:09 +0000222 if options.label:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800223 image_dir_path = '{0}/src/build/images/{1}/latest'.format(
224 options.chromeos_root, options.board)
asharif8697d4e2013-02-15 09:18:09 +0000225 real_image_dir_path = os.path.realpath(image_dir_path)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800226 command = 'ln -sf -T {0} {1}/{2}'.format(
shenhan52e96222013-02-19 22:45:41 +0000227 os.path.basename(real_image_dir_path),\
228 os.path.dirname(real_image_dir_path),\
229 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000230
231 ret = cmd_executer.RunCommand(command)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800232 logger.GetLogger().LogFatalIf(ret, 'Failed to apply symlink label %s' %
kbaclawski6999ada2013-02-15 19:57:09 +0000233 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000234
235 return ret
236
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800237
238if __name__ == '__main__':
asharif2198c512013-02-15 09:21:35 +0000239 retval = Main(sys.argv)
240 sys.exit(retval)