# Copyright (c) 2017 The Brave Authors. All rights reserved. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at https://mozilla.org/MPL/2.0/. import( "//brave/browser/brave_vpn/win/brave_vpn_wireguard_service/allowlist.gni") import("//brave/build/config.gni") import("//brave/build/redirect_cc.gni") import("//brave/components/brave_vpn/common/buildflags/buildflags.gni") import("//brave/tools/crates/build_crate.gni") import("//build/config/locales.gni") import("//build/config/zip.gni") import("//chrome/browser/buildflags.gni") import("//extensions/buildflags/buildflags.gni") import("//media/media_options.gni") import("//third_party/icu/config.gni") import("//third_party/widevine/cdm/widevine.gni") import("//tools/grit/repack.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") import("//ui/base/ui_features.gni") if (enable_library_cdms) { import("//media/cdm/library_cdm/cdm_paths.gni") } if (!is_ios) { import("//brave/brave_paks.gni") } if (is_mac) { import("//brave/build/mac/tweak_info_plist.gni") import("//build/config/mac/rules.gni") } if (is_win) { import("//brave/build/win/sign.gni") } if (is_linux) { import("//brave/build/linux/channels.gni") } declare_args() { audit_dev_deps = true } chromium_unit_tests_deps = [ "//base:base_unittests", "//net:net_unittests", ] if (!is_ios) { chromium_unit_tests_deps += [ "//chrome/test:unit_tests" ] } if (use_blink && !is_android) { # TODO(https://github.com/brave/brave-browser/issues/48062): Fix this target # for android. chromium_unit_tests_deps += [ "//content/test:content_unittests" ] } if (!is_android) { # TODO(https://github.com/brave/brave-browser/issues/48062): Fix this target # for android. chromium_unit_tests_deps += [ "//components:components_unittests" ] } group("chromium_unit_tests") { testonly = true data_deps = chromium_unit_tests_deps write_file("$root_out_dir/chromium_unit_tests.json", chromium_unit_tests_deps, "json") } # Only add tests to this list if you want them to run by default for # brave_all_unit_tests. brave_all_unit_tests_deps = [ "//brave/components:brave_components_unittests" ] if (!is_ios) { brave_all_unit_tests_deps += [ "//brave/test:brave_unit_tests" ] } else { brave_all_unit_tests_deps += [ "//brave/ios/testing:ios_brave_unit_tests", "//brave/ios/web:ios_brave_web_inttests", "//brave/ios/web:ios_brave_web_unittests", ] } if (!is_ios && !is_android) { brave_all_unit_tests_deps += [ "//brave/test:brave_installer_unittests" ] } if (is_win || is_mac || is_linux) { brave_all_unit_tests_deps += [ "//brave/updater:brave_updater_unittests" ] } if (is_win) { # These tests are especially important while we are maintaining the delta # update logic ourselves. See github.com/brave/brave-core/pull/31937. brave_all_unit_tests_deps += [ "//chrome/installer/setup:setup_unittests", "//chrome/installer/util:installer_util_unittests", ] } # This group is for unit tests that run as part of brave_all_unit_tests. Other # tests that you only want to build should be added directly to `all` group group("brave_all_unit_tests") { testonly = true data_deps = brave_all_unit_tests_deps write_file("$root_out_dir/brave_all_unit_tests.json", brave_all_unit_tests_deps, "json") } # This target serves as a canonical place to define all code that has to be # buildable in all platforms in a single build run. group("all") { testonly = true deps = [ ":brave_all_unit_tests", ":chromium_unit_tests", "//brave", ] if (!is_android && !is_ios) { deps += [ "//brave/test:brave_interactive_ui_tests", "//brave/test:brave_network_audit_tests", "//chrome/test:browser_tests", ] } if (toolkit_views) { deps += [ "//ui/views/examples:views_examples" ] } if (!is_ios) { deps += [ "//brave/test:brave_browser_tests" ] } if (is_android) { deps += [ "//brave/build/android:brave", "//brave/test:brave_java_unit_tests", "//brave/test:brave_junit_tests", ] } } if (!is_ios) { group("child_dependencies") { deps = [ "common", "//brave/renderer", "//brave/utility", ] } group("browser_dependencies") { deps = [ "browser", "chromium_src/chrome/app", "common", "//components/omnibox/common", "//services/device/public/cpp:device_features", "//services/network/public/cpp", ] data_deps = [ ":unpacked_resources" ] if (!is_ios) { deps += [ ":packed_resources" ] } } group("storybook") { deps = [ "//brave/.storybook:storybook" ] } } if (is_win) { packed_files_rc_file = "$root_out_dir/gen/chrome/installer/mini_installer/packed_delta_files.rc" action("delta_installer_archive") { script = "//brave/tools/win/create_delta_archive.py" if (skip_signing) { setup_exe = "setup.exe" } else { setup_exe = "presigned_binaries/setup.exe" } inputs = [ # The original tool for delta archive generation was called "courgette". # But it runs out of memory on recent Chromium / Brave revisions. Its # drop-in replacement is Zucchini. We need to use its 64-bit version to # again prevent out of memory errors. "$root_out_dir/zucchini64.exe", "$root_out_dir/chrome.7z", "$root_out_dir/" + setup_exe, ] outputs = [ "$root_out_dir/chrome_patch.diff", "$root_out_dir/chrome_patch.packed.7z", "$root_out_dir/setup_patch.diff", "$root_out_dir/setup_patch.packed.7z", packed_files_rc_file, ] deps = [ "//chrome/installer/mini_installer:mini_installer_archive", "//chrome/installer/setup", "//components/zucchini:zucchini64", ] if (!skip_signing) { deps += [ ":signed_setup_exe" ] } args = [ "zucchini64.exe", "$last_chrome_installer/chrome.7z", "chrome.7z", "$last_chrome_installer/setup.exe", setup_exe, "chrome_patch.diff", "chrome_patch.packed.7z", "setup_patch.diff", "setup_patch.packed.7z", rebase_path(packed_files_rc_file, root_build_dir), ] if (is_component_build) { args += [ "--is_component_build" ] } } if (!skip_signing) { sign("signed_setup_exe") { sources = [ "$root_out_dir/setup.exe" ] outputs = [ "$root_out_dir/presigned_binaries/setup.exe" ] deps = [ "//chrome/installer/setup" ] } sign("signed_brave_exe") { sources = [ "$root_out_dir/brave.exe" ] outputs = [ "$root_out_dir/presigned_binaries/brave.exe" ] deps = [ "//brave/build/win:copy_exe" ] } sign("signed_chrome_dll") { sources = [ "$root_out_dir/chrome.dll" ] outputs = [ "$root_out_dir/presigned_binaries/chrome.dll" ] deps = [ "//chrome:chrome_dll" ] } } group("mini_installer_dependencies") { deps = [ ":brave" ] if (!skip_signing) { deps += [ ":signed_brave_exe", ":signed_chrome_dll", ":signed_setup_exe", ] if (enable_widevine && enable_cdm_host_verification) { deps += [ "//brave/browser/widevine:brave_exe_sig", "//brave/browser/widevine:chrome_dll_sig", ] } } } } group("brave") { deps = [ "build/$target_os:brave" ] if (!is_android && !is_ios) { deps += [ "//brave/components/version_info:generate_version", "//chrome", ] } } group("resources") { public_deps = [ # TODO(bridiver) # "//brave/browser:resources", # "//brave/common:resources", # "//brave/renderer:resources", "//brave/components/resources", ] data_deps = [ "//brave/components/resources:about_credits" ] } if (is_android) { android_assets("brave_file_assets") { sources = [ "//brave/LICENSE.html", "//brave/android/java/org/chromium/chrome/browser/ntp/ntp_news_optin_icon_animation.json", "//brave/android/java/org/chromium/chrome/browser/onboarding/animations/onboarding_ads.json", "//brave/android/java/org/chromium/chrome/browser/onboarding/animations/onboarding_ads_notification.json", "//brave/android/java/org/chromium/chrome/browser/onboarding/animations/onboarding_rewards.json", "//brave/android/java/org/chromium/chrome/browser/onboarding/animations/privacy_protection.json", "//brave/android/java/org/chromium/chrome/browser/onboarding/animations/save_data_and_battery.json", "//brave/android/java/org/chromium/chrome/browser/onboarding/animations/website_loads_faster.json", "//brave/android/java/org/chromium/chrome/browser/vpn/brave_vpn_confirm.json", "//brave/browser/brave_shields/android/java/src/org/chromium/chrome/browser/brave_shields/brave_first_party_storage_clean_animation.json", ] disable_compression = false } android_assets("brave_pak_assets") { sources = [ "$root_out_dir/brave_resources.pak" ] deps = [ "//brave:brave_file_assets", "//brave:packed_resources_extra", ] disable_compression = true } } if (is_mac) { group("framework_bundle_data") { deps = [ "components/brave_extension/extension/brave_extension:brave_extension_framework_bundle_data" ] } } group("unpacked_resources") { if (!is_mac) { deps = [] if (enable_extensions) { deps = [ "//brave/components/brave_extension/extension/brave_extension:locales", ] } } } #TODO(bridiver) - what to do if (!is_ios) { group("brave_tests") { testonly = true deps = [ "test:brave_unit_tests" ] if (!is_android) { deps += [ "test:brave_browser_tests", "test:brave_interactive_ui_tests", "test:brave_network_audit_tests", ] } if (use_libfuzzer) { deps += [ "//brave/fuzzers:brave_fuzzers" ] } } } if (!is_ios) { brave_paks("packed_resources") { if (is_mac) { output_dir = "$root_gen_dir/repack" copy_data_to_bundle = true } else { output_dir = root_out_dir } } } branding_dir = "//chrome/app/theme/$branding_path_component" branding_dir_100 = "//chrome/app/theme/default_100_percent/$branding_path_component" copy("theme_files") { visibility = [ ":*" ] if (is_linux) { sources = [ "$branding_dir/linux/product_logo_128_beta.png", "$branding_dir/linux/product_logo_128_development.png", "$branding_dir/linux/product_logo_128_nightly.png", "$branding_dir/linux/product_logo_24_beta.png", "$branding_dir/linux/product_logo_24_nightly.png", "$branding_dir/linux/product_logo_256_beta.png", "$branding_dir/linux/product_logo_256_nightly.png", "$branding_dir/linux/product_logo_48_beta.png", "$branding_dir/linux/product_logo_48_nightly.png", "$branding_dir/linux/product_logo_64_beta.png", "$branding_dir/linux/product_logo_64_nightly.png", "$branding_dir_100/linux/product_logo_16_beta.png", "$branding_dir_100/linux/product_logo_16_dev.png", "$branding_dir_100/linux/product_logo_16_nightly.png", "$branding_dir_100/linux/product_logo_32_beta.png", "$branding_dir_100/linux/product_logo_32_dev.png", "$branding_dir_100/linux/product_logo_32_nightly.png", ] # Dev channel resources only exist for brave, not brave_origin if (branding_path_component == "brave") { sources += [ "$branding_dir/linux/product_logo_128_dev.png", "$branding_dir/linux/product_logo_24_dev.png", "$branding_dir/linux/product_logo_256_dev.png", "$branding_dir/linux/product_logo_48_dev.png", "$branding_dir/linux/product_logo_64_dev.png", ] } } else { sources = [ "$branding_dir/product_logo_128_beta.png", "$branding_dir/product_logo_128_development.png", "$branding_dir/product_logo_128_nightly.png", ] # Dev channel resources only exist for brave, not brave_origin if (branding_path_component == "brave") { sources += [ "$branding_dir/product_logo_128_dev.png" ] } } outputs = [ "$root_out_dir/installer/theme/{{source_file_part}}" ] } group("create_dist") { deps = [] if (is_android) { if (android_aab_to_apk && target_cpu == "arm64") { deps += [ "build/android:sign_app_convert_aab_to_apk" ] } else { deps += [ "build/android:sign_app" ] } } else { deps += [ ":create_symbols_dist" ] } # for linux zip will be created along with installer if (!is_linux) { deps += [ ":create_dist_zips" ] } if (is_win) { deps += [ "//brave/build/win:create_signed_installer", "//brave/components/policy:pack_policy_templates", ] if (build_omaha) { deps += [ "//brave/vendor/omaha" ] } if (last_chrome_installer != "") { deps += [ "//brave/build/win:signed_delta_installer" ] } } if (is_mac) { deps += [ "//brave/build/mac:create_dist_mac" ] } if (is_linux) { deps += [ ":theme_files", "//brave/app/linux:dist_resources", "//chrome/installer/linux:$linux_channel", ] } } if (!is_mac && !is_android && !is_ios) { copy("brave_locale_dist_resources") { deps = [ "//chrome:packed_resources" ] sources = [] foreach(locale, platform_pak_locales) { sources += [ "$root_out_dir/locales/$locale.pak" ] } outputs = [ "$brave_dist_dir/locales/{{source_file_part}}" ] } if (enable_extensions) { group("brave_extensions_locale_dist_resources") { deps = [ "//brave/components/brave_extension/extension/brave_extension:locales", ] public_deps = [] foreach(locale, platform_pak_locales) { # public_deps is used intentionaly because ":create_dist_zip" needs the all dependency # of all locale files. public_deps += [ ":brave_shields_locales_${locale}" ] } } foreach(locale, platform_pak_locales) { copy("brave_shields_locales_${locale}") { deps = [ "//brave/components/brave_extension/extension/brave_extension:locales_$locale" ] locale = string_replace(locale, "-", "_") sources = [ "$root_out_dir/resources/brave_extension/_locales/$locale/messages.json" ] outputs = [ "$brave_dist_dir/resources/brave_extension/_locales/$locale/{{source_file_part}}" ] } } } } copy("brave_license_dist_resources") { sources = [ "//brave/LICENSE" ] outputs = [ "$brave_dist_dir/{{source_file_part}}" ] } if (!is_android && !is_ios) { copy("brave_dist_resources") { sources = [ "$root_out_dir/version" ] deps = [ ":brave", ":brave_license_dist_resources", ":packed_resources", "build/$target_os:brave", "//brave/components/version_info:generate_version", "//chrome:packed_resources", "//third_party/icu:icudata", ] if (!is_mac) { sources += [ "$root_out_dir/$brave_exe", "$root_out_dir/brave_100_percent.pak", "$root_out_dir/brave_200_percent.pak", "$root_out_dir/brave_resources.pak", "$root_out_dir/chrome_100_percent.pak", "$root_out_dir/chrome_200_percent.pak", "$root_out_dir/icudtl.dat", "$root_out_dir/resources.pak", ] if (v8_use_external_startup_data) { deps += [ "//v8" ] if (use_v8_context_snapshot) { sources += [ "$root_out_dir/v8_context_snapshot.bin" ] deps += [ "//tools/v8_context_snapshot" ] } else { sources += [ "$root_out_dir/snapshot_blob.bin" ] } } } outputs = [ "$brave_dist_dir/{{source_file_part}}" ] } } if (target_cpu == "x86") { target_arch = "ia32" } else { target_arch = target_cpu } template("create_dist_template") { action(target_name) { inputs = get_target_outputs(":brave_license_dist_resources") file_inputs = [] foreach(input, inputs) { file_inputs += [ rebase_path(input, brave_dist_dir) ] } rebase_base_dir = rebase_path(brave_dist_dir) outputs = [ invoker.output ] rebase_output = rebase_path(invoker.output) dir_inputs = invoker.dir_inputs script = "//brave/script/create-dist.py" deps = [ ":brave_license_dist_resources" ] if (defined(invoker.deps)) { deps += invoker.deps } args = [ "--base-dir=$rebase_base_dir", "--inputs=$file_inputs", "--dir-inputs=$dir_inputs", "--output=$rebase_output", ] } } if (should_generate_symbols) { create_dist_template("create_brave_symbols_dist") { if (is_android) { # TODO(https://github.com/brave/brave-browser/issues/51200) # Cleanup Mono once cr144 reaches stable channel, CI also needs to be updated output = "$brave_dist_dir/$brave_dist_name-v$brave_version-$brave_platform-mono-$target_cpu-symbols-$target_android_output_format.zip" } else { output = "$brave_dist_dir/$brave_dist_name-v$brave_version-$brave_platform-$target_arch-symbols.zip" } deps = [ "//brave/app/$current_os:symbol_dist_resources" ] if (is_win) { dir_inputs = [ "$brave_product_name.syms" ] } else { dir_inputs = [ "$brave_product_name.breakpad.syms" ] } } if (is_mac) { copy("create_native_symbols_dist") { sources = [ "$root_out_dir/$chrome_product_full_name.dSYM.tar.bz2" ] outputs = [ "$brave_dist_dir/$brave_dist_name-v$brave_version-$brave_platform-$target_arch-native-symbols.tar.bz2" ] deps = [ "//chrome:chrome_dsym_archive" ] } } else { group("create_native_symbols_dist") { } } } group("create_symbols_dist") { # Currently on some platforms (Android, Linux) this target generate more # than just symbols, so always depend on it. public_deps = [ "//brave/app/$current_os:symbol_dist_resources" ] if (should_generate_symbols) { public_deps += [ ":create_brave_symbols_dist", ":create_native_symbols_dist", ] } } action("create_dist_zips") { output = "$brave_dist_dir/$brave_dist_name-v$brave_version-$brave_platform-$target_arch.zip" outputs = [ output ] if (is_win) { # Repack a Chrome release archive to the Brave format. # Besides changing from 7z to zip, the directory structure is a bit different. # TODO(atuchin): support other platforms. script = "//brave/script/repack-archive.py" deps = [ "//chrome/installer/mini_installer:mini_installer_archive" ] input = "$root_out_dir/chrome.7z" inputs = [ input ] args = [ "--input=" + rebase_path(input), "--output=" + rebase_path(output), "--target_dir=Chrome-bin", ] } else { # !is_win script = "//brave/script/create-dist.py" inputs = [] deps = [ "app/$current_os:dist_resources" ] if (!is_mac) { inputs += get_target_outputs(":brave_license_dist_resources") deps += [ ":brave_license_dist_resources" ] } if (!is_mac && !is_android && !is_ios) { inputs += get_target_outputs(":brave_dist_resources") inputs += get_target_outputs(":brave_locale_dist_resources") if (enable_extensions) { foreach(locale, platform_pak_locales) { inputs += get_target_outputs(":brave_shields_locales_${locale}") } } } file_inputs = [] foreach(input, inputs) { file_inputs += [ rebase_path(input, brave_dist_dir) ] } dir_inputs = [] if (is_mac) { dir_inputs += [ brave_exe ] rebase_base_dir = rebase_path(root_out_dir) deps += [ "//chrome:chrome_app" ] } else { rebase_base_dir = rebase_path(brave_dist_dir, root_out_dir) } if (!is_mac && !is_android && !is_ios) { deps += [ ":brave_dist_resources", ":brave_locale_dist_resources", ] if (enable_extensions) { deps += [ ":brave_extensions_locale_dist_resources" ] } } rebase_output = rebase_path(output) args = [ "--base-dir=$rebase_base_dir", "--inputs=$file_inputs", "--dir-inputs=$dir_inputs", "--output=$rebase_output", ] } # !is_win } if (is_mac) { group("brave_app") { deps = [ ":brave_app_plist" ] } brave_tweak_info_plist("brave_app_plist") { info_plist = "$root_gen_dir/chrome/chrome_app_plist_tweaked.plist" args = [ "--brave_channel=" + brave_channel, "--brave_product_dir_name=" + brave_product_dir_name, "--brave_version=" + brave_version, "--brave_eddsa_key=" + sparkle_eddsa_public_key, ] if (skip_signing) { args += [ "--skip_signing" ] } if (enable_updater) { args += [ "--enable_updater" ] } deps = [ "//chrome:chrome_app_plist" ] } brave_tweak_info_plist("brave_helper_plist") { info_plist = "$root_gen_dir/chrome/chrome_helper_plist_tweaked.plist" args = [ "--brave_channel=" + brave_channel, "--brave_product_dir_name=" + brave_product_dir_name, "--brave_version=" + brave_version, ] deps = [ "//chrome:chrome_helper_plist" ] } } if (current_toolchain == host_toolchain) { action("audit_deps") { script = "//brave/script/audit_deps.py" output = "$target_gen_dir/audit_deps.json" deps = [ "//brave/tools/crates:cargo-audit" ] # Action must have outputs, and these outputs must be created, otherwise # SISO will fail. outputs = [ output ] args = [ "--source_root=" + rebase_path("//brave"), "--cargo_audit_exe=" + rebase_path("$root_build_dir/cargo-audit$host_exe_suffix"), "--output=" + rebase_path(output), ] if (audit_dev_deps) { args += [ "--audit_dev_deps" ] } } } if (is_redirect_cc_build) { group("redirect_cc") { deps = [ "//brave/tools/redirect_cc" ] } } if (is_win && enable_resource_allowlist_generation) { # Merge chrome_resource_allowlist and wireguard resources allowlist to keep # wireguard resources in pak files. When VPN is disabled, just copy the chrome # allowlist. if (enable_brave_vpn) { action("merge_allowlists") { deps = [ "//brave/browser/brave_vpn/win/brave_vpn_wireguard_service:wireguard_resource_allowlist", "//chrome:resource_allowlist", ] script = "//brave//resources/brave_allowlist.py" source_allowlist = "$root_gen_dir/chrome/chrome_resource_allowlist.txt" args = [ "--repack_allowlist", rebase_path(source_allowlist, root_build_dir), "--brave_allowlist", rebase_path(wireguard_resource_allowlist_file, root_build_dir), "--output", rebase_path(brave_allowlist_file, root_build_dir), ] outputs = [ brave_allowlist_file ] } } else { # When VPN is disabled, just copy the chrome resource allowlist. copy("merge_allowlists") { deps = [ "//chrome:resource_allowlist" ] sources = [ "$root_gen_dir/chrome/chrome_resource_allowlist.txt" ] outputs = [ brave_allowlist_file ] } } }