blob: f162c1d4fec3e7f25edfaa5bb73076371ccd79ff [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.
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
11__author__ = "raymes@google.com (Raymes Khoury)"
12
13import optparse
asharif8697d4e2013-02-15 09:18:09 +000014import os
asharif795af1d2013-02-16 02:11:01 +000015import shutil
raymes49fd5a32013-02-15 04:55:27 +000016import sys
kbaclawski20082a02013-02-16 02:12:57 +000017
18import build_chromeos
raymes49fd5a32013-02-15 04:55:27 +000019from utils import command_executer
20from utils import logger
kbaclawski20082a02013-02-16 02:12:57 +000021from utils import misc
raymes49fd5a32013-02-15 04:55:27 +000022
23cmd_executer = None
24
25
26def Usage(parser, message):
27 print "ERROR: " + message
28 parser.print_help()
29 sys.exit(0)
30
31
asharif8697d4e2013-02-15 09:18:09 +000032def Main(argv):
raymes49fd5a32013-02-15 04:55:27 +000033 """Build Chrome browser."""
34 # Common initializations
35 global cmd_executer
36 cmd_executer = command_executer.GetCommandExecuter()
37
38 parser = optparse.OptionParser()
39 parser.add_option("--chromeos_root", dest="chromeos_root",
40 help="Target directory for ChromeOS installation.")
raymes49fd5a32013-02-15 04:55:27 +000041 parser.add_option("--version", dest="version")
asharif795af1d2013-02-16 02:11:01 +000042 parser.add_option("--clean",
43 dest="clean",
44 default=False,
45 action="store_true",
shenhan9213b832013-02-19 20:42:47 +000046 help=("Clean the /var/cache/chromeos-chrome/"
47 "chrome-src/src/out_$board dir"))
asharif795af1d2013-02-16 02:11:01 +000048 parser.add_option("--env",
49 dest="env",
50 default="",
51 help="Use the following env")
asharif52ff3072013-02-16 02:13:00 +000052 parser.add_option("--ebuild_version",
53 dest="ebuild_version",
54 help="Use this ebuild instead of the default one.")
raymes49fd5a32013-02-15 04:55:27 +000055 parser.add_option("--cflags", dest="cflags",
asharif32ed84e2013-02-15 05:15:55 +000056 default="",
raymes49fd5a32013-02-15 04:55:27 +000057 help="CFLAGS for the ChromeOS packages")
58 parser.add_option("--cxxflags", dest="cxxflags",
asharif32ed84e2013-02-15 05:15:55 +000059 default="",
raymes49fd5a32013-02-15 04:55:27 +000060 help="CXXFLAGS for the ChromeOS packages")
61 parser.add_option("--ldflags", dest="ldflags",
asharif32ed84e2013-02-15 05:15:55 +000062 default="",
raymes49fd5a32013-02-15 04:55:27 +000063 help="LDFLAGS for the ChromeOS packages")
64 parser.add_option("--board", dest="board",
65 help="ChromeOS target board, e.g. x86-generic")
shenhan52e96222013-02-19 22:45:41 +000066 parser.add_option("--no_build_image", dest="no_build_image", default=False,
67 action="store_true",
68 help=("Skip build image after building browser."
69 "Defaults to False."))
asharif8697d4e2013-02-15 09:18:09 +000070 parser.add_option("--label", dest="label",
71 help="Optional label to apply to the ChromeOS image.")
asharif915f0f92013-02-16 03:13:48 +000072 parser.add_option("--build_image_args",
73 default="",
74 dest="build_image_args",
75 help="Optional arguments to build_image.")
shenhan9213b832013-02-19 20:42:47 +000076 parser.add_option("--cros_workon", dest="cros_workon",
77 help="Build using external source tree.")
shenhan52e96222013-02-19 22:45:41 +000078 parser.add_option("--dev", dest="dev", default=False, action="store_true",
79 help=("Build a dev (eg. writable/large) image. "
80 "Defaults to False."))
81 parser.add_option("--debug", dest="debug", default=False, action="store_true",
82 help=("Build chrome browser using debug mode. "
83 "This option implies --dev. Defaults to false."))
84 parser.add_option("--verbose", dest="verbose", default=False,
85 action="store_true",
86 help="Build with verbose information.")
raymes49fd5a32013-02-15 04:55:27 +000087
asharif8697d4e2013-02-15 09:18:09 +000088 options = parser.parse_args(argv)[0]
raymes49fd5a32013-02-15 04:55:27 +000089
90 if options.chromeos_root is None:
91 Usage(parser, "--chromeos_root must be set")
92
93 if options.board is None:
94 Usage(parser, "--board must be set")
95
raymes49fd5a32013-02-15 04:55:27 +000096 if options.version is None:
97 logger.GetLogger().LogOutput("No Chrome version given so "
98 "using the default checked in version.")
99 chrome_version = ""
100 else:
101 chrome_version = "CHROME_VERSION=%s" % options.version
102
shenhan52e96222013-02-19 22:45:41 +0000103 if options.dev and options.no_build_image:
104 logger.GetLogger().LogOutput(
105 "\"--dev\" is meaningless if \"--no_build_image\" is given.")
106
107 if options.debug:
108 options.dev = True
109
asharif52ff3072013-02-16 02:13:00 +0000110 options.chromeos_root = misc.CanonicalizePath(options.chromeos_root)
111
asharif44aff652013-02-16 02:41:07 +0000112 unmask_env = "ACCEPT_KEYWORDS=~*"
asharif52ff3072013-02-16 02:13:00 +0000113 if options.ebuild_version:
114 ebuild_version = "=%s" % options.ebuild_version
asharif44aff652013-02-16 02:41:07 +0000115 options.env = "%s %s" % (options.env, unmask_env)
asharif52ff3072013-02-16 02:13:00 +0000116 else:
117 ebuild_version = "chromeos-chrome"
118
shenhan9213b832013-02-19 20:42:47 +0000119 if options.cros_workon and not (
120 os.path.isdir(options.cros_workon) and os.path.exists(
121 os.path.join(options.cros_workon, "src/chromeos/chromeos.gyp"))):
122 Usage(parser, "--cros_workon must be a valid chromium browser checkout.")
123
shenhan52e96222013-02-19 22:45:41 +0000124 if options.verbose:
125 options.env = misc.MergeEnvStringWithDict(
126 options.env, {"USE": "chrome_internal verbose"})
127 else:
128 options.env = misc.MergeEnvStringWithDict(options.env,
129 {"USE": "chrome_internal"})
130 if options.debug:
131 options.env = misc.MergeEnvStringWithDict(options.env,
132 {"BUILDTYPE": "Debug"})
133
ashariffc4c06f2013-02-19 19:43:10 +0000134 if options.clean:
llozano3a428922013-02-19 21:36:47 +0000135 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
ashariffc4c06f2013-02-19 19:43:10 +0000136
shenhan52e96222013-02-19 22:45:41 +0000137 chrome_origin = "SERVER_SOURCE"
shenhan9213b832013-02-19 20:42:47 +0000138 if options.cros_workon:
shenhan52e96222013-02-19 22:45:41 +0000139 chrome_origin = "LOCAL_SOURCE"
shenhan9213b832013-02-19 20:42:47 +0000140 command = 'cros_workon --board={0} start chromeos-chrome'.format(
141 options.board)
142 ret = cmd_executer.ChrootRunCommand(
143 options.chromeos_root, command, return_output=True)
144
145 # cros_workon start returns non-zero if chromeos-chrome is already a
146 # cros_workon package.
147 if ret[0] and ret[2].find(
148 "WARNING : Already working on chromeos-base/chromeos-chrome") == -1:
149 logger.GetLogger().LogFatal("cros_workon chromeos-chrome failed.")
150
151 # Return value is non-zero means we do find the "Already working on..."
152 # message, keep the information, so later on we do not revert the
153 # cros_workon status.
154 cros_workon_keep = (ret[0] != 0)
155
raymes49fd5a32013-02-15 04:55:27 +0000156 # Emerge the browser
shenhan9213b832013-02-19 20:42:47 +0000157 emerge_browser_command = \
158 ("CHROME_ORIGIN={0} {1} "
159 "CFLAGS=\"$(portageq-{2} envvar CFLAGS) {3}\" "
160 "LDFLAGS=\"$(portageq-{2} envvar LDFLAGS) {4}\" "
161 "CXXFLAGS=\"$(portageq-{2} envvar CXXFLAGS) {5}\" "
162 "{6} emerge-{2} --buildpkg {7}").format(
163 chrome_origin, chrome_version, options.board, options.cflags,
164 options.ldflags, options.cxxflags, options.env, ebuild_version)
165
166 cros_sdk_options = ''
167 if options.cros_workon:
shenhan52e96222013-02-19 22:45:41 +0000168 cros_sdk_options = '--chrome_root={0}'.format(options.cros_workon)
shenhan9213b832013-02-19 20:42:47 +0000169
170 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
171 emerge_browser_command,
172 cros_sdk_options=cros_sdk_options)
raymes49fd5a32013-02-15 04:55:27 +0000173
kbaclawski6999ada2013-02-15 19:57:09 +0000174 logger.GetLogger().LogFatalIf(ret, "build_packages failed")
raymes49fd5a32013-02-15 04:55:27 +0000175
shenhan9213b832013-02-19 20:42:47 +0000176 if options.cros_workon and not cros_workon_keep:
177 command = 'cros_workon --board={0} stop chromeos-chrome'.format(
178 options.board)
179 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
180 # cros_workon failed, not a fatal one, just report it.
181 if ret:
182 print "cros_workon stop chromeos-chrome failed."
183
shenhan52e96222013-02-19 22:45:41 +0000184 if options.no_build_image:
185 return ret
186
187 # Finally build the image
188 ret = cmd_executer.ChrootRunCommand(
189 options.chromeos_root, "{0} {1} {2} {3}".format(
190 unmask_env, options.env, misc.GetBuildImageCommand(
191 options.board, dev=options.dev), options.build_image_args))
raymes49fd5a32013-02-15 04:55:27 +0000192
kbaclawski6999ada2013-02-15 19:57:09 +0000193 logger.GetLogger().LogFatalIf(ret, "build_image failed")
raymes49fd5a32013-02-15 04:55:27 +0000194
raymes49fd5a32013-02-15 04:55:27 +0000195
asharif8697d4e2013-02-15 09:18:09 +0000196 flags_file_name = "chrome_flags.txt"
shenhan52e96222013-02-19 22:45:41 +0000197 flags_file_path = "{0}/src/build/images/{1}/latest/{2}".format(
198 options.chromeos_root, options.board, flags_file_name)
asharif8697d4e2013-02-15 09:18:09 +0000199 flags_file = open(flags_file_path, "wb")
shenhan52e96222013-02-19 22:45:41 +0000200 flags_file.write("CFLAGS={0}\n".format(options.cflags))
201 flags_file.write("CXXFLAGS={0}\n".format(options.cxxflags))
202 flags_file.write("LDFLAGS={0}\n".format(options.ldflags))
asharif8697d4e2013-02-15 09:18:09 +0000203 flags_file.close()
204
205
206 if options.label:
shenhan52e96222013-02-19 22:45:41 +0000207 image_dir_path = "{0}/src/build/images/{1}/latest".format(
208 options.chromeos_root, options.board)
asharif8697d4e2013-02-15 09:18:09 +0000209 real_image_dir_path = os.path.realpath(image_dir_path)
shenhan52e96222013-02-19 22:45:41 +0000210 command = "ln -sf -T {0} {1}/{2}".format(
211 os.path.basename(real_image_dir_path),\
212 os.path.dirname(real_image_dir_path),\
213 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000214
215 ret = cmd_executer.RunCommand(command)
kbaclawski6999ada2013-02-15 19:57:09 +0000216 logger.GetLogger().LogFatalIf(ret, "Failed to apply symlink label %s" %
217 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000218
219 return ret
220
raymes49fd5a32013-02-15 04:55:27 +0000221if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000222 retval = Main(sys.argv)
223 sys.exit(retval)