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

Unified Diff: tools/gn/functions.cc

Issue 2006923004: Add support for user defined "pool" to GN. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 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 | « tools/gn/functions.h ('k') | tools/gn/gn.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/functions.cc
diff --git a/tools/gn/functions.cc b/tools/gn/functions.cc
index af413d655b3cc33ecb4f8e79dc1c5a8f5f87703b..24bc2c91da4ab56c4797b67996e216d5ae55b4f5 100644
--- a/tools/gn/functions.cc
+++ b/tools/gn/functions.cc
@@ -15,6 +15,7 @@
#include "tools/gn/err.h"
#include "tools/gn/input_file.h"
#include "tools/gn/parse_tree.h"
+#include "tools/gn/pool.h"
#include "tools/gn/scheduler.h"
#include "tools/gn/scope.h"
#include "tools/gn/settings.h"
@@ -678,6 +679,94 @@ Value RunSetSourcesAssignmentFilter(Scope* scope,
return Value();
}
+// pool ------------------------------------------------------------------------
+
+const char kPool[] = "pool";
+const char kPool_HelpShort[] =
+ "pool: Defines a pool object.";
+const char kPool_Help[] =
+ "pool: Defines a pool object.\n"
+ "\n"
+ " Pool objects can be applied to a tool to limit the parallelism of the\n"
+ " build. This object has a single property \"depth\" corresponding to\n"
+ " the number of tasks that may run simultaneously.\n"
+ "\n"
+ " As the file containing the pool definition may be executed in the\n"
+ " of more than one toolchain it is recommended to specify an explicit\n"
Dirk Pranke 2016/06/06 23:32:18 nit: "in the context of"
+ " toolchain when definining and referencing a pool.\n"
Dirk Pranke 2016/06/06 23:32:18 nit: "defining"
+ "\n"
+ " A pool is referenced by its label just like a target.\n"
+ "\n"
+ "Variables\n"
+ "\n"
+ " depth*\n"
+ " * = required\n"
+ "\n"
+ "Example\n"
+ "\n"
+ " if (current_toolchain == default_toolchain) {\n"
+ " pool(\"link_pool\") {\n"
+ " depth = 1\n"
+ " }\n"
+ " }\n"
+ "\n"
+ " toolchain(\"toolchain\") {\n"
+ " tool(\"link\") {\n"
+ " command = \"...\"\n"
+ " pool = \":link_pool($default_toolchain)\")\n"
+ " }\n"
+ " }\n";
+
+const char kDepth[] = "depth";
+
+Value RunPool(const FunctionCallNode* function,
+ const std::vector<Value>& args,
+ Scope* scope,
+ Err* err) {
+ NonNestableBlock non_nestable(scope, function, "pool");
+ if (!non_nestable.Enter(err))
+ return Value();
+
+ if (!EnsureSingleStringArg(function, args, err) ||
+ !EnsureNotProcessingImport(function, scope, err))
+ return Value();
+
+ Label label(MakeLabelForScope(scope, function, args[0].string_value()));
+
+ if (g_scheduler->verbose_logging())
+ g_scheduler->Log("Defining pool", label.GetUserVisibleName(true));
+
+ // Get the pool depth. It is an error to define a pool without a depth,
+ // so check first for the presence of the value.
+ const Value* depth = scope->GetValue(kDepth, true);
+ if (!depth) {
+ *err = Err(function, "Can't define a pool without depth.");
+ return Value();
+ }
+
+ if (!depth->VerifyTypeIs(Value::INTEGER, err))
+ return Value();
+
+ if (depth->int_value() < 0) {
+ *err = Err(function, "depth must be positive or nul.");
+ return Value();
+ }
+
+ // Create the new pool.
+ std::unique_ptr<Pool> pool(new Pool(scope->settings(), label));
+ pool->set_depth(depth->int_value());
+
+ // Save the generated item.
+ Scope::ItemVector* collector = scope->GetItemCollector();
+ if (!collector) {
+ *err = Err(function, "Can't define a pool in this context.");
+ return Value();
+ }
+ collector->push_back(pool.release());
+
+ return Value();
+}
+
// print -----------------------------------------------------------------------
const char kPrint[] = "print";
@@ -826,6 +915,7 @@ struct FunctionInfoInitializer {
INSERT_FUNCTION(GetPathInfo, false)
INSERT_FUNCTION(GetTargetOutputs, false)
INSERT_FUNCTION(Import, false)
+ INSERT_FUNCTION(Pool, false)
INSERT_FUNCTION(Print, false)
INSERT_FUNCTION(ProcessFileTemplate, false)
INSERT_FUNCTION(ReadFile, false)
« no previous file with comments | « tools/gn/functions.h ('k') | tools/gn/gn.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698