blob: 614b30a7309b91fd462620e4f4426a9c920f923b [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
raymes01959ae2013-02-15 04:50:07 +000021cmd_executer = command_executer.GetCommandExecuter()
22
asharife3668f12013-02-15 04:46:29 +000023
raymes5154d7f2013-02-15 04:35:37 +000024def Usage(parser, message):
25 print "ERROR: " + message
26 parser.print_help()
27 sys.exit(0)
28
29
30def ExecuteCommandInChroot(chromeos_root, toolchain_root, command,
raymesbfb57992013-02-15 04:35:45 +000031 return_output=False, chrome_root=""):
asharife3668f12013-02-15 04:46:29 +000032 """Executes a command in the chroot."""
raymesbfb57992013-02-15 04:35:45 +000033 chrome_mount = ""
34 if chrome_root:
35 chrome_mount = "--chrome_root=" + chromeos_root + "/" + chrome_root
raymes01959ae2013-02-15 04:50:07 +000036 argv = [os.path.dirname(os.path.abspath(__file__)) + "/tc_enter_chroot.py",
37 "--chromeos_root=" + chromeos_root,
38 "--toolchain_root=" + toolchain_root,
39 chrome_mount,
asharif541b6392013-02-15 04:50:38 +000040 "\n" + command]
asharife3668f12013-02-15 04:46:29 +000041 return tc_enter_chroot.Main(argv)
42
43
44def MakeChroot(chromeos_root, clobber_chroot=False):
45 """Make a chroot given a chromeos checkout."""
46 if (not os.path.isdir(chromeos_root + "/chroot")
47 or clobber_chroot):
48 commands = []
49 commands.append("cd " + chromeos_root + "/src/scripts")
50 clobber_chroot = ""
51 if clobber_chroot:
52 clobber_chroot = "--replace"
53 commands.append("./make_chroot --fast " + clobber_chroot)
raymes01959ae2013-02-15 04:50:07 +000054 ret = cmd_executer.RunCommands(commands)
asharife3668f12013-02-15 04:46:29 +000055 utils.AssertTrue(ret == 0, "make_chroot failed")
56 else:
raymes01959ae2013-02-15 04:50:07 +000057 logger.GetLogger().LogOutput("Did not make_chroot because it already exists")
raymes5154d7f2013-02-15 04:35:37 +000058
59
raymes5154d7f2013-02-15 04:35:37 +000060def Main():
61 """Build ChromeOS."""
62 # Common initializations
raymes5154d7f2013-02-15 04:35:37 +000063
64 parser = optparse.OptionParser()
65 parser.add_option("--chromeos_root", dest="chromeos_root",
66 help="Target directory for ChromeOS installation.")
67 parser.add_option("--toolchain_root", dest="toolchain_root",
68 help="The gcctools directory of your P4 checkout.")
69 parser.add_option("--clobber_chroot", dest="clobber_chroot",
70 action="store_true", help=
71 "Delete the chroot and start fresh", default=False)
72 parser.add_option("--clobber_board", dest="clobber_board",
73 action="store_true",
74 help="Delete the board and start fresh", default=False)
75 parser.add_option("--cflags", dest="cflags",
76 help="CFLAGS for the ChromeOS packages")
77 parser.add_option("--cxxflags", dest="cxxflags",
78 help="CXXFLAGS for the ChromeOS packages")
79 parser.add_option("--ldflags", dest="ldflags",
80 help="LDFLAGS for the ChromeOS packages")
81 parser.add_option("--board", dest="board",
82 help="ChromeOS target board, e.g. x86-generic")
83
84 options = parser.parse_args()[0]
85
86 if options.chromeos_root is None:
87 Usage(parser, "--chromeos_root must be set")
88
89 if options.toolchain_root is None:
90 Usage(parser, "--toolchain_root must be set")
91
92 if options.board is None:
93 Usage(parser, "--board must be set")
94
asharife3668f12013-02-15 04:46:29 +000095 MakeChroot(options.chromeos_root, options.clobber_chroot)
raymes5154d7f2013-02-15 04:35:37 +000096
97 # Setup board
raymes04164a12013-02-15 04:36:03 +000098 if not os.path.isdir(options.chromeos_root + "/chroot/build/"
99 + options.board) or options.clobber_board:
raymes5f35b922013-02-15 04:35:57 +0000100 force = ""
101 if options.clobber_board:
102 force = "--force"
raymes04164a12013-02-15 04:36:03 +0000103 # Run build_tc.py from binary package
raymes01959ae2013-02-15 04:50:07 +0000104 rootdir = utils.GetRoot(sys.argv[0])[0]
105 ret = cmd_executer.RunCommand(rootdir + "/build_tc.py --chromeos_root=%s "
106 "--toolchain_root=%s --board=%s -B"
107 % (options.chromeos_root,
108 options.toolchain_root, options.board))
raymes04164a12013-02-15 04:36:03 +0000109 utils.AssertTrue(ret == 0, "build_tc.py failed")
raymes5f6be5f2013-02-15 04:36:13 +0000110 version_number = utils.GetRoot(rootdir)[1]
asharif541b6392013-02-15 04:50:38 +0000111 pkgdir = "/usr/local/toolchain_root/" + version_number + "/output/pkgs"
raymes5f35b922013-02-15 04:35:57 +0000112 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
raymes5f6be5f2013-02-15 04:36:13 +0000113 "PKGDIR=%s ./setup_board --board=%s "
114 " --gcc_version=9999 "
115 "%s" % (pkgdir, options.board, force))
raymes5f35b922013-02-15 04:35:57 +0000116 utils.AssertTrue(ret == 0, "setup_board failed")
117 else:
raymes01959ae2013-02-15 04:50:07 +0000118 logger.GetLogger().LogOutput("Did not setup_board "
119 "because it already exists")
raymesbfb57992013-02-15 04:35:45 +0000120
121 # Modify make.conf to add CFLAGS/CXXFLAGS/LDFLAGS
raymesbfb57992013-02-15 04:35:45 +0000122 ret1 = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
123 "[ -e /build/%s/etc/make.conf.orig ] || "
124 "sudo mv /build/%s/etc/make.conf "
125 "/build/%s/etc/make.conf.orig"
126 % (options.board, options.board, options.board))
asharif541b6392013-02-15 04:50:38 +0000127 makeconf = ("source make.conf.orig\n")
raymesbfb57992013-02-15 04:35:45 +0000128 #"CFLAGS='%s'\\\nCXXFLAGS='%s'\\\nLDFLAGS='%s'\\\n" %
129 #(options.cflags, options.cxxflags, options.ldflags))
raymese91a6e62013-02-15 04:35:51 +0000130 ret2 = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
asharif541b6392013-02-15 04:50:38 +0000131 "if [ -e /build/%s/etc/make.conf.orig ] ; "
132 "then sudo echo -e \"%s\" | sudo tee "
raymese91a6e62013-02-15 04:35:51 +0000133 "/build/%s/etc/make.conf > /dev/null ;"
asharif541b6392013-02-15 04:50:38 +0000134 "else exit 1 ; fi"
raymes5f6be5f2013-02-15 04:36:13 +0000135 % (options.board, makeconf, options.board))
raymes5f35b922013-02-15 04:35:57 +0000136
raymesbfb57992013-02-15 04:35:45 +0000137 utils.AssertTrue(ret1 == 0 and ret2 == 0, "Could not modify make.conf")
raymes5154d7f2013-02-15 04:35:37 +0000138
139 # Find Chrome browser version
raymes01959ae2013-02-15 04:50:07 +0000140 chrome_version = cmd_executer.RunCommand("%s/src/scripts/chromeos_version.sh "
asharif541b6392013-02-15 04:50:38 +0000141 "| grep CHROME_VERSION"
raymes01959ae2013-02-15 04:50:07 +0000142 % options.chromeos_root, True)
raymesbfb57992013-02-15 04:35:45 +0000143
144 ret = chrome_version[0]
145 utils.AssertTrue(ret == 0, "Could not determine Chrome browser version")
raymes5154d7f2013-02-15 04:35:37 +0000146
147 chrome_version = chrome_version[1].strip().split("=")
148 if len(chrome_version) == 2:
149 chrome_version = chrome_version[1]
150 else:
151 chrome_version = ""
152
raymes5154d7f2013-02-15 04:35:37 +0000153 # Build packages
raymesbfb57992013-02-15 04:35:45 +0000154 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
raymese91a6e62013-02-15 04:35:51 +0000155 "CHROME_ORIGIN=SERVER_SOURCE CHROME_VERSION=%s "
raymesbfb57992013-02-15 04:35:45 +0000156 "./build_packages --withdev "
157 "--board=%s --withtest --withautotest"
158 % (chrome_version, options.board),
159 chrome_root="chrome_browser")
160
161 utils.AssertTrue(ret == 0, "build_packages failed")
raymes5154d7f2013-02-15 04:35:37 +0000162
163 # Build image
raymesbfb57992013-02-15 04:35:45 +0000164 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
165 "./build_image --board=%s" % options.board)
166
167 utils.AssertTrue(ret == 0, "build_image failed")
raymes5154d7f2013-02-15 04:35:37 +0000168
169 # Mod image for test
raymesbfb57992013-02-15 04:35:45 +0000170 ret = ExecuteCommandInChroot(options.chromeos_root, options.toolchain_root,
171 "./mod_image_for_test.sh --board=%s"
172 % options.board)
raymes5154d7f2013-02-15 04:35:37 +0000173
raymesbfb57992013-02-15 04:35:45 +0000174 utils.AssertTrue(ret == 0, "mod_image_for_test failed")
raymes5154d7f2013-02-15 04:35:37 +0000175
176if __name__ == "__main__":
177 Main()