blob: c02f10262624a916ee47287bb5fc303d66ccf3da [file] [log] [blame]
raymes5154d7f2013-02-15 04:35:37 +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
14import os
15import sys
kbaclawski20082a02013-02-16 02:12:57 +000016
asharife3668f12013-02-15 04:46:29 +000017import tc_enter_chroot
raymes01959ae2013-02-15 04:50:07 +000018from utils import command_executer
19from utils import logger
kbaclawski20082a02013-02-16 02:12:57 +000020from utils import misc
raymes5154d7f2013-02-15 04:35:37 +000021
asharife3668f12013-02-15 04:46:29 +000022
raymes5154d7f2013-02-15 04:35:37 +000023def Usage(parser, message):
24 print "ERROR: " + message
25 parser.print_help()
26 sys.exit(0)
27
asharife3668f12013-02-15 04:46:29 +000028
bjanakiraman6496e5f2013-02-15 04:50:58 +000029def Main(argv):
raymes5154d7f2013-02-15 04:35:37 +000030 """Build ChromeOS."""
31 # Common initializations
asharif5a9bb462013-02-15 04:50:57 +000032 cmd_executer = command_executer.GetCommandExecuter()
raymes5154d7f2013-02-15 04:35:37 +000033
34 parser = optparse.OptionParser()
35 parser.add_option("--chromeos_root", dest="chromeos_root",
36 help="Target directory for ChromeOS installation.")
raymes5154d7f2013-02-15 04:35:37 +000037 parser.add_option("--clobber_chroot", dest="clobber_chroot",
38 action="store_true", help=
39 "Delete the chroot and start fresh", default=False)
40 parser.add_option("--clobber_board", dest="clobber_board",
41 action="store_true",
42 help="Delete the board and start fresh", default=False)
asharif80b47dc2013-02-15 06:31:19 +000043 parser.add_option("--rebuild", dest="rebuild",
44 action="store_true",
45 help="Rebuild all board packages except the toolchain.",
46 default=False)
raymes9b8305c2013-02-15 04:56:27 +000047 parser.add_option("--cflags", dest="cflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000048 help="CFLAGS for the ChromeOS packages")
raymes9b8305c2013-02-15 04:56:27 +000049 parser.add_option("--cxxflags", dest="cxxflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000050 help="CXXFLAGS for the ChromeOS packages")
raymes9b8305c2013-02-15 04:56:27 +000051 parser.add_option("--ldflags", dest="ldflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000052 help="LDFLAGS for the ChromeOS packages")
53 parser.add_option("--board", dest="board",
54 help="ChromeOS target board, e.g. x86-generic")
asharif8697d4e2013-02-15 09:18:09 +000055 parser.add_option("--label", dest="label",
56 help="Optional label symlink to point to build dir.")
asharif44473782013-02-19 19:58:15 +000057 parser.add_option("--env",
58 dest="env",
59 default="",
60 help="Env to pass to build_packages.")
asharif0341d302013-02-15 04:56:38 +000061 parser.add_option("--vanilla", dest="vanilla",
asharifb1752c82013-02-15 04:56:37 +000062 default=False,
63 action="store_true",
asharif0341d302013-02-15 04:56:38 +000064 help="Use default ChromeOS toolchain.")
raymes5154d7f2013-02-15 04:35:37 +000065
bjanakiraman6496e5f2013-02-15 04:50:58 +000066 options = parser.parse_args(argv[1:])[0]
raymes5154d7f2013-02-15 04:35:37 +000067
68 if options.chromeos_root is None:
69 Usage(parser, "--chromeos_root must be set")
70
raymes5154d7f2013-02-15 04:35:37 +000071 if options.board is None:
72 Usage(parser, "--board must be set")
73
asharif44473782013-02-19 19:58:15 +000074 build_packages_env = options.env
asharif80b47dc2013-02-15 06:31:19 +000075 if options.rebuild == True:
llozano109ac9f2013-02-19 19:58:27 +000076 build_packages_env += " EXTRA_BOARD_FLAGS=-e"
llozano3a428922013-02-19 21:36:47 +000077 # EXTRA_BOARD_FLAGS=-e should clean up the object files for the chrome
78 # browser but it doesn't. So do it here.
79 misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board)
asharif80b47dc2013-02-15 06:31:19 +000080
asharifde19f7c2013-02-19 19:34:59 +000081 build_packages_env = misc.MergeEnvStringWithDict(build_packages_env,
82 {"USE": "chrome_internal"})
83
asharif01e29a52013-02-15 04:56:41 +000084 options.chromeos_root = os.path.expanduser(options.chromeos_root)
asharif01e29a52013-02-15 04:56:41 +000085
kbaclawski20082a02013-02-16 02:12:57 +000086 build_packages_command = misc.GetBuildPackagesCommand(options.board)
87 build_image_command = misc.GetBuildImageCommand(options.board)
asharifca8c5ef2013-02-15 04:57:02 +000088
asharif0341d302013-02-15 04:56:38 +000089 if options.vanilla == True:
kbaclawski20082a02013-02-16 02:12:57 +000090 command = misc.GetSetupBoardCommand(options.board,
llozano3a428922013-02-19 21:36:47 +000091 usepkg=False,
92 force=options.clobber_board)
asharifc380f612013-02-15 09:13:07 +000093 command += "; " + build_packages_env + " " + build_packages_command
asharif44473782013-02-19 19:58:15 +000094 command += "&& " + build_packages_env + " " + build_image_command
asharifca3c6c12013-02-15 23:17:54 +000095 ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command)
asharifb1752c82013-02-15 04:56:37 +000096 return ret
97
raymes5154d7f2013-02-15 04:35:37 +000098 # Setup board
raymes04164a12013-02-15 04:36:03 +000099 if not os.path.isdir(options.chromeos_root + "/chroot/build/"
100 + options.board) or options.clobber_board:
raymes04164a12013-02-15 04:36:03 +0000101 # Run build_tc.py from binary package
kbaclawski20082a02013-02-16 02:12:57 +0000102 rootdir = misc.GetRoot(argv[0])[0]
103 version_number = misc.GetRoot(rootdir)[1]
asharifca3c6c12013-02-15 23:17:54 +0000104 ret = cmd_executer.ChrootRunCommand(
105 options.chromeos_root,
kbaclawski20082a02013-02-16 02:12:57 +0000106 misc.GetSetupBoardCommand(options.board,
asharife0cc3052013-02-15 05:20:48 +0000107 force=options.clobber_board))
kbaclawski6999ada2013-02-15 19:57:09 +0000108 logger.GetLogger().LogFatalIf(ret, "setup_board failed")
raymes5f35b922013-02-15 04:35:57 +0000109 else:
raymes01959ae2013-02-15 04:50:07 +0000110 logger.GetLogger().LogOutput("Did not setup_board "
111 "because it already exists")
raymesbfb57992013-02-15 04:35:45 +0000112
raymes9b8305c2013-02-15 04:56:27 +0000113 # Build packages
asharifca3c6c12013-02-15 23:17:54 +0000114 ret = cmd_executer.ChrootRunCommand(
115 options.chromeos_root,
116 "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
asharifca3c6c12013-02-15 23:17:54 +0000117 "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
llozano109ac9f2013-02-19 19:58:27 +0000118 "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
asharifca3c6c12013-02-15 23:17:54 +0000119 "CHROME_ORIGIN=SERVER_SOURCE "
120 "%s "
121 "%s"
122 % (options.board, options.cflags,
123 options.board, options.cxxflags,
124 options.board, options.ldflags,
125 build_packages_env,
126 build_packages_command))
raymesbfb57992013-02-15 04:35:45 +0000127
kbaclawski6999ada2013-02-15 19:57:09 +0000128 logger.GetLogger().LogFatalIf(ret, "build_packages failed")
raymes5154d7f2013-02-15 04:35:37 +0000129
130 # Build image
asharifca3c6c12013-02-15 23:17:54 +0000131 ret = cmd_executer.ChrootRunCommand(options.chromeos_root,
asharif44473782013-02-19 19:58:15 +0000132 build_packages_env + " " +
asharifca3c6c12013-02-15 23:17:54 +0000133 build_image_command)
raymesbfb57992013-02-15 04:35:45 +0000134
kbaclawski6999ada2013-02-15 19:57:09 +0000135 logger.GetLogger().LogFatalIf(ret, "build_image failed")
raymes5154d7f2013-02-15 04:35:37 +0000136
asharif8697d4e2013-02-15 09:18:09 +0000137 flags_file_name = "flags.txt"
138 flags_file_path = ("%s/src/build/images/%s/latest/%s" %
139 (options.chromeos_root,
140 options.board,
141 flags_file_name))
142 flags_file = open(flags_file_path, "wb")
143 flags_file.write("CFLAGS=%s\n" % options.cflags)
144 flags_file.write("CXXFLAGS=%s\n" % options.cxxflags)
145 flags_file.write("LDFLAGS=%s\n" % options.ldflags)
146 flags_file.close()
147
148 if options.label:
149 image_dir_path = ("%s/src/build/images/%s/latest" %
150 (options.chromeos_root,
151 options.board))
152 real_image_dir_path = os.path.realpath(image_dir_path)
153 command = ("ln -sf -T %s %s/%s" %
154 (os.path.basename(real_image_dir_path),
155 os.path.dirname(real_image_dir_path),
156 options.label))
157
158 ret = cmd_executer.RunCommand(command)
kbaclawski6999ada2013-02-15 19:57:09 +0000159 logger.GetLogger().LogFatalIf(ret, "Failed to apply symlink label %s" %
160 options.label)
asharif8697d4e2013-02-15 09:18:09 +0000161
162 return ret
raymes5154d7f2013-02-15 04:35:37 +0000163
164if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000165 retval = Main(sys.argv)
166 sys.exit(retval)