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