blob: e275da1f311940ae298f14f66e64b4a8db4c5d02 [file] [log] [blame]
Zhizhou Yang81d651f2020-02-10 16:51:20 -08001#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
raymes5154d7f2013-02-15 04:35:37 +00003#
Zhizhou Yang81d651f2020-02-10 16:51:20 -08004# Copyright 2020 The Chromium OS Authors. All rights reserved.
5# Use of this source code is governed by a BSD-style license that can be
6# found in the LICENSE file.
7
raymes5154d7f2013-02-15 04:35:37 +00008"""Script to checkout the ChromeOS source.
9
10This script sets up the ChromeOS source in the given directory, matching a
11particular release of ChromeOS.
12"""
13
Caroline Tice88272d42016-01-13 09:48:29 -080014from __future__ import print_function
15
Luis Lozanof2a3ef42015-12-15 13:49:30 -080016__author__ = ('asharif@google.com (Ahmad Sharif) '
17 'llozano@google.com (Luis Lozano) '
18 'raymes@google.com (Raymes Khoury) '
19 'shenhan@google.com (Han Shen)')
raymes5154d7f2013-02-15 04:35:37 +000020
Caroline Tice88272d42016-01-13 09:48:29 -080021import argparse
raymes5154d7f2013-02-15 04:35:37 +000022import os
23import sys
kbaclawski20082a02013-02-16 02:12:57 +000024
Caroline Tice88272d42016-01-13 09:48:29 -080025from cros_utils import command_executer
26from cros_utils import logger
27from cros_utils import misc
raymes5154d7f2013-02-15 04:35:37 +000028
asharife3668f12013-02-15 04:46:29 +000029
raymes5154d7f2013-02-15 04:35:37 +000030def Usage(parser, message):
Caroline Tice88272d42016-01-13 09:48:29 -080031 print('ERROR: %s' % message)
raymes5154d7f2013-02-15 04:35:37 +000032 parser.print_help()
33 sys.exit(0)
34
asharife3668f12013-02-15 04:46:29 +000035
bjanakiraman6496e5f2013-02-15 04:50:58 +000036def Main(argv):
raymes5154d7f2013-02-15 04:35:37 +000037 """Build ChromeOS."""
38 # Common initializations
asharif5a9bb462013-02-15 04:50:57 +000039 cmd_executer = command_executer.GetCommandExecuter()
raymes5154d7f2013-02-15 04:35:37 +000040
Caroline Tice88272d42016-01-13 09:48:29 -080041 parser = argparse.ArgumentParser()
Caroline Ticef6ef4392017-04-06 17:16:05 -070042 parser.add_argument(
43 '--chromeos_root',
44 dest='chromeos_root',
45 help='Target directory for ChromeOS installation.')
46 parser.add_argument(
47 '--clobber_chroot',
48 dest='clobber_chroot',
49 action='store_true',
50 help='Delete the chroot and start fresh',
51 default=False)
52 parser.add_argument(
53 '--clobber_board',
54 dest='clobber_board',
55 action='store_true',
56 help='Delete the board and start fresh',
57 default=False)
58 parser.add_argument(
59 '--rebuild',
60 dest='rebuild',
61 action='store_true',
62 help='Rebuild all board packages except the toolchain.',
63 default=False)
64 parser.add_argument(
65 '--cflags',
66 dest='cflags',
67 default='',
68 help='CFLAGS for the ChromeOS packages')
69 parser.add_argument(
70 '--cxxflags',
71 dest='cxxflags',
72 default='',
73 help='CXXFLAGS for the ChromeOS packages')
74 parser.add_argument(
75 '--ldflags',
76 dest='ldflags',
77 default='',
78 help='LDFLAGS for the ChromeOS packages')
79 parser.add_argument(
80 '--board', dest='board', help='ChromeOS target board, e.g. x86-generic')
81 parser.add_argument(
82 '--package', dest='package', help='The package needs to be built')
83 parser.add_argument(
84 '--label',
85 dest='label',
86 help='Optional label symlink to point to build dir.')
87 parser.add_argument(
88 '--dev',
89 dest='dev',
90 default=False,
91 action='store_true',
92 help=('Make the final image in dev mode (eg writable, '
93 'more space on image). Defaults to False.'))
94 parser.add_argument(
95 '--debug',
96 dest='debug',
97 default=False,
98 action='store_true',
Zhizhou Yang81d651f2020-02-10 16:51:20 -080099 help=('Optional. Build chrome browser with "-g -O0". '
100 "Notice, this also turns on '--dev'. "
Caroline Ticef6ef4392017-04-06 17:16:05 -0700101 'Defaults to False.'))
102 parser.add_argument(
103 '--env', dest='env', default='', help='Env to pass to build_packages.')
104 parser.add_argument(
105 '--vanilla',
106 dest='vanilla',
107 default=False,
108 action='store_true',
109 help='Use default ChromeOS toolchain.')
110 parser.add_argument(
111 '--vanilla_image',
112 dest='vanilla_image',
113 default=False,
114 action='store_true',
115 help=('Use prebuild packages for building the image. '
116 'It also implies the --vanilla option is set.'))
raymes5154d7f2013-02-15 04:35:37 +0000117
Caroline Tice88272d42016-01-13 09:48:29 -0800118 options = parser.parse_args(argv[1:])
raymes5154d7f2013-02-15 04:35:37 +0000119
120 if options.chromeos_root is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800121 Usage(parser, '--chromeos_root must be set')
Luis Lozano09b027f2015-03-30 13:29:49 -0700122 options.chromeos_root = os.path.expanduser(options.chromeos_root)
123 scripts_dir = os.path.join(options.chromeos_root, 'src', 'scripts')
124 if not os.path.isdir(scripts_dir):
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800125 Usage(parser, '--chromeos_root must be set up first. Use setup_chromeos.py')
raymes5154d7f2013-02-15 04:35:37 +0000126
raymes5154d7f2013-02-15 04:35:37 +0000127 if options.board is None:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800128 Usage(parser, '--board must be set')
raymes5154d7f2013-02-15 04:35:37 +0000129
shenhan48738582013-02-19 22:45:41 +0000130 if options.debug:
131 options.dev = True
132
asharif44473782013-02-19 19:58:15 +0000133 build_packages_env = options.env
shenhan48738582013-02-19 22:45:41 +0000134 if build_packages_env.find('EXTRA_BOARD_FLAGS=') != -1:
135 logger.GetLogger().LogFatal(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800136 ('Passing "EXTRA_BOARD_FLAGS" in "--env" is not supported. '
137 'This flags is used internally by this script. '
138 'Contact the author for more detail.'))
shenhan48738582013-02-19 22:45:41 +0000139
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800140 if options.rebuild:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800141 build_packages_env += ' EXTRA_BOARD_FLAGS=-e'
llozano3a428922013-02-19 21:36:47 +0000142 # EXTRA_BOARD_FLAGS=-e should clean up the object files for the chrome
143 # browser but it doesn't. So do it here.
144 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
asharif80b47dc2013-02-15 06:31:19 +0000145
Luis Lozano09b027f2015-03-30 13:29:49 -0700146 # Build with afdo_use by default.
147 # To change the default use --env="USE=-afdo_use".
148 build_packages_env = misc.MergeEnvStringWithDict(
Luis A. Lozano09ce67b2017-06-15 17:57:49 -0700149 build_packages_env, {'USE': 'chrome_internal afdo_use -cros-debug'})
asharif01e29a52013-02-15 04:56:41 +0000150
shenhan48738582013-02-19 22:45:41 +0000151 build_packages_command = misc.GetBuildPackagesCommand(
Caroline Ticef6ef4392017-04-06 17:16:05 -0700152 board=options.board, usepkg=options.vanilla_image, debug=options.debug)
yunlian5acba6e2013-02-19 22:34:37 +0000153
154 if options.package:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800155 build_packages_command += ' {0}'.format(options.package)
yunlian5acba6e2013-02-19 22:34:37 +0000156
shenhan48738582013-02-19 22:45:41 +0000157 build_image_command = misc.GetBuildImageCommand(options.board, options.dev)
asharifca8c5ef2013-02-15 04:57:02 +0000158
Yunlian Jiangd145a582013-08-19 13:59:34 -0700159 if options.vanilla or options.vanilla_image:
Caroline Ticef6ef4392017-04-06 17:16:05 -0700160 command = misc.GetSetupBoardCommand(
161 options.board,
162 usepkg=options.vanilla_image,
163 force=options.clobber_board)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800164 command += '; ' + build_packages_env + ' ' + build_packages_command
165 command += '&& ' + build_packages_env + ' ' + build_image_command
asharifca3c6c12013-02-15 23:17:54 +0000166 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
asharifb1752c82013-02-15 04:56:37 +0000167 return ret
168
raymes5154d7f2013-02-15 04:35:37 +0000169 # Setup board
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800170 if not os.path.isdir(options.chromeos_root + '/chroot/build/' +
171 options.board) or options.clobber_board:
raymes04164a12013-02-15 04:36:03 +0000172 # Run build_tc.py from binary package
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800173 ret = cmd_executer.ChrootRunCommand(
174 options.chromeos_root,
175 misc.GetSetupBoardCommand(options.board, force=options.clobber_board))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800176 logger.GetLogger().LogFatalIf(ret, 'setup_board failed')
raymes5f35b922013-02-15 04:35:57 +0000177 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800178 logger.GetLogger().LogOutput('Did not setup_board '
179 'because it already exists')
raymesbfb57992013-02-15 04:35:45 +0000180
shenhan48738582013-02-19 22:45:41 +0000181 if options.debug:
182 # Perform 2-step build_packages to build a debug chrome browser.
183
184 # Firstly, build everything that chromeos-chrome depends on normally.
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800185 if options.rebuild:
shenhan48738582013-02-19 22:45:41 +0000186 # Give warning about "--rebuild" and "--debug". Under this combination,
187 # only dependencies of "chromeos-chrome" get rebuilt.
188 logger.GetLogger().LogWarning(
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800189 '--rebuild" does not correctly re-build every package when '
190 '"--debug" is enabled. ')
shenhan48738582013-02-19 22:45:41 +0000191
192 # Replace EXTRA_BOARD_FLAGS=-e with "-e --onlydeps"
193 build_packages_env = build_packages_env.replace(
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800194 'EXTRA_BOARD_FLAGS=-e', 'EXTRA_BOARD_FLAGS="-e --onlydeps"')
shenhan48738582013-02-19 22:45:41 +0000195 else:
196 build_packages_env += ' EXTRA_BOARD_FLAGS=--onlydeps'
197
198 ret = cmd_executer.ChrootRunCommand(
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800199 options.chromeos_root, 'CFLAGS="$(portageq-%s envvar CFLAGS) %s" '
200 'CXXFLAGS="$(portageq-%s envvar CXXFLAGS) %s" '
201 'LDFLAGS="$(portageq-%s envvar LDFLAGS) %s" '
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800202 'CHROME_ORIGIN=SERVER_SOURCE '
203 '%s '
204 '%s --skip_chroot_upgrade'
205 'chromeos-chrome' % (options.board, options.cflags, options.board,
206 options.cxxflags, options.board, options.ldflags,
207 build_packages_env, build_packages_command))
shenhan48738582013-02-19 22:45:41 +0000208
209 logger.GetLogger().LogFatalIf(\
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800210 ret, 'build_packages failed while trying to build chromeos-chrome deps.')
shenhan48738582013-02-19 22:45:41 +0000211
212 # Secondly, build chromeos-chrome using debug mode.
213 # Replace '--onlydeps' with '--nodeps'.
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800214 if options.rebuild:
shenhan48738582013-02-19 22:45:41 +0000215 build_packages_env = build_packages_env.replace(
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800216 'EXTRA_BOARD_FLAGS="-e --onlydeps"', 'EXTRA_BOARD_FLAGS=--nodeps')
shenhan48738582013-02-19 22:45:41 +0000217 else:
218 build_packages_env = build_packages_env.replace(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800219 'EXTRA_BOARD_FLAGS=--onlydeps', 'EXTRA_BOARD_FLAGS=--nodeps')
shenhan48738582013-02-19 22:45:41 +0000220 ret = cmd_executer.ChrootRunCommand(
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800221 options.chromeos_root, 'CFLAGS="$(portageq-%s envvar CFLAGS) %s" '
222 'CXXFLAGS="$(portageq-%s envvar CXXFLAGS) %s" '
223 'LDFLAGS="$(portageq-%s envvar LDFLAGS) %s" '
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800224 'CHROME_ORIGIN=SERVER_SOURCE BUILDTYPE=Debug '
225 '%s '
226 '%s --skip_chroot_upgrade'
227 'chromeos-chrome' % (options.board, options.cflags, options.board,
228 options.cxxflags, options.board, options.ldflags,
229 build_packages_env, build_packages_command))
shenhan48738582013-02-19 22:45:41 +0000230 logger.GetLogger().LogFatalIf(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800231 ret,
232 'build_packages failed while trying to build debug chromeos-chrome.')
shenhan48738582013-02-19 22:45:41 +0000233
234 # Now, we have built chromeos-chrome and all dependencies.
235 # Finally, remove '-e' from EXTRA_BOARD_FLAGS,
236 # otherwise, chromeos-chrome gets rebuilt.
237 build_packages_env = build_packages_env.replace(\
238 'EXTRA_BOARD_FLAGS=--nodeps', '')
239
240 # Up to now, we have a debug built chromos-chrome browser.
241 # Fall through to build the rest of the world.
242
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800243 # Build packages
asharifca3c6c12013-02-15 23:17:54 +0000244 ret = cmd_executer.ChrootRunCommand(
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800245 options.chromeos_root, 'CFLAGS="$(portageq-%s envvar CFLAGS) %s" '
246 'CXXFLAGS="$(portageq-%s envvar CXXFLAGS) %s" '
247 'LDFLAGS="$(portageq-%s envvar LDFLAGS) %s" '
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800248 'CHROME_ORIGIN=SERVER_SOURCE '
249 '%s '
Caroline Ticef6ef4392017-04-06 17:16:05 -0700250 '%s --skip_chroot_upgrade' %
251 (options.board, options.cflags, options.board, options.cxxflags,
252 options.board, options.ldflags, build_packages_env,
253 build_packages_command))
raymesbfb57992013-02-15 04:35:45 +0000254
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800255 logger.GetLogger().LogFatalIf(ret, 'build_packages failed')
yunlian5acba6e2013-02-19 22:34:37 +0000256 if options.package:
257 return 0
raymes5154d7f2013-02-15 04:35:37 +0000258 # Build image
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800259 ret = cmd_executer.ChrootRunCommand(
260 options.chromeos_root, build_packages_env + ' ' + build_image_command)
raymesbfb57992013-02-15 04:35:45 +0000261
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800262 logger.GetLogger().LogFatalIf(ret, 'build_image failed')
raymes5154d7f2013-02-15 04:35:37 +0000263
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800264 flags_file_name = 'flags.txt'
265 flags_file_path = ('%s/src/build/images/%s/latest/%s' %
266 (options.chromeos_root, options.board, flags_file_name))
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800267 with open(flags_file_path, 'w', encoding='utf-8') as flags_file:
268 flags_file.write('CFLAGS=%s\n' % options.cflags)
269 flags_file.write('CXXFLAGS=%s\n' % options.cxxflags)
270 flags_file.write('LDFLAGS=%s\n' % options.ldflags)
asharif8697d4e2013-02-15 09:18:09 +0000271
272 if options.label:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800273 image_dir_path = ('%s/src/build/images/%s/latest' % (options.chromeos_root,
274 options.board))
asharif8697d4e2013-02-15 09:18:09 +0000275 real_image_dir_path = os.path.realpath(image_dir_path)
Zhizhou Yang81d651f2020-02-10 16:51:20 -0800276 command = ('ln -sf -T %s %s/%s' % (os.path.basename(real_image_dir_path),
277 os.path.dirname(real_image_dir_path),
278 options.label))
asharif8697d4e2013-02-15 09:18:09 +0000279
280 ret = cmd_executer.RunCommand(command)
Caroline Ticef6ef4392017-04-06 17:16:05 -0700281 logger.GetLogger().LogFatalIf(
282 ret, 'Failed to apply symlink label %s' % options.label)
asharif8697d4e2013-02-15 09:18:09 +0000283
284 return ret
raymes5154d7f2013-02-15 04:35:37 +0000285
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800286
287if __name__ == '__main__':
asharif2198c512013-02-15 09:21:35 +0000288 retval = Main(sys.argv)
289 sys.exit(retval)