diff --git a/engine/src/flutter/recipe_changelog.md b/engine/src/flutter/recipe_changelog.md index 0bf659e8825..bc48a1b60eb 100644 --- a/engine/src/flutter/recipe_changelog.md +++ b/engine/src/flutter/recipe_changelog.md @@ -1,5 +1,10 @@ # Recipe Changelog +## 29 Oct 2019 + +* Recipe Link: https://chromium-review.googlesource.com/c/chromium/tools/build/+/1887742 +* Reason: Start uploading Fuchsia debug symbols to CIPD. + ## 28 Oct 2019 * Recipe Link: https://chromium-review.googlesource.com/c/chromium/tools/build/+/1885414 diff --git a/engine/src/flutter/tools/fuchsia/fuchsia_debug_symbols.gni b/engine/src/flutter/tools/fuchsia/fuchsia_debug_symbols.gni index fb02d70eeea..cdb046ecf41 100644 --- a/engine/src/flutter/tools/fuchsia/fuchsia_debug_symbols.gni +++ b/engine/src/flutter/tools/fuchsia/fuchsia_debug_symbols.gni @@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("$flutter_root/common/fuchsia_config.gni") + # The inputs to this template are 'binary_path' and a boolean 'unstripped'. # If 'unstripped' is specified, we append '.debug' to the symbols name. template("_copy_debug_symbols") { @@ -23,8 +25,7 @@ template("_copy_debug_symbols") { binary_path, ] - _dest_base = - "${root_out_dir}/flutter-debug-symbols-${target_os}-${target_cpu}" + _dest_base = "${root_out_dir}/flutter-debug-symbols-${flutter_runtime_mode}-${target_os}-${target_cpu}" args = [ "--executable-name", diff --git a/engine/src/flutter/tools/fuchsia/merge_and_upload_debug_symbols.py b/engine/src/flutter/tools/fuchsia/merge_and_upload_debug_symbols.py new file mode 100755 index 00000000000..95f14eb5785 --- /dev/null +++ b/engine/src/flutter/tools/fuchsia/merge_and_upload_debug_symbols.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +# +# Copyright 2013 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +""" Merges the debug symbols and uploads them to cipd. +""" + +import argparse +import collections +import json +import os +import platform +import shutil +import subprocess +import sys +import tempfile +import yaml + + +def IsLinux(): + return platform.system() == 'Linux' + + +def CreateCIPDDefinition(target_arch, out_dir): + pkg_def = {} + pkg_def['package'] = 'flutter/fuchsia-debug-symbols-%s' % target_arch + desc = 'Flutter and Dart runner debug symbols for Fuchsia. Target architecture: %s.' % target_arch + pkg_def['description'] = desc + pkg_def['install_mode'] = 'copy' + pkg_def['data'] = [{'dir': os.path.basename(os.path.normpath(out_dir))}] + return pkg_def + + +def WriteCIPDDefinition(target_arch, out_dir): + _, temp_file = tempfile.mkstemp(suffix='.yaml') + with open(temp_file, 'w') as f: + yaml.dump( + CreateCIPDDefinition(target_arch, out_dir), f, default_flow_style=False) + return temp_file + + +def ProcessCIPDPackage(upload, cipd_yaml, engine_version, out_dir, target_arch): + _packaging_dir = os.path.abspath(os.path.join(out_dir, os.pardir)) + if upload and IsLinux(): + command = [ + 'cipd', 'create', '-pkg-def', cipd_yaml, '-ref', 'latest', '-tag', + 'git_revision:%s' % engine_version + ] + else: + command = [ + 'cipd', 'pkg-build', '-pkg-def', cipd_yaml, '-out', + os.path.join(_packaging_dir, + 'fuchsia-debug-symbols-%s.cipd' % target_arch) + ] + + subprocess.check_call(command, cwd=_packaging_dir) + + +def NormalizeDirPathForRsync(path): + norm_path = os.path.normpath(path) + return norm_path + os.path.sep + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument( + '--symbol-dirs', + required=True, + nargs='+', + help='Space separated list of directories that contain the debug symbols.' + ) + parser.add_argument( + '--out-dir', + required=True, + action='store', + dest='out_dir', + help='Output directory where the executables will be placed.') + parser.add_argument( + '--target-arch', type=str, choices=['x64', 'arm64'], required=True) + parser.add_argument( + '--engine-version', + required=True, + help='Specifies the flutter engine SHA.') + + parser.add_argument('--upload', default=False, action='store_true') + + args = parser.parse_args() + + symbol_dirs = args.symbol_dirs + for symbol_dir in symbol_dirs: + assert os.path.exists(symbol_dir) and os.path.isdir(symbol_dir) + + out_dir = NormalizeDirPathForRsync(args.out_dir) + if os.path.exists(out_dir): + print 'Directory: %s is not empty, deleting it.' % out_dir + shutil.rmtree(out_dir) + os.makedirs(out_dir) + + for symbol_dir in symbol_dirs: + subprocess.check_output( + ['rsync', '--recursive', + NormalizeDirPathForRsync(symbol_dir), out_dir]) + + cipd_def = WriteCIPDDefinition(args.target_arch, out_dir) + ProcessCIPDPackage(args.upload, cipd_def, args.engine_version, out_dir, + args.target_arch) + return 0 + + +if __name__ == '__main__': + sys.exit(main())