Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1180)

Unified Diff: build/config/jumbo.gni

Issue 2963733003: Scripts for unity/jumbo (default disabled) compilation (Closed)
Patch Set: Addressed review issues. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | build/config/merge_for_jumbo.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/config/jumbo.gni
diff --git a/build/config/jumbo.gni b/build/config/jumbo.gni
new file mode 100644
index 0000000000000000000000000000000000000000..baf19f1b6bf91c39a5a3c25aded68027de6485cc
--- /dev/null
+++ b/build/config/jumbo.gni
@@ -0,0 +1,146 @@
+# Copyright 2017 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/split_static_library.gni") # When someone uses that target_type
+
+declare_args() {
+ # If true, use a jumbo build (files compiled together) to speed up
+ # compilation.
+ use_jumbo_build = false
+
+ # A target to exclude from jumbo builds, for optimal round trip time
+ # when frequently changing a single cpp file.
+ jumbo_build_excluded = ""
+
+ # How many files to group at most. Smaller numbers give more
+ # parallellism, higher numbers give less total CPU usage. Higher
+ # numbers also give longer single-file recompilation times.
+ #
+ # Recommendations:
+ # Higher numbers than 200 does not reduce wall clock compile times
+ # for 4 cores or less.
+ # 200 uses 8% less total CPU than 100 when compiling content and 10%
+ # less wall clock when compiling with 4 cores.
+ jumbo_file_merge_limit = 200
+}
+
+# Use this to generate a target which merges sources if possible to
+# compile much faster.
+#
+# Special values.
+#
+# target_type
+# The kind of target to build. For example the string
+# "static_library".
+#
+# always_build_jumbo
+# If set and set to true, then use jumbo compile even when it is
+# globally disabled. Otherwise it has no effect.
+#
+# never_build_jumbo
+# If set and set to true, then do not jumbo compile even if it is
+# globally enabled. Otherwise it has no effect.
+#
+# jumbo_excluded_sources
+# If set to a list of files, those files will not be merged with
+# the rest. This can be necessary if merging the files causes
+# compilation issues and fixing the issues is impractical.
+template("jumbo_target") {
+ use_jumbo_build_for_target = use_jumbo_build
+ if (defined(invoker.always_build_jumbo) && invoker.always_build_jumbo) {
+ use_jumbo_build_for_target = true
+ }
+ if (defined(invoker.never_build_jumbo) && invoker.never_build_jumbo) {
+ use_jumbo_build_for_target = false
+ }
+ if (target_name == jumbo_build_excluded) {
+ use_jumbo_build_for_target = false
+ }
+
+ excluded_sources = []
+ if (defined(invoker.jumbo_excluded_sources)) {
+ excluded_sources += invoker.jumbo_excluded_sources
+ }
+
+ invoker_sources = invoker.sources
+ gen_target_dir = get_path_info(invoker_sources[0], "gen_dir")
+ assert(excluded_sources != [] || true) # Prevent "unused variable".
+ assert(gen_target_dir != "") # Prevent "unused variable".
+
+ if (use_jumbo_build_for_target) {
+ jumbo_files = []
+
+ # Split the sources list into chunks that are not excessively large
+ files_per_chunk = jumbo_file_merge_limit
+ current_file_index = 0
+ next_chunk_start = 0
+ next_chunk_number = 1
+ foreach(source_file, invoker.sources) {
+ if (current_file_index == next_chunk_start) {
+ jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_" +
+ next_chunk_number + ".cc" ]
+ next_chunk_number += 1
+ next_chunk_start += files_per_chunk
+ }
+ current_file_index += 1
+ }
+
+ merge_action_name = target_name + "__jumbo_merge"
+
+ # Create an action that calls a script that merges all the source files.
+ action(merge_action_name) {
+ script = "//build/config/merge_for_jumbo.py"
+ response_file_contents =
+ rebase_path(invoker.sources - excluded_sources, gen_target_dir)
+ outputs = jumbo_files
+ args = [ "--outputs" ] + rebase_path(outputs, root_build_dir) +
+ [ "--file-list={{response_file_name}}" ]
+ }
+ }
+
+ target_type = invoker.target_type
+ if (use_jumbo_build_for_target && target_type == "split_static_library") {
+ # Meaningless and also impossible if split_count > len(jumbo_files)
+ target_type = "static_library"
+
+ # Prevent "unused variable" warning.
+ assert(!defined(invoker.split_count) || invoker.split_count > 0)
+ }
+
+ # Perform the actual operation, either on the original sources or
+ # the sources post-jumbo merging.
+ target(target_type, target_name) {
+ deps = []
+ if (defined(invoker.deps)) {
+ deps += invoker.deps
+ }
+
+ # Take everything else not handled above from the invoker.
+ variables_to_not_forward = [ "deps" ]
+ if (use_jumbo_build_for_target) {
+ deps += [ ":" + merge_action_name ]
+ variables_to_not_forward += [ "sources" ]
+ assert(jumbo_files != [])
+ sources = jumbo_files + excluded_sources
+
+ # Need to keep the headers in sources so that dependency checks
+ # work, and we need to keep Objective-C code since they
+ # cannot be merged into a cc file (FIXME).
+ foreach(source_file, invoker.sources) {
+ source_ext = get_path_info(source_file, "extension")
+ if (source_ext == "h" || source_ext == "mm") {
+ sources += [ source_file ]
+ }
+ }
+ }
+ forward_variables_from(invoker, "*", variables_to_not_forward)
+ }
+}
+
+set_defaults("jumbo_target") {
+ # This sets the default list of configs when the content_source_set target
+ # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
+ # is the list normally applied to static libraries and source sets.
+ configs = default_compiler_configs
+}
« no previous file with comments | « no previous file | build/config/merge_for_jumbo.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698