| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/scope_per_file_provider.h" | 5 #include "tools/gn/scope_per_file_provider.h" |
| 6 | 6 |
| 7 #include "tools/gn/filesystem_utils.h" | 7 #include "tools/gn/filesystem_utils.h" |
| 8 #include "tools/gn/settings.h" | 8 #include "tools/gn/settings.h" |
| 9 #include "tools/gn/source_file.h" | 9 #include "tools/gn/source_file.h" |
| 10 #include "tools/gn/toolchain_manager.h" | 10 #include "tools/gn/toolchain_manager.h" |
| 11 #include "tools/gn/value.h" | 11 #include "tools/gn/value.h" |
| 12 #include "tools/gn/variables.h" | 12 #include "tools/gn/variables.h" |
| 13 | 13 |
| 14 ScopePerFileProvider::ScopePerFileProvider(Scope* scope) | 14 ScopePerFileProvider::ScopePerFileProvider(Scope* scope) |
| 15 : ProgrammaticProvider(scope) { | 15 : ProgrammaticProvider(scope) { |
| 16 } | 16 } |
| 17 | 17 |
| 18 ScopePerFileProvider::~ScopePerFileProvider() { | 18 ScopePerFileProvider::~ScopePerFileProvider() { |
| 19 } | 19 } |
| 20 | 20 |
| 21 const Value* ScopePerFileProvider::GetProgrammaticValue( | 21 const Value* ScopePerFileProvider::GetProgrammaticValue( |
| 22 const base::StringPiece& ident) { | 22 const base::StringPiece& ident) { |
| 23 if (ident == variables::kCurrentToolchain) | 23 if (ident == variables::kCurrentToolchain) |
| 24 return GetCurrentToolchain(); | 24 return GetCurrentToolchain(); |
| 25 if (ident == variables::kDefaultToolchain) | 25 if (ident == variables::kDefaultToolchain) |
| 26 return GetDefaultToolchain(); | 26 return GetDefaultToolchain(); |
| 27 if (ident == variables::kPythonPath) | 27 if (ident == variables::kPythonPath) |
| 28 return GetPythonPath(); | 28 return GetPythonPath(); |
| 29 | 29 |
| 30 if (ident == variables::kRelativeBuildToSourceRootDir) | |
| 31 return GetRelativeBuildToSourceRootDir(); | |
| 32 if (ident == variables::kRelativeRootOutputDir) | |
| 33 return GetRelativeRootOutputDir(); | |
| 34 if (ident == variables::kRelativeRootGenDir) | |
| 35 return GetRelativeRootGenDir(); | |
| 36 if (ident == variables::kRelativeSourceRootDir) | |
| 37 return GetRelativeSourceRootDir(); | |
| 38 if (ident == variables::kRelativeTargetOutputDir) | |
| 39 return GetRelativeTargetOutputDir(); | |
| 40 if (ident == variables::kRelativeTargetGenDir) | |
| 41 return GetRelativeTargetGenDir(); | |
| 42 if (ident == variables::kRootGenDir) | 30 if (ident == variables::kRootGenDir) |
| 43 return GetRootGenDir(); | 31 return GetRootGenDir(); |
| 32 if (ident == variables::kRootOutDir) |
| 33 return GetRootOutDir(); |
| 44 if (ident == variables::kTargetGenDir) | 34 if (ident == variables::kTargetGenDir) |
| 45 return GetTargetGenDir(); | 35 return GetTargetGenDir(); |
| 36 if (ident == variables::kTargetOutDir) |
| 37 return GetTargetOutDir(); |
| 46 return NULL; | 38 return NULL; |
| 47 } | 39 } |
| 48 | 40 |
| 49 const Value* ScopePerFileProvider::GetCurrentToolchain() { | 41 const Value* ScopePerFileProvider::GetCurrentToolchain() { |
| 50 if (!current_toolchain_) { | 42 if (!current_toolchain_) { |
| 51 current_toolchain_.reset(new Value(NULL, | 43 current_toolchain_.reset(new Value(NULL, |
| 52 scope_->settings()->toolchain()->label().GetUserVisibleName(false))); | 44 scope_->settings()->toolchain()->label().GetUserVisibleName(false))); |
| 53 } | 45 } |
| 54 return current_toolchain_.get(); | 46 return current_toolchain_.get(); |
| 55 } | 47 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 66 } | 58 } |
| 67 | 59 |
| 68 const Value* ScopePerFileProvider::GetPythonPath() { | 60 const Value* ScopePerFileProvider::GetPythonPath() { |
| 69 if (!python_path_) { | 61 if (!python_path_) { |
| 70 python_path_.reset(new Value(NULL, | 62 python_path_.reset(new Value(NULL, |
| 71 FilePathToUTF8(scope_->settings()->build_settings()->python_path()))); | 63 FilePathToUTF8(scope_->settings()->build_settings()->python_path()))); |
| 72 } | 64 } |
| 73 return python_path_.get(); | 65 return python_path_.get(); |
| 74 } | 66 } |
| 75 | 67 |
| 76 const Value* ScopePerFileProvider::GetRelativeBuildToSourceRootDir() { | |
| 77 if (!relative_build_to_source_root_dir_) { | |
| 78 const SourceDir& build_dir = | |
| 79 scope_->settings()->build_settings()->build_dir(); | |
| 80 relative_build_to_source_root_dir_.reset( | |
| 81 new Value(NULL, InvertDirWithNoLastSlash(build_dir))); | |
| 82 } | |
| 83 return relative_build_to_source_root_dir_.get(); | |
| 84 } | |
| 85 | |
| 86 const Value* ScopePerFileProvider::GetRelativeRootOutputDir() { | |
| 87 if (!relative_root_output_dir_) { | |
| 88 relative_root_output_dir_.reset(new Value(NULL, | |
| 89 GetRelativeRootWithNoLastSlash() + | |
| 90 GetRootOutputDirWithNoLastSlash(scope_->settings()))); | |
| 91 } | |
| 92 return relative_root_output_dir_.get(); | |
| 93 } | |
| 94 | |
| 95 const Value* ScopePerFileProvider::GetRelativeRootGenDir() { | |
| 96 if (!relative_root_gen_dir_) { | |
| 97 relative_root_gen_dir_.reset(new Value(NULL, | |
| 98 GetRelativeRootWithNoLastSlash() + | |
| 99 GetRootGenDirWithNoLastSlash(scope_->settings()))); | |
| 100 } | |
| 101 return relative_root_gen_dir_.get(); | |
| 102 } | |
| 103 | |
| 104 const Value* ScopePerFileProvider::GetRelativeSourceRootDir() { | |
| 105 if (!relative_source_root_dir_) { | |
| 106 relative_source_root_dir_.reset(new Value(NULL, | |
| 107 GetRelativeRootWithNoLastSlash())); | |
| 108 } | |
| 109 return relative_source_root_dir_.get(); | |
| 110 } | |
| 111 | |
| 112 const Value* ScopePerFileProvider::GetRelativeTargetOutputDir() { | |
| 113 if (!relative_target_output_dir_) { | |
| 114 relative_target_output_dir_.reset(new Value(NULL, | |
| 115 GetRelativeRootWithNoLastSlash() + | |
| 116 GetRootOutputDirWithNoLastSlash(scope_->settings()) + "/obj" + | |
| 117 GetFileDirWithNoLastSlash())); | |
| 118 } | |
| 119 return relative_target_output_dir_.get(); | |
| 120 } | |
| 121 | |
| 122 const Value* ScopePerFileProvider::GetRelativeTargetGenDir() { | |
| 123 if (!relative_target_gen_dir_) { | |
| 124 relative_target_gen_dir_.reset(new Value(NULL, | |
| 125 GetRelativeRootWithNoLastSlash() + | |
| 126 GetRootGenDirWithNoLastSlash(scope_->settings()) + | |
| 127 GetFileDirWithNoLastSlash())); | |
| 128 } | |
| 129 return relative_target_gen_dir_.get(); | |
| 130 } | |
| 131 | |
| 132 const Value* ScopePerFileProvider::GetRootGenDir() { | 68 const Value* ScopePerFileProvider::GetRootGenDir() { |
| 133 if (!root_gen_dir_) { | 69 if (!root_gen_dir_) { |
| 134 root_gen_dir_.reset(new Value(NULL, | 70 root_gen_dir_.reset(new Value(NULL, |
| 135 "/" + GetRootGenDirWithNoLastSlash(scope_->settings()))); | 71 "/" + GetRootGenDirWithNoLastSlash(scope_->settings()))); |
| 136 } | 72 } |
| 137 return root_gen_dir_.get(); | 73 return root_gen_dir_.get(); |
| 138 } | 74 } |
| 139 | 75 |
| 76 const Value* ScopePerFileProvider::GetRootOutDir() { |
| 77 if (!root_out_dir_) { |
| 78 root_out_dir_.reset(new Value(NULL, |
| 79 "/" + GetRootOutputDirWithNoLastSlash(scope_->settings()))); |
| 80 } |
| 81 return root_out_dir_.get(); |
| 82 } |
| 83 |
| 140 const Value* ScopePerFileProvider::GetTargetGenDir() { | 84 const Value* ScopePerFileProvider::GetTargetGenDir() { |
| 141 if (!target_gen_dir_) { | 85 if (!target_gen_dir_) { |
| 142 target_gen_dir_.reset(new Value(NULL, | 86 target_gen_dir_.reset(new Value(NULL, |
| 143 "/" + | 87 "/" + |
| 144 GetRootGenDirWithNoLastSlash(scope_->settings()) + | 88 GetRootGenDirWithNoLastSlash(scope_->settings()) + |
| 145 GetFileDirWithNoLastSlash())); | 89 GetFileDirWithNoLastSlash())); |
| 146 } | 90 } |
| 147 return target_gen_dir_.get(); | 91 return target_gen_dir_.get(); |
| 148 } | 92 } |
| 149 | 93 |
| 94 const Value* ScopePerFileProvider::GetTargetOutDir() { |
| 95 if (!target_out_dir_) { |
| 96 target_out_dir_.reset(new Value(NULL, |
| 97 "/" + |
| 98 GetRootOutputDirWithNoLastSlash(scope_->settings()) + "/obj" + |
| 99 GetFileDirWithNoLastSlash())); |
| 100 } |
| 101 return target_out_dir_.get(); |
| 102 } |
| 103 |
| 150 // static | 104 // static |
| 151 std::string ScopePerFileProvider::GetRootOutputDirWithNoLastSlash( | 105 std::string ScopePerFileProvider::GetRootOutputDirWithNoLastSlash( |
| 152 const Settings* settings) { | 106 const Settings* settings) { |
| 153 const std::string& output_dir = | 107 const std::string& output_dir = |
| 154 settings->build_settings()->build_dir().value(); | 108 settings->build_settings()->build_dir().value(); |
| 155 | 109 |
| 156 // Trim off a leading and trailing slash. So "//foo/bar/" -> /foo/bar". | 110 // Trim off a leading and trailing slash. So "//foo/bar/" -> /foo/bar". |
| 157 DCHECK(output_dir.size() > 2 && output_dir[0] == '/' && | 111 DCHECK(output_dir.size() > 2 && output_dir[0] == '/' && |
| 158 output_dir[output_dir.size() - 1] == '/'); | 112 output_dir[output_dir.size() - 1] == '/'); |
| 159 return output_dir.substr(1, output_dir.size() - 2); | 113 return output_dir.substr(1, output_dir.size() - 2); |
| 160 } | 114 } |
| 161 | 115 |
| 162 // static | 116 // static |
| 163 std::string ScopePerFileProvider::GetRootGenDirWithNoLastSlash( | 117 std::string ScopePerFileProvider::GetRootGenDirWithNoLastSlash( |
| 164 const Settings* settings) { | 118 const Settings* settings) { |
| 165 return GetRootOutputDirWithNoLastSlash(settings) + "/gen"; | 119 return GetRootOutputDirWithNoLastSlash(settings) + "/gen"; |
| 166 } | 120 } |
| 167 | 121 |
| 168 std::string ScopePerFileProvider::GetFileDirWithNoLastSlash() const { | 122 std::string ScopePerFileProvider::GetFileDirWithNoLastSlash() const { |
| 169 const std::string& dir_value = scope_->GetSourceDir().value(); | 123 const std::string& dir_value = scope_->GetSourceDir().value(); |
| 170 | 124 |
| 171 // Trim off a leading and trailing slash. So "//foo/bar/" -> /foo/bar". | 125 // Trim off a leading and trailing slash. So "//foo/bar/" -> /foo/bar". |
| 172 DCHECK(dir_value.size() > 2 && dir_value[0] == '/' && | 126 DCHECK(dir_value.size() > 2 && dir_value[0] == '/' && |
| 173 dir_value[dir_value.size() - 1] == '/'); | 127 dir_value[dir_value.size() - 1] == '/'); |
| 174 return dir_value.substr(1, dir_value.size() - 2); | 128 return dir_value.substr(1, dir_value.size() - 2); |
| 175 } | 129 } |
| 176 | |
| 177 std::string ScopePerFileProvider::GetRelativeRootWithNoLastSlash() const { | |
| 178 return InvertDirWithNoLastSlash(scope_->GetSourceDir()); | |
| 179 } | |
| 180 | |
| 181 // static | |
| 182 std::string ScopePerFileProvider::InvertDirWithNoLastSlash( | |
| 183 const SourceDir& dir) { | |
| 184 std::string inverted = InvertDir(dir); | |
| 185 if (inverted.empty()) | |
| 186 return "."; | |
| 187 return inverted.substr(0, inverted.size() - 1); | |
| 188 } | |
| OLD | NEW |