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_H_
      6 #define TOOLS_GN_TARGET_H_
      7 
      8 #include <set>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/compiler_specific.h"
     14 #include "base/logging.h"
     15 #include "base/strings/string_piece.h"
     16 #include "base/synchronization/lock.h"
     17 #include "tools/gn/config_values.h"
     18 #include "tools/gn/item.h"
     19 #include "tools/gn/label_ptr.h"
     20 #include "tools/gn/ordered_set.h"
     21 #include "tools/gn/script_values.h"
     22 #include "tools/gn/source_file.h"
     23 
     24 class InputFile;
     25 class Settings;
     26 class Token;
     27 
     28 class Target : public Item {
     29  public:
     30   enum OutputType {
     31     UNKNOWN,
     32     GROUP,
     33     EXECUTABLE,
     34     SHARED_LIBRARY,
     35     STATIC_LIBRARY,
     36     SOURCE_SET,
     37     COPY_FILES,
     38     CUSTOM,
     39   };
     40   typedef std::vector<SourceFile> FileList;
     41   typedef std::vector<std::string> StringVector;
     42 
     43   Target(const Settings* settings, const Label& label);
     44   virtual ~Target();
     45 
     46   // Returns a string naming the output type.
     47   static const char* GetStringForOutputType(OutputType type);
     48 
     49   // Item overrides.
     50   virtual Target* AsTarget() OVERRIDE;
     51   virtual const Target* AsTarget() const OVERRIDE;
     52   virtual void OnResolved() OVERRIDE;
     53 
     54   OutputType output_type() const { return output_type_; }
     55   void set_output_type(OutputType t) { output_type_ = t; }
     56 
     57   bool IsLinkable() const;
     58 
     59   // Will be the empty string to use the target label as the output name.
     60   const std::string& output_name() const { return output_name_; }
     61   void set_output_name(const std::string& name) { output_name_ = name; }
     62 
     63   const FileList& sources() const { return sources_; }
     64   FileList& sources() { return sources_; }
     65 
     66   // Compile-time extra dependencies.
     67   const FileList& source_prereqs() const { return source_prereqs_; }
     68   FileList& source_prereqs() { return source_prereqs_; }
     69 
     70   // Runtime dependencies.
     71   const FileList& data() const { return data_; }
     72   FileList& data() { return data_; }
     73 
     74   // Targets depending on this one should have an order dependency.
     75   bool hard_dep() const { return hard_dep_; }
     76   void set_hard_dep(bool hd) { hard_dep_ = hd; }
     77 
     78   // Linked dependencies.
     79   const LabelTargetVector& deps() const { return deps_; }
     80   LabelTargetVector& deps() { return deps_; }
     81 
     82   // Non-linked dependencies.
     83   const LabelTargetVector& datadeps() const { return datadeps_; }
     84   LabelTargetVector& datadeps() { return datadeps_; }
     85 
     86   // List of configs that this class inherits settings from.
     87   const LabelConfigVector& configs() const { return configs_; }
     88   LabelConfigVector& configs() { return configs_; }
     89 
     90   // List of configs that all dependencies (direct and indirect) of this
     91   // target get. These configs are not added to this target. Note that due
     92   // to the way this is computed, there may be duplicates in this list.
     93   const LabelConfigVector& all_dependent_configs() const {
     94     return all_dependent_configs_;
     95   }
     96   LabelConfigVector& all_dependent_configs() {
     97     return all_dependent_configs_;
     98   }
     99 
    100   // List of configs that targets depending directly on this one get. These
    101   // configs are not added to this target.
    102   const LabelConfigVector& direct_dependent_configs() const {
    103     return direct_dependent_configs_;
    104   }
    105   LabelConfigVector& direct_dependent_configs() {
    106     return direct_dependent_configs_;
    107   }
    108 
    109   // A list of a subset of deps where we'll re-export direct_dependent_configs
    110   // as direct_dependent_configs of this target.
    111   const LabelTargetVector& forward_dependent_configs() const {
    112     return forward_dependent_configs_;
    113   }
    114   LabelTargetVector& forward_dependent_configs() {
    115     return forward_dependent_configs_;
    116   }
    117 
    118   bool external() const { return external_; }
    119   void set_external(bool e) { external_ = e; }
    120 
    121   const std::set<const Target*>& inherited_libraries() const {
    122     return inherited_libraries_;
    123   }
    124 
    125   // This config represents the configuration set directly on this target.
    126   ConfigValues& config_values() { return config_values_; }
    127   const ConfigValues& config_values() const { return config_values_; }
    128 
    129   ScriptValues& script_values() { return script_values_; }
    130   const ScriptValues& script_values() const { return script_values_; }
    131 
    132   const OrderedSet<SourceDir>& all_lib_dirs() const { return all_lib_dirs_; }
    133   const OrderedSet<std::string>& all_libs() const { return all_libs_; }
    134 
    135   const SourceFile& gyp_file() const { return gyp_file_; }
    136   void set_gyp_file(const SourceFile& gf) { gyp_file_ = gf; }
    137 
    138  private:
    139   // Pulls necessary information from dependents to this one when all
    140   // dependencies have been resolved.
    141   void PullDependentTargetInfo(std::set<const Config*>* unique_configs);
    142 
    143   OutputType output_type_;
    144   std::string output_name_;
    145 
    146   FileList sources_;
    147   FileList source_prereqs_;
    148   FileList data_;
    149 
    150   bool hard_dep_;
    151 
    152   // Note that if there are any groups in the deps, once the target is resolved
    153   // these vectors will list *both* the groups as well as the groups' deps.
    154   //
    155   // This is because, in general, groups should be "transparent" ways to add
    156   // groups of dependencies, so adding the groups deps make this happen with
    157   // no additional complexity when iterating over a target's deps.
    158   //
    159   // However, a group may also have specific settings and configs added to it,
    160   // so we also need the group in the list so we find these things. But you
    161   // shouldn't need to look inside the deps of the group since those will
    162   // already be added.
    163   LabelTargetVector deps_;
    164   LabelTargetVector datadeps_;
    165 
    166   LabelConfigVector configs_;
    167   LabelConfigVector all_dependent_configs_;
    168   LabelConfigVector direct_dependent_configs_;
    169   LabelTargetVector forward_dependent_configs_;
    170 
    171   bool external_;
    172 
    173   // Static libraries and source sets from transitive deps. These things need
    174   // to be linked only with the end target (executable, shared library). These
    175   // do not get pushed beyond shared library boundaries.
    176   std::set<const Target*> inherited_libraries_;
    177 
    178   // These libs and dirs are inherited from statically linked deps and all
    179   // configs applying to this target.
    180   OrderedSet<SourceDir> all_lib_dirs_;
    181   OrderedSet<std::string> all_libs_;
    182 
    183   ConfigValues config_values_;  // Used for all binary targets.
    184   ScriptValues script_values_;  // Used for script (CUSTOM) targets.
    185 
    186   SourceFile gyp_file_;
    187 
    188   DISALLOW_COPY_AND_ASSIGN(Target);
    189 };
    190 
    191 #endif  // TOOLS_GN_TARGET_H_
    192