#!/usr/bin/env vpython3 # Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. # # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file in the root of the source # tree. An additional intellectual property rights grant can be found # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. """ This script builds a GN executable targeting the host machine. It is useful, for example, for mobile devices performance testing where it makes sense to build WebRTC for a mobile platform (e.g. Android) but part of the test is performed on the host machine (e.g. running an executable to analyze a video downloaded from a device). The script has only one (mandatory) option: --executable_name, which is the output name of the GN executable. For example, if you have the following executable in your out folder: out/Debug/random_exec You will be able to compile the same executable targeting your host machine by running: $ vpython3 tools_webrtc/executable_host_build.py --executable_name random_exec The generated executable will have the same name as the input executable with suffix '_host'. This script should not be used standalone but from GN, through an action: action("random_exec_host") { script = "//tools_webrtc/executable_host_build.py" outputs = [ "${root_out_dir}/random_exec_host", ] args = [ "--executable_name", "random_exec", ] } The executable for the host machine will be generated in the GN out directory (e.g. out/Debug in the previous example). """ from contextlib import contextmanager import argparse import os import shutil import subprocess import sys import tempfile SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir)) sys.path.append(os.path.join(SRC_DIR, 'build')) import find_depot_tools def _ParseArgs(): desc = 'Generates a GN executable targeting the host machine.' parser = argparse.ArgumentParser(description=desc) parser.add_argument('--executable_name', required=True, help='Name of the executable to build') args = parser.parse_args() return args @contextmanager def HostBuildDir(): temp_dir = tempfile.mkdtemp() try: yield temp_dir finally: shutil.rmtree(temp_dir) def _RunCommand(argv, cwd=SRC_DIR, **kwargs): with open(os.devnull, 'w') as devnull: subprocess.check_call(argv, cwd=cwd, stdout=devnull, **kwargs) def DepotToolPath(*args): return os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, *args) if __name__ == '__main__': ARGS = _ParseArgs() EXECUTABLE_TO_BUILD = ARGS.executable_name EXECUTABLE_FINAL_NAME = ARGS.executable_name + '_host' with HostBuildDir() as build_dir: _RunCommand([sys.executable, DepotToolPath('gn.py'), 'gen', build_dir]) _RunCommand([DepotToolPath('ninja'), '-C', build_dir, EXECUTABLE_TO_BUILD]) shutil.copy(os.path.join(build_dir, EXECUTABLE_TO_BUILD), EXECUTABLE_FINAL_NAME)