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/gtest_prod_util.h" 13#include "base/memory/scoped_ptr.h" 14#include "tools/gn/source_dir.h" 15#include "tools/gn/target.h" 16 17class BuildSettings; 18class Err; 19class Location; 20class Scope; 21class Token; 22class Value; 23 24// Creates Target objects from a Scope (the result of a script execution). 25class TargetGenerator { 26 public: 27 TargetGenerator(Target* target, 28 Scope* scope, 29 const Token& function_token, 30 const std::vector<Value>& args, 31 const std::string& output_type, 32 Err* err); 33 ~TargetGenerator(); 34 35 void Run(); 36 37 // The function token is the token of the function name of the generator for 38 // this target. err() will be set on failure. 39 static void GenerateTarget(Scope* scope, 40 const Token& function_token, 41 const std::vector<Value>& args, 42 const std::string& output_type, 43 Err* err); 44 45 private: 46 // Sets err_ on failure. 47 Target::OutputType GetOutputType() const; 48 49 // Reads configs/deps from the given var name, and uses the given setting on 50 // the target to save them. 51 void FillGenericConfigs(const char* var_name, 52 void (Target::*setter)(std::vector<const Config*>*)); 53 void FillGenericDeps(const char* var_name, 54 void (Target::*setter)(std::vector<const Target*>*)); 55 56 void FillConfigs(); 57 void FillAllDependentConfigs(); 58 void FillDirectDependentConfigs(); 59 void FillSources(); 60 void FillData(); 61 void FillDependencies(); 62 void FillDataDependencies(); 63 void FillDestDir(); 64 void FillScript(); 65 void FillScriptArgs(); 66 void FillOutputs(); 67 68 const BuildSettings* GetBuildSettings() const; 69 70 Target* target_; 71 Scope* scope_; 72 const Token& function_token_; 73 std::vector<Value> args_; 74 std::string output_type_; 75 Err* err_; 76 77 // Sources are relative to this. This comes from the input file which doesn't 78 // get freed so we don't acautlly have to make a copy. 79 const SourceDir& input_directory_; 80 81 FRIEND_TEST_ALL_PREFIXES(TargetGenerator, ResolveInputPath); 82 83 DISALLOW_COPY_AND_ASSIGN(TargetGenerator); 84}; 85 86#endif // TOOLS_GN_TARGET_GENERATOR_H_ 87