# Copyright 2019 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/compile_plist.gni")
import("//build/apple/tweak_info_plist.gni")
import("//build/config/mac/rules.gni")
import("//build/config/python.gni")
import("//build/symlink.gni")
import("//build/util/process_version.gni")
import("//chrome/updater/branding.gni")
import("//chrome/updater/mac/signing/signing_sources.gni")
import("//chrome/updater/zip.gni")
import("//chrome/version.gni")
group("mac") {
deps = [
":browser_install_script",
":launcher",
":launcher_test",
":privileged_helper",
":updater_bundle",
":updater_bundle_test",
":updater_install_script",
":updater_zip",
"//chrome/updater/mac/installer:metainstaller",
"//chrome/updater/mac/signing",
]
if (!is_component_build && enable_dsyms) {
deps += [ ":syms_archive" ]
}
}
tweak_info_plist("updater_plist") {
info_plist = "Info.plist"
}
mac_info_plist("launcher_plist") {
info_plist = "Info.plist"
executable_name = "launcher"
extra_substitutions =
[ "MAC_BUNDLE_IDENTIFIER=$mac_updater_bundle_identifier" ]
}
mac_app_bundle("updater_bundle") {
info_plist_target = ":updater_plist"
output_name = updater_product_full_name
extra_substitutions =
[ "MAC_BUNDLE_IDENTIFIER=$mac_updater_bundle_identifier" ]
sources = [ "main.cc" ]
public_deps = [
":keystone_agent_bundle_resource_executable",
":keystone_agent_bundle_resource_plist",
":ksadmin",
":ksadmin_link",
":updater_bundle_helpers",
":updater_bundle_keystone_executable",
":updater_bundle_keystone_helpers_ksinstall",
":updater_bundle_keystone_plist",
]
deps = [
"//chrome/updater:base",
"//chrome/updater:constants_prod",
]
}
mac_app_bundle("updater_bundle_test") {
info_plist_target = ":updater_plist"
output_name = updater_product_full_name + "_test"
extra_substitutions =
[ "MAC_BUNDLE_IDENTIFIER=$mac_updater_bundle_identifier" ]
sources = [ "main.cc" ]
public_deps = [
":keystone_agent_bundle_resource_executable_test",
":keystone_agent_bundle_resource_plist",
":ksadmin_test_copy",
":updater_bundle_helpers_test",
":updater_bundle_keystone_executable",
":updater_bundle_keystone_helpers_ksinstall",
":updater_bundle_keystone_plist",
]
if (is_asan) {
public_deps +=
[ ":keystone_agent_bundle_resource_executable_test_asan_dylib" ]
}
deps = [
"//chrome/updater:base",
"//chrome/updater:constants_test",
]
}
source_set("privileged_helper_sources") {
sources = [
"privileged_helper/server.h",
"privileged_helper/server.mm",
"privileged_helper/service.h",
"privileged_helper/service.mm",
"privileged_helper/service_protocol.h",
]
deps = [
":helper_header",
"//base",
"//chrome/updater:base",
"//chrome/updater:branding_header",
]
}
compile_plist("priviledged_info_plist") {
plist_templates = [ "privileged_helper/Info.plist" ]
format = "xml1"
substitutions = [
"UPDATER_HELPER_BUNDLE_ID=$privileged_helper_name",
"UPDATER_HELPER_BUNDLE_NAME=$privileged_helper_bundle_name",
"BROWSER_BUNDLE_IDENTIFIER=$mac_browser_bundle_identifier",
]
output_name = "$target_gen_dir/$privileged_helper_name-Info.plist"
}
process_version("priviledged_launchd_plist") {
extra_args = [
"-e",
"UPDATER_HELPER_BUNDLE_ID=\"$privileged_helper_name\"",
]
process_only = true
template_file = "privileged_helper/launchd.plist"
output = "$target_gen_dir/$privileged_helper_name-launchd.plist"
}
process_version("helper_header") {
extra_args = [
"-e",
"UPDATER_HELPER_BUNDLE_ID=\"$privileged_helper_name\"",
]
template_file = "privileged_helper/helper_branding.h.in"
output = "$target_gen_dir/privileged_helper/helper_branding.h"
}
executable("privileged_helper") {
output_name = privileged_helper_name
sources = [ "privileged_helper/main.mm" ]
deps = [
":priviledged_info_plist",
":priviledged_launchd_plist",
":privileged_helper_sources",
"//base",
"//chrome/updater:constants_prod",
]
frameworks = [
"Foundation.framework",
"Security.framework",
]
inputs = [
"$target_gen_dir/$privileged_helper_name-Info.plist",
"$target_gen_dir/$privileged_helper_name-launchd.plist",
]
ldflags = [
"-sectcreate",
"__TEXT",
"__info_plist",
rebase_path(inputs[0], root_out_dir),
"-sectcreate",
"__TEXT",
"__launchd_plist",
rebase_path(inputs[1], root_out_dir),
]
}
action("updater_install_script") {
script = "embed_variables.py"
inputs = [
script,
"setup/.install.sh",
]
outputs = [ "$root_out_dir/chrome/updater/.install" ]
args = [
"-i",
rebase_path("setup/.install.sh"),
"-o",
rebase_path(root_out_dir + "/chrome/updater/.install"),
"-p",
updater_product_full_name,
]
}
action("updater_test_install_script") {
script = "embed_variables.py"
inputs = [
script,
"setup/.install.sh",
]
outputs = [ "$root_out_dir/.install" ]
args = [
"-i",
rebase_path("setup/.install.sh"),
"-o",
rebase_path(root_out_dir + "/.install"),
"-p",
updater_product_full_name + "_test",
]
}
action("browser_install_script") {
script = "embed_variables.py"
inputs = [
script,
".install.sh",
]
outputs = [ "$root_out_dir/$browser_product_name Packaging/updater/.install" ]
args = [
"-i",
rebase_path(".install.sh"),
"-o",
rebase_path(
root_out_dir + "/$browser_product_name Packaging/updater/.install"),
"-v",
chrome_version_full,
]
}
process_version("launcher_version") {
sources = [ "//chrome/VERSION" ]
template_file = "launcher_version.h.in"
output = "$target_gen_dir/launcher_version.h"
}
source_set("launcher_sources") {
sources = [
"launcher_constants.h",
"launcher_main.c",
]
public_deps = [
"//chrome/updater:branding_header",
"//chrome/updater/mac:launcher_version",
]
}
executable("launcher") {
output_name = "launcher"
sources = [ "launcher_constants_prod.c" ]
frameworks = [
"CoreFoundation.framework",
"Security.framework",
]
deps = [
":launcher_plist",
":launcher_sources",
]
inputs = [ "$target_gen_dir/launcher_plist.plist" ]
ldflags = [
"-sectcreate",
"__TEXT",
"__info_plist",
rebase_path(inputs[0], root_out_dir),
]
if (is_asan) {
# ASAN toolchain injects libclang_rt.asan_osx_dynamic.dylib into
# ./VERSION/GoogleUpdater.app/Contents/MacOS/. Adjust the rpaths so that
# this executable can find it.
ldflags += [
# When run from ./VERSION/GoogleUpdater.app/Contents/Helpers/launcher.
"-Wl,-rpath,@executable_path/../MacOS",
]
}
}
executable("launcher_test") {
output_name = "launcher_test"
sources = [ "launcher_constants_test.c" ]
deps = [
":launcher_plist",
":launcher_sources",
]
frameworks = [
"CoreFoundation.framework",
"Security.framework",
]
inputs = [ "$target_gen_dir/launcher_plist.plist" ]
ldflags = [
"-sectcreate",
"__TEXT",
"__info_plist",
rebase_path(inputs[0], root_out_dir),
]
if (is_asan) {
# ASAN toolchain injects libclang_rt.asan_osx_dynamic.dylib into
# ./VERSION/GoogleUpdater_test.app/Contents/MacOS/. Adjust the rpaths so
# that this executable can find it.
ldflags += [
# From ./VERSION/GoogleUpdater_test.app/Contents/Helpers/launcher.
"-Wl,-rpath,@executable_path/../MacOS",
]
}
}
source_set("ksadmin_lib") {
sources = [
"keystone/ksadmin.h",
"keystone/ksadmin.mm",
]
deps = [
"//base",
"//chrome/updater:base_app",
"//chrome/updater:ks_ticket",
"//chrome/updater:public_sources",
"//chrome/updater:version_header",
]
visibility = [
":ksadmin",
":ksadmin_test",
"//chrome/updater:updater_test_sources",
]
}
executable("ksadmin") {
output_dir = "$root_out_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers"
sources = [ "keystone/ksadmin_main.cc" ]
deps = [
":ksadmin_lib",
"//base",
"//chrome/updater:constants_prod",
]
frameworks = [ "CoreFoundation.framework" ]
if (is_asan) {
# asan injects a dylib that we package in ../MacOS.
ldflags = [ "-Wl,-rpath,@executable_path/../MacOS" ]
}
}
executable("ksadmin_test") {
sources = [ "keystone/ksadmin_main.cc" ]
deps = [
":ksadmin_lib",
"//base",
"//chrome/updater:constants_test",
]
frameworks = [ "CoreFoundation.framework" ]
if (is_asan) {
# asan injects a dylib that we package in ../MacOS.
ldflags = [ "-Wl,-rpath,@executable_path/../MacOS" ]
}
}
copy("ksadmin_test_copy") {
sources = [ "$root_out_dir/ksadmin_test" ]
outputs = [ "$root_out_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksadmin" ]
deps = [ ":ksadmin_test" ]
}
executable("ksinstall") {
output_name = "ksinstall"
sources = [
"keystone/ksinstall.h",
"keystone/ksinstall.mm",
"keystone/ksinstall_main.cc",
]
deps = [
"//base",
"//chrome/updater:base_app",
"//chrome/updater:branding_header",
"//chrome/updater:constants_prod",
"//chrome/updater:version_header",
]
frameworks = [ "CoreFoundation.framework" ]
if (is_asan) {
# asan injects a dylib that we package in ../MacOS.
ldflags = [ "-Wl,-rpath,@executable_path/../MacOS" ]
}
}
symlink("ksadmin_link") {
source = "$root_out_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksadmin"
output = "$root_out_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/MacOS/ksadmin"
deps = [ ":ksadmin" ]
}
mac_app_bundle("keystone_agent_bundle") {
info_plist = "keystone/Info.plist"
sources = [ "keystone/agent_main.cc" ]
output_name = keystone_app_name + "Agent"
extra_substitutions = [
"MAC_BUNDLE_IDENTIFIER=${keystone_bundle_identifier}.Agent",
"PACKAGE_TYPE=APPL",
]
deps = [
"//base",
"//chrome/updater:base",
"//chrome/updater:constants_prod",
]
}
mac_app_bundle("keystone_agent_bundle_test") {
info_plist = "keystone/Info.plist"
sources = [ "keystone/agent_main.cc" ]
output_name = keystone_app_name + "Agent_test"
extra_substitutions = [
"MAC_BUNDLE_IDENTIFIER=${keystone_bundle_identifier}.Agent",
"PACKAGE_TYPE=APPL",
]
deps = [
"//base",
"//chrome/updater:base",
"//chrome/updater:constants_test",
]
}
bundle_data("keystone_agent_bundle_resource_executable") {
sources = [ "$root_out_dir/${keystone_app_name}Agent.app/Contents/MacOS/${keystone_app_name}Agent" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/MacOS/{{source_file_part}}" ]
public_deps = [ ":keystone_agent_bundle" ]
if (is_asan) {
sources += [ "$root_out_dir/${keystone_app_name}Agent.app/Contents/MacOS/libclang_rt.asan_osx_dynamic.dylib" ]
}
}
bundle_data("keystone_agent_bundle_resource_executable_test") {
sources = [ "$root_out_dir/${keystone_app_name}Agent_test.app/Contents/MacOS/${keystone_app_name}Agent_test" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/MacOS/${keystone_app_name}Agent" ]
public_deps = [ ":keystone_agent_bundle_test" ]
}
if (is_asan) {
bundle_data("keystone_agent_bundle_resource_executable_test_asan_dylib") {
sources = [ "$root_out_dir/${keystone_app_name}Agent_test.app/Contents/MacOS/libclang_rt.asan_osx_dynamic.dylib" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/MacOS/{{source_file_part}}" ]
public_deps = [ ":keystone_agent_bundle_test" ]
}
}
bundle_data("keystone_agent_bundle_resource_plist") {
sources =
[ "$root_out_dir/${keystone_app_name}Agent.app/Contents/Info.plist" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/{{source_file_part}}" ]
public_deps = [ ":keystone_agent_bundle" ]
}
mac_app_bundle("keystone_bundle") {
info_plist = "keystone/Info.plist"
sources = [ "keystone/keystone_main.cc" ]
output_name = keystone_app_name
package_type = "bundle"
extra_substitutions = [
"MAC_BUNDLE_IDENTIFIER=$keystone_bundle_identifier",
"PACKAGE_TYPE=BNDL",
]
}
bundle_data("updater_bundle_keystone_executable") {
sources = [
"$root_out_dir/$keystone_app_name.bundle/Contents/MacOS/$keystone_app_name",
]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/MacOS/{{source_file_part}}" ]
public_deps = [ ":keystone_bundle" ]
if (is_asan) {
sources += [ "$root_out_dir/${keystone_app_name}.bundle/Contents/MacOS/libclang_rt.asan_osx_dynamic.dylib" ]
}
}
bundle_data("updater_bundle_keystone_plist") {
sources = [ "$root_out_dir/$keystone_app_name.bundle/Contents/Info.plist" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/{{source_file_part}}" ]
public_deps = [ ":keystone_bundle" ]
}
bundle_data("updater_bundle_keystone_helpers_ksinstall") {
sources = [ "$root_out_dir/ksinstall" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/$keystone_app_name.bundle/Contents/Helpers/{{source_file_part}}" ]
public_deps = [ ":ksinstall" ]
}
bundle_data("updater_bundle_helpers") {
sources = [ "$root_out_dir/launcher" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/{{source_file_part}}" ]
public_deps = [ ":launcher" ]
}
bundle_data("updater_bundle_helpers_test") {
sources = [ "$root_out_dir/launcher_test" ]
outputs = [ "{{bundle_contents_dir}}/Helpers/launcher" ]
public_deps = [ ":launcher_test" ]
}
if (!is_component_build && enable_dsyms) {
_symbols_sources = [
"$root_out_dir/$updater_product_full_name.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksadmin",
"$root_out_dir/$updater_product_full_name.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksinstall",
"$root_out_dir/$updater_product_full_name.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/MacOS/${keystone_app_name}Agent",
"$root_out_dir/$updater_product_full_name.app/Contents/Helpers/launcher",
"$root_out_dir/$updater_product_full_name.app/Contents/MacOS/$updater_product_full_name",
]
action_foreach("syms") {
script = "//build/redirect_stdout.py"
sources = _symbols_sources
dump_syms =
"//third_party/breakpad:dump_syms($host_system_allocator_toolchain)"
public_deps = [
":updater_bundle",
dump_syms,
]
outputs =
[ "$root_out_dir/{{source_file_part}}-$chrome_version_full.breakpad" ]
args = rebase_path(outputs, root_build_dir) + [
rebase_path(get_label_info(dump_syms, "root_out_dir") + "/" +
get_label_info(dump_syms, "name"),
root_build_dir),
"-m",
"-d",
"-g",
rebase_path(
"$root_out_dir/{{source_file_part}}.dSYM/Contents/Resources/DWARF/{{source_file_part}}",
root_build_dir),
"{{source}}",
]
}
action("syms_archive") {
script = "//chrome/tools/build/mac/archive_symbols.py"
sources = _symbols_sources
deps = [ ":syms" ]
_output = "$root_out_dir/$updater_product_full_name.dSYM.tar.bz2"
outputs = [ _output ]
args = [ rebase_path(_output, root_out_dir) ] +
rebase_path([
"$root_out_dir/$updater_product_full_name.dSYM",
"$root_out_dir/ksadmin.dSYM",
"$root_out_dir/ksinstall.dSYM",
"$root_out_dir/launcher.dSYM",
],
root_out_dir)
}
}
# The contents of this zip are uploaded by archivers (//infra/archive_config).
artifact_zip("updater_zip") {
output = "$root_build_dir/updater.zip"
inputs = [
"$root_build_dir/${updater_product_full_name}.app/Contents/Info.plist",
"$root_build_dir/${updater_product_full_name}.app/Contents/MacOS/${updater_product_full_name}",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/MacOS/$keystone_app_name",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksinstall",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksadmin",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/MacOS/ksadmin",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/MacOS/${keystone_app_name}Agent",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/Info.plist",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Info.plist",
"$root_build_dir/${updater_product_full_name}.app/Contents/Helpers/launcher",
"$root_build_dir/${updater_product_full_name}.app/Contents/PkgInfo",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Info.plist",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/MacOS/${updater_product_full_name}_test",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/MacOS/$keystone_app_name",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksinstall",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Helpers/ksadmin",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/MacOS/${keystone_app_name}Agent",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Resources/${keystone_app_name}Agent.app/Contents/Info.plist",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/$keystone_app_name.bundle/Contents/Info.plist",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/Helpers/launcher",
"$root_build_dir/${updater_product_full_name}_test.app/Contents/PkgInfo",
"$root_build_dir/Updater Packaging/sign_updater.py",
"$root_build_dir/Updater Packaging/signing/build_props_config.py",
"$root_build_dir/Updater Packaging/signing/pkg-dmg",
"$root_build_dir/Updater Packaging/signing/pkg/postinstall",
"$root_build_dir/chrome/updater/.install",
"$root_build_dir/qualification_app",
"$root_build_dir/${updater_product_full_name}Util",
]
inputs += rebase_path(get_path_info(updater_signing_sources, "file"),
"",
"$root_build_dir/Updater Packaging/signing")
deps = [
":updater_bundle",
":updater_bundle_test",
":updater_install_script",
"//chrome/updater/mac/signing",
"//chrome/updater/test/qualification_app",
"//chrome/updater/tools:${updater_product_full_name}Util",
]
}