|  | #!/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) |