# Copyright 2015 The Chromium Authors # 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" # Request the segment heap. See https://crbug.com/1014701 for details. declare_args() { enable_segment_heap = false } segment_heap_manifest = "//build/win/segment_heap.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 != "") } } }