blob: cb68fd0050b7cad176f0930cc4e27c157a6d2a08 [file] [log] [blame]
Caroline Tice88272d42016-01-13 09:48:29 -08001#!/usr/bin/python2
raymes5154d7f2013-02-15 04:35:37 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
raymes5154d7f2013-02-15 04:35:37 +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__ = ('asharif@google.com (Ahmad Sharif) '
13 'llozano@google.com (Luis Lozano) '
14 'raymes@google.com (Raymes Khoury) '
15 'shenhan@google.com (Han Shen)')
raymes5154d7f2013-02-15 04:35:37 +000016
Caroline Tice88272d42016-01-13 09:48:29 -080017import argparse
raymes5154d7f2013-02-15 04:35:37 +000018import os
19import sys
kbaclawski20082a02013-02-16 02:12:57 +000020
Caroline Tice88272d42016-01-13 09:48:29 -080021from cros_utils import command_executer
22from cros_utils import logger
23from cros_utils import misc
raymes5154d7f2013-02-15 04:35:37 +000024
asharife3668f12013-02-15 04:46:29 +000025
raymes5154d7f2013-02-15 04:35:37 +000026def Usage(parser, message):
Caroline Tice88272d42016-01-13 09:48:29 -080027 print('ERROR: %s' % message)
raymes5154d7f2013-02-15 04:35:37 +000028 parser.print_help()
29 sys.exit(0)
30
asharife3668f12013-02-15 04:46:29 +000031
bjanakiraman6496e5f2013-02-15 04:50:58 +000032def Main(argv):
raymes5154d7f2013-02-15 04:35:37 +000033 """Build ChromeOS."""
34 # Common initializations
asharif5a9bb462013-02-15 04:50:57 +000035 cmd_executer = command_executer.GetCommandExecuter()
raymes5154d7f2013-02-15 04:35:37 +000036
Caroline Tice88272d42016-01-13 09:48:29 -080037 parser = argparse.ArgumentParser()
38 parser.add_argument('--chromeos_root',
39 dest='chromeos_root',
40 help='Target directory for ChromeOS installation.')
41 parser.add_argument('--clobber_chroot',
42 dest='clobber_chroot',
43 action='store_true',
44 help='Delete the chroot and start fresh',
45 default=False)
46 parser.add_argument('--clobber_board',
47 dest='clobber_board',
48 action='store_true',
49 help='Delete the board and start fresh',
50 default=False)
51 parser.add_argument('--rebuild',
52 dest='rebuild',
53 action='store_true',
54 help='Rebuild all board packages except the toolchain.',
55 default=False)
56 parser.add_argument('--cflags',
57 dest='cflags',
58 default='',
59 help='CFLAGS for the ChromeOS packages')
60 parser.add_argument('--cxxflags',
61 dest='cxxflags',
62 default='',
63 help='CXXFLAGS for the ChromeOS packages')
64 parser.add_argument('--ldflags',
65 dest='ldflags',
66 default='',
67 help='LDFLAGS for the ChromeOS packages')
68 parser.add_argument('--board',
69 dest='board',
70 help='ChromeOS target board, e.g. x86-generic')
71 parser.add_argument('--package',
72 dest='package',
73 help='The package needs to be built')
74 parser.add_argument('--label',
75 dest='label',
76 help='Optional label symlink to point to build dir.')
77 parser.add_argument('--dev',
78 dest='dev',
79 default=False,
80 action='store_true',
81 help=('Make the final image in dev mode (eg writable, '
82 'more space on image). Defaults to False.'))
83 parser.add_argument('--debug',
84 dest='debug',
85 default=False,
86 action='store_true',
87 help=("Optional. Build chrome browser with \"-g -O0\". "
88 "Notice, this also turns on \'--dev\'. "
89 'Defaults to False.'))
90 parser.add_argument('--env',
91 dest='env',
92 default='',
93 help='Env to pass to build_packages.')
94 parser.add_argument('--vanilla',
95 dest='vanilla',
96 default=False,
97 action='store_true',
98 help='Use default ChromeOS toolchain.')
99 parser.add_argument('--vanilla_image',
100 dest='vanilla_image',
101 default=False,
102 action='store_true',
103 help=('Use prebuild packages for building the image. '
104 'It also implies the --vanilla option is set.'))
raymes5154d7f2013-02-15 04:35:37 +0000105
Caroline Tice88272d42016-01-13 09:48:29 -0800106 options = parser.parse_args(argv[1:])
raymes5154d7f2013-02-15 04:35:37 +0000107
108 if options.chromeos_root is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800109 Usage(parser, '--chromeos_root must be set')
Luis Lozano09b027f2015-03-30 13:29:49 -0700110 options.chromeos_root = os.path.expanduser(options.chromeos_root)
111 scripts_dir = os.path.join(options.chromeos_root, 'src', 'scripts')
112 if not os.path.isdir(scripts_dir):
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800113 Usage(parser, '--chromeos_root must be set up first. Use setup_chromeos.py')
raymes5154d7f2013-02-15 04:35:37 +0000114
raymes5154d7f2013-02-15 04:35:37 +0000115 if options.board is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800116 Usage(parser, '--board must be set')
raymes5154d7f2013-02-15 04:35:37 +0000117
shenhan48738582013-02-19 22:45:41 +0000118 if options.debug:
119 options.dev = True
120
asharif44473782013-02-19 19:58:15 +0000121 build_packages_env = options.env
shenhan48738582013-02-19 22:45:41 +0000122 if build_packages_env.find('EXTRA_BOARD_FLAGS=') != -1:
123 logger.GetLogger().LogFatal(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800124 ('Passing "EXTRA_BOARD_FLAGS" in "--env" is not supported. '
125 'This flags is used internally by this script. '
126 'Contact the author for more detail.'))
shenhan48738582013-02-19 22:45:41 +0000127
asharif80b47dc2013-02-15 06:31:19 +0000128 if options.rebuild == True:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800129 build_packages_env += ' EXTRA_BOARD_FLAGS=-e'
llozano3a428922013-02-19 21:36:47 +0000130 # EXTRA_BOARD_FLAGS=-e should clean up the object files for the chrome
131 # browser but it doesn't. So do it here.
132 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
asharif80b47dc2013-02-15 06:31:19 +0000133
Luis Lozano09b027f2015-03-30 13:29:49 -0700134 # Build with afdo_use by default.
135 # To change the default use --env="USE=-afdo_use".
136 build_packages_env = misc.MergeEnvStringWithDict(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800137 build_packages_env, {'USE': 'chrome_internal afdo_use'})
asharif01e29a52013-02-15 04:56:41 +0000138
shenhan48738582013-02-19 22:45:41 +0000139 build_packages_command = misc.GetBuildPackagesCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800140 board=options.board,
141 usepkg=options.vanilla_image,
142 debug=options.debug)
yunlian5acba6e2013-02-19 22:34:37 +0000143
144 if options.package:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800145 build_packages_command += ' {0}'.format(options.package)
yunlian5acba6e2013-02-19 22:34:37 +0000146
shenhan48738582013-02-19 22:45:41 +0000147 build_image_command = misc.GetBuildImageCommand(options.board, options.dev)
asharifca8c5ef2013-02-15 04:57:02 +0000148
Yunlian Jiangd145a582013-08-19 13:59:34 -0700149 if options.vanilla or options.vanilla_image:
kbaclawski20082a02013-02-16 02:12:57 +0000150 command = misc.GetSetupBoardCommand(options.board,
Yunlian Jiangd145a582013-08-19 13:59:34 -0700151 usepkg=options.vanilla_image,
llozano3a428922013-02-19 21:36:47 +0000152 force=options.clobber_board)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800153 command += '; ' + build_packages_env + ' ' + build_packages_command
154 command += '&& ' + build_packages_env + ' ' + build_image_command
asharifca3c6c12013-02-15 23:17:54 +0000155 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
asharifb1752c82013-02-15 04:56:37 +0000156 return ret
157
raymes5154d7f2013-02-15 04:35:37 +0000158 # Setup board
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800159 if not os.path.isdir(options.chromeos_root + '/chroot/build/' +
160 options.board) or options.clobber_board:
raymes04164a12013-02-15 04:36:03 +0000161 # Run build_tc.py from binary package
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800162 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
163 misc.GetSetupBoardCommand(
164 options.board,
165 force=options.clobber_board))
166 logger.GetLogger().LogFatalIf(ret, 'setup_board failed')
raymes5f35b922013-02-15 04:35:57 +0000167 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800168 logger.GetLogger().LogOutput('Did not setup_board '
169 'because it already exists')
raymesbfb57992013-02-15 04:35:45 +0000170
shenhan48738582013-02-19 22:45:41 +0000171 if options.debug:
172 # Perform 2-step build_packages to build a debug chrome browser.
173
174 # Firstly, build everything that chromeos-chrome depends on normally.
175 if options.rebuild == True:
176 # Give warning about "--rebuild" and "--debug". Under this combination,
177 # only dependencies of "chromeos-chrome" get rebuilt.
178 logger.GetLogger().LogWarning(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800179 "\"--rebuild\" does not correctly re-build every package when "
180 "\"--debug\" is enabled. ")
shenhan48738582013-02-19 22:45:41 +0000181
182 # Replace EXTRA_BOARD_FLAGS=-e with "-e --onlydeps"
183 build_packages_env = build_packages_env.replace(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800184 'EXTRA_BOARD_FLAGS=-e', 'EXTRA_BOARD_FLAGS=\"-e --onlydeps\"')
shenhan48738582013-02-19 22:45:41 +0000185 else:
186 build_packages_env += ' EXTRA_BOARD_FLAGS=--onlydeps'
187
188 ret = cmd_executer.ChrootRunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800189 options.chromeos_root, "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
190 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
191 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
192 'CHROME_ORIGIN=SERVER_SOURCE '
193 '%s '
194 '%s --skip_chroot_upgrade'
195 'chromeos-chrome' % (options.board, options.cflags, options.board,
196 options.cxxflags, options.board, options.ldflags,
197 build_packages_env, build_packages_command))
shenhan48738582013-02-19 22:45:41 +0000198
199 logger.GetLogger().LogFatalIf(\
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800200 ret, 'build_packages failed while trying to build chromeos-chrome deps.')
shenhan48738582013-02-19 22:45:41 +0000201
202 # Secondly, build chromeos-chrome using debug mode.
203 # Replace '--onlydeps' with '--nodeps'.
204 if options.rebuild == True:
205 build_packages_env = build_packages_env.replace(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800206 'EXTRA_BOARD_FLAGS=\"-e --onlydeps\"', 'EXTRA_BOARD_FLAGS=--nodeps')
shenhan48738582013-02-19 22:45:41 +0000207 else:
208 build_packages_env = build_packages_env.replace(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800209 'EXTRA_BOARD_FLAGS=--onlydeps', 'EXTRA_BOARD_FLAGS=--nodeps')
shenhan48738582013-02-19 22:45:41 +0000210 ret = cmd_executer.ChrootRunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800211 options.chromeos_root, "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
212 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
213 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
214 'CHROME_ORIGIN=SERVER_SOURCE BUILDTYPE=Debug '
215 '%s '
216 '%s --skip_chroot_upgrade'
217 'chromeos-chrome' % (options.board, options.cflags, options.board,
218 options.cxxflags, options.board, options.ldflags,
219 build_packages_env, build_packages_command))
shenhan48738582013-02-19 22:45:41 +0000220 logger.GetLogger().LogFatalIf(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800221 ret,
222 'build_packages failed while trying to build debug chromeos-chrome.')
shenhan48738582013-02-19 22:45:41 +0000223
224 # Now, we have built chromeos-chrome and all dependencies.
225 # Finally, remove '-e' from EXTRA_BOARD_FLAGS,
226 # otherwise, chromeos-chrome gets rebuilt.
227 build_packages_env = build_packages_env.replace(\
228 'EXTRA_BOARD_FLAGS=--nodeps', '')
229
230 # Up to now, we have a debug built chromos-chrome browser.
231 # Fall through to build the rest of the world.
232
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800233 # Build packages
asharifca3c6c12013-02-15 23:17:54 +0000234 ret = cmd_executer.ChrootRunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800235 options.chromeos_root, "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
asharifca3c6c12013-02-15 23:17:54 +0000236 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
llozano109ac9f2013-02-19 19:58:27 +0000237 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800238 'CHROME_ORIGIN=SERVER_SOURCE '
239 '%s '
240 '%s --skip_chroot_upgrade' % (options.board, options.cflags,
241 options.board, options.cxxflags,
242 options.board, options.ldflags,
243 build_packages_env, build_packages_command))
raymesbfb57992013-02-15 04:35:45 +0000244
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800245 logger.GetLogger().LogFatalIf(ret, 'build_packages failed')
yunlian5acba6e2013-02-19 22:34:37 +0000246 if options.package:
247 return 0
raymes5154d7f2013-02-15 04:35:37 +0000248 # Build image
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800249 ret = cmd_executer.ChrootRunCommand(
250 options.chromeos_root, build_packages_env + ' ' + build_image_command)
raymesbfb57992013-02-15 04:35:45 +0000251
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800252 logger.GetLogger().LogFatalIf(ret, 'build_image failed')
raymes5154d7f2013-02-15 04:35:37 +0000253
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800254 flags_file_name = 'flags.txt'
255 flags_file_path = ('%s/src/build/images/%s/latest/%s' %
256 (options.chromeos_root, options.board, flags_file_name))
257 flags_file = open(flags_file_path, 'wb')
258 flags_file.write('CFLAGS=%s\n' % options.cflags)
259 flags_file.write('CXXFLAGS=%s\n' % options.cxxflags)
260 flags_file.write('LDFLAGS=%s\n' % options.ldflags)
asharif8697d4e2013-02-15 09:18:09 +0000261 flags_file.close()
262
263 if options.label:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800264 image_dir_path = ('%s/src/build/images/%s/latest' % (options.chromeos_root,
265 options.board))
asharif8697d4e2013-02-15 09:18:09 +0000266 real_image_dir_path = os.path.realpath(image_dir_path)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800267 command = ('ln -sf -T %s %s/%s' %
asharif8697d4e2013-02-15 09:18:09 +0000268 (os.path.basename(real_image_dir_path),
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800269 os.path.dirname(real_image_dir_path), options.label))
asharif8697d4e2013-02-15 09:18:09 +0000270
271 ret = cmd_executer.RunCommand(command)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800272 logger.GetLogger().LogFatalIf(ret, 'Failed to apply symlink label %s' %
kbaclawski6999ada2013-02-15 19:57:09 +0000273 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000274
275 return ret
raymes5154d7f2013-02-15 04:35:37 +0000276
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800277
278if __name__ == '__main__':
asharif2198c512013-02-15 09:21:35 +0000279 retval = Main(sys.argv)
280 sys.exit(retval)