Home | History | Annotate | Download | only in gn
      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 
     13 ScopePerFileProvider::ScopePerFileProvider(Scope* scope,
     14                                            bool allow_target_vars)
     15     : ProgrammaticProvider(scope),
     16       allow_target_vars_(allow_target_vars) {
     17 }
     18 
     19 ScopePerFileProvider::~ScopePerFileProvider() {
     20 }
     21 
     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 
     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 
     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 
     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 
     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 
     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 
     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 
     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 
    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