aboutsummaryrefslogtreecommitdiff
path: root/v14/build_chromeos.py
blob: 2b68ab3374ef7a72776250a18b0cf63f7eb311f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#!/usr/bin/python2.6
#
# Copyright 2010 Google Inc. All Rights Reserved.

"""Script to checkout the ChromeOS source.

This script sets up the ChromeOS source in the given directory, matching a
particular release of ChromeOS.
"""

__author__ = "raymes@google.com (Raymes Khoury)"

import optparse
import os
import sys
import tc_enter_chroot
from utils import command_executer
from utils import logger
from utils import utils


def Usage(parser, message):
  print "ERROR: " + message
  parser.print_help()
  sys.exit(0)

#TODO(raymes): move this to a common utils file.
def ExecuteCommandInChroot(chromeos_root, command, toolchain_root=None,
                           return_output=False, full_mount=False,
                           tec_options=[]):
  """Executes a command in the chroot."""
  global cmd_executer
  cmd_executer = command_executer.GetCommandExecuter()
  chromeos_root = os.path.expanduser(chromeos_root)

  argv = [os.path.dirname(os.path.abspath(__file__)) + "/tc_enter_chroot.py",
          "--chromeos_root=" + chromeos_root,
          command]
  if toolchain_root:
    toolchain_root = os.path.expanduser(toolchain_root)
    argv.append("--toolchain_root=" + toolchain_root)
  if not full_mount:
    argv.append("-s")
  argv += tec_options
  return tc_enter_chroot.Main(argv, return_output)


def MakeChroot(chromeos_root, clobber_chroot=False):
  """Make a chroot given a chromeos checkout."""
  if (not os.path.isdir(chromeos_root + "/chroot")
      or clobber_chroot):
    commands = []
    commands.append("cd " + chromeos_root + "/src/scripts")
    clobber_chroot = ""
    if clobber_chroot:
      clobber_chroot = "--replace"
    commands.append("./make_chroot --fast " + clobber_chroot)
    ret = command_executer.GetCommandExecuter().RunCommands(commands)
    logger.GetLogger().LogFatalIf(ret, "make_chroot failed")
  else:
    logger.GetLogger().LogOutput("Did not make_chroot because it already exists")


def Main(argv):
  """Build ChromeOS."""
  # Common initializations
  cmd_executer = command_executer.GetCommandExecuter()

  parser = optparse.OptionParser()
  parser.add_option("--chromeos_root", dest="chromeos_root",
                    help="Target directory for ChromeOS installation.")
  parser.add_option("--clobber_chroot", dest="clobber_chroot",
                    action="store_true", help=
                    "Delete the chroot and start fresh", default=False)
  parser.add_option("--clobber_board", dest="clobber_board",
                    action="store_true",
                    help="Delete the board and start fresh", default=False)
  parser.add_option("--rebuild", dest="rebuild",
                    action="store_true",
                    help="Rebuild all board packages except the toolchain.",
                    default=False)
  parser.add_option("--cflags", dest="cflags", default="",
                    help="CFLAGS for the ChromeOS packages")
  parser.add_option("--cxxflags", dest="cxxflags", default="",
                    help="CXXFLAGS for the ChromeOS packages")
  parser.add_option("--ldflags", dest="ldflags", default="",
                    help="LDFLAGS for the ChromeOS packages")
  parser.add_option("--board", dest="board",
                    help="ChromeOS target board, e.g. x86-generic")
  parser.add_option("--label", dest="label",
                    help="Optional label symlink to point to build dir.")
  parser.add_option("--vanilla", dest="vanilla",
                    default=False,
                    action="store_true",
                    help="Use default ChromeOS toolchain.")

  options = parser.parse_args(argv[1:])[0]

  if options.chromeos_root is None:
    Usage(parser, "--chromeos_root must be set")

  if options.board is None:
    Usage(parser, "--board must be set")

  build_packages_env = ""
  if options.rebuild == True:
    build_packages_env = "EXTRA_BOARD_FLAGS=-e"

  options.chromeos_root = os.path.expanduser(options.chromeos_root)

  MakeChroot(options.chromeos_root, options.clobber_chroot)

  build_packages_command = utils.GetBuildPackagesCommand(options.board)
  build_image_command = utils.GetBuildImageCommand(options.board)
  mod_image_command = utils.GetModImageForTestCommand(options.board)

  if options.vanilla == True:
    command = utils.GetSetupBoardCommand(options.board,
                                         usepkg=False,
                                         force=options.clobber_board)
    command += "; " + build_packages_env + " " + build_packages_command
    command += "&& " + build_image_command
    command += "&& " + mod_image_command
    ret = ExecuteCommandInChroot(options.chromeos_root, command)
    return ret

  # Setup board
  if not os.path.isdir(options.chromeos_root + "/chroot/build/"
                       + options.board) or options.clobber_board:
    # Run build_tc.py from binary package
    rootdir = utils.GetRoot(argv[0])[0]
    version_number = utils.GetRoot(rootdir)[1]
    ret = ExecuteCommandInChroot(options.chromeos_root,
                                 utils.GetSetupBoardCommand(options.board,
                                   gcc_version="9999",
                                   binutils_version="9999",
                                   force=options.clobber_board))
    logger.GetLogger().LogFatalIf(ret, "setup_board failed")
  else:
    logger.GetLogger().LogOutput("Did not setup_board "
                                 "because it already exists")

  # Build packages
  ret = ExecuteCommandInChroot(options.chromeos_root,
                               "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" "
                               "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" "
                               "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" "
                               "CHROME_ORIGIN=SERVER_SOURCE "
                               "%s "
                               "%s"
                               % (options.board, options.cflags,
                                  options.board, options.cxxflags,
                                  options.board, options.ldflags,
                                  build_packages_env,
                                  build_packages_command))

  logger.GetLogger().LogFatalIf(ret, "build_packages failed")

  # Build image
  ret = ExecuteCommandInChroot(options.chromeos_root,
                               build_image_command)

  logger.GetLogger().LogFatalIf(ret, "build_image failed")

  # Mod image for test
  ret = ExecuteCommandInChroot(options.chromeos_root, mod_image_command)

  logger.GetLogger().LogFatalIf(ret, "mod_image_for_test failed")

  flags_file_name = "flags.txt"
  flags_file_path = ("%s/src/build/images/%s/latest/%s" %
                     (options.chromeos_root,
                      options.board,
                      flags_file_name))
  flags_file = open(flags_file_path, "wb")
  flags_file.write("CFLAGS=%s\n" % options.cflags)
  flags_file.write("CXXFLAGS=%s\n" % options.cxxflags)
  flags_file.write("LDFLAGS=%s\n" % options.ldflags)
  flags_file.close()

  if options.label:
    image_dir_path = ("%s/src/build/images/%s/latest" %
                  (options.chromeos_root,
                   options.board))
    real_image_dir_path = os.path.realpath(image_dir_path)
    command = ("ln -sf -T %s %s/%s" %
               (os.path.basename(real_image_dir_path),
                os.path.dirname(real_image_dir_path),
                options.label))

    ret = cmd_executer.RunCommand(command)
    logger.GetLogger().LogFatalIf(ret, "Failed to apply symlink label %s" %
                                  options.label)

  return ret

if __name__ == "__main__":
  retval = Main(sys.argv)
  sys.exit(retval)