blob: 063670839e18c9b8c292bb29e520d0e54abe5e3b [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
asharife3668f12013-02-15 04:46:29 +000016import tc_enter_chroot
raymes01959ae2013-02-15 04:50:07 +000017from utils import command_executer
18from utils import logger
raymes5154d7f2013-02-15 04:35:37 +000019from utils import utils
20
asharife3668f12013-02-15 04:46:29 +000021
raymes5154d7f2013-02-15 04:35:37 +000022def Usage(parser, message):
23 print "ERROR: " + message
24 parser.print_help()
25 sys.exit(0)
26
raymes49fd5a32013-02-15 04:55:27 +000027#TODO(raymes): move this to a common utils file.
raymes5154d7f2013-02-15 04:35:37 +000028def ExecuteCommandInChroot(chromeos_root, toolchain_root, command,
raymes81d88962013-02-15 04:56:26 +000029 return_output=False, full_mount=False):
asharife3668f12013-02-15 04:46:29 +000030 """Executes a command in the chroot."""
raymes49fd5a32013-02-15 04:55:27 +000031 global cmd_executer
32 cmd_executer = command_executer.GetCommandExecuter()
33
raymes49fd5a32013-02-15 04:55:27 +000034 if toolchain_root is None:
asharif708d57c2013-02-15 04:56:23 +000035 cmd_file = "enter_chroot.cmd"
36 cmd_file_path = chromeos_root + "/src/scripts/" + cmd_file
37 f = open(cmd_file_path, "w")
38 f.write(command)
39 logger.GetLogger().LogCmd(command)
40 f.close()
41 retval = cmd_executer.RunCommand("chmod +x " + cmd_file_path)
42 utils.AssertTrue(retval == 0, "chmod +x failed!")
raymes49fd5a32013-02-15 04:55:27 +000043 return cmd_executer.RunCommand(chromeos_root +
asharif708d57c2013-02-15 04:56:23 +000044 "/src/scripts/enter_chroot.sh -- ./%s"
45 % cmd_file)
raymes49fd5a32013-02-15 04:55:27 +000046 else:
47 argv = [os.path.dirname(os.path.abspath(__file__)) + "/tc_enter_chroot.py",
48 "--chromeos_root=" + chromeos_root,
49 "--toolchain_root=" + toolchain_root,
raymes49fd5a32013-02-15 04:55:27 +000050 "\n" + command]
raymes81d88962013-02-15 04:56:26 +000051 if not full_mount:
52 argv.append("-s")
raymes9b8305c2013-02-15 04:56:27 +000053 return tc_enter_chroot.Main(argv, return_output)
asharife3668f12013-02-15 04:46:29 +000054
55
56def MakeChroot(chromeos_root, clobber_chroot=False):
57 """Make a chroot given a chromeos checkout."""
58 if (not os.path.isdir(chromeos_root + "/chroot")
59 or clobber_chroot):
60 commands = []
61 commands.append("cd " + chromeos_root + "/src/scripts")
62 clobber_chroot = ""
63 if clobber_chroot:
64 clobber_chroot = "--replace"
65 commands.append("./make_chroot --fast " + clobber_chroot)
asharif967d7002013-02-15 04:51:00 +000066 ret = command_executer.GetCommandExecuter().RunCommands(commands)
asharife3668f12013-02-15 04:46:29 +000067 utils.AssertTrue(ret == 0, "make_chroot failed")
68 else:
raymes01959ae2013-02-15 04:50:07 +000069 logger.GetLogger().LogOutput("Did not make_chroot because it already exists")
raymes5154d7f2013-02-15 04:35:37 +000070
71
bjanakiraman6496e5f2013-02-15 04:50:58 +000072def Main(argv):
raymes5154d7f2013-02-15 04:35:37 +000073 """Build ChromeOS."""
74 # Common initializations
asharif5a9bb462013-02-15 04:50:57 +000075 cmd_executer = command_executer.GetCommandExecuter()
raymes5154d7f2013-02-15 04:35:37 +000076
77 parser = optparse.OptionParser()
78 parser.add_option("--chromeos_root", dest="chromeos_root",
79 help="Target directory for ChromeOS installation.")
80 parser.add_option("--toolchain_root", dest="toolchain_root",
81 help="The gcctools directory of your P4 checkout.")
82 parser.add_option("--clobber_chroot", dest="clobber_chroot",
83 action="store_true", help=
84 "Delete the chroot and start fresh", default=False)
85 parser.add_option("--clobber_board", dest="clobber_board",
86 action="store_true",
87 help="Delete the board and start fresh", default=False)
raymes9b8305c2013-02-15 04:56:27 +000088 parser.add_option("--cflags", dest="cflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000089 help="CFLAGS for the ChromeOS packages")
raymes9b8305c2013-02-15 04:56:27 +000090 parser.add_option("--cxxflags", dest="cxxflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000091 help="CXXFLAGS for the ChromeOS packages")
raymes9b8305c2013-02-15 04:56:27 +000092 parser.add_option("--ldflags", dest="ldflags", default="",
raymes5154d7f2013-02-15 04:35:37 +000093 help="LDFLAGS for the ChromeOS packages")
94 parser.add_option("--board", dest="board",
95 help="ChromeOS target board, e.g. x86-generic")
asharifb1752c82013-02-15 04:56:37 +000096 parser.add_option("--binary", dest="binary",
97 default=False,
98 action="store_true",
99 help="Use binary packages while building ChromeOS")
raymes5154d7f2013-02-15 04:35:37 +0000100
bjanakiraman6496e5f2013-02-15 04:50:58 +0000101 options = parser.parse_args(argv[1:])[0]
raymes5154d7f2013-02-15 04:35:37 +0000102
103 if options.chromeos_root is None:
104 Usage(parser, "--chromeos_root must be set")
105
asharifb1752c82013-02-15 04:56:37 +0000106 if options.toolchain_root is None and options.binary == False:
raymes5154d7f2013-02-15 04:35:37 +0000107 Usage(parser, "--toolchain_root must be set")
108
109 if options.board is None:
110 Usage(parser, "--board must be set")
111
asharife3668f12013-02-15 04:46:29 +0000112 MakeChroot(options.chromeos_root, options.clobber_chroot)
raymes5154d7f2013-02-15 04:35:37 +0000113
asharifb1752c82013-02-15 04:56:37 +0000114 if options.binary == True:
115 command = "./setup_board --board=" + options.board
116 command += "&& ./build_packages --board=" + options.board
117 command += "&& ./build_image --board=" + options.board
118 command += "&& ./mod_image_for_test.sh --board=" + options.board
119 ret = ExecuteCommandInChroot(options.chromeos_root, None, command)
120 return ret
121
raymes5154d7f2013-02-15 04:35:37 +0000122 # Setup board
raymes04164a12013-02-15 04:36:03 +0000123 if not os.path.isdir(options.chromeos_root + "/chroot/build/"
124 + options.board) or options.clobber_board:
raymes5f35b922013-02-15 04:35:57 +0000125 force = ""
126 if options.clobber_board:
127 force = "--force"
raymes04164a12013-02-15 04:36:03 +0000128 # Run build_tc.py from binary package
bjanakiraman6496e5f2013-02-15 04:50:58 +0000129 rootdir = utils.GetRoot(argv[0])[0]
raymes01959ae2013-02-15 04:50:07 +0000130 ret = cmd_executer.RunCommand(rootdir + "/build_tc.py --chromeos_root=%s "
131 "--toolchain_root=%s --board=%s -B"
132 % (options.chromeos_root,
133 options.toolchain_root, options.board))
raymes04164a12013-02-15 04:36:03 +0000134 utils.AssertTrue(ret == 0, "build_tc.py failed")
raymes5f6be5f2013-02-15 04:36:13 +0000135 version_number = utils.GetRoot(rootdir)[1]
asharif541b6392013-02-15 04:50:38 +0000136 pkgdir = "/usr/local/toolchain_root/" + version_number + "/output/pkgs"
raymes5f35b922013-02-15 04:35:57 +0000137 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
raymes5f6be5f2013-02-15 04:36:13 +0000138 "PKGDIR=%s ./setup_board --board=%s "
139 " --gcc_version=9999 "
asharif1755b432013-02-15 04:55:29 +0000140 " --binutils_version=9999 "
raymes5f6be5f2013-02-15 04:36:13 +0000141 "%s" % (pkgdir, options.board, force))
raymes5f35b922013-02-15 04:35:57 +0000142 utils.AssertTrue(ret == 0, "setup_board failed")
143 else:
raymes01959ae2013-02-15 04:50:07 +0000144 logger.GetLogger().LogOutput("Did not setup_board "
145 "because it already exists")
raymesbfb57992013-02-15 04:35:45 +0000146
raymes9b8305c2013-02-15 04:56:27 +0000147 # Build packages
raymesbfb57992013-02-15 04:35:45 +0000148 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
raymes9b8305c2013-02-15 04:56:27 +0000149 "CFLAGS='%s' CXXFLAGS='%s' LDFLAGS='%s' "
asharifc0f71932013-02-15 04:56:18 +0000150 "CHROME_ORIGIN=SERVER_SOURCE "
asharifb1752c82013-02-15 04:56:37 +0000151 "./build_packages --withdev --nousepkg "
raymesbfb57992013-02-15 04:35:45 +0000152 "--board=%s --withtest --withautotest"
raymes9b8305c2013-02-15 04:56:27 +0000153 % (options.cflags, options.cxxflags,
154 options.ldflags, options.board))
raymesbfb57992013-02-15 04:35:45 +0000155
156 utils.AssertTrue(ret == 0, "build_packages failed")
raymes5154d7f2013-02-15 04:35:37 +0000157
158 # Build image
raymesbfb57992013-02-15 04:35:45 +0000159 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
raymes81d88962013-02-15 04:56:26 +0000160 "./build_image --yes --board=%s" % options.board)
raymesbfb57992013-02-15 04:35:45 +0000161
162 utils.AssertTrue(ret == 0, "build_image failed")
raymes5154d7f2013-02-15 04:35:37 +0000163
164 # Mod image for test
raymesbfb57992013-02-15 04:35:45 +0000165 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
166 "./mod_image_for_test.sh --board=%s"
167 % options.board)
raymes5154d7f2013-02-15 04:35:37 +0000168
raymesbfb57992013-02-15 04:35:45 +0000169 utils.AssertTrue(ret == 0, "mod_image_for_test failed")
raymes5154d7f2013-02-15 04:35:37 +0000170
171if __name__ == "__main__":
bjanakiraman6496e5f2013-02-15 04:50:58 +0000172 Main(sys.argv)