1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "tools/gn/scope_per_file_provider.h"
6
7 #include "tools/gn/filesystem_utils.h"
8 #include "tools/gn/settings.h"
9 #include "tools/gn/source_file.h"
10 #include "tools/gn/value.h"
11 #include "tools/gn/variables.h"
12
ScopePerFileProvider(Scope * scope,bool allow_target_vars)13 ScopePerFileProvider::ScopePerFileProvider(Scope* scope,
14 bool allow_target_vars)
15 : ProgrammaticProvider(scope),
16 allow_target_vars_(allow_target_vars) {
17 }
18
~ScopePerFileProvider()19 ScopePerFileProvider::~ScopePerFileProvider() {
20 }
21
GetProgrammaticValue(const base::StringPiece & ident)22 const Value* ScopePerFileProvider::GetProgrammaticValue(
23 const base::StringPiece& ident) {
24 if (ident == variables::kCurrentToolchain)
25 return GetCurrentToolchain();
26 if (ident == variables::kDefaultToolchain)
27 return GetDefaultToolchain();
28 if (ident == variables::kPythonPath)
29 return GetPythonPath();
30
31 if (ident == variables::kRootBuildDir)
32 return GetRootBuildDir();
33 if (ident == variables::kRootGenDir)
34 return GetRootGenDir();
35 if (ident == variables::kRootOutDir)
36 return GetRootOutDir();
37
38 if (allow_target_vars_) {
39 if (ident == variables::kTargetGenDir)
40 return GetTargetGenDir();
41 if (ident == variables::kTargetOutDir)
42 return GetTargetOutDir();
43 }
44 return NULL;
45 }
46
GetCurrentToolchain()47 const Value* ScopePerFileProvider::GetCurrentToolchain() {
48 if (!current_toolchain_) {
49 current_toolchain_.reset(new Value(NULL,
50 scope_->settings()->toolchain_label().GetUserVisibleName(false)));
51 }
52 return current_toolchain_.get();
53 }
54
GetDefaultToolchain()55 const Value* ScopePerFileProvider::GetDefaultToolchain() {
56 if (!default_toolchain_) {
57 default_toolchain_.reset(new Value(NULL,
58 scope_->settings()->default_toolchain_label().GetUserVisibleName(
59 false)));
60 }
61 return default_toolchain_.get();
62 }
63
GetPythonPath()64 const Value* ScopePerFileProvider::GetPythonPath() {
65 if (!python_path_) {
66 python_path_.reset(new Value(NULL,
67 FilePathToUTF8(scope_->settings()->build_settings()->python_path())));
68 }
69 return python_path_.get();
70 }
71
GetRootBuildDir()72 const Value* ScopePerFileProvider::GetRootBuildDir() {
73 if (!root_build_dir_) {
74 root_build_dir_.reset(new Value(NULL, DirectoryWithNoLastSlash(
75 scope_->settings()->build_settings()->build_dir())));
76 }
77 return root_build_dir_.get();
78 }
79
GetRootGenDir()80 const Value* ScopePerFileProvider::GetRootGenDir() {
81 if (!root_gen_dir_) {
82 root_gen_dir_.reset(new Value(NULL,
83 DirectoryWithNoLastSlash(GetToolchainGenDir(scope_->settings()))));
84 }
85 return root_gen_dir_.get();
86 }
87
GetRootOutDir()88 const Value* ScopePerFileProvider::GetRootOutDir() {
89 if (!root_out_dir_) {
90 root_out_dir_.reset(new Value(NULL,
91 DirectoryWithNoLastSlash(GetToolchainOutputDir(scope_->settings()))));
92 }
93 return root_out_dir_.get();
94 }
95
GetTargetGenDir()96 const Value* ScopePerFileProvider::GetTargetGenDir() {
97 if (!target_gen_dir_) {
98 target_gen_dir_.reset(new Value(NULL,
99 DirectoryWithNoLastSlash(GetCurrentGenDir(scope_))));
100 }
101 return target_gen_dir_.get();
102 }
103
GetTargetOutDir()104 const Value* ScopePerFileProvider::GetTargetOutDir() {
105 if (!target_out_dir_) {
106 target_out_dir_.reset(new Value(NULL,
107 DirectoryWithNoLastSlash(GetCurrentOutputDir(scope_))));
108 }
109 return target_out_dir_.get();
110 }
111