blob: 8effa19dcbeaba19d17a00553a77f4279d5d1c00 [file] [log] [blame]
Caroline Tice88272d42016-01-13 09:48:29 -08001#!/usr/bin/python2
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
Caroline Tice88272d42016-01-13 09:48:29 -080010from __future__ import print_function
11
Luis Lozanof2a3ef42015-12-15 13:49:30 -080012__author__ = 'raymes@google.com (Raymes Khoury)'
raymes49fd5a32013-02-15 04:55:27 +000013
Caroline Tice88272d42016-01-13 09:48:29 -080014import argparse
asharif8697d4e2013-02-15 09:18:09 +000015import os
raymes49fd5a32013-02-15 04:55:27 +000016import sys
kbaclawski20082a02013-02-16 02:12:57 +000017
Caroline Tice88272d42016-01-13 09:48:29 -080018from cros_utils import command_executer
19from cros_utils import logger
20from cros_utils import misc
raymes49fd5a32013-02-15 04:55:27 +000021
22
23def Usage(parser, message):
Caroline Tice88272d42016-01-13 09:48:29 -080024 print('ERROR: %s' % message)
raymes49fd5a32013-02-15 04:55:27 +000025 parser.print_help()
26 sys.exit(0)
27
28
asharif8697d4e2013-02-15 09:18:09 +000029def Main(argv):
raymes49fd5a32013-02-15 04:55:27 +000030 """Build Chrome browser."""
Caroline Tice88272d42016-01-13 09:48:29 -080031
raymes49fd5a32013-02-15 04:55:27 +000032 cmd_executer = command_executer.GetCommandExecuter()
33
Caroline Tice88272d42016-01-13 09:48:29 -080034 parser = argparse.ArgumentParser()
35 parser.add_argument('--chromeos_root',
36 dest='chromeos_root',
37 help='Target directory for ChromeOS installation.')
38 parser.add_argument('--version', dest='version')
39 parser.add_argument('--clean',
40 dest='clean',
41 default=False,
42 action='store_true',
43 help=('Clean the /var/cache/chromeos-chrome/'
44 'chrome-src/src/out_$board dir'))
45 parser.add_argument('--env',
46 dest='env',
47 default='',
48 help='Use the following env')
49 parser.add_argument('--ebuild_version',
50 dest='ebuild_version',
51 help='Use this ebuild instead of the default one.')
52 parser.add_argument('--cflags',
53 dest='cflags',
54 default='',
55 help='CFLAGS for the ChromeOS packages')
56 parser.add_argument('--cxxflags',
57 dest='cxxflags',
58 default='',
59 help='CXXFLAGS for the ChromeOS packages')
60 parser.add_argument('--ldflags',
61 dest='ldflags',
62 default='',
63 help='LDFLAGS for the ChromeOS packages')
64 parser.add_argument('--board',
65 dest='board',
66 help='ChromeOS target board, e.g. x86-generic')
67 parser.add_argument('--no_build_image',
68 dest='no_build_image',
69 default=False,
70 action='store_true',
71 help=('Skip build image after building browser.'
72 'Defaults to False.'))
73 parser.add_argument('--label',
74 dest='label',
75 help='Optional label to apply to the ChromeOS image.')
76 parser.add_argument('--build_image_args',
77 default='',
78 dest='build_image_args',
79 help='Optional arguments to build_image.')
80 parser.add_argument('--cros_workon',
81 dest='cros_workon',
82 help='Build using external source tree.')
83 parser.add_argument('--dev',
84 dest='dev',
85 default=False,
86 action='store_true',
87 help=('Build a dev (eg. writable/large) image. '
88 'Defaults to False.'))
89 parser.add_argument('--debug',
90 dest='debug',
91 default=False,
92 action='store_true',
93 help=('Build chrome browser using debug mode. '
94 'This option implies --dev. Defaults to false.'))
95 parser.add_argument('--verbose',
96 dest='verbose',
97 default=False,
98 action='store_true',
99 help='Build with verbose information.')
raymes49fd5a32013-02-15 04:55:27 +0000100
Caroline Tice88272d42016-01-13 09:48:29 -0800101 options = parser.parse_args(argv)
raymes49fd5a32013-02-15 04:55:27 +0000102
103 if options.chromeos_root is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800104 Usage(parser, '--chromeos_root must be set')
raymes49fd5a32013-02-15 04:55:27 +0000105
106 if options.board is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800107 Usage(parser, '--board must be set')
raymes49fd5a32013-02-15 04:55:27 +0000108
raymes49fd5a32013-02-15 04:55:27 +0000109 if options.version is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800110 logger.GetLogger().LogOutput('No Chrome version given so '
111 'using the default checked in version.')
112 chrome_version = ''
raymes49fd5a32013-02-15 04:55:27 +0000113 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800114 chrome_version = 'CHROME_VERSION=%s' % options.version
raymes49fd5a32013-02-15 04:55:27 +0000115
shenhan52e96222013-02-19 22:45:41 +0000116 if options.dev and options.no_build_image:
117 logger.GetLogger().LogOutput(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800118 "\"--dev\" is meaningless if \"--no_build_image\" is given.")
shenhan52e96222013-02-19 22:45:41 +0000119
120 if options.debug:
121 options.dev = True
122
asharif52ff3072013-02-16 02:13:00 +0000123 options.chromeos_root = misc.CanonicalizePath(options.chromeos_root)
124
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800125 unmask_env = 'ACCEPT_KEYWORDS=~*'
asharif52ff3072013-02-16 02:13:00 +0000126 if options.ebuild_version:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800127 ebuild_version = '=%s' % options.ebuild_version
128 options.env = '%s %s' % (options.env, unmask_env)
asharif52ff3072013-02-16 02:13:00 +0000129 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800130 ebuild_version = 'chromeos-chrome'
asharif52ff3072013-02-16 02:13:00 +0000131
shenhan9213b832013-02-19 20:42:47 +0000132 if options.cros_workon and not (
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800133 os.path.isdir(options.cros_workon) and os.path.exists(os.path.join(
134 options.cros_workon, 'src/chromeos/chromeos.gyp'))):
135 Usage(parser, '--cros_workon must be a valid chromium browser checkout.')
shenhan9213b832013-02-19 20:42:47 +0000136
shenhan52e96222013-02-19 22:45:41 +0000137 if options.verbose:
138 options.env = misc.MergeEnvStringWithDict(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800139 options.env, {'USE': 'chrome_internal verbose'})
shenhan52e96222013-02-19 22:45:41 +0000140 else:
141 options.env = misc.MergeEnvStringWithDict(options.env,
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800142 {'USE': 'chrome_internal'})
shenhan52e96222013-02-19 22:45:41 +0000143 if options.debug:
144 options.env = misc.MergeEnvStringWithDict(options.env,
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800145 {'BUILDTYPE': 'Debug'})
shenhan52e96222013-02-19 22:45:41 +0000146
ashariffc4c06f2013-02-19 19:43:10 +0000147 if options.clean:
llozano3a428922013-02-19 21:36:47 +0000148 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
ashariffc4c06f2013-02-19 19:43:10 +0000149
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800150 chrome_origin = 'SERVER_SOURCE'
shenhan9213b832013-02-19 20:42:47 +0000151 if options.cros_workon:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800152 chrome_origin = 'LOCAL_SOURCE'
shenhan9213b832013-02-19 20:42:47 +0000153 command = 'cros_workon --board={0} start chromeos-chrome'.format(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800154 options.board)
Luis Lozano036c9232015-12-10 10:47:01 -0800155 ret = cmd_executer.ChrootRunCommandWOutput(options.chromeos_root, command)
shenhan9213b832013-02-19 20:42:47 +0000156
157 # cros_workon start returns non-zero if chromeos-chrome is already a
158 # cros_workon package.
159 if ret[0] and ret[2].find(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800160 'WARNING : Already working on chromeos-base/chromeos-chrome') == -1:
161 logger.GetLogger().LogFatal('cros_workon chromeos-chrome failed.')
shenhan9213b832013-02-19 20:42:47 +0000162
163 # Return value is non-zero means we do find the "Already working on..."
164 # message, keep the information, so later on we do not revert the
165 # cros_workon status.
166 cros_workon_keep = (ret[0] != 0)
167
raymes49fd5a32013-02-15 04:55:27 +0000168 # Emerge the browser
Caroline Tice88272d42016-01-13 09:48:29 -0800169 emerge_browser_command = ('CHROME_ORIGIN={0} {1} '
170 'CFLAGS="$(portageq-{2} envvar CFLAGS) {3}" '
171 'LDFLAGS="$(portageq-{2} envvar LDFLAGS) {4}" '
172 'CXXFLAGS="$(portageq-{2} envvar CXXFLAGS) {5}" '
173 '{6} emerge-{2} --buildpkg {7}').format(
174 chrome_origin, chrome_version, options.board,
175 options.cflags, options.ldflags,
176 options.cxxflags, options.env, ebuild_version)
shenhan9213b832013-02-19 20:42:47 +0000177
178 cros_sdk_options = ''
179 if options.cros_workon:
shenhan52e96222013-02-19 22:45:41 +0000180 cros_sdk_options = '--chrome_root={0}'.format(options.cros_workon)
shenhan9213b832013-02-19 20:42:47 +0000181
182 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
183 emerge_browser_command,
184 cros_sdk_options=cros_sdk_options)
raymes49fd5a32013-02-15 04:55:27 +0000185
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800186 logger.GetLogger().LogFatalIf(ret, 'build_packages failed')
raymes49fd5a32013-02-15 04:55:27 +0000187
shenhan9213b832013-02-19 20:42:47 +0000188 if options.cros_workon and not cros_workon_keep:
189 command = 'cros_workon --board={0} stop chromeos-chrome'.format(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800190 options.board)
shenhan9213b832013-02-19 20:42:47 +0000191 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
192 # cros_workon failed, not a fatal one, just report it.
193 if ret:
Caroline Tice88272d42016-01-13 09:48:29 -0800194 print('cros_workon stop chromeos-chrome failed.')
shenhan9213b832013-02-19 20:42:47 +0000195
shenhan52e96222013-02-19 22:45:41 +0000196 if options.no_build_image:
197 return ret
198
199 # Finally build the image
200 ret = cmd_executer.ChrootRunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800201 options.chromeos_root,
202 '{0} {1} {2} {3}'.format(unmask_env,
203 options.env,
204 misc.GetBuildImageCommand(options.board,
205 dev=options.dev),
206 options.build_image_args))
raymes49fd5a32013-02-15 04:55:27 +0000207
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800208 logger.GetLogger().LogFatalIf(ret, 'build_image failed')
raymes49fd5a32013-02-15 04:55:27 +0000209
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800210 flags_file_name = 'chrome_flags.txt'
211 flags_file_path = '{0}/src/build/images/{1}/latest/{2}'.format(
212 options.chromeos_root, options.board, flags_file_name)
213 flags_file = open(flags_file_path, 'wb')
214 flags_file.write('CFLAGS={0}\n'.format(options.cflags))
215 flags_file.write('CXXFLAGS={0}\n'.format(options.cxxflags))
216 flags_file.write('LDFLAGS={0}\n'.format(options.ldflags))
asharif8697d4e2013-02-15 09:18:09 +0000217 flags_file.close()
218
asharif8697d4e2013-02-15 09:18:09 +0000219 if options.label:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800220 image_dir_path = '{0}/src/build/images/{1}/latest'.format(
221 options.chromeos_root, options.board)
asharif8697d4e2013-02-15 09:18:09 +0000222 real_image_dir_path = os.path.realpath(image_dir_path)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800223 command = 'ln -sf -T {0} {1}/{2}'.format(
Caroline Tice88272d42016-01-13 09:48:29 -0800224 os.path.basename(real_image_dir_path),\
shenhan52e96222013-02-19 22:45:41 +0000225 os.path.dirname(real_image_dir_path),\
226 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000227
228 ret = cmd_executer.RunCommand(command)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800229 logger.GetLogger().LogFatalIf(ret, 'Failed to apply symlink label %s' %
kbaclawski6999ada2013-02-15 19:57:09 +0000230 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000231
232 return ret
233
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800234
235if __name__ == '__main__':
Caroline Tice88272d42016-01-13 09:48:29 -0800236 retval = Main(sys.argv[1:])
asharif2198c512013-02-15 09:21:35 +0000237 sys.exit(retval)