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 #ifndef TOOLS_GN_TARGET_GENERATOR_H_
      6 #define TOOLS_GN_TARGET_GENERATOR_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "tools/gn/source_dir.h"
     14 #include "tools/gn/target.h"
     15 
     16 class BuildSettings;
     17 class Err;
     18 class FunctionCallNode;
     19 class Location;
     20 class Scope;
     21 class Value;
     22 
     23 // Fills the variables in a Target object from a Scope (the result of a script
     24 // execution). Target-type-specific derivations of this class will be used
     25 // for each different type of function call. This class implements the common
     26 // behavior.
     27 class TargetGenerator {
     28  public:
     29   TargetGenerator(Target* target,
     30                   Scope* scope,
     31                   const FunctionCallNode* function_call,
     32                   Err* err);
     33   ~TargetGenerator();
     34 
     35   void Run();
     36 
     37   // The function call is the parse tree node that invoked the target.
     38   // err() will be set on failure.
     39   static void GenerateTarget(Scope* scope,
     40                              const FunctionCallNode* function_call,
     41                              const std::vector<Value>& args,
     42                              const std::string& output_type,
     43                              Err* err);
     44 
     45  protected:
     46   // Derived classes implement this to do type-specific generation.
     47   virtual void DoRun() = 0;
     48 
     49   const BuildSettings* GetBuildSettings() const;
     50 
     51   bool FillSources();
     52   bool FillPublic();
     53   bool FillInputs();
     54   bool FillConfigs();
     55   bool FillOutputs(bool allow_substitutions);
     56 
     57   // Rrturns true if the given pattern will expand to a file in the output
     58   // directory. If not, returns false and sets the error, blaming the given
     59   // Value.
     60   bool EnsureSubstitutionIsInOutputDir(
     61       const SubstitutionPattern& pattern,
     62       const Value& original_value);
     63 
     64   Target* target_;
     65   Scope* scope_;
     66   const FunctionCallNode* function_call_;
     67   Err* err_;
     68 
     69  private:
     70   bool FillDependentConfigs();  // Includes all types of dependent configs.
     71   bool FillData();
     72   bool FillDependencies();  // Includes data dependencies.
     73   bool FillTestonly();
     74 
     75   // Reads configs/deps from the given var name, and uses the given setting on
     76   // the target to save them.
     77   bool FillGenericConfigs(const char* var_name,
     78                           UniqueVector<LabelConfigPair>* dest);
     79   bool FillGenericDeps(const char* var_name, LabelTargetVector* dest);
     80 
     81   bool FillForwardDependentConfigs();
     82 
     83   DISALLOW_COPY_AND_ASSIGN(TargetGenerator);
     84 };
     85 
     86 #endif  // TOOLS_GN_TARGET_GENERATOR_H_
     87