blob: 295331277bb62c1f4091e8db33452705a24b52da [file] [log] [blame]
bjanakiraman7f4a4852013-02-15 04:35:28 +00001#!/usr/bin/python2.6
2#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to build the ChromeOS toolchain.
6
7This script sets up the toolchain if you give it the gcctools directory.
8"""
9
10__author__ = "asharif@google.com (Ahmad Sharif)"
11
asharif80c6e552013-02-15 04:35:40 +000012import getpass
bjanakiraman7f4a4852013-02-15 04:35:28 +000013import optparse
asharif17621302013-02-15 04:46:35 +000014import os
bjanakiraman7f4a4852013-02-15 04:35:28 +000015import sys
asharif252df0f2013-02-15 04:46:28 +000016import tc_enter_chroot
asharife3668f12013-02-15 04:46:29 +000017import build_chromeos
asharif0d3535a2013-02-15 04:50:33 +000018import setup_chromeos
raymes01959ae2013-02-15 04:50:07 +000019from utils import command_executer
bjanakiraman7f4a4852013-02-15 04:35:28 +000020from utils import utils
raymes01959ae2013-02-15 04:50:07 +000021from utils import logger
bjanakiraman7f4a4852013-02-15 04:35:28 +000022
23# Common initializations
raymes01959ae2013-02-15 04:50:07 +000024cmd_executer = command_executer.GetCommandExecuter()
bjanakiraman7f4a4852013-02-15 04:35:28 +000025
bjanakiraman7f4a4852013-02-15 04:35:28 +000026
asharif0d3535a2013-02-15 04:50:33 +000027def Main(argv):
asharif19c73dd2013-02-15 04:35:37 +000028 """The main function."""
asharif0d3535a2013-02-15 04:50:33 +000029 rootdir = utils.GetRoot(sys.argv[0])[0]
30
asharif19c73dd2013-02-15 04:35:37 +000031 parser = optparse.OptionParser()
32 parser.add_option("-c", "--chromeos_root", dest="chromeos_root",
asharif0d3535a2013-02-15 04:50:33 +000033 help=("ChromeOS root checkout directory" +
34 " uses ../.. if none given."))
asharif19c73dd2013-02-15 04:35:37 +000035 parser.add_option("-t", "--toolchain_root", dest="toolchain_root",
36 help="Toolchain root directory.")
asharifd751e252013-02-15 04:35:52 +000037 parser.add_option("-b", "--board", dest="board", default="x86-generic",
asharif19c73dd2013-02-15 04:35:37 +000038 help="board is the argument to the setup_board command.")
asharifd751e252013-02-15 04:35:52 +000039 parser.add_option("-C", "--clean", dest="clean", default=False,
40 action="store_true",
asharife2cca302013-02-15 04:35:42 +000041 help="Uninstall the toolchain.")
asharifd751e252013-02-15 04:35:52 +000042 parser.add_option("-f", "--force", dest="force", default=False,
43 action="store_true",
asharife2cca302013-02-15 04:35:42 +000044 help="Do an uninstall/install cycle.")
asharif19c73dd2013-02-15 04:35:37 +000045 parser.add_option("-i", "--incremental", dest="incremental",
46 help="The toolchain component that should be "
47 "incrementally compiled.")
asharife2cca302013-02-15 04:35:42 +000048 parser.add_option("-B", "--binary", dest="binary",
49 action="store_true", default=False,
50 help="The toolchain should use binaries stored in "
51 "the install/ directory.")
asharif0d3535a2013-02-15 04:50:33 +000052 parser.add_option("-s", "--setup-chromeos-options",
53 dest="setup_chromeos_options",
54 help="Additional options that should be passed on to"
55 "the setup_chromeos script.")
56 parser.add_option("-o", "--output", dest="output",
57 default=rootdir + "/output",
58 help="The output directory where logs,pkgs, etc. go.")
bjanakiraman7f4a4852013-02-15 04:35:28 +000059
asharif0d3535a2013-02-15 04:50:33 +000060 options = parser.parse_args(argv)[0]
asharif17621302013-02-15 04:46:35 +000061
asharif19c73dd2013-02-15 04:35:37 +000062 if options.toolchain_root is None or options.board is None:
63 parser.print_help()
64 sys.exit()
bjanakiraman7f4a4852013-02-15 04:35:28 +000065
asharif0d3535a2013-02-15 04:50:33 +000066 if options.chromeos_root is None:
67 if os.path.exists("enter_chroot.sh"):
68 options.chromeos_root = "../.."
69 else:
70 logger.GetLogger().LogError("--chromeos_root not given")
71 parser.print_help()
72 sys.exit()
73 else:
74 options.chromeos_root = os.path.expanduser(options.chromeos_root)
75
76 if not os.path.exists(options.chromeos_root):
77 logger.GetLogger().LogOutput("Creating a chromeos checkout at: %s" %
78 options.chromeos_root)
79 sc_args = ("--dir=\"%s\" %s" % (options.chromeos_root,
80 options.setup_chromeos_options))
81 setup_chromeos.Main(sc_args)
82
83 output = options.output
84
85 if output.startswith("/") == False:
86 output = os.getcwd() + "/" + output
87 else:
88 output = os.path.expanduser(output)
89
90 chroot_mount = "/usr/local/toolchain_root/"
91 chroot_base = utils.GetRoot(output)[1]
92 chroot_output = chroot_mount + chroot_base
93
94 tc_enter_chroot_options = []
95 output_mount = ("-o %s:%s/%s" % (output, chroot_mount, chroot_base))
96 tc_enter_chroot_options.append(output_mount)
97
asharife3668f12013-02-15 04:46:29 +000098 build_chromeos.MakeChroot(options.chromeos_root)
99
asharife2cca302013-02-15 04:35:42 +0000100 portage_flags = ""
101 if options.binary == True:
102 # FIXME(asharif): This should be using --usepkg but that was not working.
103 portage_flags = "--usepkgonly"
104
asharif19c73dd2013-02-15 04:35:37 +0000105 f = open(options.chromeos_root + "/src/overlays/overlay-" +
106 options.board + "/toolchain.conf", "r")
107 target = f.read()
108 f.close()
109 target = target.strip()
asharif2d815d02013-02-15 04:36:02 +0000110 features = "noclean userfetch userpriv usersandbox -strict"
asharif09bfb6f2013-02-15 04:35:44 +0000111 if options.incremental is not None and options.incremental:
112 features += " keepwork"
asharif19c73dd2013-02-15 04:35:37 +0000113 env = CreateEnvVarString(" FEATURES", features)
asharif80c6e552013-02-15 04:35:40 +0000114 env += CreateEnvVarString(" PORTAGE_USERNAME", getpass.getuser())
asharif0d3535a2013-02-15 04:50:33 +0000115 logdir = "/logs"
116 pkgdir = "/pkgs"
117 tmpdir = "/objects"
118 installdir = "/install"
119 package_dir = output + pkgdir
120 portage_logdir = chroot_output + logdir
121 portage_pkgdir = chroot_output + pkgdir
122 portage_tmpdir = chroot_output + tmpdir
123 env += CreateEnvVarString(" PORT_LOGDIR", portage_logdir)
124 env += CreateEnvVarString(" PKGDIR", portage_pkgdir)
125 env += CreateEnvVarString(" PORTAGE_BINHOST", portage_pkgdir)
126 env += CreateEnvVarString(" PORTAGE_TMPDIR", portage_tmpdir)
asharif252df0f2013-02-15 04:46:28 +0000127 env += CreateEnvVarString(" USE", "mounted_sources")
asharif2d815d02013-02-15 04:36:02 +0000128
asharifd751e252013-02-15 04:35:52 +0000129 retval = 0
asharif80c6e552013-02-15 04:35:40 +0000130 if options.force == True:
asharifd751e252013-02-15 04:35:52 +0000131 retval = BuildTC(options.chromeos_root, options.toolchain_root, env,
asharif0d3535a2013-02-15 04:50:33 +0000132 target, True, options.incremental, portage_flags,
133 tc_enter_chroot_options)
asharifd751e252013-02-15 04:35:52 +0000134 retval = BuildTC(options.chromeos_root, options.toolchain_root, env,
asharif0d3535a2013-02-15 04:50:33 +0000135 target, options.clean, options.incremental, portage_flags,
136 tc_enter_chroot_options)
asharifd751e252013-02-15 04:35:52 +0000137 utils.AssertTrue(retval == 0, "Build toolchain failed!")
asharif0d3535a2013-02-15 04:50:33 +0000138 command = "sudo chown -R " + getpass.getuser() + " " + package_dir
asharifd751e252013-02-15 04:35:52 +0000139
140 if options.incremental is None and not options.clean:
asharif0d3535a2013-02-15 04:50:33 +0000141 install_dir = output + installdir
asharifd751e252013-02-15 04:35:52 +0000142 retval = InstallTC(package_dir, install_dir)
143 utils.AssertTrue(retval == 0, "Installation of the toolchain failed!")
144
145 return retval
asharife2cca302013-02-15 04:35:42 +0000146
147
148def CreateCrossdevPortageFlags(portage_flags):
asharif2d815d02013-02-15 04:36:02 +0000149 portage_flags = portage_flags.strip()
asharife2cca302013-02-15 04:35:42 +0000150 if not portage_flags:
151 return ""
152 crossdev_flags = " --portage "
153 crossdev_flags += " --portage ".join(portage_flags.split(" "))
154 return crossdev_flags
asharif19c73dd2013-02-15 04:35:37 +0000155
156
157def CreateEnvVarString(variable, value):
158 return variable + "=" + EscapeQuoteString(value)
159
160
161def EscapeQuoteString(string):
162 return "\\\"" + string + "\\\""
163
164
asharifd751e252013-02-15 04:35:52 +0000165def InstallTC(package_dir, install_dir):
asharif9994d292013-02-15 04:36:04 +0000166 command = ("mkdir -p " + install_dir)
167 command += ("&& for f in $(find " + package_dir +
ashariffcf8cfc2013-02-15 04:49:21 +0000168 " -name \\*.tbz2); do tar xf $f -C " +
169 install_dir + " ; done")
raymes01959ae2013-02-15 04:50:07 +0000170 retval = cmd_executer.RunCommand(command)
asharifd751e252013-02-15 04:35:52 +0000171 return retval
172
173
asharif19c73dd2013-02-15 04:35:37 +0000174def BuildTC(chromeos_root, toolchain_root, env, target, uninstall,
asharif0d3535a2013-02-15 04:50:33 +0000175 incremental_component, portage_flags, tc_enter_chroot_options):
asharif19c73dd2013-02-15 04:35:37 +0000176 """Build the toolchain."""
asharif2d815d02013-02-15 04:36:02 +0000177 portage_flags = portage_flags.strip()
178 portage_flags += " -b "
179
asharif19c73dd2013-02-15 04:35:37 +0000180 binutils_version = "2.20.1-r1"
181 gcc_version = "9999"
asharif17621302013-02-15 04:46:35 +0000182 libc_version = "2.10.1-r2"
asharif19c73dd2013-02-15 04:35:37 +0000183 kernel_version = "2.6.30-r1"
asharif19c73dd2013-02-15 04:35:37 +0000184
raymes01959ae2013-02-15 04:50:07 +0000185 rootdir = utils.GetRoot(sys.argv[0])[0]
asharif0d3535a2013-02-15 04:50:33 +0000186 argv = [rootdir + "/tc_enter_chroot.py",
asharife3668f12013-02-15 04:46:29 +0000187 "--chromeos_root=" + chromeos_root,
188 "--toolchain_root=" + toolchain_root]
asharif0d3535a2013-02-15 04:50:33 +0000189 argv += tc_enter_chroot_options
asharif252df0f2013-02-15 04:46:28 +0000190
asharif2d815d02013-02-15 04:36:02 +0000191 env += " "
192
asharif19c73dd2013-02-15 04:35:37 +0000193 if uninstall == True:
194 tflag = " -C "
195 else:
196 tflag = " -t "
197
asharif0269d462013-02-15 04:46:31 +0000198 command = " -- sudo " + env
asharif2d815d02013-02-15 04:36:02 +0000199
200 if uninstall == True:
201 command += " crossdev " + tflag + target
asharife3668f12013-02-15 04:46:29 +0000202 argv.append(command)
203 retval = tc_enter_chroot.Main(argv)
asharif2d815d02013-02-15 04:36:02 +0000204 return retval
asharif19c73dd2013-02-15 04:35:37 +0000205
206 if incremental_component == "binutils":
asharife2cca302013-02-15 04:35:42 +0000207 command += (" emerge =cross-" + target + "/binutils-" + binutils_version +
208 portage_flags)
asharif19c73dd2013-02-15 04:35:37 +0000209 elif incremental_component == "gcc":
asharife2cca302013-02-15 04:35:42 +0000210 command += (" emerge =cross-" + target + "/gcc-" + gcc_version +
211 portage_flags)
asharif19c73dd2013-02-15 04:35:37 +0000212 elif incremental_component == "libc" or incremental_component == "glibc":
asharife2cca302013-02-15 04:35:42 +0000213 command += (" emerge =cross-" + target + "/glibc-" + libc_version +
214 portage_flags)
asharif19c73dd2013-02-15 04:35:37 +0000215 else:
asharif2d815d02013-02-15 04:36:02 +0000216 crossdev_flags = CreateCrossdevPortageFlags(portage_flags)
asharif19c73dd2013-02-15 04:35:37 +0000217 command += (" crossdev -v " + tflag + target +
218 " --binutils " + binutils_version +
219 " --libc " + libc_version +
220 " --gcc " + gcc_version +
221 " --kernel " + kernel_version +
asharif2d815d02013-02-15 04:36:02 +0000222 crossdev_flags)
asharif19c73dd2013-02-15 04:35:37 +0000223
asharife3668f12013-02-15 04:46:29 +0000224 argv.append(command)
225 retval = tc_enter_chroot.Main(argv)
asharif19c73dd2013-02-15 04:35:37 +0000226 return retval
227
228if __name__ == "__main__":
asharif0d3535a2013-02-15 04:50:33 +0000229 Main(sys.argv)
asharifd751e252013-02-15 04:35:52 +0000230