blob: 9b6517d081032ca44a51155fe2f63d4266b31317 [file] [log] [blame]
raymes49fd5a32013-02-15 04:55:27 +00001#!/usr/bin/python2.6
2#
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")
asharif8697d4e2013-02-15 09:18:09 +000066 parser.add_option("--label", dest="label",
67 help="Optional label to apply to the ChromeOS image.")
asharif915f0f92013-02-16 03:13:48 +000068 parser.add_option("--build_image_args",
69 default="",
70 dest="build_image_args",
71 help="Optional arguments to build_image.")
shenhan9213b832013-02-19 20:42:47 +000072 parser.add_option("--cros_workon", dest="cros_workon",
73 help="Build using external source tree.")
raymes49fd5a32013-02-15 04:55:27 +000074
asharif8697d4e2013-02-15 09:18:09 +000075 options = parser.parse_args(argv)[0]
raymes49fd5a32013-02-15 04:55:27 +000076
77 if options.chromeos_root is None:
78 Usage(parser, "--chromeos_root must be set")
79
80 if options.board is None:
81 Usage(parser, "--board must be set")
82
raymes49fd5a32013-02-15 04:55:27 +000083 if options.version is None:
84 logger.GetLogger().LogOutput("No Chrome version given so "
85 "using the default checked in version.")
86 chrome_version = ""
87 else:
88 chrome_version = "CHROME_VERSION=%s" % options.version
89
asharif52ff3072013-02-16 02:13:00 +000090 options.chromeos_root = misc.CanonicalizePath(options.chromeos_root)
91
asharif44aff652013-02-16 02:41:07 +000092 unmask_env = "ACCEPT_KEYWORDS=~*"
asharif52ff3072013-02-16 02:13:00 +000093 if options.ebuild_version:
94 ebuild_version = "=%s" % options.ebuild_version
asharif44aff652013-02-16 02:41:07 +000095 options.env = "%s %s" % (options.env, unmask_env)
asharif52ff3072013-02-16 02:13:00 +000096 else:
97 ebuild_version = "chromeos-chrome"
98
shenhan9213b832013-02-19 20:42:47 +000099 if options.cros_workon and not (
100 os.path.isdir(options.cros_workon) and os.path.exists(
101 os.path.join(options.cros_workon, "src/chromeos/chromeos.gyp"))):
102 Usage(parser, "--cros_workon must be a valid chromium browser checkout.")
103
asharif01dba112013-02-19 19:20:01 +0000104 options.env = misc.MergeEnvStringWithDict(options.env,
105 {"USE": "chrome_internal"})
ashariffc4c06f2013-02-19 19:43:10 +0000106 if options.clean:
llozano3a428922013-02-19 21:36:47 +0000107 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
ashariffc4c06f2013-02-19 19:43:10 +0000108
shenhan9213b832013-02-19 20:42:47 +0000109 chrome_origin="SERVER_SOURCE"
110 if options.cros_workon:
111 chrome_origin="LOCAL_SOURCE"
112 command = 'cros_workon --board={0} start chromeos-chrome'.format(
113 options.board)
114 ret = cmd_executer.ChrootRunCommand(
115 options.chromeos_root, command, return_output=True)
116
117 # cros_workon start returns non-zero if chromeos-chrome is already a
118 # cros_workon package.
119 if ret[0] and ret[2].find(
120 "WARNING : Already working on chromeos-base/chromeos-chrome") == -1:
121 logger.GetLogger().LogFatal("cros_workon chromeos-chrome failed.")
122
123 # Return value is non-zero means we do find the "Already working on..."
124 # message, keep the information, so later on we do not revert the
125 # cros_workon status.
126 cros_workon_keep = (ret[0] != 0)
127
raymes49fd5a32013-02-15 04:55:27 +0000128 # Emerge the browser
shenhan9213b832013-02-19 20:42:47 +0000129 emerge_browser_command = \
130 ("CHROME_ORIGIN={0} {1} "
131 "CFLAGS=\"$(portageq-{2} envvar CFLAGS) {3}\" "
132 "LDFLAGS=\"$(portageq-{2} envvar LDFLAGS) {4}\" "
133 "CXXFLAGS=\"$(portageq-{2} envvar CXXFLAGS) {5}\" "
134 "{6} emerge-{2} --buildpkg {7}").format(
135 chrome_origin, chrome_version, options.board, options.cflags,
136 options.ldflags, options.cxxflags, options.env, ebuild_version)
137
138 cros_sdk_options = ''
139 if options.cros_workon:
140 cros_sdk_options='--chrome_root={0}'.format(options.cros_workon)
141
142 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
143 emerge_browser_command,
144 cros_sdk_options=cros_sdk_options)
raymes49fd5a32013-02-15 04:55:27 +0000145
kbaclawski6999ada2013-02-15 19:57:09 +0000146 logger.GetLogger().LogFatalIf(ret, "build_packages failed")
raymes49fd5a32013-02-15 04:55:27 +0000147
shenhan9213b832013-02-19 20:42:47 +0000148 if options.cros_workon and not cros_workon_keep:
149 command = 'cros_workon --board={0} stop chromeos-chrome'.format(
150 options.board)
151 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
152 # cros_workon failed, not a fatal one, just report it.
153 if ret:
154 print "cros_workon stop chromeos-chrome failed."
155
raymes49fd5a32013-02-15 04:55:27 +0000156 # Build image
asharifca3c6c12013-02-15 23:17:54 +0000157 ret = (cmd_executer.
158 ChrootRunCommand(options.chromeos_root,
asharif915f0f92013-02-16 03:13:48 +0000159 ("%s %s %s %s" %
asharif44aff652013-02-16 02:41:07 +0000160 (unmask_env,
asharif915f0f92013-02-16 03:13:48 +0000161 options.env,
162 misc.GetBuildImageCommand(options.board),
163 options.build_image_args))))
raymes49fd5a32013-02-15 04:55:27 +0000164
kbaclawski6999ada2013-02-15 19:57:09 +0000165 logger.GetLogger().LogFatalIf(ret, "build_image failed")
raymes49fd5a32013-02-15 04:55:27 +0000166
raymes49fd5a32013-02-15 04:55:27 +0000167
asharif8697d4e2013-02-15 09:18:09 +0000168 flags_file_name = "chrome_flags.txt"
169 flags_file_path = ("%s/src/build/images/%s/latest/%s" %
170 (options.chromeos_root,
171 options.board,
172 flags_file_name))
173 flags_file = open(flags_file_path, "wb")
174 flags_file.write("CFLAGS=%s\n" % options.cflags)
175 flags_file.write("CXXFLAGS=%s\n" % options.cxxflags)
176 flags_file.write("LDFLAGS=%s\n" % options.ldflags)
177 flags_file.close()
178
179
180 if options.label:
181 image_dir_path = ("%s/src/build/images/%s/latest" %
182 (options.chromeos_root,
183 options.board))
184 real_image_dir_path = os.path.realpath(image_dir_path)
185 command = ("ln -sf -T %s %s/%s" %
186 (os.path.basename(real_image_dir_path),
187 os.path.dirname(real_image_dir_path),
188 options.label))
189
190 ret = cmd_executer.RunCommand(command)
kbaclawski6999ada2013-02-15 19:57:09 +0000191 logger.GetLogger().LogFatalIf(ret, "Failed to apply symlink label %s" %
192 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000193
194 return ret
195
raymes49fd5a32013-02-15 04:55:27 +0000196if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000197 retval = Main(sys.argv)
198 sys.exit(retval)