# 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.

import("//flutter/build/zip_bundle.gni")
import("//flutter/common/config.gni")

if (build_engine_artifacts) {
  zip_bundle("artifacts") {
    deps = [
      "//flutter/flutter_frontend_server:frontend_server",
      "//flutter/impeller/compiler:impellerc",
      "//flutter/impeller/tessellator:tessellator_shared",
      "//flutter/lib/snapshot:generate_snapshot_bin",
      "//flutter/shell/testing:testing",
    ]
    prefix = "$full_platform_name/"
    if (flutter_runtime_mode != "debug") {
      prefix = "$full_platform_name-$flutter_runtime_mode/"
    }
    output = "$prefix/artifacts.zip"
    files = [
      {
        source = "//third_party/icu/flutter/icudtl.dat"
        destination = "icudtl.dat"
      },
      {
        source = "$root_out_dir/gen/flutter/lib/snapshot/isolate_snapshot.bin"
        destination = "isolate_snapshot.bin"
      },
      {
        source = "$root_gen_dir/flutter/lib/snapshot/vm_isolate_snapshot.bin"
        destination = "vm_isolate_snapshot.bin"
      },
      {
        source = "$root_gen_dir/frontend_server.dart.snapshot"
        destination = "frontend_server.dart.snapshot"
      },
    ]

    exe = ""
    if (host_os == "win") {
      exe = ".exe"
    }
    dll = ".so"
    if (host_os == "win") {
      dll = ".dll"
    } else if (host_os == "mac") {
      dll = ".dylib"
    }
    files += [
      {
        source = "$root_out_dir/flutter_tester$exe"
        destination = "flutter_tester$exe"
      },
      {
        source = "$root_out_dir/impellerc$exe"
        destination = "impellerc$exe"
      },
      {
        source = "$root_out_dir/libtessellator$dll"
        destination = "libtessellator$dll"
      },
    ]
  }
}

if (host_os == "linux" || host_os == "win") {
  group("embedder") {
    deps = [ "//flutter/shell/platform/embedder:embedder-archive" ]
  }
}

# Generates flutter_patched_sdk.zip for debug and profile runtime modes
# and saves it in the zips_archive folder. For release runtime mode it
# generates flutter_patched_sdk_product.zip and saves it to
# zips_archive/flutter_patched_sdk_product/ folder.
zip_bundle("flutter_patched_sdk") {
  file_suffix = ""
  path_prefix = ""
  if (flutter_runtime_mode == "release") {
    file_suffix = "_product"
    path_prefix = "flutter_patched_sdk_product/"
  }
  output = "flutter_patched_sdk${file_suffix}.zip"
  deps = [ "//flutter/lib/snapshot:strong_platform" ]
  files = [
    {
      source = "$root_out_dir/flutter_patched_sdk/vm_outline_strong.dill"
      destination = "${path_prefix}vm_outline_strong.dill"
    },
    {
      source = "$root_out_dir/flutter_patched_sdk/platform_strong.dill"
      destination = "${path_prefix}platform_strong.dill"
    },
  ]
}

# Flutter consumes the dart sdk as a prebuilt. Rather than regenerating
# the zip file we are just copying the original file to the artifacts location.
if (build_engine_artifacts && flutter_prebuilt_dart_sdk) {
  copy("dart_sdk_archive") {
    sources = [ prebuilt_dart_sdk_archive ]
    outputs =
        [ "$root_out_dir/zip_archives/dart-sdk-$full_target_platform_name.zip" ]
  }
}

# Archives Flutter Web SDK
if (!is_fuchsia) {
  group("flutter_web_sdk") {
    deps = [ "//flutter/web_sdk:flutter_web_sdk_archive" ]
  }
}

# Archives Flutter Windows Artifacts
if (host_os == "win") {
  zip_bundle("windows_flutter") {
    output = "$full_platform_name-$flutter_runtime_mode/$full_platform_name-flutter.zip"
    deps = [
      "//flutter/shell/platform/common:publish_headers",
      "//flutter/shell/platform/windows:flutter_windows",
      "//flutter/shell/platform/windows:publish_headers_windows",
    ]
    files = [
      {
        source = "$root_out_dir/flutter_export.h"
        destination = "flutter_export.h"
      },
      {
        source = "$root_out_dir/flutter_windows.h"
        destination = "flutter_windows.h"
      },
      {
        source = "$root_out_dir/flutter_messenger.h"
        destination = "flutter_messenger.h"
      },
      {
        source = "$root_out_dir/flutter_plugin_registrar.h"
        destination = "flutter_plugin_registrar.h"
      },
      {
        source = "$root_out_dir/flutter_texture_registrar.h"
        destination = "flutter_texture_registrar.h"
      },
      {
        source = "$root_out_dir/flutter_windows.dll"
        destination = "flutter_windows.dll"
      },
    ]
  }
}

# Archives Flutter Mac Artifacts
if (is_mac) {
  group("macos_flutter_framework") {
    deps = [
      "//flutter/shell/platform/darwin/macos:macos_flutter_framework_archive",
    ]
  }

  zip_bundle("archive_gen_snapshot") {
    deps = [ "//flutter/lib/snapshot:create_macos_gen_snapshots" ]
    suffix = "-$flutter_runtime_mode"
    if (flutter_runtime_mode == "debug") {
      suffix = ""
    }
    output = "$full_platform_name$suffix/gen_snapshot.zip"
    files = [
      {
        source = "$root_out_dir/gen_snapshot_$target_cpu"
        destination = "gen_snapshot_$target_cpu"
      },
    ]
  }

  group("flutter_embedder_framework") {
    deps = [
      "//flutter/shell/platform/embedder:flutter_embedder_framework_archive",
    ]
  }
}
