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_NINJA_BINARY_TARGET_WRITER_H_
      6 #define TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "tools/gn/ninja_target_writer.h"
     10 #include "tools/gn/toolchain.h"
     11 
     12 // Writes a .ninja file for a binary target type (an executable, a shared
     13 // library, or a static library).
     14 class NinjaBinaryTargetWriter : public NinjaTargetWriter {
     15  public:
     16   NinjaBinaryTargetWriter(const Target* target,
     17                           const Toolchain* toolchain,
     18                           std::ostream& out);
     19   virtual ~NinjaBinaryTargetWriter();
     20 
     21   virtual void Run() OVERRIDE;
     22 
     23  private:
     24   typedef std::set<OutputFile> OutputFileSet;
     25 
     26   void WriteCompilerVars();
     27   void WriteSources(std::vector<OutputFile>* object_files);
     28   void WriteLinkerStuff(const std::vector<OutputFile>& object_files);
     29   void WriteLinkerFlags(const Toolchain::Tool& tool,
     30                         const OutputFile& windows_manifest);
     31   void WriteLibs(const Toolchain::Tool& tool);
     32 
     33   // Writes the build line for linking the target. Includes newline.
     34   void WriteLinkCommand(const OutputFile& external_output_file,
     35                         const OutputFile& internal_output_file,
     36                         const std::vector<OutputFile>& object_files);
     37 
     38   // Writes the stamp line for a source set. These are not linked.
     39   void WriteSourceSetStamp(const std::vector<OutputFile>& object_files);
     40 
     41   // Gets all target dependencies and classifies them, as well as accumulates
     42   // object files from source sets we need to link.
     43   void GetDeps(std::set<OutputFile>* extra_object_files,
     44                std::vector<const Target*>* linkable_deps,
     45                std::vector<const Target*>* non_linkable_deps) const;
     46 
     47   // Classifies the dependency as linkable or nonlinkable with the current
     48   // target, adding it to the appropriate vector. If the dependency is a source
     49   // set we should link in, the source set's object files will be appended to
     50   // |extra_object_files|.
     51   void ClassifyDependency(const Target* dep,
     52                           std::set<OutputFile>* extra_object_files,
     53                           std::vector<const Target*>* linkable_deps,
     54                           std::vector<const Target*>* non_linkable_deps) const;
     55 
     56   // Writes the implicit dependencies for the link or stamp line. This is
     57   // the "||" and everything following it on the ninja line.
     58   //
     59   // The implicit dependencies are the non-linkable deps passed in as an
     60   // argument, plus the data file depdencies in the target.
     61   void WriteImplicitDependencies(
     62       const std::vector<const Target*>& non_linkable_deps);
     63 
     64   Toolchain::ToolType tool_type_;
     65 
     66   DISALLOW_COPY_AND_ASSIGN(NinjaBinaryTargetWriter);
     67 };
     68 
     69 #endif  // TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_
     70 
     71