chromium/components/policy/BUILD.gn

# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/apple/convert_plist.gni")
import("//build/config/chrome_build.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/features.gni")
import("//build/timestamp.gni")
import("//build/toolchain/toolchain.gni")
import("//components/policy/resources/policy_templates.gni")
import("//components/policy/tools/generate_policy_source.gni")
import("//third_party/libprotobuf-mutator/fuzzable_proto_library.gni")
import("//third_party/protobuf/proto_library.gni")
import("//tools/grit/grit_args.gni")
import("//tools/grit/grit_rule.gni")

# To generate policy documentation for local use, set this to true for the
# links between pages and subpages to work.
gen_policy_templates_local = false

# To test policy generation for platforms different than your OS, override and
# enable these flags (but don't check that in!).
gen_policy_templates_common = true
gen_policy_templates_win = is_win
gen_policy_templates_linux = is_linux || is_chromeos
gen_policy_templates_android = is_android
gen_policy_templates_mac = is_mac
gen_policy_templates_ios = is_ios

# The zip file is grabbed from the Windows build right now.
gen_policy_templates_zip = is_win

# Make sure all dependencies of the zip are built.
if (gen_policy_templates_zip) {
  gen_policy_templates_common = true
  gen_policy_templates_win = true
}

if (is_mac) {
  import("//build/util/branding.gni")
} else if (gen_policy_templates_mac) {
  chrome_mac_bundle_id = "DUMMY_MAC_BUNDLE_ID"
}

if (is_component_build) {
  # External code should depend on either //components/policy/core/browser or
  # .../common depending on what code it needs.
  component("policy") {
    output_name = "policy_component"
    visibility = [
      "//components/policy/core/browser",
      "//components/policy/core/common",
    ]
    public_deps = [
      "//build:branding_buildflags",
      "//components/policy/core/browser:internal",
      "//components/policy/core/common:internal",
      "//components/policy/core/common:policy_namespace_internal",
    ]
  }
}

# Used by targets that compile into the implementation.
config("component_implementation") {
  defines = [ "POLICY_COMPONENT_IMPLEMENTATION" ]
}

# This protobuf is equivalent to chrome_settings.proto but shares messages
# for policies of the same type, so that less classes have to be generated
# and compiled.
cloud_policy_proto_path = "$target_gen_dir/proto/cloud_policy.proto"

# This is the "full" protobuf, which defines one protobuf message per
# policy. It is also the format currently used by the server.
chrome_settings_proto_path = "$target_gen_dir/proto/chrome_settings.proto"

constants_header_path = "$target_gen_dir/policy_constants.h"
constants_source_path = "$target_gen_dir/policy_constants.cc"
risk_tag_header_path = "$target_gen_dir/risk_tag.h"

policy_templates_deps_file = "$policy_templates_base_dir/policy_templates.d"
policy_templates_generated_json_path =
    "$policy_templates_base_dir/policy_templates.json"

generate_policy_source("policy_code_generate") {
  chunking = true
}

policy_templates_grd_file = "resources/policy_templates.build.grd"

# Generates a single policy_templates.json with a real JSON format.
action("generate_policy_templates") {
  script = "resources/policy_templates.py"
  depfile = policy_templates_deps_file
  outputs = [
    "$policy_templates_generated_json_path",
    "$policy_templates_deps_file",
  ]
  args = [
    "--dest",
    rebase_path(policy_templates_generated_json_path, root_build_dir),
    "--depfile",
    rebase_path(policy_templates_deps_file, root_build_dir),
  ]
}

# Translates policy_templates.json into various languages.
grit("translate_policy_templates") {
  deps = [ ":generate_policy_templates" ]
  source = policy_templates_grd_file
  inputs = [ policy_templates_generated_json_path ]
  output_dir = "$root_gen_dir/chrome"
  outputs = policy_templates_translation_outputs
  grit_flags = [
    "-E",
    "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
    "-E",
    "root_src_dir=" + rebase_path("//", root_build_dir),
  ]
}

# Generate the various templates and docs (admx, doc, json, etc.)
action("policy_templates") {
  script = "tools/template_writers/template_formatter.py"
  chrome_version_abspath = "//chrome/VERSION"
  chrome_version_path = rebase_path(chrome_version_abspath, root_build_dir)
  deps = [ ":translate_policy_templates_grit" ]
  inputs = [ chrome_version_abspath ] + policy_templates_translation_outputs
  outputs = []
  args = [
           "--translations",
           rebase_path(policy_templates_translation_json_path, root_build_dir),
           "--languages",
           policy_templates_languages_str,
           "--version_path",
           chrome_version_path,
         ] + grit_args

  if (gen_policy_templates_local) {
    args += [ "--local" ]
  }
  if (gen_policy_templates_common) {
    outputs += policy_templates_common_outputs
    args += [
      "--doc",
      rebase_path(policy_templates_doc_path, root_build_dir),
      "--doc_atomic_groups",
      rebase_path(policy_templates_doc_atomic_groups_path, root_build_dir),
    ]
  }
  if (gen_policy_templates_android) {
    outputs += policy_templates_android_outputs
    args += [
      "--android_policy",
      rebase_path(policy_templates_android_policy_path, root_build_dir),
    ]
  }
  if (gen_policy_templates_linux) {
    outputs += policy_templates_linux_outputs
    args += [
      "--json",
      rebase_path(policy_templates_json_path, root_build_dir),
    ]
  }
  if (gen_policy_templates_mac) {
    outputs += policy_templates_mac_outputs
    args += [
      "--plist",
      rebase_path(policy_templates_plist_path, root_build_dir),
      "--plist_strings",
      rebase_path(policy_templates_plist_strings_path, root_build_dir),
      "--jamf",
      rebase_path(policy_templates_jamf_path, root_build_dir),
      "-D",
      "mac_bundle_id=$chrome_mac_bundle_id",
    ]
  }
  if (gen_policy_templates_win) {
    outputs += policy_templates_win_outputs
    args += [
      "--reg",
      rebase_path(policy_templates_win_reg_path, root_build_dir),
      "--adm",
      rebase_path(policy_templates_win_adm_path, root_build_dir),
      "--adml",
      rebase_path(policy_templates_win_adml_path, root_build_dir),
      "--admx",
      rebase_path(policy_templates_win_admx_path, root_build_dir),
    ]
    if (is_chrome_branded) {
      # Create google.admx and google.adml files that define a common 'Google'
      # category used for Chrome, Chrome OS and possibly external tools, see
      # crbug.com/665400.
      outputs += policy_templates_win_google_outputs
      args += [
        "--google_adml",
        rebase_path(policy_templates_win_google_adml_path, root_build_dir),
        "--google_admx",
        rebase_path(policy_templates_win_google_admx_path, root_build_dir),
      ]
    }
  }
  if (gen_policy_templates_ios) {
    outputs += policy_templates_ios_outputs
    args += [
      "--ios_app_config",
      rebase_path(policy_templates_ios_app_config_path, root_build_dir),
    ]
  }
}

# Run the proto compiler over the generated file and make it a component.
component("cloud_policy_proto_generated_compile") {
  public_deps = [ ":cloud_policy_proto_generated_compile_proto" ]
}
proto_library("cloud_policy_proto_generated_compile_proto") {
  visibility = [ ":cloud_policy_proto_generated_compile" ]

  sources = [ cloud_policy_proto_path ]

  import_dirs = [ "//components/policy/proto" ]
  proto_out_dir = "components/policy/proto"
  cc_generator_options = "dllexport_decl=POLICY_PROTO_EXPORT:"
  cc_include = "components/policy/proto/policy_proto_export.h"
  component_build_force_source_set = true
  defines = [ "POLICY_PROTO_COMPILATION" ]

  link_deps =
      [ "//components/policy/proto:policy_common_definitions_compile_proto" ]
  proto_deps = [ ":policy_code_generate" ]
}

# This target builds the "full" protobuf, used for tests only.
component("chrome_settings_proto_generated_compile") {
  testonly = true
  public_deps = [ ":chrome_settings_proto_generated_compile_proto" ]
}
proto_library("chrome_settings_proto_generated_compile_proto") {
  testonly = true
  visibility = [ ":chrome_settings_proto_generated_compile" ]

  sources = [ chrome_settings_proto_path ]

  import_dirs = [ "//components/policy/proto" ]
  proto_out_dir = "components/policy/proto"
  cc_generator_options = "dllexport_decl=POLICY_CHROME_SETTINGS_PROTO_EXPORT:"
  cc_include = "components/policy/proto/policy_proto_export.h"
  component_build_force_source_set = true
  defines = [ "POLICY_CHROME_SETTINGS_PROTO_COMPILATION" ]

  link_deps =
      [ "//components/policy/proto:policy_common_definitions_compile_proto" ]
  proto_deps = [ ":policy_code_generate" ]
}

static_library("generated") {
  sources = [
    constants_header_path,
    constants_source_path,
    risk_tag_header_path,
  ]

  defines = [ "POLICY_COMPONENT_IMPLEMENTATION" ]
  public_deps = [
    ":cloud_policy_proto_generated_compile",
    ":policy_code_generate",
    "//base",
    "//components/policy/core/common:common_constants",
    "//components/policy/proto:policy_common_definitions_compile_proto",
    "//third_party/protobuf:protobuf_lite",
  ]
  deps = [ "//build:branding_buildflags" ]
}

if (gen_policy_templates_android && is_android) {
  import("//build/config/android/rules.gni")

  _generated_resources_dir = "$root_gen_dir/chrome/app/policy/android"

  copy("app_restrictions_resources_copy") {
    sources = [ "$target_gen_dir/app_restrictions.xml" ]
    outputs = [ "$_generated_resources_dir/xml-v21/app_restrictions.xml" ]
    deps = [
      ":policy_code_generate",
      ":policy_templates",
    ]
  }

  android_resources("app_restrictions_resources") {
    sources = policy_templates_android_outputs +
              [ "$_generated_resources_dir/xml-v21/app_restrictions.xml" ]
    deps = [
      ":app_restrictions_resources_copy",
      ":policy_templates",
    ]
  }
} else if (gen_policy_templates_mac && is_mac) {
  convert_plist("convert_mcx_plist") {
    source = "$policy_templates_base_dir/mac/app-Manifest.plist"
    output = "$target_gen_dir/$chrome_mac_bundle_id.manifest"
    format = "xml1"

    deps = [ ":policy_templates" ]
  }

  bundle_data("manifest_bundle_data") {
    sources = get_target_outputs(":convert_mcx_plist")
    outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
    public_deps = [ ":convert_mcx_plist" ]
  }

  # The reason we are not enumerating all the locales is that
  # the translations would eat up 3.5MB disk space in the
  # application bundle.
  bundle_data("manifest_strings_bundle_data") {
    sources = [
      "$policy_templates_base_dir/mac/strings/en.lproj/Localizable.strings",
    ]
    outputs = [ "{{bundle_resources_dir}}/en.lproj/{{source_file_part}}" ]
    public_deps = [ ":policy_templates" ]
  }

  create_bundle("chrome_manifest_bundle") {
    bundle_root_dir = "$root_out_dir/$chrome_mac_bundle_id.manifest"
    bundle_contents_dir = "$bundle_root_dir/Contents"
    bundle_resources_dir = "$bundle_contents_dir/Resources"

    deps = [
      ":manifest_bundle_data",
      ":manifest_strings_bundle_data",
    ]
  }
}

if (gen_policy_templates_zip) {
  version_path = "$policy_templates_base_dir/VERSION"

  copy("add_version") {
    sources = [ "//chrome/VERSION" ]
    outputs = [ version_path ]
  }

  action("pack_policy_templates") {
    output_zip_file = "$root_out_dir/policy_templates.zip"
    script = "tools/make_policy_zip.py"
    inputs = [ version_path ] + policy_templates_win_outputs +
             policy_templates_common_outputs
    outputs = [ output_zip_file ]
    args = [
      "--output",
      rebase_path(output_zip_file, root_build_dir),
      "--timestamp",
      build_timestamp,
      "--base_dir",
      rebase_path(policy_templates_base_dir, root_build_dir),
      "--languages",
      policy_templates_languages_str,
      "--add",
      rebase_path(version_path, root_build_dir),
      "--add",
      rebase_path(policy_templates_doc_path, root_build_dir),
      "--add",
      rebase_path(policy_templates_doc_atomic_groups_path, root_build_dir),
      "--add",
      rebase_path(policy_templates_win_reg_path, root_build_dir),
      "--add",
      rebase_path(policy_templates_win_adm_path, root_build_dir),
      "--add",
      rebase_path(policy_templates_win_adml_path, root_build_dir),
      "--add",
      rebase_path(policy_templates_win_admx_path, root_build_dir),
    ]
    if (is_chrome_branded) {
      inputs += policy_templates_win_google_outputs
      args += [
        "--add",
        rebase_path(policy_templates_win_google_adml_path, root_build_dir),
        "--add",
        rebase_path(policy_templates_win_google_admx_path, root_build_dir),
      ]
    }
    deps = [
      ":add_version",
      ":policy_templates",
    ]
  }
}