crosvm/build_test.py
Zach Reizner 1f77a0daa6 sys_util: use libc's openlog to connect to syslog
By using libc's openlog, we can ensure that the internal state of the
libc syslogger is consistent with the syslog module. Minijail will be
able to print to stderr and the syslog in the same way the logging
macros in crosvm do. The FD the syslog module uses is shared with libc
and via `syslog::get_fds`, jailed processes can inherit the needed FDs
to continue logging.

Now that `sys_log::init()` must be called in single threaded process,
this moves its tests to the list of the serially run ones in
build_test.py.

TEST=./build_test
BUG=None

Change-Id: I8dbc8ebf9d97ef670185259eceac5f6d3d6824ea
Reviewed-on: https://chromium-review.googlesource.com/649951
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Jason Clinton <jclinton@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
2017-09-06 14:31:06 -07:00

170 lines
4.4 KiB
Python
Executable file

#!/usr/bin/env python3
"""Builds crosvm in debug/release mode on all supported target architectures.
A sysroot for each target architectures is required. The defaults are all
generic boards' sysroots, but they can be changed with the ARM_SYSROOT,
AARCH64_SYSROOT, X86_64_SYSROOT environment variables.
To test changes more quickly, set the NOCLEAN environment variable. This
prevents the target directories from being removed before building and testing.
"""
from __future__ import print_function
import multiprocessing.pool
import os
import shutil
import subprocess
import sys
NOCLEAN = os.getenv('NOCLEAN') is not None
ARM_TRIPLE = os.getenv('ARM_TRIPLE', 'armv7a-cros-linux-gnueabi')
AARCH64_TRIPLE = os.getenv('AARCH64_TRIPLE', 'aarch64-cros-linux-gnu')
X86_64_TRIPLE = os.getenv('X86_64_TRIPLE', 'x86_64-cros-linux-gnu')
ARM_SYSROOT = os.getenv('ARM_SYSROOT', '/build/arm-generic')
AARCH64_SYSROOT = os.getenv('AARCH64_SYSROOT', '/build/arm64-generic')
X86_64_SYSROOT = os.getenv('X86_64_SYSROOT', '/build/amd64-generic')
BUILD_TEST_CASES = [
#(sysroot path, target triple, debug/release, should test?)
(ARM_SYSROOT, ARM_TRIPLE, "debug", False),
(ARM_SYSROOT, ARM_TRIPLE, "release", False),
(AARCH64_SYSROOT, AARCH64_TRIPLE, "debug", False),
(AARCH64_SYSROOT, AARCH64_TRIPLE, "release", False),
(X86_64_SYSROOT, X86_64_TRIPLE, "debug", False),
(X86_64_SYSROOT, X86_64_TRIPLE, "release", False),
(X86_64_SYSROOT, X86_64_TRIPLE, "debug", True),
(X86_64_SYSROOT, X86_64_TRIPLE, "release", True),
]
TEST_MODULES_PARALLEL = [
'crosvm',
'data_model',
'kernel_loader',
'kvm',
'kvm_sys',
'net_sys',
'syscall_defines',
'virtio_sys',
'x86_64',
]
TEST_MODULES_SERIAL = [
'io_jail',
'sys_util',
]
# Bright green
PASS_COLOR = '\033[1;32m'
# Bright red
FAIL_COLOR = '\033[1;31m'
# Default color
END_COLOR = '\033[0m'
def get_target_path(triple, kind, test_it):
target_path = '/tmp/%s_%s' % (triple, kind)
if test_it:
target_path += '_test'
return target_path
def build_target(triple, is_release, env):
args = ['cargo', 'build', '--target=%s' % triple]
if is_release:
args.append('--release')
return subprocess.Popen(args, env=env).wait() == 0
def test_target_modules(triple, is_release, env, modules, parallel):
args = ['cargo', 'test', '--target=%s' % triple]
if is_release:
args.append('--release')
if not parallel:
env = env.copy()
env['RUST_TEST_THREADS'] = '1'
for mod in modules:
args.append('-p')
args.append(mod)
return subprocess.Popen(args, env=env).wait() == 0
def test_target(triple, is_release, env):
return (
test_target_modules(
triple, is_release, env, TEST_MODULES_PARALLEL, True) and
test_target_modules(
triple, is_release, env, TEST_MODULES_SERIAL, False)
)
def check_build(sysroot, triple, kind, test_it):
if not os.path.isdir(sysroot):
return 'sysroot missing'
target_path = get_target_path(triple, kind, test_it)
if not NOCLEAN:
shutil.rmtree(target_path, True)
is_release = kind == 'release'
env = os.environ.copy()
env['TARGET_CC'] = '%s-clang'%triple
env['SYSROOT'] = sysroot
env['CARGO_TARGET_DIR'] = target_path
if test_it:
if not test_target(triple, is_release, env):
return 'test error'
else:
if not build_target(triple, is_release, env):
return 'build error'
return 'pass'
def get_stripped_size(triple):
target_path = get_target_path(triple, 'release', False)
bin_path = os.path.join(target_path, triple, 'release', 'crosvm')
proc = subprocess.Popen(['%s-strip' % triple, bin_path])
if proc.wait() != 0:
return 'failed'
return '%dKiB' % (os.path.getsize(bin_path) / 1024)
def main():
os.chdir(os.path.dirname(sys.argv[0]))
pool = multiprocessing.pool.Pool()
results = pool.starmap(check_build, BUILD_TEST_CASES, 1)
print('---')
print('build test summary:')
for test_case, result in zip(BUILD_TEST_CASES, results):
_, triple, kind, test_it = test_case
title = '%s_%s' % (triple.split('-')[0], kind)
if test_it:
title += "_test"
result_color = FAIL_COLOR
if result == 'pass':
result_color = PASS_COLOR
display_size = ''
if result == 'pass' and kind == 'release' and not test_it:
display_size = get_stripped_size(triple) + ' stripped binary'
print('%20s: %s%15s%s %s' %
(title, result_color, result, END_COLOR, display_size))
if __name__ == '__main__':
main()