summaryrefslogtreecommitdiff
path: root/chromium/build/fuchsia/common_args.py
blob: 855bc1149c3717d6e773fc06bd0b2ef86344863d (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
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os
import sys

from aemu_target import AemuTarget
from device_target import DeviceTarget
from qemu_target import QemuTarget
from common import GetHostArchFromPlatform


def AddCommonArgs(arg_parser):
  """Adds command line arguments to |arg_parser| for options which are shared
  across test and executable target types.

  Args:
    arg_parser: an ArgumentParser object."""

  package_args = arg_parser.add_argument_group('package', 'Fuchsia Packages')
  package_args.add_argument(
      '--package',
      action='append',
      help='Paths of the packages to install, including '
      'all dependencies.')
  package_args.add_argument(
      '--package-name',
      help='Name of the package to execute, defined in ' + 'package metadata.')

  common_args = arg_parser.add_argument_group('common', 'Common arguments')
  common_args.add_argument(
      '--output-directory',
      type=os.path.realpath,
      default=None,
      help=('Path to the directory in which build files are located. '))
  common_args.add_argument(
      '--target-cpu',
      default=GetHostArchFromPlatform(),
      help=('GN target_cpu setting for the build. Defaults to the same '
            'architecture as host cpu.'))
  common_args.add_argument('--target-staging-path',
                           help='target path under which to stage packages '
                           'during deployment.', default='/data')
  common_args.add_argument('--device', default=None,
                           choices=['aemu','qemu','device'],
                           help='Choose to run on aemu|qemu|device. ' +
                                'By default, Fuchsia will run in QEMU.')
  common_args.add_argument('-d', action='store_const', dest='device',
                           const='device',
                           help='Run on device instead of emulator.')
  common_args.add_argument('--host', help='The IP of the target device. ' +
                           'Optional.')
  common_args.add_argument('--node-name',
                           help='The node-name of the device to boot or deploy '
                                'to. Optional, will use the first discovered '
                                'device if omitted.')
  common_args.add_argument('--port', '-p', type=int, default=22,
                           help='The port of the SSH service running on the ' +
                                'device. Optional.')
  common_args.add_argument('--ssh-config', '-F',
                           help='The path to the SSH configuration used for '
                                'connecting to the target device.')
  common_args.add_argument('--fuchsia-out-dir',
                           help='Path to a Fuchsia build output directory. '
                                'Equivalent to setting --ssh_config and '
                                '---os-check=ignore')
  common_args.add_argument('--runner-logs-dir',
                           help='Directory to write test runner logs to.')
  common_args.add_argument('--system-log-file',
                           help='File to write system logs to. Specify - to '
                                'log to stdout.')
  common_args.add_argument('--exclude-system-logs',
                           action='store_false',
                           dest='include_system_logs',
                           help='Do not show system log data.')
  common_args.add_argument('--verbose', '-v', default=False,
                           action='store_true',
                           help='Enable debug-level logging.')
  common_args.add_argument(
      '--qemu-cpu-cores',
      type=int,
      default=4,
      help='Sets the number of CPU cores to provide if launching in a VM.')
  common_args.add_argument('--memory', type=int, default=2048,
                           help='Sets the RAM size (MB) if launching in a VM'),
  common_args.add_argument(
      '--allow-no-kvm',
      action='store_false',
      dest='require_kvm',
      default=True,
      help='Do not require KVM acceleration for emulators.')
  common_args.add_argument(
      '--os_check', choices=['check', 'update', 'ignore'],
      default='update',
      help='Sets the OS version enforcement policy. If \'check\', then the '
           'deployment process will halt if the target\'s version doesn\'t '
           'match. If \'update\', then the target device will automatically '
           'be repaved. If \'ignore\', then the OS version won\'t be checked.')

  aemu_args = arg_parser.add_argument_group('aemu', 'AEMU Arguments')
  aemu_args.add_argument(
      '--enable-graphics',
      action='store_true',
      default=False,
      help='Start AEMU with graphics instead of headless.')
  aemu_args.add_argument(
      '--hardware-gpu',
      action='store_true',
      default=False,
      help='Use local GPU hardware instead of Swiftshader.')


def ConfigureLogging(args):
  """Configures the logging level based on command line |args|."""

  logging.basicConfig(level=(logging.DEBUG if args.verbose else logging.INFO),
                      format='%(asctime)s:%(levelname)s:%(name)s:%(message)s')

  # The test server spawner is too noisy with INFO level logging, so tweak
  # its verbosity a bit by adjusting its logging level.
  logging.getLogger('chrome_test_server_spawner').setLevel(
      logging.DEBUG if args.verbose else logging.WARN)

  # Verbose SCP output can be useful at times but oftentimes is just too noisy.
  # Only enable it if -vv is passed.
  logging.getLogger('ssh').setLevel(
      logging.DEBUG if args.verbose else logging.WARN)


def GetDeploymentTargetForArgs(args):
  """Constructs a deployment target object using parameters taken from
  command line arguments."""
  if args.system_log_file == '-':
    system_log_file = sys.stdout
  elif args.system_log_file:
    system_log_file = open(args.system_log_file, 'w')
  else:
    system_log_file = None

  # Allow fuchsia to run on emulator if device not explicitly chosen.
  # AEMU is the default emulator for x64 Fuchsia, and QEMU for others.
  if not args.device:
    if args.target_cpu == 'x64':
      args.device = 'aemu'
    else:
      args.device = 'qemu'

  target_args = { 'output_dir':args.output_directory,
                  'target_cpu':args.target_cpu,
                  'system_log_file':system_log_file }
  if args.device == 'device':
    target_args.update({ 'host':args.host,
                         'node_name':args.node_name,
                         'port':args.port,
                         'ssh_config':args.ssh_config,
                         'fuchsia_out_dir':args.fuchsia_out_dir,
                         'os_check':args.os_check })
    return DeviceTarget(**target_args)
  else:
    target_args.update({
        'cpu_cores': args.qemu_cpu_cores,
        'require_kvm': args.require_kvm,
        'emu_type': args.device,
        'ram_size_mb': args.memory
    })
    if args.device == 'qemu':
      return QemuTarget(**target_args)
    else:
      target_args.update({
          'enable_graphics': args.enable_graphics,
          'hardware_gpu': args.hardware_gpu
      })
      return AemuTarget(**target_args)