# Copyright 2015 The Chromium 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("//build/config/chrome_build.gni")
import("//build/config/features.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/sysroot.gni")
import("//build/util/process_version.gni")
import("//build/util/version.gni")
import("//chrome/process_version_rc_template.gni")  # For branding_file_path.

if (current_cpu == "x86" || current_cpu == "x64") {
  import("//media/cdm/ppapi/cdm_paths.gni")
}

assert(is_linux)

# This target builds all "normal" Linux installers.
#
# The bot setup is to build stable, unstable, and beta packages for the current
# build. Then a later step picks up the package corresponding to what the
# current build is supposed to be. This is wasteful since one build will only
# be one of these. This build file also has targets for trunk and possibly asan
# installers.
#
# TODO it would be much nicer to have a build variable so the bot can tell us
# what the current build should be, so we only have to make one .deb/.rpm pair.
#
#
# TO BUILD LINUX INSTALLER PACKAGES
#
# The packages list the exact versions of each library used. The versions used
# on the bots are likely different than those on your workstation, so you'll
# get a stream of errors like:
#   < libasound2 (>= 1.0.23)
#   ---
#   > libasound2 (>= 1.0.16)
#
# To avoid these warnings for testing purposes, do:
#
#   export IGNORE_DEPS_CHANGES=1
#
# before you build.
group("linux") {
  deps = [
    ":beta",
    ":stable",
    ":unstable",
  ]
}

# This target is provided for compatibility w/ GYP. Users should always
# depend directly on :linux instead of this target (we set visibility
# to the empty list to prevent unwanted callers).
# TODO(GYP_GONE): Delete this target after we've migrated away from GYP and
# updated the bots to build :linux instead.
group("linux_packages_all") {
  visibility = []
  deps = [
    ":linux",
  ]
}

branding_dir = "//chrome/app/theme/$branding_path_component"
branding_dir_100 =
    "//chrome/app/theme/default_100_percent/$branding_path_component"

copy("common_packaging_files") {
  visibility = [ ":*" ]
  sources = [
    "common/apt.include",
    "common/default-app-block.template",
    "common/default-app.template",
    "common/desktop.template",
    "common/installer.include",
    "common/postinst.include",
    "common/prerm.include",
    "common/repo.cron",
    "common/rpm.include",
    "common/rpmrepo.cron",
    "common/symlinks.include",
    "common/variables.include",
    "common/wrapper",
  ]

  if (is_chrome_branded) {
    sources += [ "common/google-chrome/google-chrome.info" ]
  } else {
    sources += [ "common/chromium-browser/chromium-browser.info" ]
  }

  if (current_cpu == "x86") {
    sources += [ "//build/linux/bin/eu-strip" ]
  } else if (current_cpu == "x64") {
    sources += [ "/usr/bin/eu-strip" ]
  }

  outputs = [
    "$root_out_dir/installer/common/{{source_file_part}}",
  ]
}

copy("deb_packaging_files") {
  visibility = [ ":*" ]
  sources = [
    "debian/build.sh",
    "debian/changelog.template",
    "debian/control.template",
    "debian/debian.menu",
    "debian/expected_deps_ia32_jessie",
    "debian/expected_deps_ia32_wheezy",
    "debian/expected_deps_x64_jessie",
    "debian/expected_deps_x64_wheezy",
    "debian/postinst",
    "debian/postrm",
    "debian/prerm",
  ]
  outputs = [
    "$root_out_dir/installer/debian/{{source_file_part}}",
  ]
}

copy("theme_files") {
  visibility = [ ":*" ]
  sources = [
    "$branding_dir/BRANDING",
    "$branding_dir/linux/product_logo_32.xpm",
    "$branding_dir/product_logo_128.png",
    "$branding_dir/product_logo_22.png",
    "$branding_dir/product_logo_24.png",
    "$branding_dir/product_logo_256.png",
    "$branding_dir/product_logo_48.png",
    "$branding_dir/product_logo_64.png",
    "$branding_dir_100/product_logo_16.png",
    "$branding_dir_100/product_logo_32.png",
  ]
  outputs = [
    "$root_out_dir/installer/theme/{{source_file_part}}",
  ]
}

if (!is_chromeos) {
  copy("rpm_packaging_files") {
    visibility = [ ":*" ]
    sources = [
      "rpm/build.sh",
      "rpm/chrome.spec.template",
      "rpm/expected_deps_i386",
      "rpm/expected_deps_x86_64",
    ]
    outputs = [
      "$root_out_dir/installer/rpm/{{source_file_part}}",
    ]
  }
}

process_version("save_build_info") {
  # Just output the default version info variables (no template).
  process_only = true
  sources = [
    "//build/util/LASTCHANGE",
    "//chrome/VERSION",
    branding_file_path,
  ]
  output = "$root_out_dir/installer/version.txt"
}

# Dependencies for all Linux installer targets.
group("installer_deps") {
  # Though many of these things appear in data_deps further down the
  # dependency chain, they must appear here as public_deps so that they can
  # be listed as inputs to the actions that depend on ":installer_deps"
  # and are guaranteed to have been built before those actions run.

  public_deps = [
    ":common_packaging_files",
    ":deb_packaging_files",
    ":save_build_info",
    ":theme_files",
    "//chrome",
    "//chrome:packed_resources",
    "//sandbox/linux:chrome_sandbox",
  ]
  if (enable_nacl) {
    public_deps += [
      "//components/nacl/loader:nacl_helper",

      # These are data_deps of nacl_helper, but that is not enough,
      # as explained above.
      "//native_client/src/trusted/service_runtime/linux:bootstrap",
      "//ppapi/native_client:irt",
    ]
  }
  if (current_cpu == "x86" || current_cpu == "x64") {
    public_deps += [
      "//third_party/widevine/cdm:widevinecdm",
      "//third_party/widevine/cdm:widevinecdmadapter",
    ]
  }
  if (!is_chromeos) {
    public_deps += [ ":rpm_packaging_files" ]
  }
  if (use_custom_libcxx) {
    public_deps += [ "//buildtools/third_party/libc++" ]
  }
}

# Creates .deb and .rpm (RPM for non-ChromeOS only) installer packages.
#
# channel:
#   Name of the channel.
template("linux_package") {
  assert(defined(invoker.channel))
  channel = invoker.channel

  if (current_cpu == "x86") {
    # The shell scripts use "ia32" instead of "x86".
    build_script_arch = "ia32"
  } else {
    build_script_arch = current_cpu
  }

  packaging_files_binaries = [
    # TODO(mmoss) Any convenient way to get all the relevant build
    # files? (e.g. all locales, resources, etc.)
    "$root_out_dir/chrome",
    "$root_out_dir/chrome_sandbox",
    "$root_out_dir/xdg-mime",
    "$root_out_dir/xdg-settings",
    "$root_out_dir/locales/en-US.pak",

    "$root_out_dir/nacl_helper",
    "$root_out_dir/nacl_helper_bootstrap",
  ]

  if (current_cpu == "x86") {
    packaging_files_binaries += [ "$root_out_dir/nacl_irt_x86_32.nexe" ]
  } else if (current_cpu == "x64") {
    packaging_files_binaries += [ "$root_out_dir/nacl_irt_x86_64.nexe" ]
  } else if (current_cpu == "arm") {
    packaging_files_binaries += [ "$root_out_dir/nacl_irt_arm.nexe" ]
  }

  # The widevine BUILD.gn only produces shared libraries for x86 and x64
  if (is_chrome_branded && (current_cpu == "x86" || current_cpu == "x64")) {
    packaging_files_binaries += [
      "$root_out_dir/$widevine_cdm_path/libwidevinecdmadapter.so",
      "$root_out_dir/$widevine_cdm_path/libwidevinecdm.so",
    ]
  }

  if (use_custom_libcxx) {
    packaging_files_binaries += [ "$root_out_dir/libc++.so" ]
  }

  deb_target_name = "${target_name}_deb"
  action(deb_target_name) {
    visibility = [ ":*" ]
    script = "flock_make_package.py"

    if (current_cpu == "x86") {
      deb_arch = "i386"
    } else if (current_cpu == "x64") {
      deb_arch = "amd64"
    } else if (current_cpu == "arm") {
      deb_arch = "arm"
    } else {
      assert(false, "Linux installer not configured for this architecture.")
    }

    inputs = packaging_files_binaries
    outputs = [
      "$root_out_dir/google-chrome-${channel}_${chrome_version_full}-1_${deb_arch}.deb",
    ]

    args = [
      rebase_path("$root_out_dir/linux_package.lock", root_build_dir),
      rebase_path("$root_out_dir/installer/debian/build.sh", root_build_dir),
      "-o",
      rebase_path(root_out_dir, root_build_dir),
      "-b",
      rebase_path(root_out_dir, root_build_dir),
      "-a",
      build_script_arch,
      "-c",
      invoker.channel,
      "-d",
      branding_path_component,
      "-s",
      rebase_path(sysroot),
      "-e",
      rebase_path("//third_party/dpkg-dev"),
    ]
    deps = [
      ":installer_deps",
    ]
  }

  if (!is_chromeos) {
    rpm_target_name = "${target_name}_rpm"
    action(rpm_target_name) {
      visibility = [ ":*" ]
      script = "flock_make_package.py"

      if (current_cpu == "x86") {
        rpm_arch = "i386"
      } else if (current_cpu == "x64") {
        rpm_arch = "x86_64"
      } else if (current_cpu == "arm") {
        rpm_arch = "arm"
      } else {
        assert(false, "Linux installer not configured for this architecture.")
      }

      inputs = packaging_files_binaries
      outputs = [
        "$root_out_dir/google-chrome-${channel}_${chrome_version_full}-1.${rpm_arch}.rpm",
      ]

      args = [
        rebase_path("$root_out_dir/linux_package.lock", root_build_dir),
        rebase_path("$root_out_dir/installer/rpm/build.sh", root_build_dir),
        "-o",
        rebase_path(root_out_dir, root_build_dir),
        "-b",
        rebase_path(root_out_dir, root_build_dir),
        "-a",
        build_script_arch,
        "-c",
        invoker.channel,
        "-d",
        branding_path_component,
      ]
      deps = [
        ":installer_deps",
      ]
    }
  }

  group(target_name) {
    deps = [
      ":$deb_target_name",
    ]
    if (!is_chromeos) {
      deps += [ ":$rpm_target_name" ]
    }
  }
}

# Standard packages.
linux_package("stable") {
  channel = "stable"
}
linux_package("beta") {
  channel = "beta"
}
linux_package("unstable") {
  channel = "unstable"
}

# Other packages that we support that aren't included in the default "linux"
# target.
linux_package("trunk") {
  channel = "trunk"
}
if (is_asan) {
  linux_package("asan") {
    channel = "asan"
  }
}
