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

Unified Diff: tools/gn/scope_per_file_provider.cc

Issue 21114002: Add initial prototype for the GN meta-buildsystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add owners and readme Created 7 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 | « tools/gn/scope_per_file_provider.h ('k') | tools/gn/secondary/base/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/scope_per_file_provider.cc
diff --git a/tools/gn/scope_per_file_provider.cc b/tools/gn/scope_per_file_provider.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1799d9e12b96060bc16b1ba950dbfe2e2a8a91c1
--- /dev/null
+++ b/tools/gn/scope_per_file_provider.cc
@@ -0,0 +1,186 @@
+// Copyright (c) 2013 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.
+
+#include "tools/gn/scope_per_file_provider.h"
+
+#include "tools/gn/filesystem_utils.h"
+#include "tools/gn/settings.h"
+#include "tools/gn/source_file.h"
+#include "tools/gn/toolchain_manager.h"
+#include "tools/gn/value.h"
+
+const char* ScopePerFileProvider::kDefaultToolchain =
+ "default_toolchain";
+const char* ScopePerFileProvider::kPythonPath =
+ "python_path";
+const char* ScopePerFileProvider::kToolchain =
+ "toolchain";
+const char* ScopePerFileProvider::kRootOutputDirName =
+ "root_output_dir";
+const char* ScopePerFileProvider::kRootGenDirName =
+ "root_gen_dir";
+const char* ScopePerFileProvider::kTargetOutputDirName =
+ "target_output_dir";
+const char* ScopePerFileProvider::kTargetGenDirName =
+ "target_gen_dir";
+const char* ScopePerFileProvider::kRelativeRootOutputDirName =
+ "relative_root_output_dir";
+const char* ScopePerFileProvider::kRelativeRootGenDirName =
+ "relative_root_gen_dir";
+const char* ScopePerFileProvider::kRelativeTargetOutputDirName =
+ "relative_target_output_dir";
+const char* ScopePerFileProvider::kRelativeTargetGenDirName =
+ "relative_target_gen_dir";
+
+ScopePerFileProvider::ScopePerFileProvider(Scope* scope,
+ const SourceFile& source_file)
+ : ProgrammaticProvider(scope),
+ source_file_(source_file) {
+}
+
+ScopePerFileProvider::~ScopePerFileProvider() {
+}
+
+const Value* ScopePerFileProvider::GetProgrammaticValue(
+ const base::StringPiece& ident) {
+ if (ident == kDefaultToolchain)
+ return GetDefaultToolchain();
+ if (ident == kPythonPath)
+ return GetPythonPath();
+
+ if (ident == kTargetOutputDirName)
+ return GetTargetOutputDir();
+ if (ident == kTargetGenDirName)
+ return GetTargetGenDir();
+
+ if (ident == kRelativeRootOutputDirName)
+ return GetRelativeRootOutputDir();
+ if (ident == kRelativeRootGenDirName)
+ return GetRelativeRootGenDir();
+ if (ident == kRelativeTargetOutputDirName)
+ return GetRelativeTargetOutputDir();
+ if (ident == kRelativeTargetGenDirName)
+ return GetRelativeTargetGenDir();
+ return NULL;
+}
+
+// static
+Value ScopePerFileProvider::GetRootOutputDir(const Settings* settings) {
+ return Value(NULL, GetRootOutputDirWithNoLastSlash(settings));
+}
+
+// static
+Value ScopePerFileProvider::GetRootGenDir(const Settings* settings) {
+ return Value(NULL, GetRootGenDirWithNoLastSlash(settings));
+}
+
+const Value* ScopePerFileProvider::GetDefaultToolchain() {
+ if (!default_toolchain_) {
+ const ToolchainManager& toolchain_manager =
+ scope_->settings()->build_settings()->toolchain_manager();
+ default_toolchain_.reset(new Value(NULL,
+ toolchain_manager.GetDefaultToolchainUnlocked().GetUserVisibleName(
+ false)));
+ }
+ return default_toolchain_.get();
+}
+
+const Value* ScopePerFileProvider::GetPythonPath() {
+ if (!python_path_) {
+ python_path_.reset(new Value(NULL,
+ FilePathToUTF8(scope_->settings()->build_settings()->python_path())));
+ }
+ return python_path_.get();
+}
+
+const Value* ScopePerFileProvider::GetToolchain() {
+ if (!toolchain_) {
+ toolchain_.reset(new Value(NULL,
+ scope_->settings()->toolchain()->label().GetUserVisibleName(false)));
+ }
+ return toolchain_.get();
+}
+
+const Value* ScopePerFileProvider::GetTargetOutputDir() {
+ if (!target_output_dir_) {
+ target_output_dir_.reset(new Value(NULL,
+ GetRootOutputDirWithNoLastSlash(scope_->settings()) +
+ GetFileDirWithNoLastSlash()));
+ }
+ return target_output_dir_.get();
+}
+
+const Value* ScopePerFileProvider::GetTargetGenDir() {
+ if (!target_output_dir_) {
+ target_gen_dir_.reset(new Value(NULL,
+ GetRootGenDirWithNoLastSlash(scope_->settings()) +
+ GetFileDirWithNoLastSlash()));
+ }
+ return target_gen_dir_.get();
+}
+
+const Value* ScopePerFileProvider::GetRelativeRootOutputDir() {
+ if (!relative_root_output_dir_) {
+ relative_root_output_dir_.reset(new Value(NULL,
+ GetRelativeRootWithNoLastSlash() +
+ GetRootOutputDirWithNoLastSlash(scope_->settings())));
+ }
+ return relative_root_output_dir_.get();
+}
+
+const Value* ScopePerFileProvider::GetRelativeRootGenDir() {
+ if (!relative_root_gen_dir_) {
+ relative_root_gen_dir_.reset(new Value(NULL,
+ GetRelativeRootWithNoLastSlash() +
+ GetRootGenDirWithNoLastSlash(scope_->settings())));
+ }
+ return relative_root_gen_dir_.get();
+}
+
+const Value* ScopePerFileProvider::GetRelativeTargetOutputDir() {
+ if (!relative_target_output_dir_) {
+ relative_target_output_dir_.reset(new Value(NULL,
+ GetRelativeRootWithNoLastSlash() +
+ GetRootOutputDirWithNoLastSlash(scope_->settings()) + "obj/" +
+ GetFileDirWithNoLastSlash()));
+ }
+ return relative_target_output_dir_.get();
+}
+
+const Value* ScopePerFileProvider::GetRelativeTargetGenDir() {
+ if (!relative_target_gen_dir_) {
+ relative_target_gen_dir_.reset(new Value(NULL,
+ GetRelativeRootWithNoLastSlash() +
+ GetRootGenDirWithNoLastSlash(scope_->settings()) +
+ GetFileDirWithNoLastSlash()));
+ }
+ return relative_target_gen_dir_.get();
+}
+
+// static
+std::string ScopePerFileProvider::GetRootOutputDirWithNoLastSlash(
+ const Settings* settings) {
+ const std::string& output_dir =
+ settings->build_settings()->build_dir().value();
+ CHECK(!output_dir.empty());
+ return output_dir.substr(0, output_dir.size() - 1);
+}
+
+// static
+std::string ScopePerFileProvider::GetRootGenDirWithNoLastSlash(
+ const Settings* settings) {
+ return GetRootOutputDirWithNoLastSlash(settings) + "/gen";
+}
+
+std::string ScopePerFileProvider::GetFileDirWithNoLastSlash() const {
+ std::string dir_value = source_file_.GetDir().value();
+ return dir_value.substr(0, dir_value.size() - 1);
+}
+
+std::string ScopePerFileProvider::GetRelativeRootWithNoLastSlash() const {
+ std::string inverted = InvertDir(source_file_.GetDir());
+ if (inverted.empty())
+ return ".";
+ return inverted.substr(0, inverted.size() - 1);
+}
« no previous file with comments | « tools/gn/scope_per_file_provider.h ('k') | tools/gn/secondary/base/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698