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

# HOW MANIFESTS WORK IN THE GN BUILD
#
# Use the windows_manifest template to declare a manifest generation step.
# This will combine all listed .manifest files. To link this manifest, just
# depend on the manifest target from your executable or shared library.
#
# This will define an empty placeholder target on non-Windows platforms so
# the manifest declarations and dependencies do not need to be inside of OS
# conditionals.
#
# A binary can depend on only one manifest target, but the manifest target
# can depend on many individual .manifest files which will be merged. As a
# result, only executables and shared libraries should depend on manifest
# targets. If you want to add a manifest to a component, put the dependency
# behind a "if (is_component_build)" conditional.
#
# Generally you will just want the defaults for the Chrome build. In this case
# the binary should just depend on one of the targets in //build/win/. There
# are also individual manifest files in that directory you can reference via
# the *_manifest variables defined below to pick and choose only some defaults.
# You might combine these with a custom manifest file to get specific behavior.

# Reference this manifest as a source from windows_manifest targets to get
# the default Chrome OS compatibility list.
default_compatibility_manifest = "//build/win/compatibility.manifest"

# Reference this manifest as a source from windows_manifest targets to get
# the default Chrome common constrols compatibility.
common_controls_manifest = "//build/win/common_controls.manifest"

# Reference this manifest to request that Windows not perform any elevation
# when running your program. Otherwise, it might do some autodetection and
# request elevated privileges from the user. This is normally what you want.
as_invoker_manifest = "//build/win/as_invoker.manifest"

# An alternative to as_invoker_manifest when you want the application to always
# elevate.
require_administrator_manifest = "//build/win/require_administrator.manifest"

# Construct a target to combine the given manifest files into a .rc file.
#
# Variables for the windows_manifest template:
#
#   sources: (required)
#     List of source .manifest files to add.
#
#   deps: (optional)
#   visibility: (optional)
#     Normal meaning.
#
# Example:
#
#   windows_manifest("doom_melon_manifest") {
#     sources = [
#       "doom_melon.manifest",   # Custom values in here.
#       default_compatibility_manifest,  # Want the normal OS compat list.
#     ]
#   }
#
#   executable("doom_melon") {
#     deps = [ ":doom_melon_manifest" ]
#     ...
#   }

if (is_win) {
  template("windows_manifest") {
    config_name = "${target_name}__config"
    source_set_name = target_name

    config(config_name) {
      visibility = [ ":$source_set_name" ]
      assert(defined(invoker.sources),
             "\"sources\" must be defined for a windows_manifest target")
      manifests = []
      foreach(i, rebase_path(invoker.sources, root_build_dir)) {
        manifests += [ "/manifestinput:" + i ]
      }
      ldflags = [
                  "/manifest:embed",

                  # We handle UAC by adding explicit .manifest files instead.
                  "/manifestuac:no",
                ] + manifests
    }

    # This source set only exists to add a dep on the invoker's deps and to
    # add a public_config that sets ldflags on dependents.
    source_set(source_set_name) {
      forward_variables_from(invoker, [ "visibility" ])
      public_configs = [ ":$config_name" ]

      # Apply any dependencies from the invoker to this target, since those
      # dependencies may have created the input manifest files.
      forward_variables_from(invoker, [ "deps" ])
    }
  }
} else {
  # Make a no-op group on non-Windows platforms so windows_manifest
  # instantiations don't need to be inside windows blocks.
  template("windows_manifest") {
    group(target_name) {
      # Prevent unused variable warnings on non-Windows platforms.
      assert(invoker.sources != "")
      assert(!defined(invoker.deps) || invoker.deps != "")
      assert(!defined(invoker.visibility) || invoker.visibility != "")
    }
  }
}
