blob: 673f32b3331b8a80daf16a4310f63a85241aa0d5 [file] [log] [blame]
yunlian5acba6e2013-02-19 22:34:37 +00001#!/usr/bin/python
raymes5154d7f2013-02-15 04:35:37 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to checkout the ChromeOS source.
6
7This script sets up the ChromeOS source in the given directory, matching a
8particular release of ChromeOS.
9"""
10
shenhan48738582013-02-19 22:45:41 +000011__author__ = ("asharif@google.com (Ahmad Sharif) "
12 "llozano@google.com (Luis Lozano) "
13 "raymes@google.com (Raymes Khoury) "
14 "shenhan@google.com (Han Shen)")
raymes5154d7f2013-02-15 04:35:37 +000015
16import optparse
17import os
18import sys
kbaclawski20082a02013-02-16 02:12:57 +000019
asharife3668f12013-02-15 04:46:29 +000020import tc_enter_chroot
raymes01959ae2013-02-15 04:50:07 +000021from utils import command_executer
22from utils import logger
kbaclawski20082a02013-02-16 02:12:57 +000023from 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):
27 print "ERROR: " + message
28 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
37 parser = optparse.OptionParser()
38 parser.add_option("--chromeos_root", dest="chromeos_root",
39 help="Target directory for ChromeOS installation.")
raymes5154d7f2013-02-15 04:35:37 +000040 parser.add_option("--clobber_chroot", dest="clobber_chroot",
41 action="store_true", help=
42 "Delete the chroot and start fresh", default=False)
43 parser.add_option("--clobber_board", dest="clobber_board",
44 action="store_true",
45 help="Delete the board and start fresh", default=False)
asharif80b47dc2013-02-15 06:31:19 +000046 parser.add_option("--rebuild", dest="rebuild",
47 action="store_true",
48 help="Rebuild all board packages except the toolchain.",
49 default=False)
raymes9b8305c2013-02-15 04:56:27 +000050 parser.add_option("--cflags", dest="cflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000051 help="CFLAGS for the ChromeOS packages")
raymes9b8305c2013-02-15 04:56:27 +000052 parser.add_option("--cxxflags", dest="cxxflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000053 help="CXXFLAGS for the ChromeOS packages")
raymes9b8305c2013-02-15 04:56:27 +000054 parser.add_option("--ldflags", dest="ldflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000055 help="LDFLAGS for the ChromeOS packages")
56 parser.add_option("--board", dest="board",
57 help="ChromeOS target board, e.g. x86-generic")
yunlian5acba6e2013-02-19 22:34:37 +000058 parser.add_option("--package", dest="package",
59 help="The package needs to be built")
asharif8697d4e2013-02-15 09:18:09 +000060 parser.add_option("--label", dest="label",
61 help="Optional label symlink to point to build dir.")
shenhan48738582013-02-19 22:45:41 +000062 parser.add_option("--dev", dest="dev", default=False, action="store_true",
63 help=("Make the final image in dev mode (eg writable, "
64 "more space on image). Defaults to False."))
65 parser.add_option("--debug", dest="debug", default=False, action="store_true",
66 help=("Optional. Build chrome browser with \"-g -O0\". "
67 "Notice, this also turns on \'--dev\'. "
68 "Defaults to False."))
asharif44473782013-02-19 19:58:15 +000069 parser.add_option("--env",
70 dest="env",
71 default="",
72 help="Env to pass to build_packages.")
asharif0341d302013-02-15 04:56:38 +000073 parser.add_option("--vanilla", dest="vanilla",
asharifb1752c82013-02-15 04:56:37 +000074 default=False,
75 action="store_true",
asharif0341d302013-02-15 04:56:38 +000076 help="Use default ChromeOS toolchain.")
Yunlian Jiangd145a582013-08-19 13:59:34 -070077 parser.add_option("--vanilla_image", dest="vanilla_image",
78 default=False,
79 action="store_true",
80 help=("Use prebuild packages for building the image. "
81 "It also implies the --vanilla option is set."))
raymes5154d7f2013-02-15 04:35:37 +000082
bjanakiraman6496e5f2013-02-15 04:50:58 +000083 options = parser.parse_args(argv[1:])[0]
raymes5154d7f2013-02-15 04:35:37 +000084
85 if options.chromeos_root is None:
86 Usage(parser, "--chromeos_root must be set")
Luis Lozano09b027f2015-03-30 13:29:49 -070087 options.chromeos_root = os.path.expanduser(options.chromeos_root)
88 scripts_dir = os.path.join(options.chromeos_root, 'src', 'scripts')
89 if not os.path.isdir(scripts_dir):
90 Usage(parser, "--chromeos_root must be set up first. Use setup_chromeos.py")
raymes5154d7f2013-02-15 04:35:37 +000091
raymes5154d7f2013-02-15 04:35:37 +000092 if options.board is None:
93 Usage(parser, "--board must be set")
94
shenhan48738582013-02-19 22:45:41 +000095 if options.debug:
96 options.dev = True
97
asharif44473782013-02-19 19:58:15 +000098 build_packages_env = options.env
shenhan48738582013-02-19 22:45:41 +000099 if build_packages_env.find('EXTRA_BOARD_FLAGS=') != -1:
100 logger.GetLogger().LogFatal(
101 ('Passing "EXTRA_BOARD_FLAGS" in "--env" is not supported. '
102 'This flags is used internally by this script. '
103 'Contact the author for more detail.'))
104
asharif80b47dc2013-02-15 06:31:19 +0000105 if options.rebuild == True:
llozano109ac9f2013-02-19 19:58:27 +0000106 build_packages_env += " EXTRA_BOARD_FLAGS=-e"
llozano3a428922013-02-19 21:36:47 +0000107 # EXTRA_BOARD_FLAGS=-e should clean up the object files for the chrome
108 # browser but it doesn't. So do it here.
109 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
asharif80b47dc2013-02-15 06:31:19 +0000110
Luis Lozano09b027f2015-03-30 13:29:49 -0700111 # Build with afdo_use by default.
112 # To change the default use --env="USE=-afdo_use".
113 build_packages_env = misc.MergeEnvStringWithDict(
114 build_packages_env,
115 {"USE": "chrome_internal afdo_use"})
asharif01e29a52013-02-15 04:56:41 +0000116
shenhan48738582013-02-19 22:45:41 +0000117 build_packages_command = misc.GetBuildPackagesCommand(
Yunlian Jiangd145a582013-08-19 13:59:34 -0700118 board=options.board, usepkg=options.vanilla_image, debug=options.debug)
yunlian5acba6e2013-02-19 22:34:37 +0000119
120 if options.package:
121 build_packages_command += " {0}".format(options.package)
122
shenhan48738582013-02-19 22:45:41 +0000123 build_image_command = misc.GetBuildImageCommand(options.board, options.dev)
asharifca8c5ef2013-02-15 04:57:02 +0000124
Yunlian Jiangd145a582013-08-19 13:59:34 -0700125 if options.vanilla or options.vanilla_image:
kbaclawski20082a02013-02-16 02:12:57 +0000126 command = misc.GetSetupBoardCommand(options.board,
Yunlian Jiangd145a582013-08-19 13:59:34 -0700127 usepkg=options.vanilla_image,
llozano3a428922013-02-19 21:36:47 +0000128 force=options.clobber_board)
asharifc380f612013-02-15 09:13:07 +0000129 command += "; " + build_packages_env + " " + build_packages_command
asharif44473782013-02-19 19:58:15 +0000130 command += "&& " + build_packages_env + " " + build_image_command
asharifca3c6c12013-02-15 23:17:54 +0000131 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
asharifb1752c82013-02-15 04:56:37 +0000132 return ret
133
raymes5154d7f2013-02-15 04:35:37 +0000134 # Setup board
raymes04164a12013-02-15 04:36:03 +0000135 if not os.path.isdir(options.chromeos_root + "/chroot/build/"
136 + options.board) or options.clobber_board:
raymes04164a12013-02-15 04:36:03 +0000137 # Run build_tc.py from binary package
kbaclawski20082a02013-02-16 02:12:57 +0000138 rootdir = misc.GetRoot(argv[0])[0]
139 version_number = misc.GetRoot(rootdir)[1]
asharifca3c6c12013-02-15 23:17:54 +0000140 ret = cmd_executer.ChrootRunCommand(
141 options.chromeos_root,
kbaclawski20082a02013-02-16 02:12:57 +0000142 misc.GetSetupBoardCommand(options.board,
asharife0cc3052013-02-15 05:20:48 +0000143 force=options.clobber_board))
kbaclawski6999ada2013-02-15 19:57:09 +0000144 logger.GetLogger().LogFatalIf(ret, "setup_board failed")
raymes5f35b922013-02-15 04:35:57 +0000145 else:
raymes01959ae2013-02-15 04:50:07 +0000146 logger.GetLogger().LogOutput("Did not setup_board "
147 "because it already exists")
raymesbfb57992013-02-15 04:35:45 +0000148
shenhan48738582013-02-19 22:45:41 +0000149 if options.debug:
150 # Perform 2-step build_packages to build a debug chrome browser.
151
152 # Firstly, build everything that chromeos-chrome depends on normally.
153 if options.rebuild == True:
154 # Give warning about "--rebuild" and "--debug". Under this combination,
155 # only dependencies of "chromeos-chrome" get rebuilt.
156 logger.GetLogger().LogWarning(
157 "\"--rebuild\" does not correctly re-build every package when "
158 "\"--debug\" is enabled. ")
159
160 # Replace EXTRA_BOARD_FLAGS=-e with "-e --onlydeps"
161 build_packages_env = build_packages_env.replace(
162 'EXTRA_BOARD_FLAGS=-e', 'EXTRA_BOARD_FLAGS=\"-e --onlydeps\"')
163 else:
164 build_packages_env += ' EXTRA_BOARD_FLAGS=--onlydeps'
165
166 ret = cmd_executer.ChrootRunCommand(
167 options.chromeos_root,
168 "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
169 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
170 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
171 "CHROME_ORIGIN=SERVER_SOURCE "
172 "%s "
cmticedf805332014-05-20 13:31:03 -0700173 "%s --skip_chroot_upgrade"
shenhan48738582013-02-19 22:45:41 +0000174 "chromeos-chrome"
175 % (options.board, options.cflags,
176 options.board, options.cxxflags,
177 options.board, options.ldflags,
178 build_packages_env,
179 build_packages_command))
180
181 logger.GetLogger().LogFatalIf(\
182 ret, "build_packages failed while trying to build chromeos-chrome deps.")
183
184 # Secondly, build chromeos-chrome using debug mode.
185 # Replace '--onlydeps' with '--nodeps'.
186 if options.rebuild == True:
187 build_packages_env = build_packages_env.replace(
188 'EXTRA_BOARD_FLAGS=\"-e --onlydeps\"', 'EXTRA_BOARD_FLAGS=--nodeps')
189 else:
190 build_packages_env = build_packages_env.replace(
191 'EXTRA_BOARD_FLAGS=--onlydeps', 'EXTRA_BOARD_FLAGS=--nodeps')
192 ret = cmd_executer.ChrootRunCommand(
193 options.chromeos_root,
194 "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
195 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
196 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
197 "CHROME_ORIGIN=SERVER_SOURCE BUILDTYPE=Debug "
198 "%s "
cmticedf805332014-05-20 13:31:03 -0700199 "%s --skip_chroot_upgrade"
shenhan48738582013-02-19 22:45:41 +0000200 "chromeos-chrome"
201 % (options.board, options.cflags,
202 options.board, options.cxxflags,
203 options.board, options.ldflags,
204 build_packages_env,
205 build_packages_command))
206 logger.GetLogger().LogFatalIf(
207 ret, "build_packages failed while trying to build debug chromeos-chrome.")
208
209 # Now, we have built chromeos-chrome and all dependencies.
210 # Finally, remove '-e' from EXTRA_BOARD_FLAGS,
211 # otherwise, chromeos-chrome gets rebuilt.
212 build_packages_env = build_packages_env.replace(\
213 'EXTRA_BOARD_FLAGS=--nodeps', '')
214
215 # Up to now, we have a debug built chromos-chrome browser.
216 # Fall through to build the rest of the world.
217
raymes9b8305c2013-02-15 04:56:27 +0000218 # Build packages
asharifca3c6c12013-02-15 23:17:54 +0000219 ret = cmd_executer.ChrootRunCommand(
220 options.chromeos_root,
221 "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
asharifca3c6c12013-02-15 23:17:54 +0000222 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
llozano109ac9f2013-02-19 19:58:27 +0000223 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
asharifca3c6c12013-02-15 23:17:54 +0000224 "CHROME_ORIGIN=SERVER_SOURCE "
225 "%s "
cmticedf805332014-05-20 13:31:03 -0700226 "%s --skip_chroot_upgrade"
asharifca3c6c12013-02-15 23:17:54 +0000227 % (options.board, options.cflags,
228 options.board, options.cxxflags,
229 options.board, options.ldflags,
230 build_packages_env,
231 build_packages_command))
raymesbfb57992013-02-15 04:35:45 +0000232
kbaclawski6999ada2013-02-15 19:57:09 +0000233 logger.GetLogger().LogFatalIf(ret, "build_packages failed")
yunlian5acba6e2013-02-19 22:34:37 +0000234 if options.package:
235 return 0
raymes5154d7f2013-02-15 04:35:37 +0000236 # Build image
asharifca3c6c12013-02-15 23:17:54 +0000237 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
asharif44473782013-02-19 19:58:15 +0000238 build_packages_env + " " +
asharifca3c6c12013-02-15 23:17:54 +0000239 build_image_command)
raymesbfb57992013-02-15 04:35:45 +0000240
kbaclawski6999ada2013-02-15 19:57:09 +0000241 logger.GetLogger().LogFatalIf(ret, "build_image failed")
raymes5154d7f2013-02-15 04:35:37 +0000242
asharif8697d4e2013-02-15 09:18:09 +0000243 flags_file_name = "flags.txt"
244 flags_file_path = ("%s/src/build/images/%s/latest/%s" %
245 (options.chromeos_root,
246 options.board,
247 flags_file_name))
248 flags_file = open(flags_file_path, "wb")
249 flags_file.write("CFLAGS=%s\n" % options.cflags)
250 flags_file.write("CXXFLAGS=%s\n" % options.cxxflags)
251 flags_file.write("LDFLAGS=%s\n" % options.ldflags)
252 flags_file.close()
253
254 if options.label:
255 image_dir_path = ("%s/src/build/images/%s/latest" %
256 (options.chromeos_root,
257 options.board))
258 real_image_dir_path = os.path.realpath(image_dir_path)
259 command = ("ln -sf -T %s %s/%s" %
260 (os.path.basename(real_image_dir_path),
261 os.path.dirname(real_image_dir_path),
262 options.label))
263
264 ret = cmd_executer.RunCommand(command)
kbaclawski6999ada2013-02-15 19:57:09 +0000265 logger.GetLogger().LogFatalIf(ret, "Failed to apply symlink label %s" %
266 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000267
268 return ret
raymes5154d7f2013-02-15 04:35:37 +0000269
270if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000271 retval = Main(sys.argv)
272 sys.exit(retval)