# 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. import("//build/config/c++/c++.gni") import("//build/config/chrome_build.gni") import("//build/config/features.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/config/sysroot.gni") import("//build/util/process_version.gni") import("//build/util/version.gni") import("//chrome/process_version_rc_template.gni") # For branding_file_path. import("//components/nacl/features.gni") if (current_cpu == "x86" || current_cpu == "x64") { import("//media/cdm/ppapi/cdm_paths.gni") } assert(is_linux) packaging_files_executables = [ "$root_out_dir/chrome", "$root_out_dir/chrome_sandbox", ] packaging_files_shlibs = [] if (enable_nacl) { packaging_files_executables += [ "$root_out_dir/nacl_helper", "$root_out_dir/nacl_helper_bootstrap", ] if (current_cpu == "x86") { packaging_files_executables += [ "$root_out_dir/nacl_irt_x86_32.nexe" ] } else if (current_cpu == "x64") { packaging_files_executables += [ "$root_out_dir/nacl_irt_x86_64.nexe" ] } else if (current_cpu == "arm") { packaging_files_executables += [ "$root_out_dir/nacl_irt_arm.nexe" ] } else if (current_cpu == "mipsel") { packaging_files_executables += [ "$root_out_dir/nacl_irt_mips32.nexe" ] } } # The widevine BUILD.gn only produces shared libraries for x86 and x64 if (is_chrome_branded && (current_cpu == "x86" || current_cpu == "x64")) { packaging_files_shlibs += [ "$root_out_dir/$widevine_cdm_path/libwidevinecdmadapter.so", "$root_out_dir/$widevine_cdm_path/libwidevinecdm.so", ] } if (!libcpp_is_static && use_custom_libcxx) { packaging_files_shlibs += [ "$root_out_dir/libc++.so" ] } packaging_files_binaries = packaging_files_executables + packaging_files_shlibs # TODO(mmoss) Any convenient way to get all the relevant build files? # (e.g. all locales, resources, etc.) packaging_files = packaging_files_binaries + [ "$root_out_dir/xdg-mime", "$root_out_dir/xdg-settings", "$root_out_dir/locales/en-US.pak", ] action_foreach("calculate_deb_dependencies") { deps = [ ":installer_deps", ] script = "debian/calculate_package_deps.py" sources = packaging_files_binaries inputs = [ "debian/deb_version.py", "debian/dist_package_versions.json", "debian/package_version_interval.py", ] outputs = [ "$root_out_dir/deb_{{source_name_part}}.deps", ] args = [ "{{source}}", rebase_path(sysroot, root_build_dir), target_cpu, "deb_{{source_name_part}}.deps", ] if (is_desktop_linux && target_cpu == "x64") { args += [ "--distro-check" ] } } action("merge_deb_dependencies") { deps = [ ":calculate_deb_dependencies", ] script = "debian/merge_package_versions.py" additional_deps = "debian/additional_deps" inputs = [ additional_deps, "debian/deb_version.py", "debian/package_version_interval.py", ] outputs = [ "$root_out_dir/deb_common.deps", ] args = [ "deb_common.deps", rebase_path(additional_deps, root_build_dir), ] args += rebase_path(get_target_outputs(":calculate_deb_dependencies"), root_build_dir) } action_foreach("calculate_rpm_dependencies") { deps = [ ":installer_deps", ] script = "rpm/calculate_package_deps.py" sources = packaging_files_binaries inputs = [ "rpm/dist_package_provides.json", ] outputs = [ "$root_out_dir/rpm_{{source_name_part}}.deps", ] args = [ "{{source}}", "rpm_{{source_name_part}}.deps", ] args += rebase_path(packaging_files_shlibs, root_build_dir) if (is_desktop_linux && target_cpu == "x64") { args += [ "--distro-check" ] } } action("merge_rpm_dependencies") { deps = [ ":calculate_rpm_dependencies", ] script = "rpm/merge_package_deps.py" additional_deps = "rpm/additional_deps" inputs = [ additional_deps, ] outputs = [ "$root_out_dir/rpm_common.deps", ] args = [ "rpm_common.deps", rebase_path(additional_deps, root_build_dir), ] args += rebase_path(get_target_outputs(":calculate_rpm_dependencies"), root_build_dir) } action("strip_chrome_binary") { prog_name = "$root_out_dir/chrome" debug_file = prog_name + ".debug" stripped_file = prog_name + ".stripped" deps = [ "//chrome", ] script = "//build/gn_run_binary.py" sources = [ prog_name, ] outputs = [ debug_file, stripped_file, ] args = [ rebase_path("//third_party/eu-strip/bin/eu-strip", root_build_dir), "-o", rebase_path(stripped_file, root_build_dir), "-f", rebase_path(debug_file, root_build_dir), rebase_path(prog_name, root_build_dir), ] } # This target builds all "normal" Linux installers. # # The bot setup is to build stable, unstable, and beta packages for the current # build. Then a later step picks up the package corresponding to what the # current build is supposed to be. This is wasteful since one build will only # be one of these. # # TODO it would be much nicer to have a build variable so the bot can tell us # what the current build should be, so we only have to make one .deb/.rpm pair. # # # TO BUILD LINUX INSTALLER PACKAGES # # The packages list the exact versions of each library used. The versions used # on the bots are likely different than those on your workstation, so you'll # get a stream of errors like: # < libasound2 (>= 1.0.23) # --- # > libasound2 (>= 1.0.16) # # To avoid these warnings for testing purposes, do: # # export IGNORE_DEPS_CHANGES=1 # # before you build. group("linux") { deps = [ ":beta", ":stable", ":unstable", ] } branding_dir = "//chrome/app/theme/$branding_path_component" branding_dir_100 = "//chrome/app/theme/default_100_percent/$branding_path_component" copy("common_packaging_files") { visibility = [ ":*" ] sources = [ "//chrome/app/resources/manpage.1.in", "common/apt.include", "common/default-app-block.template", "common/default-app.template", "common/desktop.template", "common/installer.include", "common/postinst.include", "common/prerm.include", "common/repo.cron", "common/rpm.include", "common/rpmrepo.cron", "common/symlinks.include", "common/variables.include", "common/wrapper", ] if (is_chrome_branded) { sources += [ "common/google-chrome/google-chrome.appdata.xml.template", "common/google-chrome/google-chrome.info", ] } else { sources += [ "common/chromium-browser/chromium-browser.appdata.xml", "common/chromium-browser/chromium-browser.info", ] } sources += [ "//third_party/eu-strip/bin/eu-strip" ] outputs = [ "$root_out_dir/installer/common/{{source_file_part}}", ] } copy("deb_packaging_files") { visibility = [ ":*" ] sources = [ "debian/build.sh", "debian/changelog.template", "debian/control.template", "debian/debian.menu", "debian/postinst", "debian/postrm", "debian/prerm", ] outputs = [ "$root_out_dir/installer/debian/{{source_file_part}}", ] } copy("theme_files") { visibility = [ ":*" ] sources = [ "$branding_dir/BRANDING", "$branding_dir/linux/product_logo_32.xpm", "$branding_dir/product_logo_128.png", "$branding_dir/product_logo_22.png", "$branding_dir/product_logo_24.png", "$branding_dir/product_logo_256.png", "$branding_dir/product_logo_48.png", "$branding_dir/product_logo_64.png", "$branding_dir_100/product_logo_16.png", "$branding_dir_100/product_logo_32.png", ] if (is_chrome_branded) { sources += [ "$branding_dir/linux/product_logo_32_beta.xpm", "$branding_dir/linux/product_logo_32_dev.xpm", "$branding_dir/product_logo_128_beta.png", "$branding_dir/product_logo_128_dev.png", "$branding_dir/product_logo_22_beta.png", "$branding_dir/product_logo_22_dev.png", "$branding_dir/product_logo_24_beta.png", "$branding_dir/product_logo_24_dev.png", "$branding_dir/product_logo_256_beta.png", "$branding_dir/product_logo_256_dev.png", "$branding_dir/product_logo_48_beta.png", "$branding_dir/product_logo_48_dev.png", "$branding_dir/product_logo_64_beta.png", "$branding_dir/product_logo_64_dev.png", "$branding_dir_100/product_logo_16_beta.png", "$branding_dir_100/product_logo_16_dev.png", "$branding_dir_100/product_logo_32_beta.png", "$branding_dir_100/product_logo_32_dev.png", ] } outputs = [ "$root_out_dir/installer/theme/{{source_file_part}}", ] } if (!is_chromeos) { copy("rpm_packaging_files") { visibility = [ ":*" ] sources = [ "rpm/build.sh", "rpm/chrome.spec.template", ] outputs = [ "$root_out_dir/installer/rpm/{{source_file_part}}", ] } } process_version("save_build_info") { # Just output the default version info variables (no template). process_only = true sources = [ "//build/util/LASTCHANGE", "//chrome/VERSION", branding_file_path, ] output = "$root_out_dir/installer/version.txt" } # Dependencies for all Linux installer targets. group("installer_deps") { # Though many of these things appear in data_deps further down the # dependency chain, they must appear here as public_deps so that they can # be listed as inputs to the actions that depend on ":installer_deps" # and are guaranteed to have been built before those actions run. public_deps = [ ":common_packaging_files", ":deb_packaging_files", ":save_build_info", ":strip_chrome_binary", ":theme_files", "//chrome", "//chrome:packed_resources", "//sandbox/linux:chrome_sandbox", ] if (enable_nacl) { public_deps += [ "//components/nacl/loader:nacl_helper", # These are data_deps of nacl_helper, but that is not enough, # as explained above. "//native_client/src/trusted/service_runtime/linux:bootstrap", "//ppapi/native_client:irt", ] } if (current_cpu == "x86" || current_cpu == "x64") { public_deps += [ "//third_party/widevine/cdm:widevinecdm", "//third_party/widevine/cdm:widevinecdmadapter", ] } if (!is_chromeos) { public_deps += [ ":rpm_packaging_files" ] } if (!libcpp_is_static && use_custom_libcxx) { public_deps += [ "//buildtools/third_party/libc++:libc++" ] } } # Creates .deb and .rpm (RPM for non-ChromeOS only) installer packages. # # channel: # Name of the channel. template("linux_package") { assert(defined(invoker.channel)) channel = invoker.channel if (current_cpu == "x86") { # The shell scripts use "ia32" instead of "x86". build_script_arch = "ia32" } else { build_script_arch = current_cpu } deb_target_name = "${target_name}_deb" action(deb_target_name) { visibility = [ ":*" ] script = "//build/gn_run_binary.py" if (current_cpu == "x86") { deb_arch = "i386" } else if (current_cpu == "x64") { deb_arch = "amd64" } else if (current_cpu == "arm") { deb_arch = "arm" } else if (current_cpu == "mipsel") { deb_arch = "mipsel" } else { assert(false, "Linux installer not configured for this architecture.") } inputs = packaging_files if (is_chrome_branded) { package = "google-chrome" } else { package = "chromium-browser" } outputs = [ "$root_out_dir/${package}-${channel}_${chrome_version_full}-1_${deb_arch}.deb", ] args = [ rebase_path("$root_out_dir/installer/debian/build.sh", root_build_dir), "-a", build_script_arch, "-b", rebase_path(root_out_dir, root_build_dir), "-c", invoker.channel, "-d", branding_path_component, "-o", rebase_path(root_out_dir, root_build_dir), "-s", rebase_path(sysroot, root_build_dir), ] if (is_official_build) { args += [ "-f" ] } deps = [ ":installer_deps", ":merge_deb_dependencies", ] } if (!is_chromeos) { rpm_target_name = "${target_name}_rpm" action(rpm_target_name) { visibility = [ ":*" ] script = "//build/gn_run_binary.py" if (current_cpu == "x86") { rpm_arch = "i386" } else if (current_cpu == "x64") { rpm_arch = "x86_64" } else if (current_cpu == "arm") { rpm_arch = "arm" } else if (current_cpu == "mipsel") { rpm_arch = "mipsel" } else { assert(false, "Linux installer not configured for this architecture.") } inputs = packaging_files if (is_chrome_branded) { package = "google-chrome" } else { package = "chromium-browser" } outputs = [ "$root_out_dir/${package}-${channel}-${chrome_version_full}-1.${rpm_arch}.rpm", ] args = [ rebase_path("$root_out_dir/installer/rpm/build.sh", root_build_dir), "-a", build_script_arch, "-b", rebase_path(root_out_dir, root_build_dir), "-c", invoker.channel, "-d", branding_path_component, "-o", rebase_path(root_out_dir, root_build_dir), ] if (is_official_build) { args += [ "-f" ] } deps = [ ":installer_deps", ":merge_rpm_dependencies", ] } } group(target_name) { deps = [ ":$deb_target_name", ] if (!is_chromeos) { deps += [ ":$rpm_target_name" ] } } } # Standard packages. linux_package("stable") { channel = "stable" } linux_package("beta") { channel = "beta" } linux_package("unstable") { channel = "unstable" }